zoukankan      html  css  js  c++  java
  • 外设驱动库开发笔记32:HLPM025K3 PM2.5传感器驱动

      现在人们对大气环境及室内环境都比较关注。PM2.5在生活中也是常见的词汇。在有些产品中就要求检测PM2.5的数值。检测PM2.5的手段多种多样,在要求不高时我们通常可以采用激光模块。在这一篇中,我们将讨论HLPM025K3 PM2.5传感器驱动的设计与实现。

    1、功能概述

      HLPM025K3传感器采用激光散射原理。即令激光照射在空气中的悬浮颗粒物上产生散射,同时在某一特定角度收集散射光,得到散射光强随时间变化的曲线。通过稳定的气 体对流系统,使外界空气均匀的通过自主研发设计的风路,同时在风路中设有多个精密的光学传感器,可以精确的获得粒子的尺寸、速度和质量等信息,加以统计学原理,继而计算出总的粒子质量,从而实时的得到空气中所被关注的粒子的浓度,达到检测PM2.5以及PM10的目的。其基本原理如下图所示:

      HLPM025K3传感器采用串行通讯,采用6脚通讯接口,其引脚定义如下图所示:

      HLPM025K3传感器采用TTL串行通讯,采用9600的波特率,8为数据位,1为停止位,无校验的方式。HLPM025K3传感器通讯采取主动发送模式,0.8到1.2秒发送一次数据。其数据包含7个字节,具体格式如下:

      其中,校验位=PM2.5(H)+PM2.5(L)+PM10(H)+PM10(L)
      接收到的数据按公式计算后得到 PM2.5 和 PM10 的值。
      PM2.5 = (PM2.5(H)×256 + PM2.5(L))×0.1;
      PM10 = (PM2.5(H)×256 + PM2.5(L))×0.1;

    2、驱动设计与实现

      我们已经了解了HLPM025K3型PM2.5传感器的基本情况。在这一节中我们将设计并实现HLPM025K3型PM2.5传感器的驱动。

    2.1、对象定义

      在使用一个对象之前我们需要获得一个对象。同样的我们想要HLPM025K3 PM2.5传感器就需要先定义HLPM025K3 PM2.5传感器的对象。

    2.1.1、对象的抽象

      我们要得到HLPM025K3 PM2.5传感器对象,需要先分析其基本特性。一般来说,一个对象至少包含两方面的特性:属性与操作。接下来我们就来从这两个方面思考一下HLPM025K3 PM2.5传感器的对象。
      先来考虑属性,作为属性肯定是用于标识或记录对象特征的东西。我们来考虑HLPM025K3 PM2.5传感器对象属性。我们将测量数据作为对象的属性,因为他们表示了对象当前的状态。
      接着我们还需要考虑HLPM025K3 PM2.5传感器对象的操作问题。对象本身除了接受数据并没有什么需要操作的。我们使用队列来存储接收到的数据,所以入队出队过程可看作是其操作。
      根据上述我们对HLPM025K3 PM2.5传感器的分析,我们可以定义HLPM025K3 PM2.5传感器的对象类型如下:

    /*定义HLPM025K3对象类型*/
    typedef struct HlpmObject {
    	float pm25;		//PM2.5测量值
    	float pm100;	//PM10测量值
    	struct DwinRxBuffer{
    		uint8_t queue[HLPMRxBufferLength];	//键值存储队列
    		uint8_t pRead;									//读队列指针
    		uint8_t pWrite;									//写队列指针
    		uint16_t (*DeQueue)(struct HlpmObject *hlpm,uint8_t *rxBuf);	//出队操作
    		void (*EnQueue)(struct HlpmObject *hlpm,uint8_t rData);				//入队操作
    	}rxBuffer;					//定义接收缓存队列
    }HlpmObjectType;
    

    2.1.2、对象初始化

      我们知道,一个对象仅作声明是不能使用的,我们需要先对其进行初始化,所以这里我们来考虑HLPM025K3 PM2.5传感器对象的初始化函数。一般来说,初始化函数需要处理几个方面的问题。一是检查输入参数是否合理;二是为对象的属性赋初值;三是对对象作必要的初始化配置。据此我们设计HLPM025K3 PM2.5传感器对象的初始化函数如下:

    /*HLPM对象初始化函数*/
    void HlpmInitialization(HlpmObjectType *hlpm)
    {
    	if(hlpm==NULL)
    	{
    		return;
    	}
    	
    	hlpm->pm25=0.0;
    	hlpm->pm100=0.0;
    	
    	hlpm->rxBuffer.pRead=0;
    	hlpm->rxBuffer.pWrite=0;
    	hlpm->rxBuffer.EnQueue=BufferDataEnQueue;
    	hlpm->rxBuffer.DeQueue=BufferDataDeQueue;
    }
    

    2.2、对象操作

      我们已经完成了HLPM025K3 PM2.5传感器对象类型的定义和对象初始化函数的设计。但我们的主要目标是获取对象的信息,接下来我们还要实现面向HLPM025K3 PM2.5传感器的各类操作。
      由于HLPM025K3 PM2.5传感器对象是自主发送,所以我们需要做的就是接收消息并解析。

    /*解析PM2.5和PM10的数据*/
    bool ParsingPMData(HlpmObjectType *hlpm)
    {
    	uint16_t length=0;
    	uint8_t receivedData[7]={0};
    	bool isValid=false;
    	
    	length=hlpm->rxBuffer.DeQueue(hlpm,receivedData);
      
    	if(length>0)
    	{
    		isValid=CheckDataIsValid(receivedData);
    		if(isValid)
    		{
    			hlpm->pm25=SynthesisPMValue(receivedData+1);
    			hlpm->pm100=SynthesisPMValue(receivedData+3);
    		}
    	}
      return isValid;
    }
    

    3、驱动的使用

      我们已经设计并实现了HLPM025K3 PM2.5传感器对象的驱动程序。接下来我们设计一个简单的应用来验证这一驱动程序是否可行。

    3.1、声明并初始化对象

      使用基于对象的操作我们需要先得到这个对象,所以我们先要使用前面定义的HLPM025K3 PM2.5传感器对象类型声明一个HLPM025K3 PM2.5传感器对象变量,具体操作格式如下:
      HlpmObjectType hlpm;
      声明了这个对象变量并不能立即使用,我们还需要使用驱动中定义的初始化函数对这个变量进行初始化。这个初始化函数所需要的输入参数如下:
      HlpmObjectType *hlpm,HLPM025K3 PM2.5传感器对象
      这个对象变量我们已经定义了,所以只需输入这个对象就好了。于是我们可以调用初始化函数如下:
      HlpmInitialization(&hlpm);
      对于串口通讯,我们可以使用多种方式,我们在此使用中断来接收数据,具体实现如下:

    //数据接收中断处理函数
    void HLPM_USART_ReceiveDataHandle(void)
    {
      uint8_t res;
      // 接收寄存器为空,等待字节被对应的串口完全接收 
      if(__HAL_UART_GET_FLAG(&hlpmhuart,UART_FLAG_RXNE)!=RESET)
        {   
          
        // 获取接收到的字节数
        HAL_UART_Receive(&hlpmhuart,&res,1,1000);
        hlpm.rxBuffer.EnQueue(&hlpm,res);
        __HAL_UART_CLEAR_FLAG(&hlpmhuart,UART_FLAG_RXNE);
      }
    }
    

    3.2、基于对象进行操作

      我们定义了对象变量并使用初始化函数给其作了初始化。接着我们就来考虑操作这一对象获取我们想要的数据。我们在驱动中已经将获取数据并转换为转换值的比例值,接下来我们使用这一驱动开发我们的应用实例。

    /*数据获取*/
    void GetDataFromHLPM025K3(void)
    {
    	float pm25Value;
    	float pm10Value;
    	
    	ParsingPMData(&hlpm);
    	
    	pm25Value=hlpm.pm25;
    	pm10Value=hlpm.pm100;
    }
    

    4、应用总结

      我们已经设计并实现了HLPM025K3 PM2.5传感器对象的驱动程序,并且设计了简单的验证程序。HLPM025K3 PM2.5传感器的操作本身比较简单,只需要通过串口获取数据就可以了。
      驱动中采用了FIFO队列存储接收到的HLPM025K3 PM2.5传感器数据,主要是考虑到被动接收的情况下,能够保证正确的解析数据。如果不使用也是没有问题的,本身不是HLPM025K3 PM2.5传感器对象所必需的。

    欢迎关注:

    如果阅读这篇文章让您略有所得,还请点击下方的【好文要顶】按钮。

    当然,如果您想及时了解我的博客更新,不妨点击下方的【关注我】按钮。

    如果您希望更方便且及时的阅读相关文章,也可以扫描上方二维码关注我的微信公众号【木南创智

  • 相关阅读:
    LeetCode 面试题 02.02. 返回倒数第 k 个节点
    LeetCode 1290. 二进制链表转整数
    LeetCode 面试题52. 两个链表的第一个公共节点
    LeetCode 2. 两数相加
    Jupyter Notebook 常用快捷键 (转)
    LeetCode 414. 第三大的数
    LeetCode 404. 左叶子之和
    三年了
    LeetCode 543. 二叉树的直径
    求结点在二叉排序树中层次的算法
  • 原文地址:https://www.cnblogs.com/foxclever/p/15334767.html
Copyright © 2011-2022 走看看