STM32单片机+MQ

您所在的位置:网站首页 半导体接线图 STM32单片机+MQ

STM32单片机+MQ

2024-07-17 16:23| 来源: 网络整理| 查看: 265

目录

一、MQ-2烟雾传感器介绍

二、MQ-2烟雾传感器测量气体浓度的基本原理

三、MQ-2烟雾传感器测量气体浓度的程序实现

四、串口打印数据

五、源代码

六、串口调试助手软件 

七、MQ-2烟雾浓度传感器原理图资料

一、MQ-2烟雾传感器介绍

      MQ-2烟雾传感器采用在清洁空气中电导率较低的二氧化锡(SnO2),属于表面离子式N型半导体。当MQ-2烟雾传感器在200到300摄氏度环境时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的调至而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大。MQ-2烟雾传感器的探测范围极其的广泛,常用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。

MQ-2具有以下特点:

具有信号输出指示。 双路信号输出(模拟量输出及TTL电平输出) TTL输出有效信号为低电平,当输出低电平时信号灯亮,可直接接单片机。 模拟量输出0~5V电压,浓度越高电压越高。 对液化气,天然气,城市煤气有较好的灵敏度。 具有长期的使用寿命和可靠的稳定性。 快速的响应恢复特性。

 图一 MQ-2烟雾传感器的外观图                         图二 MQ-2烟雾传感器的内部电路图

二、MQ-2烟雾传感器测量气体浓度的基本原理

      MQ-2烟雾传感器输出0~5V的测量信号电压,浓度越高电压越高。这样将MQ-2烟雾传感器的模拟输出信号管脚接到处理器的一个ADC(模数转换)管脚进行模数转换,得出MQ-2烟雾传感器信号管脚上输出的电压值。我们知道MQ-2烟雾传感器信号管脚上输出的电压值是与电阻成反比关系的,而电阻值的大小是与气体浓度呈一定的线性关系的。这样一来,我们就能通过测量MQ-2烟雾传感器的输出电压值推导得到气体的浓度。

                                           图三 MQ-2烟雾传感器气敏元件的灵敏度特性

图四 MQ-2烟雾传感器气敏元件的温湿度影响 

三、MQ-2烟雾传感器测量气体浓度的程序实现

      在我们的实际工程应用中,将MQ-2烟雾传感器的模拟信号输出管脚接到STM32F103C8T6的ADC管脚上(PA1管脚)。下面MQ2.c文件列出AD采样的相关代码:

#include "MQ2.h" #include "OLED.h" #include "FMQ.h" #include #include "Serial.h" u8 times; void Adc_Init() { GPIO_InitTypeDef GPIO_Initstructre; ADC_InitTypeDef ADC_InitStruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1,ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_Initstructre.GPIO_Mode=GPIO_Mode_AIN; GPIO_Initstructre.GPIO_Pin=GPIO_Pin_1; GPIO_Initstructre.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstructre); GPIO_SetBits(GPIOA,GPIO_Pin_1); RCC_ADCCLKConfig(RCC_PCLK2_Div6); ADC_DeInit(ADC1);//شλADC1 ADC_InitStruct.ADC_ContinuousConvMode = DISABLE; ADC_InitStruct.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; ADC_InitStruct.ADC_Mode=ADC_Mode_Independent; ADC_InitStruct.ADC_NbrOfChannel = 1; ADC_InitStruct.ADC_ScanConvMode = DISABLE; ADC_Init(ADC1,&ADC_InitStruct); ADC_Cmd(ADC1,ENABLE); ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); } u16 Get_Adc(u8 ch) { ADC_RegularChannelConfig(ADC1,ch,1,ADC_SampleTime_239Cycles5); ADC_SoftwareStartConvCmd(ADC1,ENABLE); while(!ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)); return ADC_GetConversionValue(ADC1); } u16 Get_Adc_Average(u8 ch,u8 times) { u32 temp_val=0; u8 t; for(t=0;t


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3