差压式流量计设计说明书
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、流量测量的依据
1. 流量与差压换算公式
依据流体力学公式,对于差压式流量计中流量和差压的关系式可以简化为
Q=C 其中0C 即作为本设计中流量系数,修改0C 即可以修正Q 与P ∆的关系。
2. 流量与电流换算公式
本设计中流量范围为0~1000L/min ,流量计输出信号4~20mA ,依据流体力学公式和信号转换特点有如下关系式:
max Q Q max P I-4
=
P 16
∆∆ 即可得到Q 与I 的关系式:
max Q Q 若假设流量为500L/min ,依据计算公式可知,
2
500I=16+4=8 mA 1000⎛⎫⨯ ⎪⎝⎭
二、差压式流量计的结构设计
1. 整体结构框图,如图所示
2. 电容式差压传感器(差动电容)
如图所示,即为一种电容式差压传感器。
当流量计的两路过程压力从测量容室的两侧施加到隔离膜片后,经硅油灌冲液传至中心膜片上,中心膜片是一个边缘张紧的膜片,在压力作用下,产生相应的位移,该位移即形成差动电容变化。
将该差动电容接入一个LC 振荡回路(或LRC 振荡回路)中,差动电容的容值变化将会导致振荡电路的振荡频率改变。
3. f-V 转换电路(频率-电压转换电路)
频率电压转换电路可实现频率到电压的转换。
这里选用美国NS 公司生产的精密频率电压转换芯片LM331。
LM331性能价格比高、外围电路简单、可单电源供电、低功耗的集成电路。
LM331动态范围宽达100dB ,工作频率低到0.1Hz 时尚有较好的线性度,数字分辨率达12位。
LM331的输出驱动器采用集电极开路形式,因此可通过选择逻辑电流和外接电阻来灵活改变输出脉冲的逻辑电平,以适配TTL 、DTL 和CMOS 等不同逻辑电路。
LM331可工作在4.0V ~40V 之间,输出可高达40V ,而且可以防止VCC 短路。
这里假设频率范围0~10KHz 进行设计,电路图如图,转换后电压范围0~5V 。
改变Rs 的阻值可以调节转换后电压范围。
()
4. 调理电路
由于f-V 转换电路后的输出电压已经在0~5V 范围内,故暂不需要放大电路。
调理电路部分只主要考虑抗混叠滤波电路。
根据设计要求总采样周期0.5s ,共采集100个点,每个点采样周期为5ms ,所以采样频率为200Hz 。
根据抗混叠滤波器设计原理:
· 2s k f k f k =≥()
其中s f 为采样频率,k f 为截止频率。
考虑到AD 转换位数m=12,这里取k=5,故低通滤波器的截止频率为40Hz 。
低通滤波器采用巴特沃斯设计法,假设截止频率40Hz ,通带最大衰减3dB ,阻带起始频率50Hz ,阻带最小衰减25dB 。
首先确定巴特沃斯低通滤波器的阶数N :
25
-
20
s =10=0.053δ
()
2
1
lg -10.053 2.5502
N =
=4.2355800.6021
2lg 40≥
⎛⎫ ⎪⎝⎭
()
取N=5。
低通滤波器3dB 截止频率()c p =2f =80=251 rad/s ππΩ 则五阶巴特沃斯滤波器的传输函数为:
5
4
3
2
c c c c c -125-104-73521
=
s s s s s +3.236+4.236+4.236+3.236+11
=
1.00310s +8.15310s
2.67910s 6.72410s 0.129s+1H s -⎛⎫⎛⎫⎛⎫⎛⎫⎛⎫
⎪ ⎪ ⎪ ⎪ ⎪ΩΩΩΩΩ⎝⎭⎝⎭⎝⎭⎝⎭⎝⎭
⨯⨯+⨯+⨯+()
传递函数(已经归一化)确定后,根据sallen-key 拓扑结构即可设计出模拟电路结构,此处不再详述。
5. A/D 转换
A/D 转换要求精度101
0.1%2
≈,所以至少选用10位以上AD 。
考虑到AD 转
换的精度特点(AD 后两位精度不高),最终选用12位或以上的ADC 。
这里可以有两种选择:
(1) TI 生产的DSP 系列中绝大部分已经内置了A/D 转换模块,且精度足
够。
TMS320F2812中自带12位ADC 模块。
(2) 选用外接的AD 芯片。
若选用外接AD 芯片,要求主要有两点:1. 转换精度为12位或更高;2. 输出电压最好便于与DSP 连接;3. 转换时间小于5ms ;4. 仅需一个通道就能满足功能。
由于现在市面上的单通道12位AD 芯片已经几乎不再生产,外接AD 芯片最终选用16位的AD 芯片AD977A 。
AD977A 工作电压为单电源供电0~5V ,输入通道数1,内部基准电平2.5V 。
6. DSP 选型
DSP 选择的主要指标有如下几点:
(1) 运算精度。
定点精度就足够,不需要浮点运算,16位或32位均可。
(2) 运算速率。
一般DSP 运算速率在100MHz 以上,设计中采样速率仅为
200Hz ,故一般DSP 几乎都能满足数据处理要求。
(3) 功耗。
TMS320C5000系列为低功耗系列,本设计没有功耗要求。
(4) 硬件资源。
本设计中不使用DSP 内部ADC ,硬件资源要求不多。
主要
考虑数字部分使用FIR 滤波。
I/O 引脚数一般也能达到要求。
(5) 资料丰富程度,使用普及度。
TMS320F2812资料多,应用广泛。
(6) 最好有JTAG 口,便于调试。
经过查阅资料,TMS320C5000系列,像5404、5502是最低功耗的;
TMS320C6000系列,是最佳处理的,但价格高;TMS320C2000系列,像2810、2812、2407是最佳控制的。
决定选用TMS320F2812作为选本设计的DSP 芯片 7. DSP 与AD 接口电路
由于TMS320F2812管脚最高耐压为4.6V ,查阅AD977A 芯片资料后得知,
min OH V =4.0V ,若直接相连,也能使用,但为了安全起见,使用SN74LVTH245A 转换电平后连接。
具体连接如图所示,其中/OE 为低电平使能端,DIR 为电平转换方向控制端,接DSP 的一个I/O 口进行控制。
8. D/A 芯片以及EEPROM
由于信号经TMS320F2812处理后需要转换为4~20mA 电流信号进行输出故选用D/A 芯片进行数模转换。
选用D/A 芯片为12位D/A 芯片AD8522,它使用单电源0~5V 供电,V IHmin =2.4V 小于3.3V 可以直接与DSP 相连省去了电平转换过程。
由于采集和计算累计流量时会产生大量数据,需要进行存储,选用3.3V 的EEPROM 进行存储,连接如图。
9. 总体电路图
三、差压式流量计的软件设计
1.系统程序框图
如图,本设计主要包含初始化程序、AD采集程序、数字滤波程序、流量计
算程序、数据存储程序和232通讯程序。
初始化程序部分主要完成DSP系统初始化、各器件工作状态初始化以及从EEPROM中读取电压调整参数,设置AD977A的参考电源等工作。
AD采集程序负责控制AD977A采集信号,并将转换结果传输至TMS320F2812中,供DSP进行进一步处理。
利用DSP内部的定时器产生中断,定时启动AD977A 采集信号和转换结果数据传输。
数字滤波程序是将因外界干扰使被测信号中混入的噪声脉冲滤掉,提高信号质量。
流量计算部分主要是依据从EEPROM读取出流量系数后,进行电压—压力——流量数值转换,先计算出瞬时流量,将瞬时流量叠加可得到累计流量。
数据存储程序主要是从EEPROM中读取数据,数据主要有电压调整参数、流量系数、显示设置、检测次数和累计流量的存储结果。
232通信程序(中断形式)是DSP与PC机之间的桥梁,通过232通信PC机可以修改流量系数、显示方式和检测次数等。
232通讯采用中断的方式进行(232中断优先级高于AD采集定时器中断的优先级),读取数据后立刻存入EEPROM 中然后退出中断。
随后在主程序中从EEPROM中读出这些值,作出相应变化。
100点采样时间共0.5s作为一个采样大周期,采样后还得进行滤波、流量计算的步骤,整个程序一个大周期设为1s(系统周期),也就是该差压式流量计1s 更新一次流量显示数值。
2.数字滤波部分设计
数字滤波主要有FIR、IIR两种滤波形式,这里考虑到信号特点和设计要求,选用FIR型数字滤波。
FIR数字滤波设计这里主要借助MATLAB中的滤波器设计和分析工具进行辅助设计。
如图,滤波器阶数设置为15阶,低通滤波器,采用窗函数的方法进行设计,窗函数选择Kaiser窗,采样频率设为200Hz,截止频率设为40Hz,设计好的滤波器如函数图所示。
改用汉宁窗设计的FIR滤波器如下图所示。
若进一步要求通带最大衰减3dB,阻带最小衰减25dB,发现汉宁窗更符合设计要求故最终采用汉宁窗进行FIR滤波器设计。
滤波器的的系数如上图所示。
再将MATLAB中的设计的滤波器通过Targets 中的Generate C header进行导出,导出如下(考虑到DSP定点运算和运算精度,系数矩阵已经进行量化)
之后只需将该头文件导入TI提供的CCS软件中,就能得到DSP的FIR滤波程序。
FIR滤波后得到100个采样值再进行中值滤波,先将100个采样值按大小排序,去掉最大的20个和最小的20个,再对剩下的60个数据进行算术平均,最后所得的数值作为这个采样大周期(0.5s)的采集数据。
中值滤波程序如下:
#define N 100 //定义获得的数据个数
char filter()
{
char value_buff[N]; //定义存储数据的数组
char count,i,j,temp;
int sum=0;
for(count=0;count<N;count++) //获取数据
{
value_buf[count]=get_data();
delay(); //如果采集数据比较慢,那么就需要延时或中断}
for(j=0;j<N-1;j++) //用冒泡法对数据进行排序
{
for(i=0;i<N-j;i++)
{
if(value_buff[i]>value_buff[i+1]
{
temp=value_buff[i];
value_buff[i]=value_buff[i+1];
value_buff[i+1]=temp;
}
}
}
for(count=10;cont<N-10;count++)
sum+=value[count];
return (char)(sum/(N-20));
}
3.AD采集程序
AD转换器AD977A与F2812是通过三线I/0接口连接,即读取/转换控制引脚R/C、数据引脚DATA、时钟引脚DCLK。
工作时,利用F2812片内定时器产生的中断,定时启动AD977A工作,设定为每5ms采样转换一次。
根据AD977A器件时序,用F2812控制这三线I/O接口的高低电平来驱动AD转换和读取数据。
当引脚R/C为高电平时,AD977A为读取转换数据模式;当引脚R/C为低电平时,AD977A进入模数转换模式。
F2812通过改变R/C引脚状态来控制AD977A完成信号采集和数据传输工作。
相关的数据采集程序如下:
#inelude”DSP28lx_Deviee.h”
#define ADC_RC GPioDataRegs.GPBDAT.bit.GPIOB0
#define ADC_DATA GPioDataRegs.GPBDAT.bit.GPIOB1
#define ADC_CLK GPioDataRegs.GPBDAT.bit.GPIOB2
long int Data;
int mark=0;
//初始化I/O口
Void InitIO(void)
{
EALLOW;
GPioMuxRegs.GPBMUX.all=0x0000;
GPioMuxRegs.GPBDIR.all=0x0005;
EDIS;
}
//读取AD977A的转换结果数据
int ReadADC(void)
{
int i;
int result=0;
ADC_CLK=0;
ADC_RC=1;
ADC_CLK=1;
for(i=0;i<16;i++)
{
result<<=1;
ADC_CLK=0;
if(ADC_DATA&&0x0001)
result|=0x0001; //读1
else
result&=0xFFFE; //读0
ADC_CLK=1;
}
return(result);
}
//设置定时器
void InitTimer()
{
EvaRegs.GPTCONA.all=0;
EvaRegs.T1PR=0x03D0; //定时周期为5.12us*(T1PR+1)=0.005s EvaRegs.T1CNT=0x0000;
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;
EvaRegs.T1CON.all=0x1740;
}
//中断服务程序
interrupt void eva_timer1_isr(void)
{
mark=1; //修改标记
EvaRegs.EVAIMRA.bit.T1PINT=1;
EvaRegs.EVAIFRA.bit.T1PINT=1;
PieCtrlRegs.PIEACK.all=PIEACK_GROUP2;
}
void main(void)
{
······
InitIO();
ADC_RC=0; //启动ADC转换
InitTimer(); //初始化定时器,打开定时器
······
for(;;)
{
······
if(mark==1)
{
mark=0; //修改标记
Data=ReadADC(); //读AD977A转换数据
ADC_RC=0; //启动ADC转换
}
······
}
}
4.流量计算程序
AD采样值经过数字滤波后,DSP从EEPROM中读出流量系数后,先计算瞬时流量(L/min),在计算累计流量(m3/h)。
累计流量为1h(这个系统周期与前3599个系统周期)瞬时流量的累积和。
程序如下:
void shunshi()
{
result_filter=result_filter>>16; //右移16位,相当于除以2^16 shunshi=result_filter*1000*C; //乘以满量程1000L/min和流量系数C return sunshiflow;
}
void leiji()
{
leijiflow=sunshiflow*60/1000/3600+leiji*3599/3600; //注意单位换算return leijiflow;
}
void outprint()
{
switch(print_type) //选择显示方式:瞬时流量/累计流量{
case 0:print (sunshiflow);break;
case 1:print (leijiflow);break;
default:print(error);break;
}
}。