本文从原理到实际应用 逐步分解 打造你自己的 气体流量传感器
基于ADS7835的气体流量计的设计
1.气体流量计的作用概述
气体流量计是计量气体流量的仪表。安装在管路中记录流过的气体量。可以测量,高炉煤气流量计,焦炉煤气质量流量计,煤气,空气,氮气,乙炔,光气,氢气,天然气,氮气,液化石油气,过氧化氢,烟道气,甲烷,丁烷,氯气,燃气,沼气,二氧化碳,氧气,压缩空气,氩气,甲苯,苯,二甲苯,硫化氢,二氧化硫,氨气 ………等等。
气体流量计被广泛适用于冶金、电力、煤炭、化工、石油、交通、建筑、轻纺、食品、医药、农业、环境保护及人民日常生活等国民经济各个领域,是发展工农业生产,节约能源,改进产品质量,提高经济效益和管理水平的重要工具在国民经济中占有重要的地位。在过程自动化仪表与装置中,气体流量计有两大功用:作为过程自动化控制系统的检测仪表和测量物料数量的总量表。
气体流量计的大概原理就是如下:把气体的流量大小通过流量传感器转为对应的模拟信号量输出,然后再利用AD 进行采集,转为能够被人视觉接受的数字信号。气体流量传感器的精度一般都在1%左右,所以采用TI公司提供的ADS7835完全能够满足设计要求,下面基于此进行分析:
- ADS7835的主要性能分析
ADS7835 是TI公司提供的12位高速低功耗模数转换器。此器件的有极低功耗,进入低功耗模式后,能量消耗仅为2.5MW;通过图(1)(ADS7835的内部构造图)。我们可以看出 ADS7835 有一个内部基准,这就为我们省去了额外加外部基准的成本。同时,也减少了PCB面积,方便更加小巧型的设计。
图(1)
ADS7835 提供了易用的SPI 串行接口,可以直接跟CPU(带SPI口的)直接相连或者跟软件模拟的 SPI 口相连接。这种简易的接口对于设计隔离的远程数据采集来说,减少了隔离器件的成本。 此器件的模拟输入范围是 —Vref 到+Vref,但是IC 本身的供电电压是+5V供电。这对于单电源供电的采集系统,需要测量负电压的时候 ,省去了提供负电源电路,利用ADS7835 可以直接测量 量程范围之内的负电压。
下面我们再来看一看ADS7835 与流量计设计比较密切的技术参数:
ADS7835的测试线性度是 0.8LSB,满量程误差是12LSB;气体流量传感器的精度一般都是正负1%; 这样一比较的话 ,我们可以得出ADS7835完全能够胜任流量的数据采集。流量计的输出电压范围一般是0——5V;而我们的ADS7835的正模拟电压输入范围是+2.5V(使用内部基准的情况下)。所以,我们要对流量传感器的输出电压 进行简单的降压措施,使之能满足ADS7835的正端模拟电压的输入求(后面具体电路会做说明)。图(2)是ADS7835的基本操作
想得到更加详细的关于此AD的说明,请登录以下TI官网
下面就基于ADS7835的基本操作图进行流量计的框图设计
原理框图概述: 模拟前端接收气体传感器的输出的模拟信号,进行处理完以后传送给ADS7835的模拟输入端。系统的MCU 定期对ADS7835进行数据的读数 ,处理完以后通过通信部分传送给上位机。测量部分电源跟通信部分电源分别是单独供电的。这样减少通信的干扰对AD采集造成的精度影响问题。
根据以上框图,我们进行原理图的基本设计
ADS7835的原理图
ADS7835 的模拟前端原理图
ADS7835 电源部分
CPU ,通信部分可以采用TI MSP430的火箭板,进行测试。有条件的话 ,用CC2540的蓝牙开发板进行无线通信传输测试更加完美。
下面是进行ADS7835 操作的底层代码,模拟SPI。仅供参考,因为不同的CPU,频率不一样,这就要求时序等待要求是不一样的。
ADS7835 操作代码
//====================采集一个点===========================
unsigned int ReadAD_7835(void) // 采一个点
{
unsigned char i;
unsigned int r;
CLOCK=0;
NOP;
NOP;
CONV=1;
NOP;
NOP;
CONV=0;
NOP;
NOP;
NOP;
CLOCK=1;
NOP;
NOP;
CLOCK=0;
NOP;
r=0;
CLOCK=1;
for(i=0;i<12;i++)
{
CLOCK=0;
NOP;
CLOCK=1;
r=r<<1;
if(R_DATA) r|=0x01;
NOP;
}
CLOCK=0;
NOP;
/*CLOCK=1;
NOP;
CLOCK=0;
NOP;
CLOCK=1;
NOP;
CLOCK=0;*/
//CONV=1;
//NOP;
CLOCK=1;
NOP;
CLOCK=0;
NOP;
CLOCK=1;
NOP;
CLOCK=0;
NOP;
CONV=1;
NOP;
r=r&0xfff;
return r;
}
unsigned int ReadADS_7835(uchar Num) // 定长采样点数
{
unsigned char i,t;
float ACQ;
unsigned int x;
float p ;
ACQ=0;
for(i=0;i<Num;i++)
{
Array[i]=ReadAD_7835();
if(Array[i]>0x7ff) Array[i] =0 ;// 负数清0
DelyUS(10);
}
SortData();
for(i=1;i<N-1;i++) ACQ=ACQ+Array[i];
ACQ = ACQ /(N-2) ;
//转换为电压计算
ACQ=ACQ/2047;
ACQ=ACQ*2500; // 2.5V
ACQ=ACQ*2 ; //硬件电路放大倍数
x = ACQ ;
/* p=FERROR;
ACQ=(ACQ-ZERROR/100)/(p/1000);
x=ACQ ;
if(Z_ADJUSTFLAG==1)
{
t=x*100;
ZERROR=t;
WriteSetup();
Z_ADJUSTFLAG=0;
ALLOW_ADJUST=0;
}
if(F_ADJUSTFLAG==1)
{
p=x;
p=(p*1000);
x=p/5000;
FERROR=x;
WriteSetup();
F_ADJUSTFLAG=0;
ALLOW_ADJUST=0;
} */
//x=FERROR;
return(x);
}
//====================数据排序===========================
void SortData(void)
{
uchar i,j;
int iTemp;
for(i=0;i<N-1;i++)
{
for(j=i+1;j<N;j++)
{
if(Array[j]<Array[i])
{
iTemp=Array[i];
Array[i]=Array[j];
Array[j]=iTemp;
}
}
}
}
以上电路经过测试,能达到设计指标。基于ADS7835的气体流量计的设计到此结束。