[STM32F1] 关于GP2Y1014AU0F的STM32程序

[复制链接]
3431|6
 楼主| suedezzz 发表于 2017-10-3 19:00 | 显示全部楼层 |阅读模式
求助,急需GP2Y1014AU0FSTM32的源代码,感谢
捉虫天师 发表于 2017-10-3 20:13 来自手机 | 显示全部楼层
void GP2Y_ADC_init() {         GPIO_InitTypeDef GPIO_InitStructure;         ADC_InitTypeDef ADC_InitStructure;          RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC3,ENABLE);          RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M  最大14M 设置ADC时钟(ADCCLK)         ADC_DeInit(ADC3);          GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//ADC         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;         GPIO_Init(GPIOF,&GPIO_InitStructure);            ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;          ADC_InitStructure.ADC_ScanConvMode = DISABLE;          ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;          ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;          ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;          ADC_InitStructure.ADC_NbrOfChannel = 4;          ADC_Init(ADC3, &ADC_InitStructure);                  //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 //        ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);                  //内部温度传感器是在ADC1通道16的。         ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1,ADC_SampleTime_239Cycles5); //        ADC_TempSensorVrefintCmd(ENABLE);//打开内部温度传感器使能         ADC_Cmd(ADC3,ENABLE);                  ADC_ResetCalibration(ADC3);//重置指定的ADC的校准寄存器         while(ADC_GetResetCalibrationStatus(ADC3));//获取ADC重置校准寄存器的状态                  ADC_StartCalibration(ADC3);//开始指定ADC的校准状态         while(ADC_GetCalibrationStatus(ADC3));//获取指定ADC的校准程序          ADC_SoftwareStartConvCmd(ADC3, ENABLE);//使能或者失能指定的ADC的软件转换启动功能         GPIO_SetBits(GPIOC, GPIO_Pin_2);//置1
捉虫天师 发表于 2017-10-3 20:14 来自手机 | 显示全部楼层
u16 GetGP2YAverageValue(u8 times) {     u32 temp_val=0;     u8 t;     for(t=0;t<times;t++)     {         temp_val+=GetGP2YSingleValue();     }     return temp_val/times; }  u16 GetGP2YSingleValue(void) {                 int samplingTime = 280;//等待LED开启的时间是280μs                 int deltaTime = 40;//整个脉冲持续时间为320μs。因此,我们还需再等待40μs                          uint16_t ADCVal;                 float dustVal = 0;                 float Voltage;                          GPIO_ResetBits(GPIOC, GPIO_Pin_2);//置1  开启内部LED  ????????                 delay_us(samplingTime);                                         // 开启LED后的280us的等待时间                                  ADC_SoftwareStartConvCmd(ADC3, ENABLE);     while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC));                 ADCVal = ADC_GetConversionValue(ADC3);                          delay_us(40);                 GPIO_SetBits(GPIOC, GPIO_Pin_2);//置0                 delay_us(9680);//需要脉宽比0.32ms/10ms的PWM信号驱动传感器中的LED                 Voltage = ADCVal * 3.3 / 4096;                 dustVal = (Voltage + 1) * 1000 / 10;//*1000作用是将单位转换为ug/m3 //                if(ADCVal > 36.455) //                        dustVal = ((float)(ADCVal / 1024.0) - 0.0356) * 120000 * 0.035; //                dustVal = 0.17 * ADCVal - 0.1; //                dustVal = ADCVal; //                return dustVal; //                mg/m3                 return dustVal; }
捉虫天师 发表于 2017-10-3 20:22 来自手机 | 显示全部楼层
应该没问题,都是测试好的代码,仅供参考,如果有效欢迎打赏
yiy 发表于 2017-10-3 22:01 | 显示全部楼层
yiy 发表于 2017-10-3 22:02 | 显示全部楼层
  1. void GP2Y_ADC_init()
  2. {
  3.         GPIO_InitTypeDef GPIO_InitStructure;
  4.         ADC_InitTypeDef ADC_InitStructure;

  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOF|RCC_APB2Periph_AFIO|RCC_APB2Periph_ADC3,ENABLE);

  6.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//12M  最大14M 设置ADC时钟(ADCCLK)
  7.         ADC_DeInit(ADC3);

  8.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;//ADC
  9.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模拟输入
  10.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  11.         GPIO_Init(GPIOF,&GPIO_InitStructure);


  12.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  13.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  14.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  15.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
  16.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  17.         ADC_InitStructure.ADC_NbrOfChannel = 4;
  18.         ADC_Init(ADC3, &ADC_InitStructure);
  19.        
  20.         //设置指定ADC的规则组通道,设置它们的转化顺序和采样时间
  21. //        ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
  22.        
  23.         //内部温度传感器是在ADC1通道16的。
  24.         ADC_RegularChannelConfig(ADC3,ADC_Channel_4,1,ADC_SampleTime_239Cycles5);
  25. //        ADC_TempSensorVrefintCmd(ENABLE);//打开内部温度传感器使能
  26.         ADC_Cmd(ADC3,ENABLE);       

  27.         ADC_ResetCalibration(ADC3);//重置指定的ADC的校准寄存器
  28.         while(ADC_GetResetCalibrationStatus(ADC3));//获取ADC重置校准寄存器的状态
  29.        
  30.         ADC_StartCalibration(ADC3);//开始指定ADC的校准状态
  31.         while(ADC_GetCalibrationStatus(ADC3));//获取指定ADC的校准程序

  32.         ADC_SoftwareStartConvCmd(ADC3, ENABLE);//使能或者失能指定的ADC的软件转换启动功能
  33.         GPIO_SetBits(GPIOC, GPIO_Pin_2);//置1
yiy 发表于 2017-10-3 22:02 | 显示全部楼层
  1. u16 GetGP2YAverageValue(u8 times)
  2. {
  3.     u32 temp_val=0;
  4.     u8 t;
  5.     for(t=0;t<times;t++)
  6.     {
  7.         temp_val+=GetGP2YSingleValue();
  8.     }
  9.     return temp_val/times;
  10. }

  11. u16 GetGP2YSingleValue(void)
  12. {
  13.                 int samplingTime = 280;//等待LED开启的时间是280μs
  14.                 int deltaTime = 40;//整个脉冲持续时间为320μs。因此,我们还需再等待40μs
  15.        
  16.                 uint16_t ADCVal;
  17.                 float dustVal = 0;
  18.                 float Voltage;
  19.        
  20.                 GPIO_ResetBits(GPIOC, GPIO_Pin_2);//置1  开启内部LED  ????????
  21.                 delay_us(samplingTime);                                         // 开启LED后的280us的等待时间
  22.                
  23.                 ADC_SoftwareStartConvCmd(ADC3, ENABLE);
  24.     while(!ADC_GetFlagStatus(ADC3, ADC_FLAG_EOC));
  25.                 ADCVal = ADC_GetConversionValue(ADC3);
  26.        
  27.                 delay_us(40);
  28.                 GPIO_SetBits(GPIOC, GPIO_Pin_2);//置0
  29.                 delay_us(9680);//需要脉宽比0.32ms/10ms的PWM信号驱动传感器中的LED
  30.                 Voltage = ADCVal * 3.3 / 4096;
  31.                 dustVal = (Voltage + 1) * 1000 / 10;//*1000作用是将单位转换为ug/m3
  32. //                if(ADCVal > 36.455)
  33. //                        dustVal = ((float)(ADCVal / 1024.0) - 0.0356) * 120000 * 0.035;
  34. //                dustVal = 0.17 * ADCVal - 0.1;
  35. //                dustVal = ADCVal;
  36. //                return dustVal; //                mg/m3
  37.                 return dustVal;
  38. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部