1. GP2Y1014AU粉尘传感器
光学灰尘传感器(CP2Y1014AUOF) 在检测非常细的颗粒、例如香烟烟雾、是很有效的、并且是常用的空气净化器系统、改装置中、一个红外发光二极管和光电晶体管、对角布置成允许其检测到空气中的灰尘反射光。该传感器具有很低的电流消耗(限大20mA 11毫安典型的)可以搭载高达7VDC的传感器、输出的是一个模拟电压正比于所测得粉尘浓度、敏感性为0.5V/0.1mg/m3
2. GP2Y1014AU粉尘传感器的硬件连接
(1) 电阻R6和电容C9:因为V-LED和LED-GND是给红外发光二极管供电的,所以不能直接接上5V,需要串一个150欧的电阻来限流,另外为了稳定供电,还需要在给发光二极管供电的正极和负极上并一个220uf的电容。
(2) 上图中的3为脉冲输入脚,为传感器提供输入信号(该PWM的占空比规定为0.032)
(3) 上图中的5为单片机的ADC模拟输入脚,用来输出信号的,空气质量数据通过电压模拟信号输出
(4) 电阻R3和R4:起分压作用(因为该传感器是5V供电,而32单片机的AD采样最大电压为3.3V)
图1为脉冲输入波形,周期为10ms,高电平为0.32ms
图2为AD采样时序,由图可知,在输入上升沿到输出的峰值,时间为280us左右,就在此时进行采样,因为整个高电平持续的时间为320us,所以在打开红外发光二极管280us后采样,然后延时40us后关闭红外发光二极管,最后再延时9680us(输入波形的周期为10ms),这就实现了一次完整的工作
3. GP2Y1014AU粉尘传感器的软件设计
(1) tsensor.c包括GP2Y_Adc_Init函数、GetGP2Y函数、GP2Y_Get_Adc函数、GPY2_Get_Adc_Aveurage函数四个部分
//初始化ADC
//这里我们仅以规则通道为例
//我们默认将开启通道0~3
void GP2Y_Adc_Init(void) //ADC通道初始化
{
ADC_InitTypeDefADC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1 , ENABLE ); //使能GPIOA,ADC1通道时钟
RCC_ADCCLKConfig(RCC_PCLK2_Div6); //分频因子6时钟为72M/6=12MHz
//PA1作为模拟通道输入引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
GPIO_Init(GPIOA, &GPIO_InitStructure);
//PB1 作为脉冲输出引脚
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GP2Y_High;
ADC_DeInit(ADC1); //将外设 ADC1 的全部寄存器重设为缺省值
ADC_InitStructure.ADC_Mode= ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
ADC_InitStructure.ADC_ScanConvMode= DISABLE; //模数转换工作在单通道模式
ADC_InitStructure.ADC_ContinuousConvMode= DISABLE; //模数转换工作在单次转换模式
ADC_InitStructure.ADC_ExternalTrigConv= ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right; //ADC数据右对齐
ADC_InitStructure.ADC_NbrOfChannel= 1; //顺序进行规则转换的ADC通道的数目
ADC_Init(ADC1,&ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器
ADC_Cmd(ADC1,ENABLE); //使能指定的ADC1
ADC_ResetCalibration(ADC1); //重置指定的ADC1的复位寄存器
while(ADC_GetResetCalibrationStatus(ADC1)); //获取ADC1重置校准寄存器的状态,设置状态则等待
ADC_StartCalibration(ADC1); //开启AD校准
while(ADC_GetCalibrationStatus(ADC1)); //获取指定ADC1的校准程序,设置状态则等待
}
//获得ADC值
//ch:通道值 0~3
u16 GP2Y_Get_Adc(u8 ch)
{
//设置指定ADC的规则组通道,一个序列,采样时间
ADC_RegularChannelConfig(ADC1,ch, 1, ADC_SampleTime_239Cycles5 ); //ADC1,ADC通道3,第一个转换,采样时间为239.5周期
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //使能指定的ADC1的软件转换启动功能
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC ));//等待转换结束
returnADC_GetConversionValue(ADC1); //返回最近一次ADC1规则组的转换结果
}
//计算模拟量
Short GetGP2Y(void)
{
u32 AD_PM;
short result;
double pm;
GP2Y_Low; //打开红外二极管
delay_us(280); //延时280us,延时时间到才进行采样
AD_PM = GP2Y_Get_Adc(ADC_Channel_0); //PA0 采样,读取AD值
delay_us(40); //延时33us,280+40=320us,这是LED亮灯的最短时间
GP2Y_High; //关闭红外二极管
delay_us(9680); //延时9680us,320+9680=10000us=10ms,这是一个周期的最短时间
pm = (0.17*AD_PM-0.1)*1000; //电压-灰尘转换公式乘以1000单位换成ug/m3
printf("%f\n",pm);
result=pm*100;
return result;
//return pm;
}
//获取通道ch的转换值
//取times次,然后平均
u16 GPY2_Get_Adc_Aveurage(u8 ch,u8 times)
{
u32pm_val=0;
u8t;
for(t=0;t<times;t++)
{
pm_val+=GP2Y_Get_Adc(ch);
delay_ms(5);
}
returnpm_val/times;
}
(2) 主函数:将接收到的PM2.5浓度显示到LCD上,每秒更新一次
intmain(void)
{
shortPM;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为115200
LED_Init(); //初始化与LED连接的硬件接口
LCD_Init(); //初始化LCD
GP2Y_Adc_Init(); //ADC初始化
POINT_COLOR=RED;//设置字体为红色
LCD_ShowString(30,50,200,16,16,"EliteSTM32");
LCD_ShowString(30,70,200,16,16,"TemperatureTEST");
LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
LCD_ShowString(30,110,200,16,16,"2020/4/4");
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(30,140,200,16,16,"PM2.5:000.000ug/m3");
while(1)
{
PM=GetGP2Y(); //得到pm2.5值
printf("PM2.5浓度:%f\n",PM);
LCD_ShowxNum(30+6*8,140,PM/100,3,16,0); //显示数部分
LCD_ShowxNum(30+10*8,140,PM%100,3,16,0X80); //显示小数部分
LED0=!LED0;
delay_ms(1000);
}
}
|