近期,我们开发了一款用于检定各种酒精测试仪的产品,该产品是一种检测设备,用于对警用或者民用就见检测仪进行检定。

1、项目概述

本项目是一套用于酒精检测仪的检定的设备,用于测试酒精检测仪器精确性的检定。如可用于检定呼吸式警用酒精检测仪等。系统要实现温湿度检测、输入输出压力检测、温度控制及高精度温度检测等,因为在测试过程中温度和湿度会对检定的精确性有重要影响。进气分为6路,除了空气和酒精气体外,还有CO和丙酮等干扰性气体,有一套复炸的气体配置方式。同时又有4路气体加热腔室对测试气体进行加热并进行精确的温度控制。另外对气体的流量要进行控制并能实现数据远传和操作。

2、硬件设计

根据项目需求,在气体流量控制方面选优MFC(气体质量流量控制器)通过ADC和DAC实现控制。ADC和DAC都使用片上自带的,采用运算放大器进行隔离和放大使其输入输出0-5VDC信号。

温度检测通过LTC2400实现热电阻高精度温度采集。由于对温度非常敏感所以这部分要求较高,使用了24位的ADC实现高进度采集,通过SPI总线获取。

试验气体的配置采用6个六个电磁阀控制配置不同成分的测试气体。没路输出根据需要可输出干触点或者24VDC湿触点。

温度控制器采用宇电AI-7804同时实现4路温度的检测与控制。采用RS-485的通讯方式和PWM输出控制加热功率。

上位通讯采用两种方式,以太网远传和串口触摸屏控制。以太网采用W5500和SPI接口方式实现:

而串口触摸屏的通讯采用RS485或者RS232方式,本次采用RS485的通讯方式,使用MAX3485芯片实现。

压力检测采用MS5803采集压力的变化,采用I2C通讯。湿度检测使用SHT15实现,采用类式I2C通讯方式,通过GPIO模拟。

3、软件设计

软件的设计采用IAR EWARM V7.8和ST标准库V3.5实现。具体的软件设计包括上位远传通讯、模拟量输入输出控制、逻辑控制、热电阻温度采集、温湿度和压力数据采集以及加热和温度控制。

为了让软件更好地适应更换传感器和应用不同场合的功能增减要求,我们在设计软件时使用了一个配置文件来配置更能的使用和增减。这个配置文件就是一个头文件,定义了一些宏来控制条件编译,节选部分配置文件如下:

/*定义以太网通讯功能的使能,1:启用;0:禁用*/#ifndef Ethernet_ENABLE#define Ethernet_ENABLE (1)#endif/*定义串口上位通讯使能,1:启用;0:禁用*/#ifndef UPPER_SERIAL_ENABLE#define UPPER_SERIAL_ENABLE (0)#endif/*定义片上Flash存取使能,1:启用;0:禁用*/#ifndef STORAGE_ENABLE#define STORAGE_ENABLE (0)#endif/*定义模拟量输入是否启用,1:启用;0:禁用*/#ifndef ANALOG_INPUT_ENABLE#define ANALOG_INPUT_ENABLE (1)#endif/*定义模拟量输出是否启用,1:启用;0:禁用*/#ifndef ANALOG_OUTPUT_ENABLE#define ANALOG_OUTPUT_ENABLE (1)#endif/*定义数字量操作是否启用,1:启用;0:禁用*/#ifndef DIGITAL_ENABLE#define DIGITAL_ENABLE (1)#endif/*定义温湿度计是否启用,1:启用;0:禁用*/#ifndef HYGRO_THERMO_ENABLE#define HYGRO_THERMO_ENABLE (1)#endif/*压力变送器是否启用,1:启用;0:禁用*/#ifndef PRESS_TRANS_ENABLE#define PRESS_TRANS_ENABLE (1)#endif/*热电阻采集电路是否启用,1:启用;0:禁用*/#ifndef RTD_COLLECT_ENABLE#define RTD_COLLECT_ENABLE (0)#endif/*备用串行设备是否启用,1:启用;0:禁用*/#ifndef SERIAL_SPARE_ENABLE#define SERIAL_SPARE_ENABLE (0)#endif/*温控器是否启用,1:启用;0:禁用*/#ifndef THERMOSTAT_ENABLE#define THERMOSTAT_ENABL (0)#endif/*定义串口上位通讯方式的选择,1:RS232;0:RS485*/#ifndef UPUSART_COMM_TYPE#define UPUSART_COMM_TYPE (0)#endif/*定义压力变送器MS4515DO的通讯方式的选择,1:SPI;0:I2C*/#ifndef MS4515DO_COMM_TYPE#define MS4515DO_COMM_TYPE (0)#endif/*定义启用的压力变送器类型,1:MS5837;0:MS5803*/#ifndef PRESSURE_TRANSMITTER_TYPE#define PRESSURE_TRANSMITTER_TYPE (0)#endif/*定义MS5803(MS5837)采集值是否启用滤波功能,1:启用;0:禁用*/#ifndef MS5803_FILTER_ENABLE#define MS5803_FILTER_ENABLE (1)#endif

上位远传通讯包括有以太网通讯和串口通讯,以太网通讯用于连接远程计算机,出口通讯用于连接触摸屏。均使用Modbus协议,支持03、06、16等功能码。

//解析接收到的数据

uint16_t ReceivedDataParsing(uint8_t *rxBuffer,uint8_t *txBuffer){uint16_t length=0;uint8_t fuctionCode=rxBuffer[7];switch(fuctionCode){case READ_HOLDING_REGISTERS:{uint16_t startAddress=rxBuffer[8];startAddress=(startAddress<<8)+(uint16_t)rxBuffer[9];uint16_t RegisterNumber=rxBuffer[10];RegisterNumber=(RegisterNumber<<8)+(uint16_t)rxBuffer[11];//RegisterNumber=0;//读取对应寄存器数值
uint8_t returnData[REGISTERAMOUNT*2+2];GetRegisterValue(startAddress,RegisterNumber,returnData);uint16_t byteCount=0;txBuffer[byteCount++]=rxBuffer[0];txBuffer[byteCount++]=rxBuffer[1];txBuffer[byteCount++]=rxBuffer[2];txBuffer[byteCount++]=rxBuffer[3];uint16_t byteAmount=RegisterNumber*2+3;txBuffer[byteCount++]=(byteAmount>>8);txBuffer[byteCount++]=byteAmount;txBuffer[byteCount++]=rxBuffer[6];for(int i=0;i<RegisterNumber*2+2;i++){txBuffer[byteCount++]=returnData[i];}length=byteCount;break;}case WRITE_SINGLE_REGISTER:{//txBuffer=rxBuffer;//将指针赋值,不能改变数组的值
uint16_t ByteAmount=rxBuffer[4];ByteAmount=(ByteAmount<<8)+(uint16_t)rxBuffer[5];length=ByteAmount+6;uint16_t objectRegister=0;objectRegister=rxBuffer[8];objectRegister=(objectRegister<<8)+(uint16_t)rxBuffer[9];uint16_t setValue=rxBuffer[10];setValue=(setValue<<8)+(uint16_t)rxBuffer[11];//将设定值写到对应的寄存器
SetRegisterValue(objectRegister,setValue);for(int i=0;i<length;i++){txBuffer[i]=rxBuffer[i];}break;}case WRITE_MULTI_REGISTER:{length=12;SetMultiRegisterValue(rxBuffer+8);for(int i=0;i<length;i++){txBuffer[i]=rxBuffer[i];}txBuffer[5]=0x06;break;}default:{break;}}return length;}

模拟量输入输出控制的控制较为简单,直接使用DMA操作方式,实现简单方便,不用详述。数字量的控制方式以及温度的SPI操作与前面文章中的一致。

温湿度采集使用的SHT15模块,它的通讯协议类是于I2C方式,但是用STM32自带的I2C来操作却不方便,所以使用GPIO来实现通讯。为了方便在不同的系统使用所以对时钟和数据引脚的操作采用的回掉函数来实现。

先编写SHT15(实际上SHT1X均可用)的操作函数,并在此时用弱化的操作函数:

/*读取DATA引脚位,弱化的函数,无操作,必须在应用中实现该函数,并自动调用*/__weak uint8_t ReadDataPinBit(void){return 0;}/*将DATA线设置为输入输出方向模式*/__weak void SetDataPineDirection(IODirection direction){}

事实上是,什么也不做,然后在最终的应用中来实现这两个函数,以实现相应的操作,对于不同的系统只需在应用中实现不同操作。

/*读取DATA引脚位*/uint8_t ReadDataPinBit(void){return GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7);}/*将DATA线设置为输入输出方向模式*/void SetDataPineDirection(IODirection direction){GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;if(direction){GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;}else{GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;}GPIO_Init( GPIOB, &GPIO_InitStructure);}

同时使用函数执政数组的方式来简化SCK和DATA引脚的操作函数的编写:

/*定义操作GPIO管脚的函数指针*/void (*OperationSHT1xIO[])(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin)={GPIO_ResetBits,GPIO_SetBits};/*定义SHT1X总线引脚操作函数指针*/BusPinOperation SetBusPin[]={OperationSckPin,OperationDataPin};/*操作SCK引脚,设置高低操作*/void OperationSckPin(BusPinValue value){OperationSHT1xIO[value](GPIOB,GPIO_Pin_6);}/*操作DATA引脚,设置高低操作*/void OperationDataPin(BusPinValue value){OperationSHT1xIO[value](GPIOB,GPIO_Pin_7);}同时定义几个枚举类型:typedef enum{Set=1,Reset=(!Set)}BusPinValue;typedef enum{Out=1,In=(!Out)}IODirection;typedef enum{SckPin=0,DataPin=1}SHT1XPin;

这样要操作那个引脚就非常方便了:

 /*将data线设置为输出模式*/SetDataPineDirection(Out);/*将DATA引脚置位*/SetBusPin[DataPin](Set);

压力数据采集的采用I2C总线,对STM32的I2C通讯网上文章很多此处不再重复,需要提一下的是整个操作也是适用函数指针来实现毁掉的方式来简化编程过程。另外STM32的I2C好像比较容易出现死锁的情况,不知为何,有待解惑。

加热和温度控制采用RS485通讯,使用宇电的AI-BUS协议,这个比较简单,不再多说。

4、结果验证

经过差不多2周的调试,现在设备已经成型,效果还是比较理想的,首先来一张调试图片:

这是现实的DAC输出电压:

这是数据远传以Modscan读取数据的结果:

来一张组装后的图片:

最后来一组测试是的上位操作及显示画面:

最后说一下这次的一点体会,以往程序调试没问题就算好了,由于这个产品对时间非常敏感,有些测试过程必须在很短的时间(以毫秒为单位)完成。所以这次我再软解的整体结构上下了一些功夫,让速度提升了好几倍,所以我觉得规划好程序结构也是一很重要的方面。

转载于:https://www.cnblogs.com/foxclever/p/6657603.html

酒精测试仪检定设备设计与验证相关推荐

  1. “计量确认”与“检定”之区别

    "计量确认"与"检定"之区别  -----浅谈企业应如何进行"计量确认"工作 唐伟群 (武汉锅炉股份有限公司,湖北 武汉 430070) 目 ...

  2. matlab simca,SIMCA软件|SIMCA-多元数据分析软件

    SIMCA 16-多元数据分析软件 软件简介 SIMCA 软件是科学家.研究员.产品开发员.工程师等人士,在处理大批量数据集时使用的标准工具.只需要通过鼠标点击,您的数据就可以转化为信息,让您迅速而自 ...

  3. 西门子AmeSim车辆仿真软件在新能源汽车开发中的应用-软件AmeSim2021版分享

    利用Simcenter Amesim提高系统仿真产品设计效率,Simcenter Amesim是一个全球领先的集成.可扩展的机.电.液系统仿真平台.它允许设计工程师虚拟评估和优化系统性能. 提高系统仿 ...

  4. 前端 new实例后销毁实例_干货|仪器设备检定校准后的确认(实例)

    在CNAS-CL01:2018(ISO/IEC17025:2017)的6.4.7中"实验室应制定校准方案,并应进行复核和必要的调整,以保持对校准状态的可信度.6.4.4规定:"当设 ...

  5. 计算机软件使用前验证校准,ISO对计量器具管理要求

    一.ISO9001:2000标准对仪器管理之要求 7.6监视和测量装置的控制 组织应确定需实施的监视和测量以及所需的监视和测量装置,为产品符合确定的要求提供证据. 组织应建立过程,以确保监视和测量活动 ...

  6. 验证(Verification) 确认(Validation)鉴定( Qualification) 的区别

    百家之言.越辩越明还是越辩越不明.这种问题没有正确和好的答案,考试的话就是考个人的表达能力和想象力. http://wenku.baidu.com/view/a86ef9c20c22590102029 ...

  7. 高压蒸汽灭菌及验证相关知识

    高压蒸汽灭菌及验证相关知识 一.高压蒸汽灭菌原理 高压蒸汽灭菌是热力消毒方法中最普遍,效果最可靠的一种灭菌方法,其优点是蒸汽穿透力强,能杀灭所有微生物. 高压灭菌是湿热消毒法的一种,其原理是:在密闭的 ...

  8. 电脑接口自动测试软件,通过多种接口总线与计算机实现自动检定/校准测试系统的设计...

    2.1 多总线仪器硬件兼容的实现方案 如图2中VISA接口子层是实现仪器统一编程接口的核心.VISA详细规范了虚拟仪器I/O接口软件的组成.内部结构与实现规则,而符合此规范的虚拟仪器I/O接口函数就是 ...

  9. 测量设备校准/验证后,如何判定是否符合有关规范?

    测量设备校准/验证后,如何判定是否符合有关规范? 在标准中7.1.5.2.1 校准/验证记录 f)校准/验证后,有关符合规范的声明:意味着在测量设备校准或验证完后,需要给出书面的判定结果.多数情况下, ...

最新文章

  1. 下载安装 binary editor
  2. CentOS配置网易163 yum源
  3. SAP ABAP里存在Java List这种集合工具类么?CL_OBJECT_COLLECTION了解一下
  4. ASP.NET Core 快速入门(实战篇)
  5. Entity Framework5.0运行时错误ObjectStateManager 中已存在具有同一键的对象
  6. 检查oracle安装必须包,Linux安装oracle11gR2官方步骤
  7. 聊聊我对写好程序的认识
  8. C++/C高级数据类型
  9. 初识计算机编程语言教案,完整版,初识VB教学设计
  10. 网站的动静分离实践(动静分离)
  11. 计算机跨专业考会计专硕,二本二战三跨如何考上985会计专硕之数学篇
  12. SDRAM内存条时序特点
  13. android gsm功能,Android手机-GSM网络与WCDMA网络选择的设置
  14. python绘制彩色地震剖面断层解释_断层在地震剖面上的反映及解释
  15. 从客户端(jianjie=psasdasdfas/p)中检测到有潜在危险的 Request.Form 值
  16. 如何用Intel主板集成的RAID控制器(Intel RST)实现硬盘提速与硬盘数据恢复
  17. Aptana Studio3的安装问题
  18. DateTime转为特定时区时间
  19. P255Java练习
  20. 用智能硬件“折叠时间”,外卖商家正在触摸的数字化未来

热门文章

  1. as5.4安装gcc和g++
  2. 你要练神功,就应该先自宫,对不?
  3. JS中URL编码方法的比较
  4. mysql将最大金额加1000_Mysql数据库笔记
  5. addeventlistener 清除_科普100秒 | 吃花生能软化血管、清除垃圾?
  6. C++递归或非递归实现n的阶乘
  7. python循环括号_Python for循环内括号语法
  8. paste linux 相同字符,Linux命令之字符串处理命令paste命令使用实例
  9. string字符串数字自增_常见的字符串操作
  10. 内卷太厉害怎么办?多读好书破万“卷”