S-Modlue远红外气体传感器的驱动设计与实现

在气体分析类产品中,我们经常会用到远红外气体传感器。我们就在碳氢类气体成分分析中使用了s-modlue远红外气体传感器。接下来,我们将讨论s-modlue远红外气体传感器驱动的设计与实现。
1、功能概述  s-module evo 使用非分散红外检测技术ndir,集成稳定红外光源,配置可靠性能的光电探测器,确保了传感器检测的稳定性能。
  s-module采用的是rs232串行通讯接口,但其通讯接口对外只有一个通讯引脚,所以实现的是半双工模式。串口参数为:2400波特率,7位数据位,1位停止位,偶校验。
  在应用层采用的则是modbus ascii协议。s-module非分光红外气体模块支持03和06功能码。s-module非分光红外气体模块支持的modbus参数如下:
2、驱动设计与实现  我们知道s-module远红外气体传感器采用基于半双工rs232接口的modbus ascii通讯协议。接下来我们将基于它的协议规则设计并实现驱动程序。
2.1、对象定义  在使用一个对象之前我们需要获得一个对象。同样的我们想要s-modlue远红外气体传感器就需要先定义s-modlue远红外气体传感器的对象。
2.1.1、对象的抽象  我们要得到s-modlue远红外气体传感器对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下s-modlue远红外气体传感器的对象。
  先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑s-modlue远红外气体传感器对象的属性。首先modbus协议对象都有站地址用以标识不同的设备,所以我们将设备地址作为对象的一个属性。此外,状态信息、温度、浓度等实时信息表示了对象当前的工作状态,所以我们将这些参数也作为对象的属性。
  接着我们还需要考虑s-modlue远红外气体传感器对象的操作问题。我们需要从s-modlue远红外气体传感器获取数据和下发命令,就需要通过串口发送消息,但串口的处理与具体的平台相关,所以我们将其作为对象的操作。此外,在操作对象的过程中需要控制时序,所以延时操作函数必不可少,而延时操作函数往往依赖于具体的软硬件平台,所以将延时函数作为对象的操作。
  根据上述我们对s-modlue远红外气体传感器的分析,我们可以定义s-modlue远红外气体传感器的对象类型如下:
/*定义ndir对象类型*/typedef struct ndirobject { uint8_t moduleaddress; uint16_t status; uint32_t softversion; float concentration; float temperature; void (*sendbyte)(uint8_t data); void (*delayms)(volatile uint32_t ntime);}ndirobjecttype;2.1.2、对象初始化  我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑s-modlue远红外气体传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计s-modlue远红外气体传感器对象的初始化函数如下:
/*ndir初始化配置函数*/void ndirinitialization(ndirobjecttype *ndir, //ndir对象 uint8_t moduleaddress, //模块地址 ndirsendbytetype send, //发送数据操作函数 ndirdelaymstype delayms //毫秒延时操作函数 ){ if((ndir==null)||(send==null)||(delayms==null)) { return; } ndir->sendbyte=send; ndir->delayms=delayms; ndir->moduleaddress=moduleaddress; ndir->concentration=0.0; ndir->temperature=0.0; ndir->status=0; ndir->softversion=0;}2.2、对象操作  我们已经完成了s-modlue远红外气体传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息,接下来我们还要实现面向s-modlue远红外气体传感器的各类操作。
  对于s-modlue远红外气体传感器对象来说,最基本的操作就是向其发送操作命令或数据消息。这是基于串口的modbus ascii协议的数据通讯,基于此我们可编写响应的数据发送操作函数如下:
/*发送数据给舒茨非分光红外气体检测模块(读写数据)*/static void ndirsenddata(ndirobjecttype *ndir,uint8_t *txdata,uint16_t length){ uint16_t senddataamount=0; uint8_t senddataarray[17]; //不小于(length+1)*2+3 uint8_t rawdata[7];//含校验码 for(int i=0;i3.1、声明并初始化对象  使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的s-modlue远红外气体传感器对象类型声明一个s-modlue远红外气体传感器对象变量,具体操作格式如下:
  ndirobjecttype ndir;
  声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:
ndirobjecttype *ndir, //ndir对象uint8_t moduleaddress, //模块地址ndirsendbytetype send, //发送数据操作函数ndirdelaymstype delayms //毫秒延时操作函数  对于这些参数,对象变量我们已经定义了。模块地址根据我们实际的使用情况输入就好了。主要的是我们需要定义几个函数,并将函数指针作为参数。这几个函数的类型如下:
/*发送一个字节操作函数指针类型*/typedef void (*ndirsendbytetype)(uint8_t data);/*毫秒延时函数指针类型*/typedef void (*ndirdelaymstype)(volatile uint32_t ntime);  对于这几个函数我们根据样式定义就可以了,具体的操作可能与使用的硬件平台有关系。具体函数定义如下:
static void sendbyteforndir(uint8_t data){ hal_uart_transmit(&ndirhuart,&data,1,1000);}  对于延时函数我们可以采用各种方法实现。我们采用的stm32平台和hal库则可以直接使用hal_delay()函数。于是我们可以调用初始化函数如下:
/*上位通讯设备端口初始化配置*/void ndir_init_configuration(void){ ndir_usart_init_configuration(); //配置串口中断 /*ndir初始化配置函数*/ ndirinitialization(&ndir, //ndir对象 0x02, //模块地址 sendbyteforndir, //发送数据操作函数 hal_delay //毫秒延时操作函数 ); /*读软件版本*/ readndirsoftversion(&ndir,rxbuffer);}3.2、基于对象进行操作  我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经封装了温度、浓度以及状态信息的操作函数,接下来我们使用这一驱动开发我们的应用实例。
/*ndir数据操作*/void ndir_comm_process(void){ /*从舒茨非分光红外气体检测模块读取浓度值*/ readconcentrationdata(&ndir,rxbuffer); /*从舒茨非分光红外气体检测模块读取内部温度值*/ readtemperaturedata(&ndir,rxbuffer); /*从舒茨非分光红外气体检测模块读取状态标志*/ readndirstatusflags(&ndir,rxbuffer);}4、应用总结  在我们的气体分析仪产品上,我们就是用来s-module远红外气体传感器,也是基于我们的这一驱动实现的,通讯稳定,效果良好。
  在使用驱动程序时需要注意,驱动程序将解析程序封装到了数据发送函数中,可以直接调用数据读取函数就可以了,也可以单独调用解析函数来实现,具体工作方式可应需求实现。

怎样做好电动机起动前的准备工作?
明天发布?华为P10:曲面来袭,三星S7edge跟荣耀8的结合体?
nRF7002 Wi-Fi 6协同IC以及nRF7002开发套件
我们如何将AIoT融入工业应用以及它会给我们带来什么益处?
如何实现高速时钟信号的差分布线
S-Modlue远红外气体传感器的驱动设计与实现
赵福全对话付于武(上):构建命运共同体是未来企业生存与发展的根本
区块链钱包是什么_区块链钱包可以做什么
罗永浩卸任,优点科技收购锤子科技子公司畅呼吸
法国液空集团投资中国太阳能电池1000万欧元
安谋科技亮相ICCAD 2023:聚焦本土创新,拥抱智能计算芯时代
xSPI NOR Flash的“x”代表什么?
英伟达嵌入式计算平台让神经网络走进终端设备
M1 Mac运行win10的网卡、声卡和多款x86软件已正常运行
PS4Slim评测 体积更小重量更轻外观更好看
一步步指南:热保护器、温度开关的选型过程解析「安的电子」
特斯拉Model S Plaid的充电功率探讨
华硕推出ROG Strix XG248Q,23.8寸大小,为顶级游戏玩家打造
关于嵌入式Linux项目开发内容
马斯克身家暴跌 3天蒸发210亿美元 特斯拉股价还将持续下跌