MQ-2烟雾传感器的使用

2023-05-16

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

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

MQ-2具有以下特点:

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

 图一 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烟雾传感器的模拟信号输出管脚接到STM32F103ZET6的ADC管脚上(PA4管脚)。下面列出AD采样的相关代码:

void MQ2_Init(void)                                                                  

{

 MQ2_GPIO_Configuration();

 MQ2_DMA_Configuration();

 MQ2_Configuration();

}

void MQ2_GPIO_Configuration(void)                                            

{

 GPIO_InitTypeDef GPIO_InitStructure;  

 RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

 RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1|RCC_APB2Periph_GPIOA,ENABLE);

 GPIO_InitStructure.GPIO_Pin  =GPIO_Pin_4;

 GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AIN;

 GPIO_Init(GPIOA,&GPIO_InitStructure);

}

void MQ2_DMA_Configuration(void)                                   

{

 DMA_InitTypeDef DMA_InitStructure;

 DMA_DeInit(DMA1_Channel1);                                                 

 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;                

 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)MQ2_ADC_ConvertedValue;

 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;                         

 DMA_InitStructure.DMA_BufferSize = ADC_NUM;                                

 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;           

 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;                    

 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;

 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;

 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;                            

 DMA_InitStructure.DMA_Priority = DMA_Priority_High;                         

 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;                               

 DMA_Init(DMA1_Channel1,&DMA_InitStructure);                                

 DMA_Cmd(DMA1_Channel1,ENABLE);

}

void MQ2_Configuration(void)                                                     

{

 ADC_InitTypeDef ADC_InitStructure;

 ADC_DeInit(ADC1);                                                  

 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;                 

 ADC_InitStructure.ADC_ScanConvMode =ENABLE;                        

 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;                 

 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;

 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;             

 ADC_InitStructure.ADC_NbrOfChannel = ADC_NUM;                      

 ADC_Init(ADC1,&ADC_InitStructure);                                 

 RCC_ADCCLKConfig(RCC_PCLK2_Div6);

 ADC_RegularChannelConfig(ADC1,ADC_Channel_6,1,ADC_SampleTime_239Cycles5);

 ADC_DMACmd(ADC1, ENABLE);

 ADC_Cmd(ADC1,ENABLE);                                              

 ADC_ResetCalibration(ADC1);                                        

 while(ADC_GetResetCalibrationStatus(ADC1));                        

 ADC_StartCalibration(ADC1);                                        

 while(ADC_GetCalibrationStatus(ADC1));                                   

 ADC_SoftwareStartConvCmd(ADC1,ENABLE);

}

u16 Get_MQ2_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_MQ2_Adc_Average(u8 ch,u8 times)                            

{

 u32 temp_val=0;

 u8 t;

 for(t=0;t<times;t++)

 {

  temp_val+=Get_MQ2_Adc(ch);

  delay_ms(5);

 }

 return temp_val/times;

}

      在程序的main函数中调用Get_MQ2_Adc_Average(u8 ch,u8 times) 函数,得到MQ-2烟雾传感器的模拟信号电压值,再通过一系列的转换就能得出气体浓度。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MQ-2烟雾传感器的使用 的相关文章

  • Runtime error 216 at xxx 故障解决一例

    故障现象 xff1a 部分Delphi项目在win7开发机上不能运行了 xff0c 提示Runtime error 216 at xxx错误信息 xff0c 但是将出错的EXE文件复制到别的win7和xp下 xff0c 均运行正常 解决办法
  • 启用了TRACE 和TRACK HTTP 方法,如何禁用?

    http wenku baidu com view 557d761ea8114431b90dd873 html http wenku baidu com view de1f4ad2195f312b3169a50d html http www
  • IP地址表示方法及网段子网掩码写法

    A类IP段 0 0 0 0 到127 255 255 255 B类IP段 128 0 0 0 到191 255 255 255 C类IP段 192 0 0 0 到223 255 255 255 XP默认分配的子网掩码每段只有255或0 xf
  • ftp连接错误——服务器发回了不可路由的地址。使用服务器地址代替。

    设置filezilla客户端的连接参数 选中某一连接项高级 加密 只使用普通ftp传输设置 传输模式 主动重新连接
  • VNC内网穿透--MAC控制windos

    提示 xff1a 文章写完后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 前言SSH和VNCSSHSSH服务端SSH客户端 VNCVNC serverVNC viewer 内网穿透花生壳 前言 翻出很久
  • Excel 2016双击文件打开为空白的解决办法

    故障描述 xff1a 安装Office 2016后 xff0c 双击EXCEL文件打开后显示为空白 解决办法 xff1a 开始 运行 regedit 修改HKEY CLASSES ROOT Excel Sheet 12 shell Open
  • Linux 修改远程默认端口(22)

    如题 xff1a 在此前 xff0c 建议先查看redhat的release版本 xff0c CentOS 7的启动服务不同 xff1a more etc redhat release 正文 xff1a 1 编辑sshd配置 xff0c 修
  • pytorch环境配置(装cuda、cudnn)win10+cuda10.1+cudnn7.6.5+torch1.7.1 && 集显装pytorch

    为了装这个走了太多坑了 xff0c 所以想写一篇具体教程 xff0c 有缘人看吧 xff0c 希望能解决你的问题 xff08 第一次写文章啥也不懂 xff0c 万一冒犯了啥 xff0c 麻烦告知我改 xff09 我anaconda很早就装过
  • APM无人机软件在环仿真环境搭建

    题记 xff1a 最近做毕业设计得用到无人机仿真 xff0c 重操旧业 xff0c 搞一搞SITL仿真 给个传送门参考 xff1a 无人机SITL仿真 APM软件在环仿真 我的环境 xff1a ubuntu18 04虚拟机 1 官方教程 a
  • 无人机导航中的各类坐标系

    无人机中的各类坐标系学习笔记 xff1a 北东地坐标系 NED north east down 东北天 ENU east north up 机体坐标系 body frame 1 导航中的坐标系理解 重要参考 导航中 xff0c 最重要的两个
  • 有了Systick中断为什么还要PendSV中断?

    文章目录 问题 xff1a 原因 xff1a 1 在SysTick中断里完成任务切换会降低操作系统的实时性 xff1a 2 把systick优先级设置为最高把PendSV设置为最低的好处 xff1a 3 结语 xff1a 问题 xff1a
  • OpenCV/caffe安装流程

    公司正在做人脸识别系统 xff0c 用到了OpenCV库 xff0c 下面就是根据网上资料以及自己多次部署安装的经验整理的安装流程 xff0c 希望能给一些人一点参考 系统 xff1a Ubuntu1604 CPU架构 xff1a 一般是x
  • win10远程桌面连接ubuntu18.04

    一开始 xff0c 我是根据这个教程进行操作的 xff0c 改了设置为共享 xff0c 安装xrdp等 xff0c 一切都完成后 xff0c 当进行连接时 xff0c 也会出现那个xrdp连接界面 xff0c 但只要一登陆 xff0c 界面
  • 机器学习算法知识点整理

    1生成模型generative model和判别模型 discriminative model 已知输入变量x xff0c 生成模型通过对观测值和标注数据计算联合概率分布P x y 来达到判定估算y的目的 判别模型通过求解条件概率分布P y
  • 我的2014年总结——奔波的一年

    2014年 xff0c 发生了一些人生的大事 xff0c 这些事既有忧 xff0c 又有喜 这因为有这些事情的发生 xff0c 所以我们才越发成熟 xff0c 越发稳重 2014年技术的提升没有前2年那么突飞猛进了 xff0c 生活的事情也
  • 谈谈你对Spring Bean生命周期的理解【面试】

    前言 面试中经常会被问到Spring Bean的生命周期 xff0c 有些人说记不住 xff0c 看了一遍源码也是云里雾里的 xff0c 那是因为只看理论 xff0c 没有自己实践 xff0c 如果自己亲自写代码验证一下 xff0c 不管是
  • FreeRTOS初级篇----名称规范

    数据类型 TickType t xff1a FreeRTOS中断计数值类型 xff0c 可以是16位也可以是32位 xff0c 对于32位CPU来说TickType t最好为32位 BaseType t xff1a 是能够让CPU运行效率最
  • FreeRTOS初级篇----创建任务--动态创建、静态创建

    任务创建函数 xff1a xTaskCreate BaseType t span class token function xTaskCreate span span class token punctuation span TaskFun
  • Linux 性能测试与分析

    源自 http blog sina com cn s blog 71ad0d3f01019uzl html Linux 性能测试与分析 Revision History Version Date Author Description 1 0
  • HashMap底层原理

    文章目录 1 HashMap的概念2 底层数据结构2 JDK1 8之前存在的问题 xff1f 3 问题 xff1a 加载因子为什么默认值为0 75f xff1f 4 问题 xff1a 如果得到key的hash值 xff08 哈希码 xff0

随机推荐