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

Felcia ·
更新时间:2024-09-20
· 543 次阅读

一,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<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<CRL&=0XFFFF00FF; GPIOA->CRL|=0x00008b00; RCC->APB2ENR|=1<APB1ENR|=1<APB1RSTR|=1<APB1RSTR&=~(1<BRR=mantissa; USART2->CR1|=0X2004; USART2->CR1|=1<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<CR1|=1<SR&=~(1<APB1ENR|=1<ARR=arr; //设定计数器自动重装值//刚好1ms TIM3->PSC=psc; //预分频器7200,得到10Khz的计数时钟 TIM3->DIER|=1<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<APB2ENR|=1<CRL&=0XFF0FFFFF; GPIOB->CRL|=0X00300000;//PB.5 推挽输出 GPIOB->ODR|=1<CRL&=0XFF0FFFFF; GPIOE->CRL|=0X00300000;//PE.5推挽输出 GPIOE->ODR|=1<<5; //PE.5输出高 LED1=LED0=1; }

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


作者:liuxianfei0810



数据采集 数据 pwm 串口 pm2 stm32 传感器

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章