基于STM32F103的消防系统之MQ-4气体传感器
硬件材料
开发板 野火STM32-F103指南者

气体传感器 MQ-4气体传感器
MQ-4 气体传感器所使用的气敏材料是在清洁空气中电导率较低的二氧化锡(SnO2)。 当传感器所处环境中存在可燃气体时,传感器的电导率随空气中可燃气体浓度的增加而增大。 MQ-4 气体传感器对甲烷灵敏度高,对酒精及其他一些干扰性气体有较强的抗干扰能力。
引脚连接
注意!!必须使用5v电压,否则会造成电压过低测不准。
代码简介
MQ-4气体传感器采用的是模拟输入的模式,即使用模拟信号进行信息传递。使用模拟信号输入可以探测到周围气体的浓度值。
软件代码
.C文件
#include "mq4.h"__IO uint16_t ADC_ConvertedValue;/*** @brief ADC GPIO 初始化* @param 无* @retval 无*/
static void ADCx_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;// 打开 ADC IO端口时钟ADC_GPIO_APBxClock_FUN ( ADC_GPIO_CLK, ENABLE );// 配置 ADC IO 引脚模式// 必须为模拟输入GPIO_InitStructure.GPIO_Pin = ADC_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;// 初始化 ADC IOGPIO_Init(ADC_PORT, &GPIO_InitStructure);
}
/*** @brief 配置ADC工作模式* @param 无* @retval 无*/
static void ADCx_Mode_Config(void)
{ADC_InitTypeDef ADC_InitStructure; // 打开ADC时钟ADC_APBxClock_FUN ( ADC_CLK, ENABLE );// ADC 模式配置// 只使用一个ADC,属于独立模式ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;// 禁止扫描模式,多通道才要,单通道不需要ADC_InitStructure.ADC_ScanConvMode = DISABLE ; // 连续转换模式ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;// 不用外部触发转换,软件开启即可ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;// 转换结果右对齐ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;// 转换通道1个ADC_InitStructure.ADC_NbrOfChannel = 1; // 初始化ADCADC_Init(ADCx, &ADC_InitStructure);// 配置ADC时钟为PCLK2的8分频,即9MHzRCC_ADCCLKConfig(RCC_PCLK2_Div8); // 配置 ADC 通道转换顺序和采样时间ADC_RegularChannelConfig(ADCx, ADC_CHANNEL, 1, ADC_SampleTime_55Cycles5);// ADC 转换结束产生中断,在中断服务程序中读取转换值ADC_ITConfig(ADCx, ADC_IT_EOC, ENABLE);// 开启ADC ,并开始转换ADC_Cmd(ADCx, ENABLE);// 初始化ADC 校准寄存器 ADC_ResetCalibration(ADCx);// 等待校准寄存器初始化完成while(ADC_GetResetCalibrationStatus(ADCx));// ADC开始校准ADC_StartCalibration(ADCx);// 等待校准完成while(ADC_GetCalibrationStatus(ADCx));// 由于没有采用外部触发,所以使用软件触发ADC转换 ADC_SoftwareStartConvCmd(ADCx, ENABLE);
}static void ADC_NVIC_Config(void)
{NVIC_InitTypeDef NVIC_InitStructure;// 优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);// 配置中断优先级NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQ;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}/*** @brief ADC初始化* @param 无* @retval 无*/
void ADCx_Init(void)
{ADCx_GPIO_Config();ADCx_Mode_Config();ADC_NVIC_Config();
}
/*********************************************END OF FILE**********************/
.H文件
#ifndef __MQ_H
#define __MQ_H#include "stm32f10x.h"// ADC 编号选择
// 可以是 ADC1/2,如果使用ADC3,中断相关的要改成ADC3的
#define ADC_APBxClock_FUN RCC_APB2PeriphClockCmd
#define ADCx ADC2
#define ADC_CLK RCC_APB2Periph_ADC2// ADC GPIO宏定义
// 注意:用作ADC采集的IO必须没有复用,否则采集电压会有影响
#define ADC_GPIO_APBxClock_FUN RCC_APB2PeriphClockCmd
#define ADC_GPIO_CLK RCC_APB2Periph_GPIOA //修改时钟
#define ADC_PORT GPIOA //修改寄存器
#define ADC_PIN GPIO_Pin_5 //修改引脚
// ADC 通道宏定义
#define ADC_CHANNEL ADC_Channel_5 //修改// ADC 中断相关宏定义
#define ADC_IRQ ADC1_2_IRQn
#define ADC_IRQHandler ADC1_2_IRQHandler//#define ADC_IRQ ADC3_IRQn
//#define ADC_IRQHandler ADC3_IRQHandlervoid ADCx_Init(void);#endif /* __ADC_H */
main.c
void MQ-4(void)
{ADC_ConvertedValueLocal =(float) ADC_ConvertedValue/4096*3.3;//读取电压值/*此处可加上一行代码,将电压值转换为浓度值*/delay_ms(200);printf("read_dht11_finish=%f\r\n", ADC_ConvertedValueLocal);if(ADC_ConvertedValueLocal > x) //可改为浓度大于某值{/*用户自定义操作*/}else{/*用户自定义操作*/}
}
阅读至此,可以知道MQ-4气体传感器的模拟输入是直接借用ADC检测的代码,若是空白代码,从头编写,可能需要在stm32f10x_it.c文件添加一定的代码。
MQ-4气体传感器只是一个基础的情况探测模块,具体的应用会在以后的章节进行讲解。比如检测到燃气泄漏之后的操作,响应。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
