MQ-2烟雾传感器的电压与浓度转换

        最近真的是找了好多的资料去查找MQ-2传感器的数据获取,就连商家发给我的也是原理图,这对于新手来说真的太难了,商家给人的程序都不能获取数据,这好像不太符合我们买这传感器的目的,我相信大多数人还是想利用传感器获取空气中烟雾,乙醇,甲烷的浓度吧。这里我买的MQ2是一个精确度不是很高的烟雾传感器,只能保证值大致接近吧。

1.MQ2传感器结构应用描述

        主要特点:广泛的探测范围,高灵敏度/快速响应回复,优异的稳定性/寿命长,简单的驱动电路等特点。其实对于我们学习者来说就是相对特别便宜,虽然精度低了点,但对于我们的学习还是够了的。以后有条件了,专攻这方面咋们买好的。有它的特点我们可以知道它的主要应用在于家庭跟工厂的气体泄漏监测装置,适宜于液化气、丁烷、丙烷、甲烷、酒精、氢气、烟雾等的探测。规格这里我就不做详细介绍了,这里给一张图;

这上面主要是它的基本参数,但这里的预热24小时感觉不需要,像我们学习的话感觉预热5分钟左右就能达到一个稳定值,我这里是AO口输出的是0.36V。

2.MQ2烟雾传感器的灵敏度特性描述

这张图是温湿度特性。

        我这里两张图不知道大家有没有看懂啊,我这里解释一下吧,第二张我们用处的话相对低很多,主要是第一张,在图上有七条线,分别是H2,LPG,CH4,co,alcohol,propane,air。图上也写了对应的是温度20摄氏度,相对湿度为65%。但一般正常的环境也差不多在这个范围吧,所以我们直接用这图,这里就以CH4为例吧。

根据灵敏度特性曲线找出横坐标与纵坐标一一对应关系:
ppm=[300,400,500,600,700,800,900,1000,2000,3000,4000,5000,6000,7000,8000,9000,10000]’;
Rs/R0=10*[0.27,0.25,0.235,0.215,0.205,0.195,0.190,0.185,0.15,0.13,0.11,0.091,0.087,0.080,0.077,0.073,0.070]’;

2.电压数据与浓度转换分析
然后我们使用matlab进行仿真得到散点图和仿真曲线:

     

这里因为我没有matlab软件,所以就没有细化了,在其他地方搞了两张示例图来,转化成函数得到

基本公式:Rs/R0 = 11.5428*ppm^(-0.6549);

然后我们根据说明文档,得到它的基本测试电路

                 

根据电路图我们可以得到:
Vrl/Rl = (Vc - Vrl)/Rs;
Vrl:即AO口输出电压
Vc:回路电压
Rl:Rl为可调电阻,我的电路里面Rl为10-1K欧姆,我调成500欧姆具体看电路图。

这里我们用MQ2传感器的AO口连接PA5,将模拟电路的值传过来就是Vrl,等稳定后(大概5分钟),

得到的值为0.35V(多次去平均值),Vc=5V,我连接的是5V,则

R0=(Vc-Vrl)*Rl/vrl=(5-0.35)*0.5/0.35=6.64(正常空气情况下的Vrl值)

RS=(Vc-Vrl)*Rl/vrl=(5-Vrl)*0.5/vrl

由Rs/R0 = 11.5428*ppm^(-0.6549)得到mmp=pow(11.5428*R0/Rs,0.6549);

3.上程序

电路连接AO口与PA5连接

先初始化ADC模块,adc.c文件

void ADCx_Init(void)
{
    GPIO_InitTypeDef GPIO_InitStructure; //定义结构体变量    
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    ADC_InitTypeDef       ADC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
    
    
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; //模拟输入模式
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;//管脚设置
    GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;//浮空
    GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化结构体
    
    //RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE);      //ADC1复位
    //RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE);    //复位结束
    
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
    ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟5个时钟
    ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA失能
    ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频4分频。ADCCLK=PCLK2/4=84/4=21Mhz,ADC时钟最好不要超过36Mhz 
    ADC_CommonInit(&ADC_CommonInitStructure);//初始化
    
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;//非扫描模式    
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//关闭连续转换
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐    
    ADC_InitStructure.ADC_NbrOfConversion = 1;//1个转换在规则序列中 也就是只转换规则序列1 
    ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
    
    ADC_Cmd(ADC1, ENABLE);//开启AD转换器
}
u16 Get_ADC_Value(u8 ch,u8 times)
{
    u32 temp_val=0;
    u8 t;
    //设置指定ADC的规则组通道,一个序列,采样时间
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_480Cycles);    //ADC1,ADC通道,480个周期,提高采样时间可以提高精确度                
    
    for(t=0;t<times;t++)
    {
        ADC_SoftwareStartConv(ADC1);        //使能指定的ADC1的软件转换启动功能    
        while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
        temp_val+=ADC_GetConversionValue(ADC1);
        delay_ms(5);
    }
    return temp_val/times;

而adc.c就是函数声明

main.c主函数代码

int main()
{    
    u8 i=0;
    u16 value=0;
    float RS;
    float R0;
    float vol;
    float ppm;
    
    SysTick_Init(168);
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
    LED_Init();
    USART1_Init(115200);
    ADCx_Init();
    
    while(1)
    {
        i++;
        if(i%20==0)
        {
            LED1=!LED1;
        }
        
        if(i%50==0)
        {
            value=Get_ADC_Value(ADC_Channel_5,20);
            printf("检测AD值为:%d\r\n",value);
            vol=(float)value*(3.3/4096);
            printf("检测电压值为:%.2fV\r\n",vol);
            
            RS=(5-vol)/vol*0.5;
            R0=6.64;
            ppm=pow(11.5428*R0/RS,0.6549f)*100;        //放大100倍
            printf("检测烟雾的PPM为:%.2fPPM\r\n",ppm);
            printf("\n");
        }
        delay_ms(10);    
    

4.实验结果

 利用打火机喷出气体,达到阈值灯开始变亮。

 

检测到酒精后PPM值立马变大,灯变绿。

5.参考文献

a、博客文章:MQ系列传感器电压与浓度转换关系_mq2传感器电压与浓度转换-CSDN博客​​​​​

b、mq2传感器技术文档
http://style.winsensor.com/pro_pdf/MQ-2.pdf

 

### 回答1: MQ2烟雾传感器可以检测到空气中的烟雾、甲醛、丙烯、甲酸、乙醇、氢气等气体。但由于不同气体的分子结构不同,它们与传感器的相互作用也不同,因此无法直接根据传感器输出的电压值来确定气体浓度。通常需要进行多项式拟合或经验公式计算来估算气体浓度。 以下是一种常见的MQ2烟雾传感器浓度算法: 1. 读取传感器输出的电压值,并将其转换为对应的电阻值。 2. 计算传感器的电阻比值RS/R0,其中RS为传感器在当前气体浓度下的电阻值,R0为传感器在纯净空气中的电阻值。 3. 根据经验公式计算气体浓度,例如对于烟雾和甲醛,可使用下列公式: Smoke_density = 3.027 * pow(RS/R0, -1.179); HCHO_density = 0.17 * pow(RS/R0, -1.0) * 1000; 其中Smoke_density和HCHO_density分别为烟雾和甲醛的浓度,单位为mg/m3。 需要注意的是,这些经验公式是基于实验数据得出的,仅供参考。在实际应用中,应根据具体情况进行调整和优化。 ### 回答2: MQ2烟雾传感器是一种常见的气体传感器,可以检测空气中的可燃气体、烟雾以及一些有害气体。它是基于半导体敏感元件的原理工作的。 MQ2烟雾传感器浓度算法主要是根据敏感元件的电阻变化来计算浓度。当装置处于干净的环境中,敏感元件的电阻值会较高。然而当传感器接收到可燃气体或烟雾等有害气体时,敏感元件的电阻值会减小。 浓度算法通常基于对敏感元件电阻值和可燃气体或烟雾浓度之间的经验关系建立。传感器通常会通过一个标定过程来确定电阻值和浓度之间的对应关系,以便在实际应用中进行浓度计算。 该算法通常包括以下几个步骤: 1. 读取传感器的电阻值:通过电路进行读取,并将其转换电压值。 2. 将电压转换浓度值:利用预先标定的浓度-电阻曲线,将电压转换浓度值。一般来说,电压值越低,浓度越高。 3. 输出浓度值:将计算得到的浓度值以合适的形式进行输出,例如通过显示器显示或通过通信接口传输给其他设备。 需要注意的是,MQ2烟雾传感器浓度算法是基于经验模型建立的,对于不同的环境和气体类型,算法的准确性可能会有一定的差异。此外,算法的准确性还可能受到传感器的品质和使用环境的影响,因此在实际应用中需要进行适当的校准和调整。 ### 回答3: mq2烟雾传感器是一种常用的气体浓度监测设备,主要用于检测大气中的烟雾浓度。其浓度算法基于传感器测量到的电阻值来计算。 mq2烟雾传感器内部含有两个主要的元件——一个可燃气体传感器和一个气敏电阻。当烟雾进入传感器时,可燃气体传感器会与氧气发生化学反应,产生可测量的电压变化。同时,气敏电阻也会对气体浓度产生响应,其电阻值随气体浓度的变化而变化。 浓度算法根据气敏电阻的电阻值来计算烟雾浓度。传感器的电阻值与气体浓度呈反比关系,即电阻值越大,烟雾浓度越低;电阻值越小,烟雾浓度越高。因此,可以通过测量传感器电阻值的大小来判断烟雾浓度的高低。 具体的浓度算法可能会根据不同的传感器厂商而有所差异。一种常见的算法是利用电阻值与烟雾浓度之间的线性关系,通过标定得出电阻-浓度转换的公式。根据该公式,可以将测量到的电阻值转换为对应的烟雾浓度。 总结起来,mq2烟雾传感器浓度算法基于测量到的电阻值来计算烟雾浓度。该算法通过标定和转换公式将电阻值转换为对应的浓度值,从而实现对烟雾浓度的监测和判断。
评论 38
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

逝暮

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

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

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

打赏作者

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

抵扣说明:

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

余额充值