This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

【原创】+基于ADS7835的气体流量计的设计

Other Parts Discussed in Thread: ADS7835, CC2540

本文从原理到实际应用  逐步分解  打造你自己的 气体流量传感器

基于ADS7835的气体流量计的设计

1.气体流量计的作用概述

气体流量计是计量气体流量的仪表。安装在管路中记录流过的气体量。可以测量,高炉煤气流量计,焦炉煤气质量流量计,煤气,空气,氮气,乙炔,光气,氢气,天然气,氮气,液化石油气,过氧化氢,烟道气,甲烷,丁烷,氯气,燃气,沼气,二氧化碳,氧气,压缩空气,氩气,甲苯,苯,二甲苯,硫化氢,二氧化硫,氨气 ………等等。

气体流量计被广泛适用于冶金、电力、煤炭、化工、石油、交通、建筑、轻纺、食品、医药、农业、环境保护及人民日常生活等国民经济各个领域,是发展工农业生产,节约能源,改进产品质量,提高经济效益和管理水平的重要工具在国民经济中占有重要的地位。在过程自动化仪表与装置中,气体流量计有两大功用:作为过程自动化控制系统的检测仪表和测量物料数量的总量表。

气体流量计的大概原理就是如下:把气体的流量大小通过流量传感器转为对应的模拟信号量输出,然后再利用AD 进行采集,转为能够被人视觉接受的数字信号。气体流量传感器的精度一般都在1%左右,所以采用TI公司提供的ADS7835完全能够满足设计要求,下面基于此进行分析:

  1. 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的基本操作

                            图(2)

想得到更加详细的关于此AD的说明,请登录以下TI官网

              www.ti.com.cn/.../ads7835

 

下面就基于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的气体流量计的设计到此结束。