基于STM32F407ZGT6的MQ135例程
时间: 2024-01-27 11:04:26 浏览: 78
以下是基于STM32F407ZGT6的MQ135传感器例程代码,需要注意的是,由于MQ135传感器的工作原理是利用气体电化学反应进行检测,所以需要预热一段时间才能进行准确测量。
```C
#include "stm32f4xx.h"
#include "delay.h"
#define ADC1_DR_Address ((uint32_t)0x4001204C)
void ADC_Config(void);
uint16_t Get_ADC_Average(uint8_t times);
int main(void)
{
uint16_t mq135_value = 0;
float density = 0;
SystemInit();
Delay_Init();
ADC_Config();
while(1)
{
mq135_value = Get_ADC_Average(5); // 获取5次ADC采样的平均值
density = mq135_value / 1024.0 * 5.0; // 电压值计算
density = (density - 0.1) / 0.3 * 10.0; // 浓度值计算
Delay_ms(1000); // 延时1s
}
}
void ADC_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = DISABLE;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = 1;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles);
ADC_Cmd(ADC1, ENABLE);
ADC_ResetCalibration(ADC1);
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
uint16_t Get_ADC_Average(uint8_t times)
{
uint32_t sum = 0;
uint8_t i;
for(i = 0; i < times; i++)
{
ADC_SoftwareStartConv(ADC1);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC));
sum += ADC_GetConversionValue(ADC1);
}
return sum / times;
}
```
在上述代码中,我们使用ADC1模块进行了采样,并且使用`Get_ADC_Average`函数获取了5次采样的平均值。然后我们根据MQ135传感器的电压输出值计算出空气中的浓度值,最后延时1秒钟再重新进行采样。
阅读全文