基于STM32的ZPH01粉尘传感器数据采集及处理(PM2.5测量),串口和PWM模式

一,PM2.5概念
细颗粒物又称细粒、细颗粒、PM2.5。细颗粒物指环境空气中空气动力学当量直径小于等于 2.5 微米的颗粒物。它能较长时间悬浮于空气中,其在空气中含量浓度越高,就代表空气污染越严重。虽然PM2.5只是地球大气成分中含量很少的组分,但它对空气质量和能见度等有重要的影响。与较粗的大气颗粒物相比,PM2.5粒径小,面积大,活性强,易附带有毒、有害物质(例如,重金属、微生物等),且在大气中的停留时间长、输送距离远,因而对人体健康和大气环境质量的影响更大。2013年2月,全国科学技术名词审定委员会将PM2.5的中文名称命名为细颗粒物。细颗粒物的化学成分主要包括有机碳(OC)、元素碳(EC)、硝酸盐、硫酸盐、铵盐、钠盐(Na⁺)等。
在这里插入图片描述
(摘自百度)

二,ZPH01传感器介绍
ZPH01传感器是整合了成熟的VOC检测技术与先进PM2.5检测机理,实现对VOC与PM2.5的同时检测。该传感器中VOC检测单元对甲醛、苯、一氧化碳、氨气、氢气、酒精、香烟烟雾、香精等有机挥发气体具有极高的灵敏度。PM2.5检测单元采用粒子计数原理,可灵敏检测直径1μm以上灰尘颗粒物。
备注:VOC是Volatile Organic Compounds的缩写,即有机挥发物。含甲苯、乙苯、苯乙烯、甲醛、乙醇、十四碳烷、TVOC等。
ZPH01传感器的特点:极高的灵敏度、优异的长期稳定性、出厂已标定校准、内置加热器可实现空气的自动吸入。

三,ZPH01传感器技术指标

1,工作电压范围        5±0.2 V DC
2,输出方式            PWM /UART
3,检测能力
(1)VOC检测气体		      总类
				     甲醛、苯、一氧化碳、氢气、酒精、氨气、香烟烟雾、香精等
(2)粉尘最小粒子检出能力   1 μm
4,预热时间            ≤5 min
5,检测粒子范围        15000/283 ml
6,工作电流            ≤150 mA
7,湿度范围
					  储存环境 ≤90% RH
					  工作环境 ≤90% RH
8,温度范围         
					  储存环境 -20 ℃~50 ℃
					  工作环境 0 ℃~50

四,传感器使用时须注意的事项:

1、传感器必须垂直安装,避免接触有机溶剂(包括硅胶及其他胶粘剂)、涂料、药剂、油类及高浓度气体。远离人工气流如风扇,如当用于空气清新机时,风扇的前方和后方都不能安装,可任选外壳一侧安装,但外壳上要保留通风口以保证外部气流可以流进来。
2、粉尘传感器能检测到像粉尘一样的水蒸气,请不要在有水蒸气的地方像浴室或空气加湿气附近使用传感器。
3、粉尘传感器利用红外线的 LED 和可见光截止的光电传感器,在光学区域灯光的辐射会影响粉尘传感器的输出准确度。使用时建议用海绵遮盖粉尘传感器中心三角孔,防止外部光照照进传感器的镜头。切记勿遮挡传感器的进气口和出气口。
4、模组初次上电使用需要预热 5 分钟以上,切勿应用到涉及人身安全的系统中。
5、当传感器受潮湿将会影响它的正常功能,因此应避免受潮。
6、透镜需要根据使用环境定时进行清洁,约 6 个月一次。清洁时用棉签一头醮清水轻擦,然后用另一头擦干。不可以用酒精等有机溶剂擦拭透镜。

五,原理示意:
在这里插入图片描述
六,ZPH01传感器输出对照转化表
在这里插入图片描述
注:空气检测领域中常用“优、良、中、差”区分当前空气质量状况。模组内部经过标定校准,直接输出0x00-0x03四个等级,依次对应“优、良、中、差”

在这里插入图片描述
在这里插入图片描述
备注:空气检测领域中常用“优、良、中、差”区分当前空气质量状况,业内常用划分等级标准为:
1:较高灵敏度方案:

优:0.00%-2.00%
良:2.00%-4.00%
中:4.00%-6.00%
差:6.00%以上

2:较好一致性方案:

优:0.00%-4.00%
良:4.00%-8.00%
中:8.00%-12.00%
差:12.00%以上

七,ZPH01传感器接口定义

在这里插入图片描述
说明:
1、加热源:传感器内置一个加热器,加热引起气流上升使外部空气流进传感器内部。
2、检测的粒子类型:此传感器被设计成可以检测 1μm 以上粒子,如香烟、房屋灰尘、霉菌、 花粉、孢子。
3、控制脚 :此脚位为输出模式控制(悬空为 PWM 模式,GND 为串口模式)
4、输出脚 OUT2/RXD :此脚位串口模式下为 RXD,PWM 模式下为普通输出脚位,灵敏度已预设定,最小粒子检出能力为 1μm。
5、输出脚 OUT1/TXD :此脚位串口模式下为 TXD,PWM 模式下为普通输出脚位,输出 VOC 等级。

八,ZPH01传感器PWM模式输出波形
在这里插入图片描述

在这里插入图片描述
备注:
1、LT 一个周期内低电平的脉宽
2、UT 一个周期的脉宽
3、低脉冲率RT:RT=LT/ UT × 100%

九,ZPH01传感器通讯协议

1 通用设置

波特率			9600
数据位 			8 位
停止位 			1 位
校验位 			无

2 通讯命令
模块每间隔1S发送一次浓度值,只发送不接收。命令行格式如下:

0 		    1 		     2 		          3 		        4 		        5 		6 		7 		8
起始位 检测类型名称编码 单位(低脉冲率)低脉冲率整数部分 低脉冲率小数部分预留   模式  VOC等级   校验值
0xFF  0x18    0x00   0x00-0x63 0x00-0x63 0x00 0x01 0x00-0x03 0x00-0xFF

注:模式0x01表示PWM为1Hz输出模式。
在这里插入图片描述
备注:
对占空比的换算:例如,传感器发出一帧数据,第三位0x12,第四位0x13,则表示传感器输出占空比为18.19%。
对PM2.5的换算:将比例系数k*18.19%即可得到探测器测到的环境PM2.5的浓度,经验值:k=1000左右。

十,ZPH01传感器校验和

/**********************************************************************
* 函数名: FucCheckSum(uchar *i,ucharln)
* 功能描述:求和校验(取发送、接收协议的1\2\3\4\5\6\7的和取反+1)
* 函数说明:将数组的元素1-倒数第二个元素相加后取反+1(元素个数必须大于2)
**********************************************************************/
unsigned char FucCheckSum(unsigned char *i,unsigned char len)
{
	unsigned char j,result=0;
	i+=1;
	for(j=0;j<(len-2);j++)
	{
		result+=*i;
		i++;
	}
	result=(~result)+1;
	return result;
}

十一,程序源码

//串口2C文件
#include "usart2.h"	  
#include "timer.h"
#include "led.h"
#include "usart.h"
#include "beep.h"
USART usart2={0,0,0}; 
/*
*	串口中断函数
*/ 
void USART2_IRQHandler(void)
{
	u8 res;
	static u8 flag=0;
	
	if((USART2->SR&(1<<5)))	//接收到数据
	{		 	
		res=USART2->DR; 
		if(res==255)
		{
			flag=1;
			LED1=0;
		}
		if(flag)
		{
			usart2.usart_rx_buff[usart2.count++]=res;	
			if(usart2.count>8)
			{
				USART2->CR1 &=~(1<<5); 
				usart2.flag=1;
				BEEP=!BEEP;
				flag=0;
				LED1=1;
//				printf("\r\ncount=%d\r\n",usart2.count);		
			}
		}		
	}
} 
									 
/*
*	初始化IO 串口2
*	pclk2:PCLK2时钟频率(Mhz)
*	bound:波特率 
*/
void uart2_Init(u32 pclk2,u32 bound)
{  	 
	float temp;
	u16 mantissa;
	u16 fraction;	
	temp=(float)(pclk2*1000000)/(bound*16);
	mantissa=temp;			
	fraction=(temp-mantissa)*16; 
    mantissa<<=4;
	mantissa+=fraction; 	
	GPIOA->CRL&=0XFFFF00FF;
	GPIOA->CRL|=0x00008b00;
	RCC->APB2ENR|=1<<2;   
	RCC->APB1ENR|=1<<17;   
	RCC->APB1RSTR|=1<<17;  
	RCC->APB1RSTR&=~(1<<17);
 	USART2->BRR=mantissa;
	USART2->CR1|=0X2004;  
	USART2->CR1|=1<<5;      	
	MY_NVIC_Init(2,2,USART2_IRQn,2);
}

//ZPH01c部分文件
#include "ZPH01.h"
#include "usart2.h"	
#include "usart.h"	
#include "led.h"
#include "beep.h"
#include "delay.h"
/*
控制脚 :此脚位为输出模式控制(悬空为 PWM 模式,GND 为串口模式)
*/
typedef struct __ZPH01
{
	uchar flag;
	uchar timerFlag;
	uchar checkSum;
	uchar datBasic[9];
	float datProcess;
}ZPH01;
#if  (0==ZPH01MODESEL)
/*
*	ZPH01初始化函数(串口模式)
*/
void ZPH01_InitUART(void)
{  	 
	uart2_Init(72,9600);
	usart2.count=0;
	usart2.flag=0;
	TIM3->CR1|=0x01; 
}

//ZPH01头文件
#ifndef __ZPH01_H
#define __ZPH01_H
#include "stm32f10x.h"
#include "sys.h"
#define uchar unsigned char
#define uint unsigned  int
//ZPH01MODESEL=0 串口模式  ZPH01MODESEL=1 PWM模式
#define ZPH01MODESEL 0  
#if  (0==ZPH01MODESEL)
void ZPH01_InitUART(void);
void ZPH01_HandlerUART(void);
uchar ZPH01_FucCheckSumUART(uchar *dat,uchar len);
#else
void ZPH01_InitPWM(void);
void ZPH01_HandlerPWM(void);
uchar ZPH01_FucCheckSumPWM(uchar *dat,uchar len);
#endif
#endif

//定时器C文件
#include "timer.h"
#include "led.h"	 
#include "usart2.h"	
#include "beep.h"
//定时器3中断服务程序	 
void TIM3_IRQHandler(void)
{ 	 
	if(TIM3->SR&0X0001)//溢出中断
	{
		LED0=!LED0;
		if(usart2.timerFlag==1)
		{
			USART2->CR1 &=~(1<<5);   
			usart2.timerFlag=0;
		}
		else
		{
			USART2->CR1|=1<<5;   
			usart2.timerFlag=1;
		}
	}				   
	TIM3->SR&=~(1<<0);//清除中断标志位 	
 
}

//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
	RCC->APB1ENR|=1<<1;	//TIM3时钟使能    
 	TIM3->ARR=arr;  	//设定计数器自动重装值//刚好1ms    
	TIM3->PSC=psc;  	//预分频器7200,得到10Khz的计数时钟		  
	TIM3->DIER|=1<<0;   //允许更新中断	  
	TIM3->CR1|=0x00;    //使能定时器3
  	MY_NVIC_Init(1,2,TIM3_IRQn,2);//抢占1,子优先级3,组2									 
}
//ledC文件
#include "led.h"

//初始化PB5和PE5为输出口.并使能这两个口的时钟		    
//LED IO初始化
void LED_Init(void)
{
	RCC->APB2ENR|=1<<3;    //使能PORTB时钟	   	 
	RCC->APB2ENR|=1<<6;    //使能PORTE时钟	
	   	 
	GPIOB->CRL&=0XFF0FFFFF; 
	GPIOB->CRL|=0X00300000;//PB.5 推挽输出   	 
    GPIOB->ODR|=1<<5;      //PB.5 输出高
											  
	GPIOE->CRL&=0XFF0FFFFF;
	GPIOE->CRL|=0X00300000;//PE.5推挽输出
	GPIOE->ODR|=1<<5;      //PE.5输出高 
	LED1=LED0=1;	
}

注意:ZPH01传感器安装位置特别重要,安装位置会影响数据采集的准确性

发布了36 篇原创文章 · 获赞 34 · 访问量 6918

猜你喜欢

转载自blog.csdn.net/liuxianfei0810/article/details/105612537