岚宝科技PM2.5传感器驱动程序

《数据采集端——PM2.5传感器》

数据采集端使用PM2.5传感器为岚宝科技的串口颗粒物传感器;该传感器是一款基于激光散射原理的数字式通用颗粒物浓度传感器,可以连续采集并计算单位体积空气中不同粒径的悬浮颗粒个数,即颗粒物浓度分布,进而换算成为质量浓度,并以通用数字接口形式输出。

表1-1 传感器技术参数

参数

指标

单位

测量范围

0.3~1.0;1.0~2.5;2.5~10

微米(μm)

计数效率

50%@0.3um 98%@>=0.5 um

称准体积

0.1

升(L)

响应时间

≤10

秒(s)

直流供电电压

5.0

伏特(V)

最大工作电流

200

毫安(mA)

数据接口电平

L <0.8 @3.3 H >[email protected]

伏特(V)

工作温度范围

-20~+50

摄氏度(℃)

工作湿度范围

0~99%

平均无故障时间

≥3

年(Y)

最大尺寸

57 X 44 X 17

毫米(mm)

输出结果:主要输出为单位体积内各浓度颗粒物质量以及个数,其中颗粒物个数的单位体积为0.1升,质量浓度单位为:微克/立方米。岚宝科技PM2.5传感器驱动程序_第1张图片

传输协议:默认波特率9600,无校验位,8位数据位,1位停止位;相关格式如下:

0位

起始符1

0x42 (固定)

第1位

起始符2

0x4d (固定)

第2位

帧长度高8位

0x001C

帧长度=2x13+2(数据+校验位)

第3位

帧长度低8位

第4位

数据1高8位

PM1.0浓度(标准颗粒物)

第5位

数据1低8位

第6位

数据2高8位

PM2.5浓度(标准颗粒物)

第7位

数据2低8位

第8位

数据3高8位

PM10浓度(标准颗粒物)

第9位

数据3低8位

第10位

数据4高8位

PM1.0浓度(大气环境下)

第11位

数据4低8位

第12位

数据5高8位

PM2.5浓度(大气环境下)

第13位

数据5低8位

第14位

数据6高8位

PM10浓度(大气环境下)

第15位

数据6低8位

第16位

数据7高8位

0.1升空气中直径在0.3um以上颗粒物个数

第17位

数据7低8位

第18位

数据8高8位

0.1升空气中直径在0.5um以上颗粒物个数

第19位

数据8低8位

第20位

数据9高8位

0.1升空气中直径在1.0um以上颗粒物个数

第21位

数据9低8位

第22位

数据10高8位

0.1升空气中直径在2.5um以上颗粒物个数

第23位

数据10低8位

第24位

数据11高8位

0.1升空气中直径在5.0um以上颗粒物个数

第25位

数据11低8位

第26位

数据12高8位

0.1升空气中直径在10.0um以上颗粒物个数

第27位

数据12低8位

第28位

数据13高8位

保留

第29位

数据13低8位

保留

第30位

数据和校验高8位

校验=第0位+……+第29位

第31位

数据和校验低8位

 

      

       在本项目中通过USART1的RX(PA10)接收传感器的数据;通过USART1的串口接收中断获取数据;相关代码如下:

USART1中断接收服务函数:

//串口1中断服务函数
//用于接收PM2.5的值
void USART1_IRQHandler(void)//串口2中断服务程序
{
	uint8_t i;
	uint8_t Res;
	static char start=0;
	static uint16_t USART1_RX_STA;
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//接收中断
	{
		Res =USART_ReceiveData(USART1); 	//读取接收到的数据
		if(Res == 0x42) 			//如果接收的第一位数据是0X42
		{
			USART1_RX_STA = 0;     		//让数组索引值从0开始
			start = 1;  			//变量用于确定第二位是否接收到了0X4D
		}

		if(start == 1)
		{
			switch (USART1_RX_STA)
			{
				case 1:
					USART1_RX_BUF[0] = Res ;	break;		//接收0x4D
				case 12:
					USART1_RX_BUF[1] = Res ;	break;		//接收大气环境下PM2.5高8位
				case 13:
					USART1_RX_BUF[2] = Res ;	break;		//接收大气环境下PM2.5低8位
				default:	break;
			}
			USART1_RX_STA++;
			if(USART1_RX_STA >= 14 && (0x4d == USART1_RX_BUF[0]))
			{ 
				start  = 0;
				USART1_RX_STA=0;				//对static类型赋初值
				USART_ITConfig(USART1,USART_IT_RXNE,DISABLE);	//关闭接收终端,由定时器中断打开
				V_Pm25 = (USART1_RX_BUF[1]<<8) + USART1_RX_BUF[2];
				Tx_Data[0] = V_Pm25;				//数据传入全局变量
				printf("Value_Pm2.5 %d\t",V_Pm25);		//调试打印输出
			}
		}                   
	}
} 


 

 

你可能感兴趣的:(STM32)