
1:PM5003T颗粒物传感器产品介绍:
PMS5003T 是一款可以同时监测空气中颗粒物浓度及温湿度的二合一传感器。其中颗粒物浓度的监测基于激光散射原理,可连续采集并计算单位体积内空气中不 同粒径的悬浮颗粒物个数,即颗粒物浓度分布,进而换算成为质量浓度。传感器同时内嵌瑞士生产的温湿度一体检测芯片。颗粒物浓度数值及温度、湿度合并以通用数字接口形式输出。本传感器可嵌入各种与空气质量监测和改善相关的仪器设备,为其提供及时准确的环境参数。
工作原理:
本传感器采用激光散射原理。即令激光照射在空气中的悬浮颗粒物上产生散射, 同时在某一特定角度收集散射光,得到散射光强随时间变化的曲线。进而微处理 器利用基于米氏(MIE)理论的算法,得出颗粒物的等效粒径及单位体积内不同 粒径的颗粒物数量。
2:硬件接口定义:
输出结果:
1. 主要输出为单位体积内各浓度颗粒物质量以及个数,其中颗粒物个数的单位 体积为 0.1 升,质量浓度单位为:微克/立方米。
2. 输出分为主动输出和被动输出两种状态。传感器上电后默认状态为主动输出, 即传感器主动向主机发送串行数据,时间间隔为 200~800ms,空气中颗粒物 浓度越高,时间间隔越短。主动输出又分为两种模式:平稳模式和快速模式。 在空气中颗粒物浓度变化较小时,传感器输出为平稳模式,即每三次输出同样的一组数值,实际数据更新周期约为 2s。当空气中颗粒物浓度变化较大时, 传感器输出自动切换为快速模式,每次输出都是新的数值,实际数据更新周 期为 200~800ms。
3. 温湿度输出:输出吸入传感器内部的采样空气温度及湿度。
典型电路连接方式:
电路设计应注意:
1. PMS5003T 需要 5V 供电,这是因为风机需要 5V 驱动。但其他数据通讯和控 制管脚均需要 3.3V 作为高电平。因此与之连接通讯的主板 MCU 应为 3.3V 供 电。如果主板 MCU 为 5V 供电,则在通讯线(RXD、TXD)和控制线(SET、 RESET)上应当加入电平转换芯片或电路。
2. SET 和 RESET 内部有上拉电阻,如果不使用,则应悬空。
3. PIN7 和 PIN8 为程序内部调试用,应用电路中应使其悬空。
4. 应用休眠功能时应注意:休眠时风扇停止工作,而风扇重新启动需要至少 30秒的稳定时间,因此为获得准确的数据,休眠唤醒后传感器工作时间不应低于 30秒。
3:软件代码:
使用串口1,波特率:9600bps 检验位:无 停止位:1位
3.1串口1配置方式:
串口通讯配置步骤:
串口时钟使能,GPIO时钟使能:RCC_APB2PeriphClockCmd();
串口复位:USART_DeInit(); 这一步不是必须的
GPIO端口模式设置:GPIO_Init();
串口参数初始化:USART_Init();
开启中断并且初始化NVIC(如果需要开启中断才需要这个步骤)
NVIC_Init();
USART_ITConfig();
⑥使能串口:USART_Cmd();
⑦编写中断处理函数:USARTx_IRQHandler();
⑧串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
⑨串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
void USART_ClearITPendingBit(USART_TypeDef* USARTx, uint16_t USART_IT);
void uart_init(u32 bound)
{
//GPIO端口设置
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
//USART1_TX GPIOA.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
//USART1_RX GPIOA.10初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA10
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.10
//Usart1 NVIC 配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
//USART 初始化设置
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART1, &USART_InitStructure); //初始化串口1
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接受中断
USART_Cmd(USART1, ENABLE); //使能串口1
}
3.2 数据接收函数:
void USART1_IRQHandler(void) //串口1中断服务程序
{
u8 Res;
#if SYSTEM_SUPPORT_OS //如果SYSTEM_SUPPORT_OS为真,则需要支持OS.
OSIntEnter();
#endif
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART1); //读取接收到的数据
if(u8UART3RecvStatus == 0)
{
if(Res== 0x42)
{
USART_RX_STA = 0 ;
USART_RX_BUF[USART_RX_STA] = Res ;
u8UART3RecvStatus = 1;
}
}
else if(u8UART3RecvStatus == 1)
{
if(Res== 0x4D)
{
u8UART3RecvStatus = 2 ;
USART_RX_STA ++ ;
USART_RX_BUF[USART_RX_STA] = Res ;
}
else
u8UART3RecvStatus = 0 ;
}
else if (u8UART3RecvStatus == 2)
{
USART_RX_STA ++ ;
USART_RX_BUF[USART_RX_STA] = Res ;
if(USART_RX_STA >= 31)
{
USART_RX_STA = 0 ;
memcpy(Deal_USART_RX_BUF,&USART_RX_BUF[0],32);
u8UART3RecvStatus = 0 ;
DealData();
}
}
}
3.3数据处理函数
void DealData(void)
{
uPm25 = Deal_USART_RX_BUF[12];
uPm25 = (uPm25<<8)+Deal_USART_RX_BUF[13];
uPm100 = Deal_USART_RX_BUF[14];
uPm100 = (uPm100<<8)+Deal_USART_RX_BUF[15];
uTemputer = Deal_USART_RX_BUF[24];
uTemputer = (uTemputer<<8)+Deal_USART_RX_BUF[25];
uHumidity = Deal_USART_RX_BUF[26];
uHumidity = (uHumidity<<8)+Deal_USART_RX_BUF[27];
}
由于模块使用PMS5003T 主动式传输协议,只需要在串口中断中接收固定的长度的数据进行函数处理即可。当前保证起始符一致在进入数据接收函数,并将USART_RX_BUF[LENG]拷贝到Deal_USART_RX_BUF[LENG]中进行数据处理。
但是这样存在弊端,当单片机未处理完接收到的数据时,此时又有数据发过来时,单片机是不进行处理的,防止数组溢出。对系统要求不高的可以使用该办法进行处理。
4:实物图片:
全部评论