天天看點

外設驅動庫開發筆記32:HLPM025K3 PM2.5傳感器驅動

  現在人們對大氣環境及室内環境都比較關注。PM2.5在生活中也是常見的詞彙。在有些産品中就要求檢測PM2.5的數值。檢測PM2.5的手段多種多樣,在要求不高時我們通常可以采用雷射子產品。在這一篇中,我們将讨論HLPM025K3 PM2.5傳感器驅動的設計與實作。

1、功能概述

  HLPM025K3傳感器采用雷射散射原理。即令雷射照射在空氣中的懸浮顆粒物上産生散射,同時在某一特定角度收集散射光,得到散射光強随時間變化的曲線。通過穩定的氣 體對流系統,使外界空氣均勻的通過自主研發設計的風路,同時在風路中設有多個精密的光學傳感器,可以精确的獲得粒子的尺寸、速度和品質等資訊,加以統計學原理,繼而計算出總的粒子品質,進而實時的得到空氣中所被關注的粒子的濃度,達到檢測PM2.5以及PM10的目的。其基本原理如下圖所示:

外設驅動庫開發筆記32:HLPM025K3 PM2.5傳感器驅動

  HLPM025K3傳感器采用串行通訊,采用6腳通訊接口,其引腳定義如下圖所示:

外設驅動庫開發筆記32:HLPM025K3 PM2.5傳感器驅動

  HLPM025K3傳感器采用TTL串行通訊,采用9600的波特率,8為資料位,1為停止位,無校驗的方式。HLPM025K3傳感器通訊采取主動發送模式,0.8到1.2秒發送一次資料。其資料包含7個位元組,具體格式如下:

外設驅動庫開發筆記32:HLPM025K3 PM2.5傳感器驅動

  其中,校驗位=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傳感器對象所必需的。

歡迎關注:

外設驅動庫開發筆記32:HLPM025K3 PM2.5傳感器驅動

如果閱讀這篇文章讓您略有所得,還請點選下方的【好文要頂】按鈕。

當然,如果您想及時了解我的部落格更新,不妨點選下方的【關注我】按鈕。

如果您希望更友善且及時的閱讀相關文章,也可以掃描上方二維碼關注我的微信公衆号【木南創智】

繼續閱讀