查看: 913|回复: 0

GD32F207读GP2Y1010AU0F灰尘传感器

[复制链接]
  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2016-2-17 13:43:42 | 显示全部楼层 |阅读模式
    分享到:
    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);#endifgp2y.c
    <em>/** **************************************************************************************** * * @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;}</em>主程序读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,&quotM25:%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

    6、效果图


    热门推荐:
    轻轻松松入门GD32F207开发板
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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

    手机版|小黑屋|与非网

    GMT+8, 2024-4-18 12:31 , Processed in 0.114735 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2020, Tencent Cloud.