TA的每日心情 | 怒 2023-7-25 22:49 |
---|
签到天数: 385 天 连续签到: 1 天 [LV.9]以坛为家II
|
本帖最后由 党国特派员 于 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- /**
- ****************************************************************************************
- *
- * @file gp2y.h
- *
- * @brief GP2Y1010AU0F传感器操作模块头文件
- *
- * Copyright (C) sunsjw 2015
- *
- * $Rev: 1.0 $
- *
- ****************************************************************************************
- */
- #ifndef __GP2Y_H
- #define __GP2Y_H
- #include "gd32f20x.h"
- #include <stdint.h>
- #define GP2Y_ON GPIO_ResetBits(GPIOA,GPIO_PIN_1)
- #define GP2Y_OFF GPIO_SetBits(GPIOA,GPIO_PIN_1)
- void GP2Y_init(void);
- float GP2Y_Read(void);
- void gp2y_io_config(void);
- #endif
复制代码 gp2y.c- /**
- ****************************************************************************************
- *
- * @file gp2y.c
- *
- * @brief GP2Y1010AU0F传感器操作模块文件
- *
- * Copyright (C) sunsjw 2015
- *
- * $Rev: 1.0 $
- *
- ****************************************************************************************
- */
- #include "gp2y.h"
- //-----------------------------------------------------------------------
- // ADC配置定义
- //-----------------------------------------------------------------------
- void ADC_config(void)
- {
- ADC_InitPara adc_stru;
-
- adc_stru.ADC_Channel_Number = 1;
- adc_stru.ADC_Data_Align = ADC_DATAALIGN_RIGHT;
- adc_stru.ADC_Mode = ADC_MODE_INDEPENDENT;
- adc_stru.ADC_Mode_Continuous = DISABLE;
- adc_stru.ADC_Mode_Scan = DISABLE;
- adc_stru.ADC_Trig_External = ADC_EXTERNAL_TRIGGER_MODE_NONE;
-
- ADC_Init(ADC1,&adc_stru);
-
- ADC_RegularChannel_Config(ADC1,ADC_CHANNEL_4,1,ADC_SAMPLETIME_28POINT5 );
- //ADC_ExternalTrigConv_Enable(ADC1,ENABLE);
-
- ADC_Enable(ADC1,ENABLE);
- ADC_Calibration(ADC1);
- }
- /*!
- * @brief 粉尘传感器GP2Y1010AU0F初始化
- *
- * @param None
- *
- * @return None
- */
- void GP2Y_init()
- {
- ADC_config();
- }
- /*!
- * @brief 粉尘传感器GP2Y1010AU0F的IO配置
- *
- * @param None
- *
- * @return None
- */
- void gp2y_io_config()
- {
- //红外管开关
- GPIO_InitPara gpio_stru;
-
- gpio_stru.GPIO_Mode = GPIO_MODE_OUT_PP;
- gpio_stru.GPIO_Pin = GPIO_PIN_1;
- gpio_stru.GPIO_Speed = GPIO_SPEED_10MHZ;
-
- GPIO_Init(GPIOA,&gpio_stru);
-
- //配置ADC引脚
- gpio_stru.GPIO_Mode = GPIO_MODE_AIN;
- gpio_stru.GPIO_Pin = GPIO_PIN_4;
- gpio_stru.GPIO_Speed = GPIO_SPEED_10MHZ;
-
- GPIO_Init(GPIOA,&gpio_stru);
- }
- /*!
- * @brief 从粉尘传感器GP2Y1010AU0F读取数据
- *
- * @param None
- *
- * @return 电压值
- */
- float GP2Y_Read()
- {
- uint16_t adcData;
- float voltRead;
-
- ADC_SoftwareStartConv_Enable(ADC1,ENABLE);
- // Get ADC input
- while(ADC_GetBitState(ADC1,ADC_FLAG_EOC)!=SET);
- adcData = ADC_GetConversionValue(ADC1);
- //PRINTF("ADC:%d\n",adcData);
- // Convert ADC value to a voltage based on 3.3V VREFH on board
- voltRead = (float)adcData * (3.3 / 4096.0);
- return voltRead;
- }
复制代码 主程序读PM2.5的函数- void ShowPM25(void)
- {
- int new_pm25 = 0;
- static int prev_pm25 = 0;
- int last_pm25 = 0;
-
- GP2Y_ON;
- DelayUs(280);
- float adValue = GP2Y_Read();
- DelayUs(40);
- GP2Y_OFF;
- DelayUs(9680);
-
- /*无尘测得电压值为0.6,手册上每0.1mg/m3 电压增加0.5V
- *使用excel记算得出公式:y = 0.2x-0.12 */
- new_pm25 = (0.2f*adValue-0.12f)*1000; //电压-灰尘转换
- /*一阶滤波*/
- last_pm25 = 0.2*new_pm25+0.8*prev_pm25;
- prev_pm25 = new_pm25;
-
- sprintf((char*)showBuffer,"PM25:%3d ug/",last_pm25);
- OLED_ShowString(0,6,showBuffer);
- OLED_ShowCHinese(112,6,10);//显示m³
- }
复制代码 上面计算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 与非币)
|
|