1回答

0收藏

[分享] GD32F207读GP2Y1010AU0F灰尘传感器

GD32 GD32 4998 人阅读 | 1 人回复 | 2016-02-04

本帖最后由 党国特派员 于 2016-2-5 01:39 编辑

1、夏普光学灰尘传感器(GP2Y1010AU0F)介绍
Sharp's GP2Y1010AU0F 是一款光学空气质量传感器,设计用来感应空气中的尘埃粒子,其内部对角安放着红外线发光二极管和光电晶体管,使得其能够探测到空气中尘埃反射光,即使非常细小的如烟草烟雾颗粒也能够被检测到,通常在空气净化系统中应用。该装置中,一个红外发光二极管和光电晶体管,对角布置成允许其检测到在空气中的灰尘反射光。
2、规范
电源电压:5-7V
工作温度:-10-65摄氏度
消耗电流:20mA最大
最小粒子检出值:0.8微米
灵敏度:0.5V/(0.1mg/m3)
清洁空气中电压:0.9V  典型值
工作温度:-10~65℃
存储温度:-20~80℃
使用寿命:5年
尺寸大小:46mm×30mm×17.6mm
重量大小:15g
3、检测原理
其原理如下图,传感器中心有个洞可以让空气自由流过,定向发射LED光,通过检测经过空气中灰尘折射过后的光线来判断灰尘的含量。


4、接线说明

5、驱动代码:
gp2y.h
  1. /**
  2. ****************************************************************************************
  3. *
  4. * @file gp2y.h
  5. *
  6. * @brief GP2Y1010AU0F传感器操作模块头文件
  7. *
  8. * Copyright (C) sunsjw 2015
  9. *
  10. * $Rev: 1.0 $
  11. *
  12. ****************************************************************************************
  13. */

  14. #ifndef __GP2Y_H
  15. #define __GP2Y_H

  16. #include "gd32f20x.h"

  17. #include <stdint.h>


  18. #define GP2Y_ON                GPIO_ResetBits(GPIOA,GPIO_PIN_1)
  19. #define GP2Y_OFF    GPIO_SetBits(GPIOA,GPIO_PIN_1)

  20. void GP2Y_init(void);
  21. float GP2Y_Read(void);
  22. void gp2y_io_config(void);

  23. #endif
复制代码
gp2y.c
  1. /**
  2. ****************************************************************************************
  3. *
  4. * @file gp2y.c
  5. *
  6. * @brief GP2Y1010AU0F传感器操作模块文件
  7. *
  8. * Copyright (C) sunsjw 2015
  9. *
  10. * $Rev: 1.0 $
  11. *
  12. ****************************************************************************************
  13. */

  14. #include "gp2y.h"

  15. //-----------------------------------------------------------------------
  16. // ADC配置定义
  17. //-----------------------------------------------------------------------
  18. void ADC_config(void)
  19. {
  20.         ADC_InitPara adc_stru;
  21.         
  22.         adc_stru.ADC_Channel_Number = 1;
  23.         adc_stru.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
  24.         adc_stru.ADC_Mode = ADC_MODE_INDEPENDENT;
  25.         adc_stru.ADC_Mode_Continuous = DISABLE;
  26.         adc_stru.ADC_Mode_Scan = DISABLE;
  27.         adc_stru.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
  28.         
  29.         ADC_Init(ADC1,&adc_stru);
  30.         
  31.         ADC_RegularChannel_Config(ADC1,ADC_CHANNEL_4,1,ADC_SAMPLETIME_28POINT5                                                                                                );
  32.         //ADC_ExternalTrigConv_Enable(ADC1,ENABLE);
  33.         
  34.         ADC_Enable(ADC1,ENABLE);
  35.         ADC_Calibration(ADC1);
  36. }

  37. /*!
  38. * @brief 粉尘传感器GP2Y1010AU0F初始化
  39. *
  40. * @param None
  41. *
  42. * @return None
  43. */
  44. void GP2Y_init()
  45. {
  46.         ADC_config();
  47. }

  48. /*!
  49. * @brief 粉尘传感器GP2Y1010AU0F的IO配置
  50. *
  51. * @param None
  52. *
  53. * @return None
  54. */
  55. void gp2y_io_config()
  56. {
  57.         //红外管开关
  58.         GPIO_InitPara gpio_stru;
  59.         
  60.         gpio_stru.GPIO_Mode = GPIO_MODE_OUT_PP;
  61.         gpio_stru.GPIO_Pin = GPIO_PIN_1;
  62.         gpio_stru.GPIO_Speed = GPIO_SPEED_10MHZ;
  63.         
  64.         GPIO_Init(GPIOA,&gpio_stru);
  65.         
  66.         //配置ADC引脚
  67.         gpio_stru.GPIO_Mode = GPIO_MODE_AIN;
  68.         gpio_stru.GPIO_Pin = GPIO_PIN_4;
  69.         gpio_stru.GPIO_Speed = GPIO_SPEED_10MHZ;
  70.         
  71.         GPIO_Init(GPIOA,&gpio_stru);
  72. }

  73. /*!
  74. * @brief 从粉尘传感器GP2Y1010AU0F读取数据
  75. *
  76. * @param None
  77. *
  78. * @return 电压值
  79. */
  80. float GP2Y_Read()
  81. {
  82.     uint16_t adcData;
  83.     float voltRead;
  84.         
  85.         ADC_SoftwareStartConv_Enable(ADC1,ENABLE);
  86.     // Get ADC input
  87.     while(ADC_GetBitState(ADC1,ADC_FLAG_EOC)!=SET);

  88.     adcData = ADC_GetConversionValue(ADC1);
  89.     //PRINTF("ADC:%d\n",adcData);
  90.     // Convert ADC value to a voltage based on 3.3V VREFH on board
  91.     voltRead = (float)adcData * (3.3 / 4096.0);
  92.     return voltRead;
  93. }
复制代码
主程序读PM2.5的函数
  1. void ShowPM25(void)
  2. {
  3.         int new_pm25 = 0;
  4.         static int prev_pm25 = 0;
  5.         int last_pm25 = 0;
  6.         
  7.         GP2Y_ON;
  8.         DelayUs(280);
  9.         float adValue = GP2Y_Read();
  10.         DelayUs(40);
  11.         GP2Y_OFF;
  12.         DelayUs(9680);

  13.         
  14.         /*无尘测得电压值为0.6,手册上每0.1mg/m3 电压增加0.5V
  15.          *使用excel记算得出公式:y = 0.2x-0.12          */
  16.         new_pm25 = (0.2f*adValue-0.12f)*1000; //电压-灰尘转换
  17.         /*一阶滤波*/
  18.         last_pm25 = 0.2*new_pm25+0.8*prev_pm25;
  19.         prev_pm25 = new_pm25;
  20.         
  21.         sprintf((char*)showBuffer,"PM25:%3d   ug/",last_pm25);
  22.         OLED_ShowString(0,6,showBuffer);
  23.         OLED_ShowCHinese(112,6,10);//显示m?
  24. }
复制代码
上面计算new_pm25用excel计算出来的函数公式图:

0.6V时PM2.5是0,然后电压每增加0.25V,PM2.5增加0.05。如果你的传感器无尘时的没量值是0.8那么就只需要把0.6改为0.8,Execl会自动帮你求出函数的公式来。Excel我把上传上来。
PM25计算公式.xls (28.5 KB, 下载次数: 39, 售价: 2 与非币)

6、效果图



喜欢在构思妙想,电子产品DIY是工作,也是一种爱好。
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

糖悦之果飞

发表于 2016-2-16 13:58:29 | 只看该作者

亲,可以将内容一并发到经验频道,很有机会获得每月之星的呢http://jingyan.eeboard.com/
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条