一:瑞萨的串口中断
串口的中断:顾名思义,就是当串接收到数据时,触发控制状态,从而产生中断;RA4M2在数据交互时,传输字节之间的间隔很短,然后再一个字节的通讯时间内,没有收到数据时,意味着程序进入了中断,所以在程序的初始化后,我们只需要开启中断后,在定时器中做一个数据的超时判断,等待一段时间后,没有数据接收到就意味着一帧数据接收完成了。然后再进行数据处理。二:FSP库配置

三:PM5003T颗粒物传感器产品介绍
3.1 模块资料分享:
PMS5003T 是一款可以同时监测空气中颗粒物浓度及温湿度的二合一传感器。其中颗粒物浓度的监测基于激光散射原理,可连续采集并计算单位体积内空气中不 同粒径的悬浮颗粒物个数,即颗粒物浓度分布,进而换算成为质量浓度。传感器同时内嵌瑞士生产的温湿度一体检测芯片。颗粒物浓度数值及温度、湿度合并以通用数字接口形式输出。本传感器可嵌入各种与空气质量监测和改善相关的仪器设备,为其提供及时准确的环境参数。
工作原理:
本传感器采用激光散射原理。即令激光照射在空气中的悬浮颗粒物上产生散射, 同时在某一特定角度收集散射光,得到散射光强随时间变化的曲线。进而微处理 器利用基于米氏(MIE)理论的算法,得出颗粒物的等效粒径及单位体积内不同 粒径的颗粒物数量。
3.2 硬件设计资料

输出结果:
主要输出为单位体积内各浓度颗粒物质量以及个数,其中颗粒物个数的单位 体积为 0.1 升,质量浓度单位为:微克/立方米。输出分为主动输出和被动输出两种状态。传感器上电后默认状态为主动输出, 即传感器主动向主机发送串行数据,时间间隔为 200~800ms,空气中颗粒物 浓度越高,时间间隔越短。主动输出又分为两种模式:平稳模式和快速模式。 在空气中颗粒物浓度变化较小时,传感器输出为平稳模式,即每三次输出同样的一组数值,实际数据更新周期约为 2s。当空气中颗粒物浓度变化较大时, 传感器输出自动切换为快速模式,每次输出都是新的数值,实际数据更新周 期为 200~800ms。
温湿度输出:输出吸入传感器内部的采样空气温度及湿度。

电路设计应注意:
PMS5003T 需要 5V 供电,这是因为风机需要 5V 驱动。但其他数据通讯和控 制管脚均需要 3.3V 作为高电平。因此与之连接通讯的主板 MCU 应为 3.3V 供 电。如果主板 MCU 为 5V 供电,则在通讯线(RXD、TXD)和控制线(SET、 RESET)上应当加入电平转换芯片或电路。
SET 和 RESET 内部有上拉电阻,如果不使用,则应悬空。
PIN7 和 PIN8 为程序内部调试用,应用电路中应使其悬空。
应用休眠功能时应注意:休眠时风扇停止工作,而风扇重新启动需要至少 30秒的稳定时间,因此为获得准确的数据,休眠唤醒后传感器工作时间不应低于 30秒。
四:软件代码:
4.1 串口2的初始化
void uart2_init(void)
{
fsp_err_t err = FSP_SUCCESS;
err = R_SCI_UART_Open(&g_uart2_ctrl, &g_uart2_cfg); if (FSP_SUCCESS != err)
{ while(1);
}
}4.2 串口接收中断处理函数
void g_uart2_callback(uart_callback_args_t *p_args)
{ switch (p_args->event)
{ case UART_EVENT_RX_CHAR:
g_data_received_flag1 = true;
RxDbuffer[RxdCount] =(p_args->data);
RxdCount++ ;
R_SCI_UART_Write(&g_uart2_ctrl,(uint8_t*)&(p_args->data),1);
OverCount = 5 ; break; case UART_EVENT_TX_COMPLETE:
g_data_transmit_flag1 = true; break; default: break;
}
}4.3 接收的数据处理函数
if((RxDbuffer[0]== 0x42) &&(RxDbuffer[1]== 0x4D))
{
tempdata = ( RxDbuffer[24] << 8 ) + RxDbuffer[25] ;
hunidata = ( RxDbuffer[26] << 8 ) + RxDbuffer[27] ;
PM25data = ( RxDbuffer[6] << 8 ) + RxDbuffer[7] ;
}4.4 OLED屏幕显示函数
void WorkPage(void)
{ char buffer[10] ;
OLED_Clear();//清屏
OLED_ShowString(16,0,"environment",16);
OLED_ShowString(16,2,"huni",16); sprintf((char*)buffer,"%3d",hunidata);
OLED_ShowString(64,2,buffer,16);
OLED_ShowString(16,4,"temp",16); sprintf((char*)buffer,"%3d",tempdata);
OLED_ShowString(64,4,buffer,16);
/* OLED_ShowNum(16,0,hunidata,3,16);*/
OLED_ShowString(16,6,"PM25",16);
OLED_ShowNum(64,6,PM25data,3,16);
}五:实物验证:

我要赚赏金
