锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

外设驱动库开发笔记31:S-Modlue远红外气体传感器驱动

时间:2023-09-22 03:07:02 红外气体传感器的分类

??远红外气体传感器常用于气体分析产品。我们用于碳氢气体成分分析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.对象抽象

??我们要得到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.对象初始化

??我们知道,一个对象不能仅仅用于声明,我们需要首先初始化,所以我们在这里考虑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;i<length;i++)
 { 
        
  rawData[i]=txData[i];
 }
 rawData[6]=CheckSumCalc(txData,length);
 uint8_t objData[14];
 uint16_t cLength=ConvertHexArrayToASCIICharArray(rawData,length+1,objData);
 
 sendDataArray[sendDataAmount++]=':';
 for(int i=0;i<cLength;i++)
 { 
        
  sendDataArray[sendDataAmount++]=objData[i];
 }
 sendDataArray[sendDataAmount++]=0x0D;
 sendDataArray[sendDataAmount++]=0x0A;
 
 for(uint16_t sendDataIndex=0;sendDataIndex<sendDataAmount;sendDataIndex++)
 { 
        
  /*发送一个字节*/
  ndir->SendByte(sendDataArray[sendDataIndex]);
 }
}

3、驱动的使用

  我们已经实现了S-Module远红外气体传感器的驱动程序,但我们还需要验证一下它的正确性,所以在本节中我们就来设计一个简单的验证应用。

3.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远红外气体传感器,也是基于我们的这一驱动实现的,通讯稳定,效果良好。

  在使用驱动程序时需要注意,驱动程序将解析程序封装到了数据发送函数中,可以直接调用数据读取函数就可以了,也可以单独调用解析函数来实现,具体工作方式可应需求实现。

欢迎关注:

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章