论文写作模式-基于STM32单片机的可运动式气体分析仪-CNKI知网查重网站

论文写作模式-基于STM32单片机的可运动式气体分析仪

2021-06-08 16:53:05
作者:杭州千明

  随着化学化工行业的发展,越来越多的气体开始造福人类,但与此同时,有毒有害气体也在时时刻刻威胁着人的生命健康。为了检测环境中的气体浓度,气体分析仪应运而生。本文基于STM32设计了一款运动式多组分气体分析仪,介绍了分析仪的工作原理,硬件电路以及核心软件设计。

  该分析仪以STM32F103ZET6微控制器为主芯片,可以同时采集四种不同气体的浓度,并且实现了实时测量、定时检测、巡航检测三种不同的测量模式。在功耗方面,利用了STM32的低功耗模式,延长了系统的使用时间;在显示方面,采用3.2寸LCD彩屏,可以直观的展示运行状态和数据;在存储上,使用SD卡存储数据,可在计算机对数据进一步处理;在设计制作方面,实现模块化,降低了设计成本。

  该分析仪体积小、功耗低、功能强大,能满足多种不同环境的检测需求。

  人类与生俱来就生活在一个气体环境中,氧气就是人类生存所需要的必须品之一。随着化学化工行业的发展,越来越多的气体被发现并被应用到了我们的生活。但与此同时,由于大多气体无色无味,人们很难单单凭肉眼或嗅觉判断气体成分。在环境污染、工业生产、日常生活、科学研究等方方面面,有毒有害气体都在无形的威胁着人类的安全。

  在环境污染方面,空气污染作为我国环境污染两大主因之一,近些年越来越受到公众关注。诚然,为了提升空气质量我国已经采取了一系列措施,但从整体治理效果来看,我国大气污染治理依然没有得到彻底控制,大气治理工作任重而道远[1]。气体污染的防治是建立在有效监测数据基础之上的,气体分析仪可以通过检测大气中的气体成分进一步分析气体污染情况,能有效地发现空气污染严重的地区,指导治理空气污染,改善环境。

  在工业生产的过程中,很多工人在无形中遭受着各种工业有害气体的威胁。瓦斯是一种以甲烷为主要成分的混合易燃气体,是煤的伴生产物。在煤矿开采过程中,极易因为瓦斯引发安全事故[2]。2019年7月31日,贵州毕节市七星关区大树煤矿发生一起瓦斯爆炸事故,共计造成了7人死亡、1人受伤,经济损失高达984万元。化学化工行业经常会用到各种气体,其中就包含大量危险气体,如以硫化氢为代表的有毒气体,以氢气甲烷为代表的可燃气体等等。据不完全统计,2019年1-7月,国内化学化工行业累计发生了12起安全事故,121人因此丧生[3]。在工业生产中使用安全、准确、快速的气体分析仪势在必行。

  在日常生活中气体同样威胁着我们的安全。天然气作为一种清洁能源,已经被广泛应用到汽车燃料、生火取暖等生活的方方面面,但因为天然气泄漏而引发的事故从未间断。除此之外,CO同样对我们存在很大的威胁。CO相较于O2更易于与血液中的血红蛋白结合,从使血红蛋白无法与氧气结合,导致低氧血症和组织缺氧[4]。在日常生活中,特别是在偏僻的农村地区,取暖方式收到限制,CO中毒时有发生。

  因此,通过气体分析仪检测环境气体对于保障我们的生命财产安全,降低工业生产风险,治理空气污染具有很重要的意义。

  1.2研究现状

  传感器是一种将可以感知其他信号并将其转化为电信号的元器件,工作时会感知特定的信息,并按规律将其转变为电压、电流等电信号。气体传感器是传感器技术的重要分支,可以将气体的浓度等信息转换为电信号。

  气体分析仪是将气体传感器转换得到的电信号,处理转换为更直观数据(如气体浓度),并进一步传输、显示、存储的一种仪器。

  1.2.1气体传感器概述

  气体传感器一般可以识别特定的一种或几种气体并能把该气体的浓度转换为电信号。按照其工作原理,当前气体传感器可分为半导体气体传感器、电化学气体传感器和光学类气体传感器三类[5]。

  表2-1敏感材料的种类以及检测气体

  材料类型典型材料工作温度/℃代表检测气体

  金属氧化物SnO2、ZnO、Fe2O3、La2O3、In2O3、Al2O3、WO3、MoO3、TiO2、V2O5、Co3O4、Ga2O3、CuO、NiO、SiO2等200~500可燃性气体、NH3、CO、NOx、O3、CH4、异丁烷、H2、H2O、SO2等

  复合材料ABO3(YFeO3、LaFeO3、ZnSnO3、CdSnO3、CoTiO3)、A2BO4(MgFe2O4、CdFe2O4、CdIn2O4)型复合氧化物及其掺杂的化合物200~400 C2H5OH、H2S、CO2、LPG、CH3OH、丙酮等

  高分子材料酞菁、卟啉、卟吩及其衍生物、聚吡咯、二萘嵌苯、蒽、β-胡萝卜常温NH3、NO2、H2、H2S、Cl2等

  半导体气体传感器根据转化得到的电信号类型又可分为电阻式和非电阻式两类。电阻式半导体气体传感器利用不同浓度气体与敏感材料接触时的电阻变化来检测气体浓度,是目前为止应用最为广泛的气体传感器,常见敏感材料如表2-1[6]所示。非电阻半导体气体传感器主要包括结型二极管式、金属氧化物半导体二极管式及场效应管式气体传感器,主要用于检测氢和硅烷等可燃性气体[7]。

  电化学气体传感器主要有浓差电池式和接触燃烧式两种。其原理一般是利用气体与电极的氧化还原反应检测气体溶度。电化学气体传感器在灵敏度,选择性方面有突出的优势,具有巨大的实际应用潜力[8]。但同时,气体传感器的电解质损耗较快,使其使用寿命十分短,这会在实际使用中带来更大的成本消耗,限制气体传感器的发展。

  光学气体传感器是一种新型气体传感器,利用光在气体中的吸收反射等作用分析气体成分。现阶段光学气体传感器原理主要包括吸收法、反射法、荧光法、红外和拉曼光谱分析法、干涉法、以及表面等离子共振法等[9]。与其它两种传统气体传感器比较,光学气体传感器在选择性和可靠性上表现更好一些。

  尽管气体传感器已经发展了相当长的时间,但依旧还存在很多问题。例如,选择性较差,相对于种类繁多的气体检测范围还远远不够等等。寻找新的气敏材料,研究更精准的检测方法依旧非常重要。目前,国内外对气体传感器的主要研究和发展方向主要集中在新型气敏材料的合成、根据物理或化学效应开发新型传感器以及低功耗气体传感器的研制[10]。

  1.2.2气体分析仪现状

  随着单片机技术的发展,采用单片机设计的气体分析仪已成为主流。其原理是利用单片机读取分析气体传感器的测量数据,并通过显示模块显示出来,或者利用存储模块记录下来。当前市面上的气体检测仪按照使用方式可以划分为固定式、便携式和穿戴式[11]。固定式气体分析仪大多用于工厂检测、城市气体检测以及家庭天然气泄漏检测等固定场所检查特定气体。便携式则多用在巡查检修等方面,不受场地限制,易于携带。穿戴式气体分析仪是工作在气体泄漏或易泄漏区域人员随身携带的一种气体分析仪,其特点是无需工作人员一直操作就可以实时的显示测量数据并发出报警。

  目前,基于STM32的气体分析仪已经存在多种方案。杨发盛等人基于STM32设计了一款便携式甲烷浓度检测仪[12];郎宝华、蔡莉媛基于STM32实现了多气体检测[13]。不难发现气体分析仪正在向着便携和能测量更多气体的方向发展。通过调查还发现,目前市场上的气体检测仪普遍价格比较价格昂贵。一款元器件成本在500元左右的气体检测仪,淘宝上可以卖到近千元。而造成这种现状最重要的原因在于气体检测环境过于复杂,很少有气体检测仪能适应多种环境使用。尽管上一节介绍了丰富的气体传感器,但是其制成的气体分析仪的种类和能测量的气体却相对单一,使得大多数使用者需要在工厂定做,这势必造成了生产设计成本的增加。另外,无论是便携式或者穿戴式都需要工作人员也进入需要测量的气体环境,当前市面上还没有一款可以运动式的气体分析仪。

  因此,价格低廉、性能稳定、功能多样、能适应多种环境的低功耗运动式气体分析仪的市场需求十分广阔。

  2

  设计目标及方案

  本文设计的运动式式气体分析仪由主控芯片STM32F103ZET6微控制器及其外围功能模块构成。并在此硬件基础上通过程序实现实时测量,定时监测以及巡航检测三种测量功能。

  2.1设计目标

  在绪论中分析了造成当前市场上气体分析仪价格昂贵的一个重要因素就是设计成本较高。为了降低多次设计的成本,就需要气体分析仪能尽可能多的适应复杂环境的变化和不同客户的需求。在此前提下,对这次设计提出了如下目标:

  (1)多组分[14]。能最多同时检测4种不同气体,适应需要检测复杂环境气体的需求。

  (2)多模式。将传统的固定式和便携式结合起来,即可实时测量显示,也可以放置于某处中长期测量。同时加入巡航模式,可在固定路线巡航检测。

  (3)低功耗。充分利用STM32的睡眠、停止和待机三种低功耗模式,在测量等待时使用停止模式降低系统的耗电量,延长使用时间[15]。

  (4)模块化。统一传感器模块与微处理器之间的硬件接口,使所有满足接口要求的传感器模块可自由插拔,以适应不同用户的需求,减低设计成本。

  2.2设计方案

  本文设计的可运动式气体分析仪主要分为两部分进行设计——硬件部分和软件部分。

  2.2.1硬件设计方案

  本文设计的可运动式气体分析仪硬件部分的结构框图如图2-1所示。主要包含控制模块(STM32F103ZET6)、输入模块(传感器模块、按键)、输出模块(蜂鸣器、小车、LCD显示屏、气泵)、存储模块(TF卡)、串口模块以及电源模块(电源管理、锂电池)。

  可运动式气体分析仪的工作过程大致如下:气体传感器将气体信号转换为电信号,经过调理电路转换为0-3.3v电压信号,通过STM32F103的12位AD转换器转换为数字信号。STM32F103接收到AD读取的数字信号后经过处理得到当前的电压值及其对应的气体浓度值,记录到SD卡并在LCD屏上显示出来。

  在这个过程中还需要按键进行控制操作,需要控制气泵抽取待测气体,需要控制蜂鸣器在气体超出范围后发出警报,需要控制小车在规定路线巡航。以上这些所需模块都直接通过GPIO口进行输入输出。

  本文的硬件电路设计主要在altium designer 17软件上进行。

  图2-1硬件结构框图

  2.2.2软件设计方案

  本文设计的可运动式气体分析仪的软件流程图如图2-2所示。设备开机后先进行设备的初始化,包括各个外设的初始化设置,传感器预热、校准,以及每个传感器对应信息的选择。初始化完成后,进入工作模式选择界面。

  实时测量模式类似于传统的便携式气体分析仪,只有在选择开始测量时才会打开气泵,测量一次当前环境的气体浓度。定时检测模式适合放在固定位置进行中长期测量,会每隔固定时间进行一次测量,并将得到的数据记录到SD卡的csv文件中,后期可以通过电脑进行数据的处理。另外,在定时检测等待时,仪器会进入低功耗状态以延长测量时间。巡航检测模式需要外接四轮小车模块,经过简单设定后,小车会带着气体分析仪在规定的路线进行巡航,并循环读取AD采集的数据,如果发现气体浓度超标就会停止运动,并在原地发出警报。

  在程序设计上ST公司基于ARM的CMSIS标准建立了STM32标准库[16],提供了完善的固件函数库。本文的软件设计主要使用keil5配合ST公司提供的库函数在德飞莱M3S开发板上编辑调试。

  图2-2软件总流程图

  2.3器件选型

  本文设计的气体分析仪采用STM32F103ZET6作为主芯片。STM32系列微处理器是意法半导体公司基于ARM Cortex-M系列内核设计的高性能、低成本、低功耗的嵌入式微处理器。STM32以其优异的性能和丰富的资源,已成为当前的主流单片机之一。STM32F103ZET6采用了ARM Cortex-M3内核,最高工作频率72MHz,内部含有丰富的外设,包括51个快速IO端口、2个16通道12位模数转换器、2个12位数模转换器通道、7个内部定时器以及丰富的通信接口[17]。STM32系列微处理器基于电源管理的睡眠、停止和待机三种低功耗模式足以满足设计要求的低功耗模式。睡眠、停止和待机三种低功耗模式足以满足低功耗需求。STM32的FSMC外设还可以模拟8080接口时序,提供更快速、更方便的方法控制显示屏。

  为了显示更为丰富的内容,提供更好的视觉效果。本文设计的显示模块选用了一款3.2英寸的16位并口LCD彩屏模块。该模块通过ILI9341芯片驱动,长64.8mm,宽48.6mm,分辨率为240×320。

  电源模块选用一节3.7V、6000mwh的锂电池给整个系统供电,电池为圆柱形,长65mm,直径18mm。3.7V电源经过TPS61070将电压升高到5V,再利用AMS1117-3.3V将电压降到STM32的工作电压3.3V。另外选用TP4056芯片给锂电池充电。除此之外,电源模块还包括一节CR1220纽扣电池用以给STM32F103芯片的后备供电区域供电。

  串口模块选用CH340G将Micro USB口转为串口。CH340G是一个USB总线转接芯片,支持USB转USART、USB转IrDA红外或者USB转打印机接口。系统的ISP一键下载电路也是通过此芯片设计。

  小车系统通过外置的L298N模块控制。电机选择的直流电机,只需要通过STM32F103控制L298N的两个输入就可以便捷的控制小车的正转、反转以及制动。

  气泵选择了一款3.7V的小型气泵。蜂鸣器因为只需要单一报警功能,所以选择的是有源蜂鸣器,圆柱形,直径12mm,角距7.6mm。

  为了节约空间,其它电阻电容等器件主要以贴片封装为主。其中电阻、电容及电感为0805封装;发光二极管为红色、1206封装。普通二极管为SOD323封装。三极管选用S8050或S8550,封装为SOT23。

  2.4本章小结

  本章主要介绍了本文设计的目标和总体方案。概述了本文设计的基本要求,然后重点讲解了本文设计的硬件框架和软件流程,最后简单的介绍了选用的器件及其封装。

  3

  硬件设计

  本章主要介绍仪器设计的硬件电路部分。设计方案中已经讲过了硬件的整体框图,这一章主要分析几个核心模块的功能及其电路原理。

  3.1 STM32F103ZET6最小系统。

  本文设计采用意法半导体公司生产的STM32F103ZET6微控制器作为控制芯片。STM32F103ZET6的最小系统如图3-1所示,主要包括芯片供电、外部晶振以及硬件复位电路。

  图3-1 STM32F103ZET6最小系统

  3.1.1芯片供电

  STM32把电源供电区域划分如图3-2所示的VDDA供电区域、VDD供电区域、1.8V供电区域和后备供电区域四部分。

  (1)VDD供电区域。

  VDD供电区域就是通过外部的直流3.3V电源直接供电,这个区域的电路主要是I/O电路、待机电路和电压调节器。

  (2)1.8V供电区域。

  VDD供电区域的电压调节器会将外部3.3V电源降到1.8V,然后给除了备份域和待机电路之外的数字电路供电。

  (3)后备供电区域。

  STM32中有一个单独的后备区域,这个区域用来在系统掉电后或低功耗模式下保存类似实时时钟之类的轻易不会改变的数据。平时,备份域主要依靠主电源VDD供电,当掉电后,通过3V纽扣电池(本文选用CR1220,电路上的标号为BT2)供电。

  (4)VDDA供电区域。

  为了提高模数转换器的转换精度,STM32为其配备了单独的电源区域。VDDA供电区域需要更加稳定的电压,因此对3.3V电源做了进一步滤波。VREF是ADC的测量参考电压,决定了ADC的测量范围,本文设计直接将VREF+与VDDA相连,设定读取范围是0~3.3V。

  图3-2 STM32的电源框图

  3.1.2晶振以及复位电路

  如图3-3所示,STM32拥有一个十分庞大而且复杂的时钟系统,在这个系统上每一个外设都有对应的时钟,这些外设时钟最终又全部可以追溯到四个时钟源。

  由于内部的两个时钟源不够稳定,在设计时一般都采用外部时钟源。高速外部时钟源可以是4~16MHz的有源晶振或无源晶振,本文设计使用的是8MHz的无源石英晶振。8MHz的频率较低,在设计时并没有选择高速外部时钟源直接作为系统时钟,而是会先经过锁相环倍频,倍频后的时钟作为系统时钟源。本文设计锁相环设置为9倍频,此时的系统时钟配置为72MHz。本文设计的低速外部时钟源选择频率为32.768kHz的FC135无源晶振给RTC时钟提供时钟源[18]。

  图3-3 STM32时钟树

  STM32F103支持系统复位、电源复位和备份区域复位三种复位形式[19]。本文设计在硬件电路上增加了手动复位按键,按下按键S2会在NRST引脚产生一个低电平触发系统复位。增加手动复位可以在系统出现故障时,通过复位按键重新恢复系统的初始状态。另外,因为本文设计使用了实时时钟系统,所以应尽量避免VDD和VBAT同时掉电复位备份区域,这在使用中需要格外注意。。

  3.2电源模块

  电源模块主要由一节3.7v、6000mwh的锂电池、5V升压模块、3.3V降压模块及调理电路组成。5V电压用来给气泵供电,其余部分(除小车)采用3.3V供电。小车部分由于功耗较大,且不会一直使用,所以采用4节5号电池单独供电。

  3.2.1升压电路

  本文设计选择一节3.7V、6000mwh的锂电池给整个系统供电。STM32系统的供电的典型电路是利用AMS1117-3.3V芯片将5V电压降到3.3V。但是AMS1117芯片有一个1.2V的压差,输入电压4.4V输出时会不稳定,所以需要先利用升压电路将锂电池输出电压升高到5V。

  升压电路如图3-4所示。TPS61070是一款转换效率达90%的高效同步升压转化器,TPS61070是一款转换效率达90%的高效同步升压转化器,该升压转换器的输入电压范围为0.9V~5.5V,输出电压范围为1.8V~5.5V。根据用户手册中的典型应用,确定电感为4.7uH,输入及输出电压与地之间并接10uF电容使输出更稳定。另外,FB端的电压始终为500mV,且R2的阻值范围为0~200kΩ(常用的阻值为180 kΩ)。若需要输出的电压为5V,则电阻R1的阻值可以根据下列公式算出,即:电阻R1取值1.8MΩ。

  (3-1)

  图3-4升压电路

  3.2.2稳压电路

  稳压电路如图所示。AMS1117-3.3V芯片是AMS1117系列正向低压降稳压器中固定输出的一种,在工作范围内可以稳定输出3.3V电压。AMS1117系列稳压器的压降只有1V左右并且内部还集成了保护电路,非常适合用于给便携式计算机系统供电[20]。在本文设计的稳压电路中,AMS1117-3.3V芯片的输入输出各并联了两个电容,主要用来进行滤波。电解电容主要滤除低频波,无极性电容主要滤除高频波。

  图3-5稳压电路

  3.2.3充电电路

  为了系统的持续使用,充电电路同样必不可少。本文设计所使用锂电池的充电截至电压为4.2V,所以充电控制芯片选用了单节锂离子电池线性充电器TP4056。TP4056给锂电池采用三阶段充电法给锂电池充电[21]。当输入电压大于电压检测阈值和芯片使能输入端输入电平时,开始对锂电池充电。在电池电压小于3V时充电器用小电流对电池进行预充电;当电池电压超过3V时,采用恒流模式充电。当电池电压接近4.2V时,减小充电电流并采用4.2V恒压充电。

  本文设计时TP4056的各个引脚功能及连接说明如下:TEMP引脚接地,取消电池温度检测;PORG引脚通过一个2kΩ电阻与GND连接,设定充电电流为0.6A;VCC和CE引脚连接Micro USB的VCC引脚提供充电电源并使能芯片;~CHRG引脚连接LED灯,显示充电状态;BAT引脚连接锂电池的正极充电。另外,锂电池与升压电路之间通过按钮开关控制电源开断。

  图3-6充电电路

  3.3串口模块

  单片机不仅仅需要实现对外设的控制,和外部的通信同样重要。通用同步异步收发器是STM32单片机的一个重要串行通信设备,可以灵活的与外部设备进行全双工数据交换。USART在STM32开发过程中,应用最多的莫过于“打印”信息,可以更方便的在电脑端的串口调试助手软件上了解程序运行情况。另外,对于程序的下载同样离不开USART。

  CH340G是一个USB总线的转接芯片,实现USB转串口、USB转IrDA红外或者USB转打印口。为了更方便的使用串口通信,单独设计了串口电路,通过CH340G实现了USB转串口功能,大大方便了计算机与电脑的通信,具体电路如图3-7所示。

  本文设计选用的是16引脚的CH340G芯片,其各个引脚的功能及本文设计的连接方法如下:

  (1)电源引脚,包括VCC、V3及GND。

  CH340G的电源电压可以是5V也可以是3.3V,本文设计选用和STM32相同的工作电压。此时,VCC接3.3V电源并且需要外接一个0.1uF电源退耦电容;GND接公共地端;V3连接VCC,输入外部电源。。

  (2)数据引脚,包括TXD、RXD、D+及D-。

  D+、D-直接连接到USB总线的D+、D-数据线。TXD、RXD分别连接到STM32的USART1的TX、DX引脚。

  (3)时钟引脚,包括XI及XO。

  本文设计时在XI、XO引脚之间连接一个12MHz的石英晶振为CH340G芯片提供时钟源。石英晶振的两端需要分别对地连接震荡电容。。

  (4)MODEM联络信号引脚包括:CTS#、DSR#、RI#、DCD#、DTR#、RTS#。

  所有MODEM联络信号都是由计算机应用程序控制。本文设计只用到了DTR#、RTS#两个引脚用以实现ISP一键下载。其中RTS#为请求发送数据,低电平有效;DTR#为数据终端就绪,低电平有效。

  (5)辅助引脚包括:R232引脚。

  R232引脚用于控制辅助RS232功能,本文设计不会用到,引脚悬空。

  图3-7串口电路

  上文有提到,该串口电路不仅实现了计算机与单片机的串口通信,还设计了ISP一键下载电路[22]。通常的ISP下载步骤为:通过串口将计算机与STM32的USART连接;设置跳线保持BOOT0为高电平,BOOT1为低电平,进入程序下载模式;通过计算机下载完成后,再设置跳线保持BOOT0为低电平,BOOT1为低电平。此过程需要多次认为设置跳线。为了下载程序更方便,如图所示电路中,通过MODEM联络信号引脚实现了BOOT0和NRST的自动设置。当计算机向STM32请求下载程序时,RTS引脚拉低为低电平,DTR引脚为高电平,V1、V2导通,BOOT0的电平上拉为高电平,NRST为低电平,系统复位,进入程序下载模式;程序下载完成后,DTR引脚拉低为低电平,此时V1截至,V2导通,BOOT0和NRST回复默认电平,完成一键下载任务。

  3.4 LCD显示模块

  为了实现更好的人机交互,本文设计选择了一款分辨率为320×240的3.2英寸TFTLCD彩屏模块作为显示模块。因为控制液晶面板需要比较多的资源,而STM32F103系列芯片并没有集成液晶控制器到芯片内部,所以选择的模块内部集成了ILI9341控制芯片,其控制框图如图3-8所示。ILI9341同时支持SPI串口通信和8080并口通信,但是SPI方式刷新较慢,而且STM32的FSMC恰好可以模拟8080时序,所以本文选择使用8080并口方式控制LCD屏。

  图3-8液晶控制框图

  灵活静态存储控制器(FSMS)是STM32F1系列芯片的拓展存储器管理外设,其结构如图所示。FSMC可以用来驱动SRAM、NOR Flash、NAND Flash及PC卡,它们共用地址、数据总线等信号,通过片选信号来区分不同设备。通过FSMCLCD显示屏其实就是把ILI9341当作存储器,STM32控制把数据写入ILI9341这个特殊存储器中。而且如图所示,对比FSMC模式B与8080时序,可以看出两者时序十分相似(除了FSMC的地址线A和8080的D/CX线以外),如果可以通过一根地址线模拟8080的D/CX线,那么完全可以实现FSMC模拟8080时序控制LCD显示。

  图3-9 FSMC结构

  图3-10 FSMC模式B时序与8080时序对比(写过程)

  FSMC的地址线上的电平可以通过控制访问地址来实现,这样就可以通过访问特定的地址来实现类似8080时序D/CX线的功能。本文设计使用FSMC-A10(PG0)来模拟D/CX线,只要在代码中利用指针变量控制FSMC-A10的高低电平就可以实现写入命令和写入数据的控制。如图所示,本文设计使用FSMC_NE4作为片选信号,其对应的访问地址为0x6C000000~0x6FFFFFFF。STM32内部访问地址时使用的是8位字节地址,而选用的ILI9341是16位宽度,此时内部HADDR总线的HADDR[25:1]与FSMC_A[24:0]对应相连。因此,想要FSMC-A10为高电平,需要访问的地址为:0x6C000000+2^10×2=0x6C000800;想要FSMC-A10为低电平需要访问的地址可以设置为0x6C0007FE。

  图3-11 LCD显示电路图

  本文设计选用的LCD模块有40个引脚,具体显示电路如图3-11所示。LCD模块的主要信号线的连接上面已经介绍,电源选择3.3V供电。除此之外,1~4号引脚是触控模块控制引脚,本文设计中不使用,直接悬空。A、K0、K1和K2四个引脚为背光控制引脚,引脚A接高电平,引脚K0、K1、K2接低电平,并能通过STM32控制通断。ILI9341控制芯片可以工作在多种工作模式,如像素点位数可以是6位、16位、8位;通信接口可以是SPI或8080接口。ILI9341的工作模式可以通过IMO~IM2这三个引脚控制,本文设计选择16位8080并口模式,所以直接接地。

  3.5小车模块

  为了实现可运动的要求,本文设计外加了一个四轮小车模块。该模块通过两个MX1508对四个直流电机进行控制,可以实现简单的前进、倒退及转弯。

  MX1508是四通道双路有刷直流马达驱动IC,该产品为电池供电的玩具、低压或者电池供电的运动控制应用提供了一种集成的直流马达驱动解决方案。本设计直接选用了一款带外围保护电路的MX1508模块,因此本文不再详细介绍具体电路。MX1508模块有10个引脚,两个电源引脚、四个控制输入引脚(IN1、IN2、IN3、IN4)和四个控制输出引脚(MOTOR-A、MOTOR-B),控制方式及电机状态如表所示。通过控制让左右轮的转动方式不同还可以实现简单的转弯。

  表3-1电机控制表

  IN1 IN2电机状态

  0 0制动

  0 1正转

  1 0反转

  1 1制动

  在分析仪主电路板上预留了可插拔5引脚贴片端子,使用时直接插接就能通过STM32控制MX1508模块。因为小车的功耗较大,所以供电方式选择了四节5号电池单独供电。

  3.6气体传感器模块

  为了实现模块化的要求,需要针对不同的气体传感器设计气体传感器模块。在PCB板上通过端子预留了4个传感器的接口,每个端子有3.3V、GND及AD读取三个接线引脚。所以,设计的传感器模块同样需要用3.3V电源供电,并且通过调理电路将输出转化为0~3.3V。下面以MQ3酒精传感器、ME3一氧化碳传感器为例设计气体传感器模块。

  3.6.1 MQ3酒精传感器模块

  MQ系列气体传感器是传统半导体金属氧化物气体传感器,这种SMO气体传感器其原理涉及到两个功能——受体功能和换能器功能,前者通过气固界面识别目标气体,并引起氧化物表面的电子变化,而后者则基于将表面现象转换为传感器的电阻变化[23]。在氧气气氛中将传感器加热到高温时,氧气被吸附到SMO表面,在晶界形成势垒。大气中的氧气与SMO表面的相互作用形成带电氧层,排斥其他电子与薄膜的相互作用,从而增加了电阻。MQ系列气体传感器最常用到的敏感材料是二氧化锡(SnO2)。

  MQ系列气体传感器通常由6个引脚,两个用于加热,四个用于信号取出。加热电压可以选取交流或直流5V,本文设计选用直流5V,为了方便信号测量电路同样取直流5V。4(6)引脚为信号电压输出端,输出电压可由公式计算得出,其范围为0~5V。

  STM32的AD读取范围为0~3.3V,所以需要利用OV07放大器对输出电压进行线性调整,将0~5V电压等比例缩放到0~3.3V。

  另外,MQ系列气体传感器的工作电压为5V,而电路板提供的为3.3V电压,所以需要再通过TPS61070芯片进行升压。

  图3-12 MQ3酒精传感器模块电路图

  图3-13模块升压电路

  3.6.2 ME3-CO传感器模块

  ME3系列气体传感器是电化学气体传感器,其工作原理为定电位电解,测量气体与氧气在电极上发生氧化还原反应并释放电荷形成电流,产生的电流大小与气体浓度成正比。该电路是经ME3-CO气体传感器使用说明书上的推荐电路修改而成,ME3的W引脚输出恒定电路,经R5转换为电压信号再通过放大器电路等比例放大为0~3.3V。

  LMP7721是一款3毫微微安输入偏置电流精密放大器,需要通过MAX660产生-3.3V电压给该芯片供电。

  图3-14 ME3-CO模块电路

  图3-15 MAX660电压反转电路

  3.7其它电路

  除了以上较为复杂的电路外,设计中还有包括一些较为简单电路,如按键电路、蜂鸣器和气泵控制电路、SD卡电路。

  3.7.1按键电路

  本文设计的按键电路如图3-16所示。按键选用的是轻触式按键,按键松开时KEY1引脚输入状态为低电平,当按键按下时,电路导通输入状态为高电平。只需通过检测按键输入状态,就可以判断按键是否被按下。按键断开、闭合时,按键开关不会马上稳定,因此在电路上增加了C22电容用来消抖。

  图3-16按键电路

  3.7.2蜂鸣器和气泵控制电路

  如图3-17所示是蜂鸣器驱动电路。因为GPIO口的驱动能力较小,不能直接用来驱动蜂鸣器或是气泵,因此增加了一个三极管,通过控制三极管的通断实现对蜂鸣器的控制。气泵的控制电路与此类似,只是选择5V电源供电。

  图3-17蜂鸣器控制电路

  3.7.3 SD卡电路

  STM32与SD卡通信有两种接口(SPI接口、SDIO接口),本文设计采用SDIO接口。在电路设计上没有太多变化,只需要将对应接口连接就可以了,另外对于四根数据线需要加上一个上拉电阻,如图3-18所示。

  图3-18 SD卡电路

  3.8本章小结

  本章介绍了运动式气体分析仪的硬件设计。首先详细介绍了STM32F103ZET6最小系统、电源模块、串口模块、显示模块、小车模块以及气体传感器模块几个核心模块的功能及电路设计,然后简要介绍了按键电路、SD卡电路以及蜂鸣器和气泵控制电路。

  4

  软件设计

  本章介绍可运动式气体分析仪的软件设计部分。本文设计的气体分析仪包括实时测量、定时检测、巡航检测三个部分,系统上电后经初始化进入模式选择界面,通过按键选择所用模式并测量记录数据。下面将介绍几个核心模块的初始化及三中模式的软件流程。

  4.1 LCD彩屏显示

  上一章已经介绍过本文设计通过FSMC模拟8080时序实现LCD显示,软件部分需要在硬件电路基础上完成LCD的初始化以及一些基础的显示函数。

  4.1.1 LCD初始化函数

  LCD配置初始化主要包括GPIO配置、FSMC配置和ILI9340芯片配置三部分。

  在硬件设计中已经介绍了LCD硬件电路需要用到的引脚包括FSMC_NOE、FSMC_NWE、FSMC_NE4、FSMC_A16和FSMC_D0~15,此外还需要一根背光控制线(本文设计选择PB0引脚)。对于这些引脚需要用GPIO库函数中的GPIO_Init函数进行初始化,其中FSMC相关引脚全部初始化为复用推挽输出模式,背光引脚初始化为普通推挽输出。

  对于FSMC,相关库函数同样提供了初始化结构体和初始化函数。对于。存储映射区域、存储器类型等基础信息,只要根据硬件电路和写入要求逐一配置即可,本文不再赘述。着重讲一下读写时序,在本设计中将其配置为模式B,通过该模式模拟8080并口通信的时序。此外,读写时序中还需要配置地址建立时间和数据保持时间。ILI9341的数据手册中要求写周期最小为66ns,而读周期最小为65ns,据此参考文献将地址建立时间和数据保持时间设置为ADDSET=1、DATST=4。如图所示,可以计算出此设置下的读周期为125ns,写周期为97ns,满足ILI9341的最低读写要求。

  图4-1 FSMC读写时序

  初始化完FSMC后,就可以通过访问某个地址,实现STM32与ILI9341的通信,这个地址在上一章已经计算的到——0x6C000800(命令传输地址)、0x6C0007FE(数据传输地址)。为了更方便的通信定义了三个函数LCD_Write_Cmd(写入命令函数,告诉ILI9341要进行操作的寄存器)、LCD_Write_Data(写入数据函数,向ILI9341的寄存器中写入数据)、LCD_Write_Reg(向特定寄存器写入特定数据)。利用上面的三个函数,只需要向特定寄存器写入数据,就可以实现ILI9341的初始化配置,包括上电过程、伽马参数等等,这些一般会由厂家提供或者也可以查询数据手册自行设置,本文不再详述。

  4.1.2基本图形显示

  像素是显示器最小的成像点,所有的图形都是通过一个个像素点组成。在LCD上显示点也非常简单,只需要设定坐标,再设定颜色,就可以实现在该点显示特定颜色的像素点。

  直线的显示要略微复杂,确定起始点和结束点后,再利用Bresenham算法计算中途所有像素点的坐标,然后通过画点函数画出直线。

  矩形的显示有两种模式,一种是实心矩形,一种是矩形框。实心矩形是从起始点开始,根据长宽数据扫描画点。矩形框先通过数据确定四角坐标,然后画四条直线。

  4.1.3 ASCII码字符显示

  字符的显示类似于画实心矩形,通过字体制作软件可以将像素点位置数据变为二进制数据,此数据通过列表存储到font.h文件。要写入一个字符时,通过ASCII码得到对应的位置数据,然后在一个矩形内进行扫描,在LCD屏上显示出字符。

  字符串的显示通过指针一个字符一个字符显示;数字的显示是通过sprintf函数将数字转变为字符串,然后再显示出来。

  4.2 SD卡存储

  本文设计选择的存储方式为microSD卡,通过SDIO接口实现微控制器与SD卡的通信,为了文件操作更方便,还移植了FatFs文件系统。

  4.2.1 SD卡初始化函数

  SD卡初始化大概包括GPIO及SDIO外设初始化、识别卡类型、进入传输模式并进行读写擦除测试。尽管只有三步,但整个初始化过程其实过程十分复杂。在ST固件库中,提供了较为完整的SD卡驱动程序示例,本文设计直接参考移植该示例。

  SDIO的传输模式可以设置为DMA传输模式或者轮询模式,因为DMA模式数据传输效率较高,一般都采用此模式。在SD卡驱动程序示例中对两种模式进行了区分,但并没有DMA配置程序,需要自己添加。

  DMA传输配置包括两个——SDIO接收数据和SDIO发送数据,主要是对外设地址、目标地址和传输方向进行设置。外设地址是SDIO的数据FIFO寄存器,目标地址是主程序中定义的数组地址,传输方向是外设到存储器或存储器到外设。具体代码如下:

  //SD_DMA_RxConfig函数

  DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)SDIO_FIFO_ADDRESS;//外设地址,fifo

  DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)BufferDST;//目标地址

  DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//外设为源地址

  //SD_DMA_TxConfig函数

  DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t)SDIO_FIFO_ADDRESS;

  DMA_InitStructure.DMA_MemoryBaseAddr=(uint32_t)BufferSRC;

  DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralDST;//外设为写入目标

  SDIO使用的通信通道是DMA2的4通道,配置完成后需要打开此通道。

  4.2.2 FatFs文件系统

  文件系统时为了存储和管理数据。而在存储介质中建立的一种组织结构。FatFs是面向小型嵌入式系统的一种通用的FAT文件系统[24],可以很容易的移植到其它处理器上。diskio.c文件存放有FatFs文件系统与存储设备的接口函数,在移植时需要在此文件中编写设备状态获取函数、设备初始化函数、设备数据读取函数、设备数据写入函数和设备控制函数。

  4.3 ADC读取

  STM32F103ZET6芯片有三个ADC,精度为12位,每个ADC最多有18个外部通道。ADC1和ADC2都有16个外部通道和两个内部通道,也是通常使用的ADC,ADC3一般不会用到。本文设计读取传感器数据使用的是ADC1的10~13通道,将其配置为独立模式顺序采集,采集结束后通过DMA请求把转换好的数据存储到内存里面。

  DMA的工作参数具体如下:外设地址为ADC数据寄存器,存储地址是定义的存放数据的数组的地址,传输方向为外设到存储器,缓冲器大小为4,外设地址固定,内存地址固定,循环传输。ADC配置为独立模式,多通道采集,开启循环扫描,使能连续转换,并调用库函数设置每个通道的转换数据。完成DMA和ADC配置后,开启软件出发开始采集数据。

  ADC采集到的数据是12位数字信号,所以为了更方便理解数据还需要进一步调整位模拟信号。硬件设计时。设置的参考电压为VREF+=3.3V,VREF-=0V,这个电压就是ADC的电压输入范围。由此可以得到模拟电压计算公式:

  模拟电压=数字电压*3.3V/4095(4-1)

  4.4系统定时器和实时时钟

  STM32F1系列具有丰富的定时器系统,包括8个TIM定时器外设以及SysTick系统定时器、RTC定时器,本文设计只使用了SysTick系统定时器和RTC定时器。

  4.4.1 SysTick系统定时器

  SysTick系统定时器是CM3内核中的一个外设,是一个24位的向下递减的计数器,记一次数的时间为1/SYSCLK。本文设计用SysTick系统定时器制作标准延时程序。

  用SysTick系统定时器延时现在存在两种解决方案——中断方式和软件查询方式。但是,经过测试发现,采用中断方式延时会影响进入低功耗模式,因此选用了软件查询的方式进行延时。延时程序的原理是开启计数后,使用软件查询SysTick的CTRL寄存器,当计数结束后CTRL寄存器的位16会置1。本文设计依据此原理实现了微妙和毫秒延时,并通过迭代实现了时、分、秒延时。

  4.4.2 RTC实时时钟

  RTC模块是位于后备区域的一个独立的定时器,拥有一组连续计数的计数器。在确保持续供电(纽扣电池)的条件下,RTC的设置和时间始终维持不变,因为此特性RTC常被用于提供时钟日历的功能。

  本文设计的RTC模块通过LSE振荡器提供时钟源,在此硬件基础上以1970年1月1日为基准配置了定时器。RTC模块使用的是一个32位的计数器,大概可以计时136年,完全可以满足当前使用。

  RTC有三个专门的中断——闹钟中断、秒终端、溢出中断。前面我们计算过可以使用136年,因此一般不会发生溢出中断,不再考虑。秒中断设置为显示时间,发生中断时会更新LCD屏上的时间显示。闹钟中断设置与EXTI17中短线相连,以此实现对低功耗模式的定时唤醒。

  4.5实时测量模式

  如图所示,是实时测量模式的软件流程图。选择进入实时测量模式后会进入开始等待界面,该界面会显示一些传感器信息及上次读取的数据;在等待界面按下开始键会进入测量模式,并在LCD屏上以“measuring…”字符提示,之后打开气泵等待气体进入,并记录20次测量的结果;为确保气体状态是稳定的会对20次结果求方差,只有在一定范围内才会将其平均值作为读取结果显示出来。上面的方差范围当前设置为20次数字信号读取数值的方差不超过30,换算成模拟信号大概误差为0.0045V(量程的0.14%),这个值是使用电位器模拟气体传感器模块测试得出的,后续针对不同的传感器模块的误差值还需要做进一步的调整。方差范围的引入避免了腔内与腔外气体浓度还不完全相同时就进行测量,但这样设计还会存在另外一个问题,就是对于动态气体无法测量,这在使用过程中必须要注意。

  图4-2实时测量模式

  4.6定时检测模式

  定时检测模式的流程图如图所示。同样选择定时检测模式后也会先进入开始等待界面;选择开始后会先进行延时时间的设定,然后进行第一次的测量并记录数据;测量结束后开启闹钟中断,低功耗等待下次测量。在低功耗等待时,如果有其它按键中断,会退出低功耗并询问是否退出本次测量。定时检测模式下的每次测量过程与实时测量模式基本相同,只是在每次测量完成后不再显示数据,而是将数据记录到SD卡的CSV文件中,等待后续处理。

  图4-3定时测量模式

  4.7巡航检测模式

  巡航测量模式的流程图如图所示。本设计的运动系统较为简单,巡航路线的设定是依靠延时程序完成的,通过行驶距离和小车速度计算所需延迟计算时间。巡航测量模式开始后会先进行路线的设定,之后开始巡航测量并不断扫描传感器读取数据是否在安全范围内,如果超出则停在原地发出警报。不同于前面两种方式,巡航检测模式下会保持气泵一直运行,而且不再进行多次测量和方差计算,直接显示一次读取的结果。

  图4-4巡航检测模式

  4.8本章小结

  本章介绍了运动式气体分析仪的软件实现。在本章中重点介绍LCD显示、SD卡、AD读取等核心模块的的驱动文件编写或移植,包括初始化函数的编写及其重要参数的设置。另外对整个系统的流程做了详尽说明。

  5系统测试

  由于疫情原因,对于本文所设计的气体分析仪无法做气体测量实验,本章通过电位器模拟气体传感器模块做了简单的测试,但由于仪器精度问题,测试数据只做参考。

  5.1测量精度测试

  主要是对系统读取精度进行评估,具体方案为:在电位器两端加3.3V电压,然后改变滑动端大小,取5个测量点,分别通过气体分析仪的实时测量模式和数字电压表测量其电压值,测量结果如表所示。

  表5-1电位器电压测试表

  组数电压表示数(V)气体分析仪读数(V)

  1 2 3 4 5平均值标准差

  1 0.000 0.000 0.000 0.000 0.000 0.000 0.000 0.000

  2 0.825 0.818 0.819 0.817 0.819 0.818 0.818 0.00075

  3 1.65 1.654 1.651 1.656 1.655 1.653 1.654 0.00172

  4 2.48 2.483 2.485 2.486 2.485 2.484 2.485 0.00102

  5 3.30 3.300 3.300 3.300 3.300 3.300 3.300 0.000

  分析测量数据可以看到对于0点和满量程两者都可以较好的测量出结果,但对于中间的数值,气体分析仪的测量结果往往偏大一点,造成这点的原因还有待更多的测量来讨论分析,不排除与电压表量程相关。如果只看气体分析仪的测量数值,可以发现还是相对比较稳定,除个别点外误差基本能控制在0.001V左右。

  5.2测量时间测试

  测量时间在使用过程中同样非常重要,因为打开气泵延时5s进行一次测量这个过程在两个模式中都有使用,针对这个过程测量了时间。连续5次的测量结果分别为7.47s、7.49s、9.81s、7.64s、7.64s。其中第三次分析应该是首次测量方差较大进行了第二次测量。考虑人眼的误差,根据数据可以得出,气体环境稳定的条件下每次测量耗时在7.5s以内。