MQ-2烟雾传感器

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

MQ-2常用于家庭和工厂的气体泄漏监测装置,适宜于液化气、苯、烷、酒精、氢气、烟雾等的探测。故因此,MQ-2可以准确来说是一个多种气体探测器。

MQ-2的探测范围极其的广泛。它的优点:灵敏度高、响应快、稳定性好、寿命长、驱动电路简单。

二、MQ-2的工作原理

MQ-2型烟雾传感器属于二氧化锡半导体气敏材料,属于表面离子式N型半导体。处于200~300摄氏度时,二氧化锡吸附空气中的氧,形成氧的负离子吸附,使半导体中的电子密度减少,从而使其电阻值增加。当与烟雾接触时,如果晶粒间界处的势垒收到烟雾的浓度而变化,就会引起表面导电率的变化。利用这一点就可以获得这种烟雾存在的信息,烟雾的浓度越大,导电率越大,输出电阻越低,则输出的模拟信号就越大

三、MQ-2的特性

  • MQ-2型传感器对天然气、液化石油气等烟雾有很高的灵敏度,尤其对烷类烟雾更为敏感,具有良好的抗干扰性,可准确排除有刺激性非可燃性烟雾的干扰信息。

  • MQ-2型传感器具有良好的重复性和长期的稳定性。初始稳定,响应时间短,长时间工作性能好。需要注意的是:在使用之前必须加热一段时间,否则其输出的电阻和电压不准确。

  • 其检测可燃气体与烟雾的范围是100~10000ppm

  • (ppm为体积浓度。1ppm=1立方厘米/1立方米)

  • 电路设计电压范围宽,24V以下均可,加热电压5±0.2V

注意:如果加热电压过高,会导致输入电流过大,将内部的信号线熔断,从而器件报废。

四、MQ-2应用电路

MQ-2常用的电路有两种,一种使用采用比较器电路监控,另一种为ADC电路检测。

1. 比较器电路

 

MQ-2的引脚4输出随烟雾浓度变化的直流信号,被加到比较器U1A的2脚,Rp构成比较器的门槛电压。当烟雾浓度较高输出电压高于门槛电压时,比较器输出低电平(0v),此时LED亮报警;当浓度降低传感器的输出电压低于门槛电压时,比较器翻转输出高电平(Vcc),LED熄灭。调节Rp,可以调节比较器的门槛电压,从而调节报警输出的灵敏度。R1串入传感器的加热回路,可以保护加热丝免受冷上电时的冲击。

2. ADC转换电路

MQ-2传感器另外一个采集方法为AD信号采集,即将电压信号转化为数字信号,进而转化为精确的烟雾浓度值。

MQ-2传感器的4脚、6脚的电压为输出信号,Rs为传感器的本体电阻。其中若气体浓度上升,必导致Rs下降。而Rs的下降则会导致MQ-2的4脚、6脚对地输出的电压增大。所以气体浓度增大,其输出的电压也会增大,最终通过ADC0832转换后数值增大。

五.控制程序

1. 因为比较器电路处理的检测信号只有高和低两种状态;当浓度低于阈值时,信号为高电平;浓度高于阈值时,信号为低电平。所以单片机只需要将引脚配置为输入模式,监控该信号的高低电平即可。

2. AD信号采集程序

实现对MQ-2烟雾浓度的采集,只需实现ADC0832采集函数便可完成信号的采集。但通过ADC0832采集到的信号只为原始信号,要转换为实际的烟雾浓度,还需要根据MQ-2的特性进行校正和公式转换,最终得到实际的浓度值。

/****************************************************************************
函数功能:AD转换子程序
入口参数:channel
出口参数:dat
****************************************************************************/
unsigned char adc0832(unsigned char channel )
{
  unsigned char i,test,adval,dat;
  adval = 0x00;
  test = 0x00;
  
  Clk = 0;       //初始化
  DATI = 1;
  _nop_();
  CS = 0;
  _nop_();
  Clk = 1;
  _nop_();
  
  
  if (channel == 0x00 )      //通道选择
  {
    Clk = 0;
    DATI = 1;      //通道0的第一位
    _nop_();
    Clk = 1;
    _nop_();
    Clk = 0;
    DATI = 0;      //通道0的第二位
    _nop_();
    Clk = 1;
    _nop_();
  } 
  else
  {
    Clk = 0;
    DATI = 1;      //通道1的第一位
    _nop_();
    Clk = 1;
    _nop_();
    Clk = 0;
    DATI = 1;      //通道1的第二位
    _nop_();
    Clk = 1;
    _nop_();
  }
  
  Clk = 0;
  DATI = 1;
  for( i = 0;i < 8;i++ )      //读取前8位的值
  {
    _nop_();
    adval <<= 1;
    Clk = 1;
    _nop_();
    Clk = 0;
    if (DATO)
    adval |= 0x01;
    else
    adval |= 0x00;
  }
  for (i = 0; i < 8; i++)      //读取后8位的值
  {
    test >>= 1;
    if (DATO)
    test |= 0x80;
    else 
    test |= 0x00;
    _nop_();
    Clk = 1;
    _nop_();
    Clk = 0;
  }
  if (adval == test)      //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
  dat = test;
  nop_();
  CS = 1;        //释放ADC0832
  DATO = 1;
  Clk = 1;
  return dat;
}

/****************************************************************************
函数功能:获取烟雾浓度
入口参数:无
出口参数:dat
****************************************************************************/
unsigned char GetYanWuValue(void)
{
    unsigned int sum=0;
    unsigned char m,value=0;
    for(m=0;m<20;m++)      //读50次AD值
      sum = adc0832(0)+sum;    //读到的AD值,将读到的数据累加到sum
    value=(unsigned char)(sum/20);        //跳出上面的for循环后,将累加的总数除以50得到平均值value
  
    if(value > ADC_Zero) 
        value = value - ADC_Zero;              //首先减去零点漂移
      else
        value = 0;
  
    return value;

}
发布了9 篇原创文章 · 获赞 4 · 访问量 226

猜你喜欢

转载自blog.csdn.net/weixin_44206126/article/details/104356094