基于NDIR和PID传感器的气体检测系统设计
2020-04-18吴焱
吴 焱
(安徽工贸职业技术学院 机械与汽车工程系,安徽 淮南 232001)
0 引言
1 系统结构
NDIR+PID传感器气体检测系统硬件结构如图1所示,包括信号处理模块、数据处理模块和通信模块等。对NDIR传感器,信号处理模块包括红外光源和增益滤波电路。ADuCM360控制红外光源发出光脉冲,NDIR传感器根据检测到的光信号输出对应的电压值,本文采用的热电堆传感器输出最大mV级的电压信号,再经过增益滤波后传输给数据处理模块的AD7190采样。对PID传感器,信号处理模块包括带增益的IV转换和低通滤波电路。因为输出的是微弱电流信号,微弱电流经IV转换放大成合适的电压信号,经过低通滤波后送给数据处理模块的AD7190采样。AD7190把采样数据传给ADuCM360处理并通过通信接口传输。通信模块包括串口、USB和4~20mA的标准工业信号接口,可满足各种场合的应用。软件结构如图2所示,包括上位机与下位机两部分。下位机运行在检测硬件上,执行AD采样、DA输出和传输等功能。上位机运行在客户端,java存储程序存储采样数据到hsqldb数据库,LabVIEW监控程序显示采样信息。
图1 系统硬件结构图
图2 系统软件结构图
2 硬件设计
2.1 NDIR信号处理模块
2.1.1 红外光源驱动电路
采用MR3-1089为红外光源,驱动电压为5V时的驱动电流达到150mA可使红外辐射最大化以获得最佳性能。光源关闭时的灯丝阻值较低,这时光源开启会产生瞬间的电流浪涌,且红外光源的驱动电流较大,要避免灯的电流回路流经热电堆回路产生的电压失调误差。为解决上述问题,采用带软启动功能的稳压器ADP7105给光源单独供电,电路如图3所示。斩波频率范围从0.1Hz~5Hz,本文设为0.25Hz。ADP7105外接10nF的电容,软启动时间约12.2ms,是100ms最小斩波阶跃时间的0.122倍,电路可正常工作。
图3 热电堆信号处理电路
2.1.2 增益滤波电路
采用NDIR原理的热电堆气体传感器输出电压在几百微伏到几毫伏,后端连接的运放电路要具备高可调增益和很低的漂移和噪声,避免直流误差。本文采用最大偏置电流仅1pA的AD8605,电压噪声8nV/√Hz,低于热电堆46nV/√Hz的电压噪声。电流噪声10fA/√Hz,热电堆内部电阻84kΩ,电流流过的噪声为840pV/√Hz,影响极低。
热电堆电路如图3所示,ACT和REF分别是测量和参考输出,84kΩ内部堆电阻与电容8.2nF的CACT1组成低通滤波电路,-3dB截止频率约231Hz。RACT1、RACT2、CACT2与AD8605构成同相放大电路,CACT2是滤波电容,对低频信号电容可看作开路,对高频信号电容看作短接,此时的电路相当于一个电压跟随器,避免了对高频信号的放大,取值约15nF。该电路的截止频率为241.3Hz,22位阶跃函数建立时间10ms。NDIR最大斩波频率是5Hz,半个周期的脉冲宽度最小值100ms,同相放大电路的阶跃函数建立时间是它的0.1倍,电路可以使用。热电堆的满量程输出电压为1mVp-p,AD7190基准电压为2.5V,RACT1和RACT2取值236Ω和47kΩ,同相放大电路增益200,后续AD7190采样电路内部PGA设置为8,获得约1.6V的采样输入电压。如果要调整同相电路增益,可调节RACT1阻值,不建议调整RACT2,会影响电路主极点的频率。
针对上述问题,参考传统LNG气化站设计理念,以小型撬装式气化站为主体,充分考虑空间的局限,采用管道分析软件CAESARⅡ对撬装式LNG气化站管线进行应力分析,以保证小型撬装式LNG气化站能够安全运行。
图4 NTC电路
2.2 PID信号处理模块
2.2.1 IV转换电路+低通滤波电路
电流输出型传感器常采用IV转换和可编程增益以最大程度提高动态范围,PID传感器的输出电流非常小,可看作电流源并联分流电容和分流电阻,电容和电阻的典型值在150pF和600MΩ。通过IV转换的反馈电阻RF把电流转换成电压,RF取值1MΩ。RF会在反馈环路中产生一个低频极点导致运算放大器振荡。为了保持电路稳定需要并联一个反馈电容CF。CF会影响电路的最高带宽,选择小电容可以带来高的带宽和低的相位裕量,但可能会导致输出振荡,本文取值4.7pF,信号带宽34kHz。
为实现IV转换后的电压信号放大,有两种常用方法:
(1)IV转换+PGA,如图5(A)所示。
(2)带可调增益的IV转换,如图5(B)所示。
不使用PGA,采用1MΩ+4.7pF(PGA=1)和10MΩ+0.47pF(PGA=10)两种情况进行对比,带宽依然是34kHz。前者最终的总噪声依然是50μVrms,后者因为RF阻值较大,相应的三种噪声源数值也增加,分别为NCURRENT≈114uVrms,NRF≈93uVrms,fp1≈70kHz,NOP≈791uVrms,,总噪声约805uVrms,经RC低通滤波后总噪声约460uVrms。所以,采用带增益的IV转换电路噪声表现优于IV转换+PGA的组合电路方式。
图5 PID信号处理模块
本文采用图5(B)的电路。
2.3 数据处理和通信模块
2.3.1 ADC
AD7190是24位,具有片内极低噪声可编程增益的AD,可直接采样小信号数据。具有四个伪差分(单极性)或两个差分(双极性)模拟量输入通道,每个通道都可以被配置为缓冲或无缓冲模式。无缓冲模式时输入通道的模拟输入电流会导致动态的负载,需要合理选择电阻电容数值降低增益误差,如表1所示。本文选择无缓冲模式,模拟量输入通道前接电压跟随器。AIN1-AIN2是热电堆输入,AIN4是PID传感器输入,AINCOM是参考端。AD7190与MCU的通信通过CS、DIN、DOU/RDY和SCLK完成,CS是器件选择引脚,DIN引脚用于向寄存器写入数据,DOUT/RDY用于指示采样完成和读取采样数据,SCLK是时钟引脚,AD7190的所有操作都是基于SCLK时钟进行的。AD7190片内包含多种寄存器,对它的操作是通过配置寄存器实现的,关键的寄存器有:(1)通信寄存器,对AD7190的操作从通信寄存器开始,写入通信寄存器的数据指示下一步要操作的对象和读写操作状态。(2)状态寄存器(000),只读寄存器,读取AD7190的各种状态,如是否就绪,是否发生错误。(3)模式寄存器(001),用于设置AD7190的工作模式,如连续转换、单次转换等。(4)配置寄存器(010),用于设置AD7190是单极性还是双极性,是否使能缓冲器,PGA增益等。(5)数据寄存器(011),只读寄存器,读取AD采样的结果。以连续转换模式为例,AD7190上电后默认是该模式,CS拉低选中AD7190,向DIN写入0x58指示下一步从数据寄存器读取采样数据,当DOUT/RDY为低电平,指示转换完成,从DOUT/RDY读取采样数据,完毕后DOUT/RDY为高电平,表明读取操作完成。如果要设置为单次转换,流程如下:向DIN写入0x08,指示下一步要写入模式寄存器(001),之后向DIN写入0x280060,把模式寄存器的MR23-MR21位置为001,AD7190为单次转换模式,在一次转换完成后,DOUT/RDY变为低电平,向DINI写入0x58,指示下一步要读取数据寄存器,然后从DOUT/RDY读取采样数据,完成后DOUT/RDY变为高电平,操作结束,AD7190进入省电模式。上述模式的特点在于每次读取前都要向寄存器写入数据进行配置,操作较为繁琐。AD7190提供了连续读取模式,该模式下只需要配置一次,之后的采样结果会自动放置在DOUT/RDY上。向DIN写入0×5C,配置通信寄存器的CR2位为1,激活连续读取模式,DOUT/RDY为低采样完成,数据读取完成DOUT/RDY为高,等到下一次采样结果可用时DOUT/RDY为低,可直接读取。要注意,所有操作都要在SCLK的时钟信号下进行。
以热电堆传感器采样为例,向通信寄存器写入0x10指示下一步操作配置寄存器,然后向配置寄存器写入0x00F00B,通道选择AIN1到AIN4,增益8,单端输入。之后向通信寄存器写入0x08指示下一步操作模式寄存器,向模式寄存器写入0x0003FF配置时钟、输出速率和连续采样模式。根据数据手册,热电堆数据采样速率设置在3.5~483Hz可获得最佳噪声性能,本文AD采样速率设置为10Hz,热电堆的输出数据在2s半周期内的后1.5s以10Hz采样率获得,可以保证信号的完整性。最后向通信寄存器写入0x58读取数据寄存器的采样数据,完成操作。
2.3.2 通信模块
考虑到可能的应用场合,提供了串口、USB和4~20mA标准输出三种接口。串口和USB分别采用ADM3202和MCP2200,这里不再赘述。AD5420+AD5700提供了4~20mA的标准输出且兼容HART的通信接口,可方便接入包含变送器的应用场合。HART是双向数字通信,它改变了传统4~20mA每次只能进行一个过程变量的单向通信的限制,通过在4~20mA信号上调制一个1mA p-p FSK信号实现,包含1200Hz和2200Hz移频。电路如图6所示,AD5420是一款16位电流输出DAC,AD5700是一款低功耗HART调制解调器,AD5700的HART_OUT引脚输出HART信号,交流耦合到AD5420的CAP2引脚,之后HART信号就会出现在AD5420的IOUT输出端。CAP2与HART_OUT和AVDD间的电容要确保FSK输出没有失真,C2和C3取值分别为2.2nF和22nF。AVDD采用24V现场供电,旁路电容采用10uF+0.1uF并联形式,10uF采用钽电容,0.1uF采用低ESR和ESI的陶瓷电容,可以较好的处理内部逻辑开关引起的瞬态电容。如果驱动负载难以确定,IOUT和GND之间要外接0.01uF电容,能保证驱动超过50mH的负载。考虑到工业环境可能的瞬态高电压,采用电阻、钳位二极管和TVS保护AD5420,电阻取值要考虑IOUT流过的压降在AVDD-2.5V以内,这里取值18Ω,最大降压0.36V。IOUT和AVDD都外接了TVS,IOUT与AVDD和GND间配置钳位二极管。AD5700采用外接带通滤波器将电流限制在能够满足本质安全的水平,电阻取值150kΩ。
图6 4~20mA输出电路
AD5420的操作涉及到多个寄存器,24位移位寄存器由地址字节+数据字组成,DB15-DB0是数据字,DB23-DB16是地址字节,确定要操作的对象,如控制寄存器、数据寄存器等。如果要激活回读功能,DB23-DB16设置为00000010,此时的DB1-DB0是读取地址,取值范围从00~10,分别表示读取状态寄存器、数据寄存器和控制寄存器。以回读数据寄存器为例,写入0x020001到移位寄存器,设置读取数据寄存器,接着写入NOP条件0x000000,在该写操作期间,数据寄存器中的数据可在SDO上读取。向移位寄存器DB23-DB16写入0x55可寻址控制寄存器,DB15-DB0可设置各种功能:DB15-DB14取值00,DB13是REXT,用于选择外部电流设置电阻。DB12是OUTEN,置1输出使能。DB11-DB8是SLEW RATE数字压摆率时钟,DB7-DB5是SR步进,DB4是SREN,使能SR,DB3是DCEN,使能daisy chain,DB2-DB0选择输出范围,设置为101输出4~20mA电流。向移位寄存器的DB23-DB16写入0x01寻址数据寄存器,DB15-DB0是要写入的数据。AD5420的配置流程如图7所示,首先向移位寄存器写入0x551005配置控制寄存器,不选择外部电流设置电阻,输出使能,禁用数字压摆率控制,输出4~20mA电流。之后再把AD采样数据写入数据寄存器,完成配置。
图7 AD5420配置流程图
3 软件设计
3.1 下位机设计
图8 下位机流程图
3.2 上位机设计
3.2.1 hsqldb数据库
采用java内置的hsqldb数据库实现数据存储功能,hsqldb提供了服务器、standalone、内存和web服务等四种模式。standalone的数据保存在本地文件,跟随java虚拟机启动,JDBC实例是jdbc:hsqldb:file:数据库文件路径。内存模式的数据都保存在内存中,程序结束的同时数据也被销毁,JDBC实例是jdbc:hsqldb:mem:数据库名称。服务器模式下hsqldb与其他数据库一样,JDBC实例是jdbc:hsqldb:hsql://localhost:端口号/数据库名称。Web服务同服务器模式类似,只是通过http协议传输数据,本文采用服务器模式。
hsqldb安装流程如下:(1)安装数据库:在hsqldb官网下载并解压数据包,在PC端合适位置建立数据库文件夹hsqldb,在hsqldb建立database、data和lib目录,把解压缩数据包的libhsqldb.jar复制到该目录。(2)创建数据库:首先要保证java已经配置到path路径下,在cmd命令行模式下进入hsqldbdata目录,执行java-cp../lib/hsqldb.jar org.hsqldb.Server-datatbase qitijiance,在data目录下创建了qitijiance数据库。此时的data目录下有3个新建的文件,其中.properties是qitijiance数据库的配置文件,可根据需要修改端口号等信息。.lck是锁状态,.log是运行和操作的历史记录信息。之后进入database目录,建立runmanager、runmanagerswing和runserver2.bat文件,执行runserver2.bat启动hsqldb数据库。(3)配置数据库:执行runmanager.bat打开GUI界面,配置数据库的详细内容,如驱动名称、JDBC连接、用户名、密码、服务器模式等。之后点击OK确认,连接到qitijiance数据库。(4)操作数据库,执行SQL语句进行创建表等操作。
3.2.2 基于java的数据存储
3.2.2.1 基于串口的通信
采用java实现数据存储功能[7,8],在eclipse环境下开发。串口下的java包有3类,第1类是SUN提供的comm2.0和comm3.0,前者支持Windows,后者支持Linux。第2类是IBM提供的串口API。第3类是其他开源的API。本文采用comm2.0jar包,在eclipse环境下开发,把win32com.dll、comm.jar和javax.comm.properties分别复制到bin和jrein目录、lib和jrelibext目录、lib和jrelib目录下。如果要在64位环境下开发,可以采用rxtxjar包。eclipse环境的JRE指定为JDK的安装路径并导入hsqldb.jar、comm.jar包。串口读取并存储的操作流程如下:(1)获取本地串口:列举出本地所有的串口并打开需要的串口,涉及到serialport和commportidentifier类,通过getPortIdentifiers静态方法获取本地串口,Enumeration> allPorts = CommPortIdentifier.getPortIdentifiers(); com1 = CommPortIdentifier.getPortIdentifier(“COM1”);再通过open方法打开,serialcom1=(SerialPort)com1.open(“OpenerAndCloser”, 1000); setSerialPortParams方法用于设置串口的参数。(2)从串口读取数据,一般有轮询和事件监听两种模式,前者在固定的时间间隔扫描串口,有数据就执行读取操作,后者注册串口事件监听类,有数据就自动触发事件,在响应方法中读取数据。本文采用事件监听模式,实现serialporteventlistense类,重写serialevent方法,实现监听逻辑。定义输入流datastream= serialcom1.getInputStream(),添加监听事件对象serialcom1.addEventListener(this),serialcom1.notifyOnDataAvailable(true),重写监听方法,定义读取数据缓存数组byte[]datacache,如果串口有可用数据event.getEventType()==SerialPortEvent.DATA_AVAILABLE,把串口数据保存到缓存数组中datastream.read(datacache)。(3)把数据存储到数据库,初始化hsqldb的jdbc驱动,class.forname(“org.hsqldb.jdbcDriver”),获取hsqldb数据库的连接,connection hsqldb_c=drivermanager.getconnection(“jdbc:hsqldb:hsql://localhost:端口号/qitijiance”,”用户名”,”密码”),如果采用其他模式,JDBC的实例语句也要做修改。statement exec_st= hsqldb_c.createstatement(),执行exec_st.execute(SQL语句)把串口数据存储到数据库中。
3.2.2.2 基于USB的通信
采用libusbjava实现基于USB通信的数据存储,libusbjava是对libusb的java封装包,首先要安装libusb,在官网下载libusbjava支持的1.0.19源码解压缩,复制libusb-1.0.dll到c:windowssystem32。之后安装libusbjava,下载最新版本源代码,复制libusbjava-*.dll到c:windowssystem32,复制liggcc_s_seh-1.dll等mingw c++标准库到c:windowssystem32,如果已经安装了mingw就不用复制了。导入libusbjava.jar到当前工程文件,如果是java8版本,复制libusbjava.jar到c:windowssunjavalibext,如果是9或更新的版本,安装eclipse的libusbjava插件。安装完成就可以在java项目利用libusbjava读取USB数据并存储了:(1)初始化libusb,创建一个新的context,usb_ctx=new Context()。(2)根据VID、PID查找USB设备,VID和PID数值要与下位机一致usb_dev=Device.search(usb_ctx,VID,PID)。(3)打开设备,申明希望的接口,usb_dev.open(),usb_dev.claimInterface(interface number)。(4)从USB读取数据,保存到数据库中。usb_dev.readBulk(endpoint,data,length,0),之后的保存操作同3.2.2.1节的(3)步。(5)释放接口,关闭设备,usb_dev.releaseInterface(interface number),usb_dev.close()。
3.2.3 基于LabVIEW的上位机
因为LabVIEW没有提供数据库访问功能,采用第三方插件labsql实现基于ODBC的数据库操作。该插件应用简单,只需把解压后的文件夹保存到LabVIEW安装目录下的user.lib文件夹下即可。这里需要注意,hsqldb从2.0版本开始提供ODBC访问功能,支持所有的SQL语句操作,但是暂时还不支持元数据。可通过安装PostgreSQL ODBC驱动实现,推荐11及以上版本。安装PostgreSQL ODBC version11,打开管理员工具进入ODBC,添加PostgreSQL数据源并配置:data source就是ODBC数据源的名称,labsql就是根据这个名称找到数据对象的,一定要保证正确。database是本机上hsqldb数据库的名称。server是本机的名称,可以写localhost。user name和password是hsqldb数据库的用户名和密码,ssl mode暂时还不支持。之后点击test进行连通性测试,完成配置。LabVIEW的操作流程如下:首先执行ADO Create Conn.vi创建connection对象,把connection和DSN参数传给ADO Open Conn.vi实现与数据库的连接,DSN要与ODBC中的配置一致。ADO SQL Execute.vi执行select语句,从数据库读取数据传给控件显示,最后执行ADO Connection Close.vi关闭连接。
4 测试与小结
采用海曼CO2热电堆传感器+S1226+串口通信进行系统测试,CO2传感器测量满量程50ppm的CO2气体,已进行过校正处理,上位机显示如图9所示。PID传感器输出微弱电流信号,采用S1226光电二极管模拟,最大输出500pA,采样显示如图10所示。本文设计了基于NDIR和PID传感器的气体检测系统,详细介绍了传感器采样电路的基本原理和关键参数选择,AD采样和4-20mA输出的配置流程。采用java+hsqldb实现了串口、USB通信的数据存储,基于LabVIEW+ labsql+ PostgreSQL ODBC实现了数据库读取和显示功能。测试表明系统具有良好的稳定性和可靠性,满足应用需求。
图9 C02采样图
图10 S1226采样图