打印
[活动]

基于K22F的PM2.5+甲醛监测器(3)

[复制链接]
2030|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ketose|  楼主 | 2015-12-31 01:34 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 Ketose 于 2015-12-31 01:34 编辑

使用K22F读取夏普光学灰尘传感器(GP2Y1010AU0F)PM2.5的值
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、项目原理图

我们使用开发板的PTB1作为传感器的控制开关,用来关闭和打开传感器的测试,把PTC1设置为ADC0来采集传感器的电压。
5、代码
根据LED驱动周期(脉冲周期:T (ms) ),LED驱动时间(脉冲:宽度Pw(ms) )输出电压会变动,规格书特性的规格值是脉冲周期T:10ms,脉冲宽度Pw:0.32ms,取样时间:0.28ms,根据此条件变动,规格书上规定的特性值(无尘时输出电压、检出感度)也随之变动。在微机编程上,不能以此条件设定的情况下,请在规格书的推荐范围内操作。
另外,根据电源电压,输出电压也会变动。
/**
****************************************************************************************
*
* [url=home.php?mod=space&uid=288409]@file[/url] gp2y.h
*
* [url=home.php?mod=space&uid=247401]@brief[/url] GP2Y1010AU0F传感器操作模块头文件
*
* Copyright (C) sunsjw 2015
*
* $Rev: 1.0 $
*
****************************************************************************************
*/

#ifndef __GP2Y_H
#define __GP2Y_H

#include "MK22F51212.h"
#include "fsl_port_hal.h"
#include "fsl_gpio_hal.h"
#include "fsl_adc16_driver.h"
#include "fsl_adc16_hal.h"
#include "fsl_debug_console.h"

#include <stdint.h>


#define GP2Y_ON         GPIO_HAL_ClearPinOutput(PTB,1)
#define GP2Y_OFF        GPIO_HAL_SetPinOutput(PTB,1)

void GP2Y_init(void);
float GP2Y_Read();

#endif
/**
****************************************************************************************
*
* @file gp2y.c
*
* @brief GP2Y1010AU0F传感器操作模块文件
*
* Copyright (C) sunsjw 2015
*
* $Rev: 1.0 $
*
****************************************************************************************
*/

#include "gp2y.h"

adc16_converter_config_t g_adcConfig;
adc16_calibration_param_t g_adcCalibraitionParam;
adc16_chn_config_t g_chnConfig;

void GP2Y_init()
{
  PORT_HAL_SetMuxMode(PORTC,1U,kPortPinDisabled);
  PORT_HAL_SetMuxMode(PORTB,1U,kPortMuxAsGpio);
  
  GPIO_HAL_SetPinDir(PTB,1,kGpioDigitalOutput);
  
  ADC16_DRV_StructInitUserConfigDefault(&g_adcConfig);
  ADC16_DRV_Init(0,&g_adcConfig);
  
  ADC16_DRV_GetAutoCalibrationParam(0,&g_adcCalibraitionParam);
  ADC16_DRV_SetCalibrationParam(0,&g_adcCalibraitionParam);
  
  g_adcConfig.continuousConvEnable = true;
  ADC16_DRV_Init(0,&g_adcConfig);

  g_chnConfig.chnIdx = kAdc16Chn15;
  g_chnConfig.diffConvEnable = false;
  g_chnConfig.convCompletedIntEnable = false;
  
  ADC16_DRV_ConfigConvChn(0,0U,&g_chnConfig);
}

float GP2Y_Read()
{
    uint16_t adcData;
    float voltRead;

    // Get ADC input
    ADC16_DRV_WaitConvDone(0, 0U);

    adcData = ADC16_DRV_GetConvValueSigned(0, 0U);
    //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;
}
我们在主程序里添加如下代码:
    float aqi = 0;
    int i =0;

    while(1)
    {
      temp = humi = 0;
      if(i++ >9)
      {
        int x = round(pm * 100);
        PRINTF("PM2.5:%d\r\n",x);
        pm =0;
        i = 0;
      }
      GP2Y_ON;
      DelayUs(280);
      float AD_PM = GP2Y_Read();
      DelayUs(40);
      GP2Y_OFF;
      DelayUs(9680);

      aqi += (0.2*AD_PM-0.18); //电压-灰尘转换
    }
计算出AQI指数,如果计算PM2.5浓度:xx微克/立方米,刚参考下面的图换算出来。

好了,今天已经很晚了,休息一下先。明天再继续。。。。

相关帖子

沙发
Micachl| | 2015-12-31 08:26 | 只看该作者
这个传感器贵吗?您用的都是什么型号啊?能否说一下,谢谢

使用特权

评论回复
板凳
Ketose|  楼主 | 2015-12-31 09:45 | 只看该作者
Micachl 发表于 2015-12-31 08:26
这个传感器贵吗?您用的都是什么型号啊?能否说一下,谢谢

有贵有便宜的,我这种是便宜的读出来的是模拟信号,贵点的读出来的是数字信号。
型号就是我上面说的。

使用特权

评论回复
地板
FSL_TICS_ZJJ| | 2015-12-31 12:55 | 只看该作者
非常感谢楼主的宝贵经验分享!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我最讨厌两种人:一是有种族歧视的; 二是黑人;三是不识数的!

64

主题

3211

帖子

15

粉丝