找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 15759|回复: 1
收起左侧

基于STM32的GP2Y1014AU粉尘传感器的使用

[复制链接]
ID:731437 发表于 2020-4-17 16:17 | 显示全部楼层 |阅读模式
1. GP2Y1014AU粉尘传感器

光学灰尘传感器(CP2Y1014AUOF) 在检测非常细的颗粒、例如香烟烟雾、是很有效的、并且是常用的空气净化器系统、改装置中、一个红外发光二极管和光电晶体管、对角布置成允许其检测到空气中的灰尘反射光。该传感器具有很低的电流消耗(限大20mA 11毫安典型的)可以搭载高达7VDC的传感器、输出的是一个模拟电压正比于所测得粉尘浓度、敏感性为0.5V/0.1mg/m3


2. GP2Y1014AU粉尘传感器的硬件连接
2.png 3.png


(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)
4.png 5.png

图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);     

         }

}








评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:442132 发表于 2020-5-21 11:01 | 显示全部楼层
楼主能分享一下源程序吗
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表