1、内容目录1 引言1.1 多元气体校准仪工作原理1.2 多元气体校准仪的组成2 系统概述2.1 特性2.2 Motorola MC68HC912DG128A简介2.3 系统概述3 系统硬件3.1 压力流量采集电路3.2 臭氧紫外灯检测驱动控制电路3.3实时时钟电路3.4 电磁阀等驱动电路3.5 质量流量控制电路4 系统软件4.1 软件模块结构4.1.1各模块介绍4.1.2 主程序说明4.2 软件系统细节设计说明4.2.1 软件开发工具介绍4.2.2 硬件控制涉及原理多元气体校准仪摘要:本文介绍了用Motorola的16位微控制器MC68HC912DG128A设计的分析仪器中的多元气体校准仪。其特
2、点是采用特殊的放大器放大传感器的弱信号;用高精度的质量流量控制器精确控制小流量的气体,控制精度为0.23%;用高精度热敏电阻及定制加热器使温度控制在500.1。关键词 :校准仪、流量控制、温度控制、测量1 引言大气污染监测是环境保护工作者的眼睛,用空气质量自动监测系统可以长期监测空气中有害气体的数量、分布、动向等,为消除危害、改善环境、保护人民健康提供资料。大气污染是由固定污染源(工厂烟囱)和流动污染源(如汽车)排放的污染物经扩散形成的。大气污染的特点是范围大、随时间变化,受气象、季节、地形等影响。这样对于空气污染的监测必须在一个地区同时进行多点连续监测,通过对自动记录的大量科学数据的分析研究
3、,才能准确地掌握这一地区空气污染情况。目前空气污染最有效的监测方法是建立空气污染自动监测系统,即在一个城市、一个区域或一个国家组成一个监测网,它由一系列的监测站和一个中心站组成。各监测站与中心站之间保持自动的信息联系,并接受中心站的控制和指挥。监测站中安装的仪器类型由计划测定的污染物种类决定,我国目前主要监测3项指标:SO2、氮氧化物(NO、NO2)、PM10。空气污染监测仪器一般不能直接测定绝对浓度,而是采用相对法,因此仪器的准确度决定于校正的标准。SO2、氮氧化物就是需要定期校正的气体,校正方法是用标准气体进行动态校正。本仪器就是为此目的设计的。多元气体校准仪的主要功能是为空气监测系统的其
4、他仪器(氮氧化物分析仪、二氧化硫分析仪)提供已知浓度的标气用于校标。在空气监测系统中有SO2、氮氧化物、CO等多种气体分析仪,这就要求校准仪能够配置多种标准气体,故称为多元气体校准仪。多元气体校准仪主要由气路部分、电路部分组成。其中电路部分是本文的核心部分,具体有:多元气体校准仪的空气监测系统可用在环境监测部门或大工矿企业,用于测定空气污染。通过扩展外围器件如调制解调器等,还可以使用远程控制功能来有效地监督厂矿的气体污染治理情况。本气体校准仪留有足够的接口,供用户根据自己的需求进行功能扩展,满足用户的各种需求。因此,无论是从仪器本身的功能,还是从满足用户需求方面来看,该多元气体校准仪的设计应用
5、的前景将是十分广泛的。1李晶皎教授,指导教师,东北大学-摩托罗拉实验室主任1.1 多元气体校准仪工作原理多元气体校准仪采用动态配气,即将已知浓度的钢瓶标气以较小的流量,恒定不变地送入混合室中(见图1),零气(净化后的空气)以较大的流量恒定不变地通过混合室,与标气混合并将其稀释,稀释后的混合气体连续不断地从混合室流出,供被校准的仪器(例如SO2分析仪)使用。准确测量这两个气流之比就是稀释倍数,混合气体的浓度可从稀释倍数计算出来,调节气流之比可以得到所需浓度的标气。标气浓度计算如下:其中 C混合气浓度(或被稀释气体的最终浓度)C0钢瓶气浓度Q0钢瓶气流量Q零气流量动态配气的气路流程如图1所示。为了
6、得到准确的配气浓度,对钢瓶气与稀释气的流量测量必须准确,而且稳定。为此,使用了高精度的质量流量控制器,零气的量程为10SLPM(标准升/分),钢瓶气流量为100cc/min。由于无法购买NO2钢瓶气体,在校准氮氧化物分析仪的二氧化氮时需要使用气相滴定法(GPT)来动态配制二氧化氮气体。GPT的基本原理是一氧化氮与臭氧之间的快速气相反映:NO+O3=NO2+O2当NO过量时,NO2生成量=NO消耗量=O3量。因此,已知O3浓度就可以知道NO2的浓度。校准仪将过剩的NO与特定浓度的臭氧混合产生NO2。用零气和适当流量的已知浓度的NO钢瓶标气进行精确混合产生所需浓度的NO。臭氧浓度由臭氧发生器控制。
7、图1 多元气体校准仪气路框图基于以上的背景,选用MC68HC912DG128A微控制器,实现多元气体校准仪的功能:即用装在钢瓶中的已知浓度、且浓度很高的SO2、NO、CO等标气,分别配置所需浓度的标气供SO2、NO、CO等分析仪校标时使用。1.2 多元气体校准仪的组成多元气体校准仪的器件组成如图2所示,具体有:l 2个质量流量控制器(Mass Flow Control, 简称MFC),分别用于产生准确浓度的零气和标气l 5个电磁阀,分别控制零气输入和SO2、NO、CO等标气的输入l 1个臭氧发生器其中质量流量控制器由质量流量传感器和电磁阀组成,阀自动地开启和关闭与所需流量成比例。MFC的满量程
8、电压是5V,由微控制器输出的控制电压送到MFC,MFC根据此电压设定流量,传感器的输出电压反馈到微控制器,以实现更精确的流量控制。校准仪中包含臭氧发生器是由于NO2的腐蚀性,很少能用钢瓶盛装,所以在校准仪内配备产生NO2的气相滴定反应设备,使NO与O3反应生成NO2。臭氧发生器是通过低压汞灯在波长185nm处紫外光照射空气产生臭氧。产生的臭氧量与185nm紫外光的强度成正比。强度依赖于灯的温度和电流,灯的温度保持在50C,灯的电流变化产生不同浓度的臭氧,灯的强度由光学探测器来控制以产生稳定的灯强,从而保持一定浓度的臭氧的产生。校准仪通过RS232接口同空气质量监测系统中的工控机相连,实现标气选
9、择、浓度设置、校零和校标的时间设置等。图2 多元气体校准仪的器件组成2 系统概述2.1 特性l 基于MC68HC912DG128Al 1台仪器可校准空气中的多种气体l 也可校准用户自定义的其他气体l 针对不同的气体有不同的产生方式,如用紫外光产生臭氧、用NO和O3反应产生NO2等l 利用“质量流量控制器MFC”精确的测量和控制零气与标气的流量l 校准仪机箱温度控制、臭氧发生器温度控制l 用芯片内部10位AD转换器,测量温度和压力、流量传感器信号l 实时时钟l 电磁阀输出控制l 风扇控制l 掉电保护2.2 Motorola MC68HC912DG128A简介本设计选用MC68HC912DG128
10、A,其理由是校准仪原设计采用MC68HC11A1,因MC68HC11A1已经停产,同时新设计的校准仪需要增加一些新功能,8位的MCU功能不能满足本仪器需求,故选用MC68HC11的升级产品16位的微控制器MC68HC912DG128A。1. 4路PWM(脉宽调制)输出,在本系统中共使用3路:2路用于控制零气和标气的质量流量控制器,1路用于控制臭氧发生器的紫外灯的灯强。2. 内置的10位ADC能满足本仪器采样精度的需要,最多可支持16通道,在本系统中共使用6通道:温度信号使用3通道,压力信号使用2通道,流量信号使用1通道。3. 用通用I/O端口做输出控制电磁阀驱动电路、控制风扇和臭氧加热器。4.
11、 用内置COP模块实现看门狗功能,防止软件死锁。5. 用内置的128K闪存存储系统程序,用2K E2PROM存储本机的设置和主控工控机对本机的设置。8K RAM用于程序运行时通讯、运算等的临时存储区。6. 将实时时钟芯片与内置的SPI相接,用于本机的计时、自动校准及与监测系统保持时间同步。7. 通过内置的SCI接口,将校准仪同主控工控机相连,实现数据传输和交互。8. 丰富的I/O端口,为进一步扩展系统功能提供可能。例如,通过具有唤醒功能的端口H接入键盘,用通用I/O端口接LCD显示屏等。2.3 系统概述多元气体校准仪主要完成的功能是为空气质量监测系统中的分析仪器校准时提供所需浓度的标气。例:要
12、为二氧化硫分析仪提供浓度是400PPB、总流量为5000CC/min的SO2标气。其中钢瓶气体SO2浓度为100PPM。操作程序如下:(1) 通过主控工控机进行如下设置:设置屏幕/标气设置标气设置标气:SO2单位:PPB小数点位数:0稀释D/滴定G:D进气电磁阀位置(1-4):1钢瓶标气浓度:100000设置屏幕/校准序列设置序列设置序列号(0-99):01总流量(CCPM):5000钢瓶气体流量:20零气流量:4980标气浓度(PPB):400根据标气设置和校准序列设置的数据,系统内部要进行如下验算:钢瓶气体流量=(400PPBX5000CCPM)/100000PPB=20CCPM零气流量=
13、5000CCPM-20CCPM=4980CCPM(2) 通过主控工控机启动校准序列控制屏幕/开始一个序列开始一个序列开始停止系统做如下操作,根据设置的进气阀位置打开相应的电磁阀和零气电磁阀;根据标气的类型,打开监测系统阀板上与二氧化硫分析仪相连的电磁阀,使校准仪产生的标气输入SO2分析仪。零气和标气的质量流量控制器的流量根据设定的流量进行精确控制。气体流动是靠压差实现的,钢瓶气经减压阀调整为30PSI后与校准仪入口相接,零气来自于零气发生器,压力为30PSI。而校准仪输出气体的压力是15PSI,这样15PSI的压力使气体从入口流向出口。通过系统主程序的轮询检测机箱温度状态,并将温度检测结果通过
14、RS232接口,送主控工控机显示。3 系统硬件 系统硬件电路由温度采集电路、压力流量采集电路、电磁阀驱动控制电路、臭氧灯驱动控制电路、质量流量控制器控制电路、串行通讯电路、实时时钟电路等组成。主控芯片选用MC68HC912DG128A,具体电路框图如图3所示。本系统使用电源有:+5V、+15V、-15V、+24V,主要由开关电源模块提供,开关电源的输入为220V交流电。3.1 压力流量采集电路压力流量采集电路的原理图如图4所示,用霍尼韦尔公司的气流质量传感器测量臭氧的质量流量,用Motorola公司的压力传感器测量臭氧压力。为保证传感器信号的弱信号很好放大,采用精密仪器用放大器INA114。压
15、力信号放大后从DG128A的AD通道PAD4输入,质量流量信号从DG128A的AD通道PAD5输入,转换成10位的数字信号,参与臭氧流量计算,并闭环控制紫外灯的灯强,从而保证臭氧的恒定流量。3.2 臭氧紫外灯检测驱动控制电路本电路如图5所示,由2部分组成:紫外灯驱动控制电路和紫外灯灯强检测电路。由于紫外灯点亮需要非常高的电压,故用DG128A的PA0、PA1做控制端,控制开关管Q3、Q4的导通和截止,经变压器T1将交流电升至所需电压。将DG128A的PWM2输出,经RC滤波、放大后用于控制紫外灯的灯强。紫外灯灯强检测采用光电管,由于光电管的电信号很弱,故信号放大器采用OPA128高精度、高输入
16、阻抗的精密运放。放大后的信号输入到DG128A的AD通道PAD3,转换成10位的数字信号,用于运算,参与灯强控制。3.3实时时钟电路 电路如图6所示,实时时钟芯片选用SPI接口的DS1305,用DG128A的SPI接口对DS1305进行设置。当计时时间到,由DS1305的中断输出产生中断请求信号,并将其接入DG128A的中断请求输入端IRQ,由DG128A用SPI的3条信号线与DS1305传送数据。3.4 电磁阀等驱动电路本电路如图7所示,用DG128A的PT端口做通用I/O口,数字信号经74LS374锁存后,通过集电极开路门的驱动芯片,用于控制电磁阀、风扇和臭氧加热器等。该电路有2组组成,分
17、别用DG128A的PA2和PA3控制74LS374的选通,分别控制本机输出驱动和监测系统的输出选通。风扇由热敏电阻测量的机箱温度控制,例如,当机箱温度高于34(用户可设置)启动风扇运转,当机箱温度低于32(用户可设置)风扇停止运转。臭氧加热器由臭氧发生器中的热敏电阻控制,其温度控制在500.1,热敏电阻的精度为1%。3.5 质量流量控制电路为了精确控制小流量的气体质量流量,选用高精密的质量流量控制器,零气的MFC选用量程为10SLPM,标气的MFC量程为100CCPM。MFC需外加+15V、-15V电压,输入的控制电压为05V与0满量程相对应,MFC产生输出电压用于与输入控制电压相比较,实现闭
18、环控制。MFC与微控制器的连接关系如图8所示。图3 系统硬件框图图4压力流量采集电路图5臭氧紫外灯驱动控制电路图6 实时时钟电路图7 电磁阀等驱动电路图8 质量流量控制电路4 系统软件4.1 软件模块结构根据需求分析以及随后的系统分析和可行性分析,我们采用的是基于前后台的控制方式:前台为各种事件的响应代码,以中断服务程序为主;后台是主流程循环以及各种的定时性操作。整个软件结构按功能可以分为下面几个模块。4.1.1各模块介绍在整个的多元气体校准仪系统的软件总体设计上,采用的是模块化的设计方法。这样便于协同开发并且在功能扩展和系统以后的升级上都十分方便。串行通讯控制模块在整个系统的正常执行流程过程
19、中,只要一有中断事件的发生就会引起相应的事件处理代码的执行即中断服务程序的响应。由于在实际的应用中,用户与本多元气体校准仪的主体硬件架构是分离的,甚至可以远在两地,并且主控于具体执行部分是分离的,所以在两者之间的通讯实现上要考虑上位机发来的ASCII码的速度问题。速度太慢、速度适中和速度很快的情况下都应该能够顺利的完成通讯。在具体实现策略的选择上我们考虑了两种方案:一个是查询(Poling)方式;一种是采用中断的实现方式。在查询方式下,由主流程在一个主循环里反复的通过检查特定寄存器的特殊位是否置位来判断是否有数据来到,而这部分必须与一些实行性操作控制代码顺序执行(在主循环体的内部),这就导致了
20、较慢的响应甚至明显慢于前后台的平均响应;而且在实际的应用中由于上位机软件可能是先截获用户的键盘输入,再以较快的速度将收到的字符流一起发送给执行硬件模块。在这种方式下,查询方式就很有可能造成数据的丢失。在中断的实现方式下,在各种中断处理事件没有发生时CPU只进行各种实时性以及主控流程的执行。这样就一方面保证了CPU的效率问题,另一方面也保证了及时的处理收到的数据(省去了实时性代码的执行时间)。在具体的软件开发中,两种方式我们都实现了。查询方式比较易于调试,可以用来检查软件系统的其他模块的正确性;而中断方式则对应用的支持比较好,我们决定在最后向Flash存储器里面下载该种方式下的系统代码。下面简述
21、一下中断方式下的串行通讯模块。此模块我们设计了几个子模块:发送模块和接收模块、实时接收模块(SCI1的中断服务程序)。图9串行通讯流程图下面是串行通讯接收模块的代码。分为两个部分:接收初始化代码和接收执行代码。发送模块类同。初始化代码主要是通过给DG128A的与SCI1相关的寄存器使其工作在接收模式下。;这是通过SCI接收ASCII 字符流的初始化代码INITRECE: TPA;Transfer CCR to A accumulator ORAA #$10 ; ORed A with #$10 to Set I bit TAP ; Transfer A to CCR MOVB #$34,SC1
22、BDL ;Set BAUD =9600, in SCI1 Baud Rate Reg. MOVB #$00,SC1CR1 ; Initialize for 8-bit Data format, ;Loop Mode and parity disabled,(SC1CR1) MOVB #$0C,SC1CR2 ; Set for No Ints, and Transmitter and Receiver enabled(SC1CR2) ;清零RDRE标志这个动作可以分为2步。 LDAA SC1SR1 ; 1st step to clear TDRE flag: Read SC1SR1 LDD SC
23、1DRH ; 2nd step to clear TDRE flag: Read SC1DR register RTS ;Return from subroutine ;这是通过SCI接收ASCII 字符流的执行代码 ;接口如下:接收到的数据存放到B寄存器,只接收一个字符.;返回值:B寄存器:为正-接受了一个字符;FF-没有收到字符TRANSRECE: BRCLR SC1SR1,#$20, TRANSRECE1 ; Wait for RDRE flag LDABSC1DRL PSHB LDAA SC1SR1 ; 1st step to clear RDRE flag: Read SC1SR1
24、LDD SC1DRH ; 2nd step to clear RDRE flag: Write SC1DR register PULB RTS TRANSRECE1: ; else Transmission complete, Return from Subroutine ldab#$FF;indicate there is not char RTS ;这是通过SCI发送ASCII 字符流的初始化代码 ;接口如下:X寄存器所指向的字符串是要通过串口发出的 INITSEND: TPA ; Transfer CCR to A accumulator ORAA #$10 ; ORed A with
25、#$10 to Set I bit TAP ; Transfer A to CCR MOVB #$34,SC1BDL ; Set BAUD =9600, in SCI1 Baud Rate Reg. MOVB #$00,SC1CR1 ; Initialize for 8-bit Data format, ;Loop Mode and parity disabled,(SC1CR1) MOVB #$08,SC1CR2 ; Set for No Ints, and Transmitter enabled(SC1CR2)清零TDRE标志这个动作可以分为2步。Ldab LDAA SC1SR1 ; 1s
26、t step to clear TDRE flag: Read SC1SR1 STD SC1DRH ; 2nd step to clear TDRE flag: Write SC1DR register ; LDX #DATA ; Use X as a pointer to DATA. RTS ;Return from subroutine;这是通过SCI发送ASCII 字符流的执行代码 TRANSSEND: BRCLR SC1SR1,#$80,TRANSSEND ; Wait for TDRE flagldab,x cmpb#$16 beqtransexit stab SC1DRL ; Tr
27、ansmit character, increment X pointer inx braTRANSSEND ; If last char. not equal to eot, Branch to TRANStransexit: RTS ;这个函数的入口是将B寄存器里的ASC码通过SCI发送出去 SENDCHARBRCLR SC1SR1,#$80, SENDCHAR ; Wait for TDRE flag stab SC1DRL RTS 下面是SCI1中断服务程序的主要流程。由于一些开发环境的要求,分为以下2个部分来实现。;下面是SCI1的中断服务程序的主要功能模块zgSCI1:BRCLR
28、SC1SR1,#$20,zgSCI11 ; Wait for RDRE flagLDABSC1DRLPSHB;下面是将中断标志清除,这步很重要,忘记清除的话将会引起中断的循环嵌套LDAASC1SR1 ; 1st step to clear RDRE flag: Read SC1SR1LDDSC1DRH ; 2nd step to clear RDRE flag: Write SC1DR registerldxdotptrpulbstab,Xinxstxdotptr pshbsubb#$0dpulb ;出栈指令不影响标志位bnezgSCI1m3jsrPROCDOTCMD;是回车,则处理点命令缓冲
29、区里的点命令movw#DOTCMDBUF,dotptrbrazgSCI11zgSCI1m3:cpx#DOTCMDEND;看是否到了点命令缓冲区的末尾bnezgSCI11movw #DOTCMDBUF,dotptr;到结尾,则赋为开始的值 zgSCI11:rtc下面是SCI1中断服务程序的入口。zgintsevcallzgSCI1,2rti定时控制模块任何一种嵌入式应用的设计部分都少不了定时模块的实现,只不过有的基于硬件上的控制,有的基于软件上的实现。我们基于各种情况的考虑,根据用户在执行过程中的要求随时的切换硬件定时还是软件定时。上面已经谈过了硬件定时需要注意的方面,下面主要介绍一下软件定时的
30、实现。本软件定时都用同一个定时中断来实现,我们采用的是M68HC12DG128A的输出比较4的中断服务程序。该中断源每隔16位的计数器溢出一次所需要的时间触发一次中断(大概为8.192毫秒),就本应用范围的实时性要求来说是完全可以的。由于DG128A的主频为8M赫兹,每个时钟节拍的时间为125微秒,而16位主计数器溢出一次所经历的时钟周期为65536次,也就是8.192毫秒。软时钟应该准确的实现1秒的时间间隔,我们是这么实现该间隔的:8.192毫秒就是上面提到的计数器溢出一次的时间,0.576毫秒正好是4608个时钟周期。也就是说:图10定时中断服务程序主流程下面是软时钟中断服务程序的源代码。
31、Codewarrior嵌入式C汇编集成开发环境支持多种源代码的组织方式,我们所采用的是相对地址安排的方式。也就是要把代码分为几个相对独立的代码段,在写链接文件时再确定该代码段的安排。;下面是输出比较4的中断服务程序的代码级实现。codesec:sectionzgoutcompare4deconesec;每秒中断数减1bnezgtend lddTC4;等于0,则重置TC4和为秒计数单元赋初值 addd#secrem stdTC4 movb#overflonum,onesec clrb incsecond ldaasecond cmpa#60 ;等于60吗? bnezgtend stabsecon
32、d;是,0-秒计时 incminute;分计时加1 ldaaminute cmpa#60 ;等于60? bnezgtend stabminute inchour;小时计数加1 ldaahour cmpa#24 ;小时计数等于24? bnezgtend stabhourincdayldxzgtmonth;X指向每月天数表头ldabmonthcmpb#2;是否为2月份,若是的话还得判断是否为闰年beqzgtnt3zgtnt1;不是ldaadayabx;指向该月的计数cmpa,x;日计数等于该月天数?bnezgtendzgtnt2incbstabmonthmovb#1,daycmpb#13;月计数等
33、于13?bnezgtendstaamonthincyearzgtendmovb#$10,TFLG1;清零OC4F(输出比较通道4)标志 rtczgtnt3ldaayear+1 bita#$03;是不是闰年? bnezgtnt1;不是,则取表里的天数 lddyear ldx#100 idiv cpd#0 beqzgtnt1;能被100整除,不是闰年,则跳转ldabday;是闰年cmpa#29beqzgtnt2brazgtend;闰年,则有29天zgtmonthfcb31,28,31,30,31,30,31,31,30,31,30,31 ;这里的2月份是非闰年的 由于开发工具的限制,要求中断服务程
34、序的入口代码必须在微处理器可以直接寻址的地址范围内。sec3: sectionzgoc4callzgoutcompare4,2;这是该中断服务程序的入口rti监视模块由于嵌入型应用系统的特殊要求,对系统运行的正确性要求比较高。基于这种原因,当系统的流程因某些不可预料的原因而执行出错(例如陷入死循环)时,需要有一种处理策略。Motorola微处理器提供了这样的一种中断处理方式(COP看门狗),在本系统里就采用了中断的处理方法。要使用Motorola的COP功能在软件上必须保证独立于其他计数器的监视定时器不产生溢出,这样一旦发生溢出的话,就可判定是由于其它外部原因而使流程执行出现错误。处理的具体方
35、式通常是使系统复位。我们把该模块的具体实现部分放在主流程里,否则放在中断服务程序里将起不到作用。运算模块由于多元气体校准仪本身的一些特点,涉及到很多的计算部分(具体的计算参见4.2.2的控制硬件部分原理部分);并且很多是浮点型数据(例如气体的浓度和流速等量值)的运算和统计量的运算。基于此我们在DG128A上实现了一个浮点运算库和一些其他的涉及到矩阵和统计量的计算模块。基于DG128A的丰富的运算指令和充足的Flash存储器空间以及应用上的精度和有限的RAM空间等特殊要求,单独设置了一个浮点数堆栈、自定义了一种浮点数类型。每一个浮点数包括6个字节,各个字节的含义如下所示:第0字节为FPS,是该浮
36、点数的正负标志位。第1字节为F0,是小数部分的高字节;第2字节为F1,是小数部分的中字节;第3字节为F2,是小数部分的低字节;第4字节为FPX,是指数部分;第5字节为FPST,作为一个状态标志。由于有限的RAM空间,为了尽可能有效地应用每一个浮点数就某一个个别的浮点型数据而言,也可能有其他的意义,输出浮点型数据时,就把6个字节中的某几位用作表示浮点型数据所对应的数字串的ASCII码和小数点的位数等,但上述定义是最普遍的浮点型数据的代表含义。在系统初始化的时侯,将ISP所指向的地址保存在变量SP当中,这样就将堆栈初值构造好了。每一次进行浮点数运算时,都将要进行运算的数据放到堆栈的栈顶或是放到寄存
37、器ACC D当中,运算的结果一般放到堆栈栈顶。这样就可以大大的节省对RAM区的占用,当有浮点数运算需要时并不占用除堆栈以外的其他RAM空间。比如说当要计算二个浮点数的乘法时,先依次把2个数据压入浮点数堆栈,之后再调用浮点数乘法的子函数,最后把结果存放在栈顶。本浮点数运算库涵盖了多元气体校准仪需求的各个方面。有应用于二次曲线校准的样本空间的常用统计量的计算和二次曲线校准的方法,具体算法参见具体的计算参见4.2.2的控制硬件部分原理部分,还有一些不是很常用的运算,如取自然对数或者常用对数等。外围硬件接口控制模块风扇控制与AD转换在本多元气体校准仪系统里,用风扇调节机箱温度。在“风扇控制”菜单中对风
38、扇开和关进行设置,具体参数如下:风扇控制设置风扇开:34 风扇关:32 主要的控制流程为:前台操作中有巡检风扇温度的操作,一旦发现风扇的温度低于阈值下限就关闭风扇;一旦发现温度高于阈值上限就打开风扇。具体的实现是在一个每隔一秒一次的定时中断来完成该前台操作。本系统读取外部设备模拟输入的功能由统一的A/D接口实现。该接口不断的读取外部的模拟量并存放在约定好的存储区内,在后台操作中可以从这些存储单元直接得到想要的模拟量并进行处理。还有,本系统通过PWM脉宽调制来控制MFC(质量流量控制器)。多元气体校准仪中的外部参数是使用模拟传感器进行采集的,所以在进行处理之前必须将其进行数字化变为数字量。我们采
39、用的方案是使用DG128A本身携带的模数转换部件。DG128A的模数转换部件由两个ATD模块ATD0和ATD1组成,我们只使用ATD0模块,它具有四个通道(PAD0PAD3),我们采用的模式是对四个AD输入通道进行自动扫描(本多元气体校准仪中只使用了三个通道PAD0PAD2)。其中机箱的温度通过热敏电阻由输入通道PAD0采集,臭氧的温度由通道PAD1采集,标气的温度由通道PAD2采集。转换后的数字量存储在ADR0xH,ADR0xL(其中x=0,1,2)寄存器中,然后进行相应的处理。在该应用中我们使用PB口作为控制信号,PA.2作为使能信号。风扇控制机箱温度的程序代码如下: BSR ADINIT
40、 ; 跳转到INIT 子程序初始化AD转换 BSR CONVERT ; 跳转到CONVERT 子程序进行转换;-初始化A/D-ADINIT: LDAA #$80 STAA ATD0CTL2 ;左调整,无符号结果 BSR DLAY ; 100 uS的延时 LDAA #$00 STAA ATD0CTL3 LDAA #$81 ; 10 位,采样时间2倍 A/D 时钟 STAA ATD0CTL4 ; 预分频 = Div by 4 (PRS4:0 = 1) LDAA #$FF STAA DDRA LDAA #$FF ;初始化B口使其为输出方式 STAA DDRB RTS ; -转换子程序-; 模拟信号从 PORT AD0-2 中输入,结果分别保存在ADRxH和ADRxL中(其中x=0,1,2)CONVERT: LDAA #6 STAA ATD0CTL5 ;单个转换序列包括4个转换,WTCONV: BRCLR ATD0STAT0,#$80,WTCONV ; 等待序列结束标志LDD ADR02H ; 将转换结果放入到D寄存器中;风扇控制程序,温度高于TMPH则转,低于TMPL则停FAN: BSET PORTA,#04