概述
MQ_2功能
MQ-2烟雾传感器对液化气、天然气、城市煤气灵敏度较高。
引脚说明
MQ-2有两种输出方式:
1、数字量输出:通过板载电位器设定浓度阈值,当检测到环境气体浓度超过阈值时,通过数字引脚DOUT输出低电平。
2、模拟量输出:浓度越高,AOUT引脚输出的电压值越高,通过ADC采集的模拟值越高。
VCC——5V
GND——GND
DOUT——数字引脚(Arduino Uno的0-13引脚)
AOUT——模拟引脚(Arduino Uno的A0~A5)
使用ADC采集数据
配置流程
1.开启GPIO和ADC时钟 :RCC_APB2PeriphClockCmd
2.配置ADC分频: RCC_ADCCLKConfig(RCC_PCLK2_Div6); //6分频
3.初始化GPIO:GPIO_Init()
4.初始化ADC:ADC_Init()
5.配置通道信息: //ADC_SQRx寄存器、(ADC_SMPRx)寄存器
ADC_RegularChannelConfig(ADC1,ADC_Channel_13,1,ADC_SampleTime_239Cycles5);
ADC1,通道13,转换顺序为第1个,采样时间为239.5周期
6.使能ADC:ADC_Cmd();
7.ADC校准
ADC_ResetCalibration(ADC1); //校准
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
8.开启软件转换:ADC_SoftwareStartConvCmd()
9.等待转换完成,读取ADC的数值,也可用作中断处理,,依照ADC框图中的7中的标志位
使用的是软件触发,不配置中断,不使用中断服务函数。
while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC));
return ADC_GetConversionValue(ADC1);
注:ADC_DMACmd() //ADC-DMA使能,在运用DMA时使用,此时不使用上面的第9个步骤
具体功能查看以下连接文章
代码示例
#include <stdio.h>
#include "stm32f10x.h"
#include "mq_2.h"
#include "string.h"
#include "delay.h"
ADC adcnum;
//PA1
void mq_2_init()
{
GPIO_InitTypeDef GPIOInitStrucTure;
ADC_InitTypeDef ADCInitDef;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);
GPIOInitStrucTure.GPIO_Pin=GPIO_Pin_1; //A1
GPIOInitStrucTure.GPIO_Speed=GPIO_Speed_50MHz;
GPIOInitStrucTure.GPIO_Mode=GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIOInitStrucTure);
ADCInitDef.ADC_ContinuousConvMode=ENABLE; //是否连续转换
ADCInitDef.ADC_DataAlign=ADC_DataAlign_Right; //右对齐
ADCInitDef.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;
ADCInitDef.ADC_Mode=ADC_Mode_Independent; //独立模式1
ADCInitDef.ADC_NbrOfChannel=1; //2个通道
ADCInitDef.ADC_ScanConvMode=ENABLE;
ADC_Init(ADC1,&ADCInitDef); //ADC初始化
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_239Cycles5);
ADC_Cmd(ADC1,ENABLE);
ADC_ResetCalibration(ADC1); //校准
while(ADC_GetResetCalibrationStatus(ADC1));
ADC_StartCalibration(ADC1);
while(ADC_GetCalibrationStatus(ADC1));
}
u32 get_value(void)
{
u16 adc_value = 0;
u8 i = 0;
for(i = 0; i < 10; i++)
{
//开始转换
ADC_SoftwareStartConvCmd(ADC1,ENABLE);
//转换是否结束
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) != SET);
adc_value += ADC_GetConversionValue(ADC1);//读ADC中的值
}
return adc_value / 10;//取样10次的平均值
}
void get_power()
{
u16 ad = 0;
float power;
float mq_2num;
ad = get_value();
power=3.3 * ad /4096*2; //先读取电压值(电路图分压)
mq_2num=(power - 0.3)/0.1 * 200; //获取烟雾浓度的值
printf("电压值:%f\r\n",power);
printf("mq_2的值为%f:",mq_2num);
delay_ms(1000);
}
电路原理图
求电压的数值:
ADC读取的电压值为 A0到接地的一半。
ADC / R38 =3.3V / (R36+R38)