锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

夏普GP2Y1010AU0F灰尘传感器使用

时间:2022-12-27 07:00:00 sharp红外线传感器pm850mg电容器

夏普GP2Y1010AU0F灰尘传感器在STM使用32平台
一、传感器概述

GP2Y1010AUOF是日本夏普公司开发的光学粉尘浓度检测传感器。红外发光二极管和光电晶体管在传感器内部成对角分布,利用光敏原理工作。用于检测特别微妙的颗粒,如香烟颗粒和微妙的灰尘。颗粒浓度取决于输出脉冲的高度。

二、传感器的一些参数

三、传感器的工作原理

图(1)

图(2)

夏普GP2Y1010AU0F灰尘传感器更便宜,只能检测室内空气中的灰尘和烟尘含量.所谓的PM2.5浓度,然而现在市面上有好多红外发光二极管的传感器都称自己是PM2.5传感器,可测量PM2.5的值,其实不是,真的可以测量PM2.5浓度是数百个激光传感器,红外连接PM10不能测量,只能用来玩,或者大致描述空气质量的等级。经过多次实验,我发现传感器显示的灰尘浓度和网上公布的灰尘浓度AQI空气质量指数接近真实PM2.5浓度差别很大,灰尘浓度实际上是所有不同直径的颗粒物的总和,其中包含PM1.0,PM2.5,PM10

其原理如上图(2)所示,传感器中心有一个洞,可以让空气自由流动,定向发射LED通过检测空气中灰尘折射后的光线来判断灰尘的含量。

四、传感器与STM32的连接

(注:直接用图中的430单片机代替STM32就行了,接线顺序与电阻、电容器大小不变)

这里简单说一下,为什么要这样接?

1.电阻R1和电容C1:因为V-LED和LED-GND是给红外发光二极管供电的,所以不能直接接上5V,需要串一个150欧元的电阻来限制流量。此外,为了稳定电源,还需要在发光二极管的正负极和220uf的电容。

2.三极管:可增加LED驱动能力(建议添加,添加后稳定)

3.电阻R2:由于传感器的最大工作电流是20,因此发挥限流作用mA

4.电阻R3和R4:起分压(因为传感器是5)V32单片机供电AD最大采样电压为3.3V)

5.上图中的P1.2为脉冲输入脚,为传感器提供输入信号PWM占空比为0.032)

6.上图中的P6.5为单片机的ADC用于输出信号的模拟输入脚

(图1) (图2)

图1为脉冲输入波形,周期为10ms,高电平为0.32ms

图2为AD从图中可以看出,采样时间为280us这个时候采样,因为整个高电平持续320us,因此,打开红外发光二极管280us取样后,延迟40us关闭红外发光二极管,最后延迟9680us(输入波形的周期为10ms),这实现了一项完整的工作

电压值与灰尘浓度的关系比例图

从图中可以看出,曲线在前半部分有一定的斜率,约为0.6mg/m3左右,曲线不再生长,此时最大输出电压为3.6V左右,但在曲线的前半部分,可以得出电压值与灰尘浓度的关系:Dust density = 0.17 * Output Voltage

根据技术手册,当空气清洁时,Vo的范围是0~1.5V,典型值是0.9V

当空气粉尘浓度高时,Vo的数值大于3.6V。但传感器输出的最大电压是3.6V,因此,当灰尘浓度再次增加时,我们的传感器无法测量


0.9V表示空气干净,3.6V这意味着有很多空气灰尘。因为空气中不可能没有灰尘,所以取正常值0.9V,粉尘浓度为0.053mg/m3

当达到最大电压值3.6V此时灰尘浓度为0.512mg/m3
所以我们传感器的范围是0~512ug/m3(这512只是一个估计值,实际上可能超过这个值)

五、主程序代码

Main.c

#include "stm32f10x.h"

#include "bsp_SysTick.h"

#include "bsp_usart1.h"

#include "bsp_GP2Y.h"

#include "bsp_pwm_output.h"

#include "bsp_TiMbase.h"

#define FILTER_N 7

int A[32];

volatile u32 time = 0; // ms 计时变量

void Delay(__IO uint32_t nCount)

{

for(; nCount != 0; nCount--);

}

voidTIM3_Configuration(void);

void TIM3_NVIC_Configurtion(void);

 

int main(void)

{

float  calcVoltage ;

int  filter_sum, i ,j ,dust;

int filter_max, filter_min;

int filter_buf[FILTER_N];

 

SysTick_Init();

USART1_Config();

TIM3_Configuration();

TIM3_NVIC_Configuration();

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE);

Adc_Init();

TIM3_PWM_Init();

 

Delay_ms(200);  //等待传感器稳定工作//

 while(1)

 {

   if(time==200)    //10ms发生一次中断,等到中断200次后,即2s//

     {

      time=0;

      for(i = 0; i < FILTER_N; i++)

    {

      GP2Y_Low;                //打开红外二极管//

      Delay_us(280);            //延时280us//  

     filter_buf[i]=Get_Adc(ADC_Channel_10);    //采样,读取AD值//  

     Delay_us(19);           //延时19us,因为这里我设了AD采样的周     期为239.5,所以AD转换一次需耗时21us,19加21再加280刚好是320us,这跟上面说的高电平持续的时间为0.32ms//

     GP2Y_High;             //关闭红外二极管//

    Delay_us(9680);         //延时9680us//

   }

          filter_max = filter_buf[0];

          filter_min = filter_buf[0];

          filter_sum = filter_buf[0];

     for(i = FILTER_N - 1; i > 0; i--)

  {

    if(filter_buf[i] > filter_max)

      filter_max=filter_buf[i];

     else if(filter_buf[i] < filter_min)

      filter_min=filter_buf[i];

      filter_sum = filter_sum + filter_buf[i];

      filter_buf[i] = filter_buf[i - 1];

     }

       i = FILTER_N - 2;

      filter_sum = filter_sum - filter_max - filter_min + i/2;          //加上i/2是为了四舍五入//

      filter_sum = filter_sum / i;

      calcVoltage=filter_sum*(3.3/ 4096)*2;   /因为上面采集到的是AD值,这里要把它转换为电压值//

  (注:为什么我在公式的最后要乘以2呢?这个2是一定不能少的,因为我们将它与32单片机连接的时候,加了两个10K的电阻分压,读取到的电压值已减小了一半,但这不是实际采取到的电压,所以要在最后乘以2返回原来的电压值)

     dust=(0.17*calcVoltage-0.1)*1000;  //乘以1000单位换成ug/m3//

     if (dust<0)

      dust=0;            //限位//

     if (dust>500)        

      dust=500;

      printf("\r\n电压值:%fV\n",calcVoltage);

     printf("\r\n灰尘浓度:%dug/m3\n",dust);

 }

 }

}

以上就是主要的一些程序,由于该传感器不太稳定,输出波形抖动较大,所以在程序里我加上了数字滤波算法,我采用那种去极值取平均的中位值滤波法,在传感器工作一次时,取输出波形的连续几个波峰的峰值,存到数组里,然后进行去掉最大值,最小值的操作,剩下的取平均

 

 六、实际操作

 

 实物连接图如下:

                                                                     

 

 把程序烧进单片机,观察其输出的值

                                  

 

   对比右图可知,一般室内的灰尘浓度所对应的电压值都是0.9V左右

    

 再对比一下网上公布的空气指数

 

 

对比可知,该传感器测出的值与网上公布的AQI指数比较接近

 

  我们再来看看这输入波形和输出波形

 

 

 

 

     黄色的是输入波形,蓝色的是输出波形

  (注:这图像上显示的电压值是分压后的)

   当我往传感器的中心孔里放根杜邦线时,可以看到其输出波形立马飙升,说明这传感器还是挺灵敏的

          

 

 

    当往孔里插根杜邦线或者一支笔时,测出的值立马到达最大值3.6V左右,这是对颗粒物的灵敏度,对于烟雾类型的也很敏感,我利用电烙铁焊锡时产生的烟雾,经传感器测量也能到达最大值,显示的灰尘浓度达530ug/m3.

    由于这传感器的内部存有空隙,所以当你外加烟雾给它时,会有少量的烟雾残留在内部的空隙里,才会出现为什么我把烟雾撤去之后,显示的浓度依然很大,这时你需往孔里吹口气,将里面残留的烟雾吹走,这时才恢复你室内正常的浓度,否则的话,你得等待一段时间,待里面的烟雾慢慢散去.
--------------------- 
作者:思念中华 
来源:CSDN 
原文:https://blog.csdn.net/qq_38021919/article/details/78764764 
版权声明:本文为博主原创文章,转载请附上博文链接!

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章