MQ_2烟雾传感器

概述

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个步骤

具体功能查看以下连接文章

ADC数模转换

代码示例

#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)
在这里插入图片描述

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

好好睡觉好好吃饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值