当前位置:   article > 正文

STM32平台下夏普GP2Y1010AU0F灰尘传感器使用及源码

STM32平台下夏普GP2Y1010AU0F灰尘传感器使用及源码

GP2Y1010AU0F传感器接线方式如下:

192812_Ql79_1269296.png

192812_uCdd_1269296.jpg

使用PA0接收模拟信号,PB1发送脉冲信号。

代码如下:


GP2Y.c

  1. #include "GP2Y.h"
  2. #include "system.h"
  3. u16 AD_PM;
  4. void GP2Yinit(void)
  5. //定义变量
  6.     ADC_InitTypeDef A_InitStructure;
  7.     GPIO_InitTypeDef G_InitStructure; //PA0
  8.     GPIO_InitTypeDef Gpio_InitStructure;//PB1
  9.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE );   //使能ADC2通道时钟
  10.      
  11.     RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
  12.  
  13.     //PA0 作为模拟通道输入引脚                        
  14.     G_InitStructure.GPIO_Pin = GPIO_Pin_0;
  15.     G_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚
  16.     GPIO_Init(GPIOA, &G_InitStructure);
  17.    
  18.     ADC_DeInit(ADC1);  //复位ADC1,将外设 ADC1 的全部寄存器重设为缺省值
  19.    
  20.     A_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
  21.     A_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式
  22.     A_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式
  23.     A_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动
  24.     A_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
  25.     A_InitStructure.ADC_NbrOfChannel = 1//顺序进行规则转换的ADC通道的数目
  26.     ADC_Init(ADC1, &A_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器  
  27.    
  28.    
  29.     ADC_Cmd(ADC1, ENABLE);         //使能指定的ADC1
  30.     ADC_ResetCalibration(ADC1); //使能复位校准 
  31.     while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
  32.     ADC_StartCalibration(ADC1);  //开启AD校准
  33.     while(ADC_GetCalibrationStatus(ADC1));  //等待校准结束
  34.     Gpio_InitStructure.GPIO_Pin = GPIO_Pin_1;                  
  35.     Gpio_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出  
  36.     Gpio_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           
  37.     GPIO_Init(GPIOB, &Gpio_InitStructure);
  38.     GP2Y_High;
  39. }
  40. void GetGP2Y(void)
  41. {
  42. float pm;
  43. GP2Y_Low;
  44. delay_us(280);
  45. AD_PM = Get_Adc(ADC_Channel_0); //PA0
  46. delay_us(40);
  47. GP2Y_High;
  48. delay_us(9680);
  49. pm = 0.17*AD_PM-0.1//电压-灰尘转换
  50. printf("%f\n",pm);
  51. }

GP2Y.h

  1.   #ifndef __GP2Y_H
  2. #define __GP2Y_H
  3. #include "stm32f10x_lib.h"
  4. #define GP2Y_High GPIO_SetBits(GPIOB,GPIO_Pin_1);
  5. #define GP2Y_Low  GPIO_ResetBits(GPIOB,GPIO_Pin_1);
  6. void GP2Yinit(void);
  7. void GetGP2Y(void);
  8. #endif

PB1输出波形

193451_YLmD_1269296.jpg

获取到灰尘数值。

193451_7lH7_1269296.png


102150_FQUJ_1269296.jpg

根据上图推算出公式:dustDensity = 0.17 * calcVoltage - 0.1。


转载于:https://my.oschina.net/sencha/blog/388112

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/554148
推荐阅读
相关标签
  

闽ICP备14008679号