点缀MQ系列气体传感器-深入了解数据表和调试


购买一分钱的气体泄漏检测仪后,人们希望将架子上的所有东西都拆下来,找出里面发生了什么。关于传感器的信息和文章很多,但大多数仅限于标准中文模块的引脚排列,有时还包括操作原理。关于相对准确地确定那里的信息的绝对值。展望未来,我要说的是,我们将尝试从数据表中挤出所有内容,包括:确定“鹦鹉”的确切功能,温度和湿度校正以及一些选择的可能性。

例如,可燃气体传感器(主要是甲烷)MQ-4。简而言之,传感器元件由于其化学特性,会在不同的气体浓度下改变电阻,并充当分压器的电阻,通过该分压器我们可以通过ADC获得电压值。这些特性在传感器必须被加热的元件的特定温度下表现出来。


上面是传感器和分压器电路的示意图,其中H是加热线圈(33欧姆-约150 mA,对于带控制器的工艺品来说电流太大,在设计电源电路时必须考虑),AV是敏感元件的输出,其电阻可互换,取决于气体浓度,RL是数据手册中推荐的第二个分压电阻器-20 kOhm。

关于选择ADC参考电压(Vref)的评论
Hanwei Vc = 5 , Winsen – Vc < 24 . , 3.3 , , . 5 .

将ADC转换为ppm


在ADC分压器的输出端,我们采用电压值(Uadc),据此可以计算出传感器电阻Rs(知道分压器RL的第二个电阻的值),即 确定传感器精确地传输给我们的信息:

Rs=(Vref×RL)/UadcRL


使用Rs的值,我们已经可以根据数据表中的图表确定气体浓度。简单的Rs / Ro比值可用于确定浓度。Ro在这种情况下是在1000 ppm的检测气体浓度下传感器元件的电阻。

评论计算中的起点
,
«Ro: sensor resistance at 1000ppm of CH4 in the clean air»
, 1000 ppm. «» . , « » , , 1800 ppb ( 1.8 ppm, 1000 ppm). , 4.4 Rs/Ro.


在此阶段,由于采用了ADC和公式,我们只知道将要排斥的电流电阻(Rs)的值。我们将假设我们在校准温度和湿度(根据20数据表,65%)的清洁空气中(从检测到的气体中)对其进行了测量。稍后,将对进行校准的湿度提出有趣的评论。

因此,MQ-4传感器的参考值Ro为:

Ro=Rs/4.4



评论烟雾选择
, , Rs/Ro – 1.8…0.43, – 3.8…2.6. . , , «» . . RsRo 2.8, «» :



实际气体浓度的计算因曲线图的曲率而有些复杂,并且缺少可用于调整该曲线图的独特控制点。同样,问题在于图像的低扩展,因此有必要逐个像素地确定控制点。

为了澄清计算,最明显的值在坐标网格上隔开。控制点决定了ppm对Rs / Ro的依赖性:

关于测量极限的评论
400…10000 ppm. (Winsen/Hanwei) 200 400 ppm, 400. ppm Rs/Ro, x = ppm/1000; y= (Rs/Ro)*10:


构造的图对应于以下功能:



因此,“鹦鹉”的数量由下式识别:

关于温度补偿的一点


根据以下数据表图表,可以知道,根据使用传感器的环境,读数与实际读数有所不同:



关于测量环境的典型湿度的评论
, = 65%. RsRo/ppm ( ppm) RsRo/Temp ( ). Rs/Ro = 1 ppm=1000 20, : 33% 65%. . , , 33%. .

为了更准确地确定指标对环境的依赖性,还构建了功能图,传感器的温度范围限制为-10°C ... +50°C(x = TEMP / 10; y = RsRo(误差)* 100):


该图对应于以下功能:

f(x)=0.83x29.2x+25(0.3×HUM)



基础是湿度为33%的曲线图(根据交叉点1的判断,它是校准曲线)。如果您注意湿度,则1%的湿度会使图表移动0.3 Y(调整RsRo的实际值将除以100-为清楚起见,在图表中使用了系数)。对于“零”湿度,“ + 25”将图形位置在Y中移动;对于实际湿度,“ 0.3 x HUM”返回Y位置。在极端温度下1%湿度的“重量”的某些变化意义不大,因此未考虑在内。

重要说明:如果在湿度为33%,温度为20度的干净空气中进行校准,则所有这些都适用。

可以通过以下公式计算出校正值RsRo(误差),需要将其添加到RsRo值中以补偿对环境的影响:


“带有星号”的任务是在非标准环境中校准时澄清补偿
, (20/33%), RsRo(error) :


Y – . X: . , , .

, , , .

, — .

要计算已经补偿的值:


我们将理论转移到微控制器


为了测试传感器,使用了STM32F407VET微控制器和HAL库,从BME280传感器接收了校正值。在头文件中,我们为设置定义一些常数值。

mq4.h


#ifndef MQ4_H_
#define MQ4_H_

int mq4_default_work (void); //   
int mq4_advanced_work (float temp, float hum); //   
int mq4_full_work (float temp, float hum, float temp_cal, float hum_cal); //      
int mq4_calib_Ro(void); // 
int mq4_get_adc (void); //   ,   

#define MQ4_ADC hadc1 //    
#define MQ4_ADC_PRECISION 4096 //     (4096 = 12 bit)
#define MQ4_REFERENCE_VOLTAGE 3.3f //  
#define MQ4_STATIC_RESISTOR 20000 //RL -     
#define MQ4_RO_DEF 13600 //Ro -   1000 ppm (RsRo=1),   
#define MQ4_HUM_WEIGHT 0.3f //     (  ) 
#define MQ4_AIR_RSRO 4.4f // RsRo    (   )
#endif /* MQ4_H_ */

mq4.c


mq4.c
#include "mq4.h"
#include "adc.h"
#include "math.h"

int mq4_Rs; //  
int mq4_adc_value; // 
float mq4_volts; // 
float mq4_RsRo; //  .  . 1000 ppm
float mq4_calib_value;  //   RsRo
float mq4_calib_value2; //   RsRo (    )

extern int mq4_Ro; //   1000ppm 
extern int mq4_temp_cal; //     
extern int mq4_hum_cal; //     

PPM计算功能(无更正)
int mq4_default_work (void)
{
int ppm; 
int mq4_adc;
float volts;
int Rs;
float RsRo;
//  : 
mq4_adc = mq4_get_adc(); 
//   :
volts = mq4_adc/(MQ4_ADC_PRECISION/MQ4_REFERENCE_VOLTAGE); 
//    :
Rs = ((MQ4_REFERENCE_VOLTAGE * MQ4_STATIC_RESISTOR)/volts)- MQ4_STATIC_RESISTOR; 
//    :
RsRo = (float)Rs / (float)mq4_Ro; 

//   ( ,  ):
mq4_RsRo = RsRo; 
mq4_adc_value = mq4_adc; 
mq4_volts = volts; 
 
if (RsRo>0.437) //    (  )
 //     :
 {ppm = (pow((10/(RsRo*10)),(1/0.36152689)))*1000;} 
 //     -  9999 :
 else {ppm=9999;} 
 
 return (int)ppm;
}


Ppm计算功能,可补偿当前的温度和湿度
int mq4_advanced_work (float temp, float hum)
{
int ppm; 
int mq4_adc;
float volts;
int Rs;
float RsRo;
float K; // 

//   :
mq4_adc = mq4_get_adc(); 
//    :
volts = mq4_adc/(MQ4_ADC_PRECISION/MQ4_REFERENCE_VOLTAGE); 

//    
Rs = ((MQ4_REFERENCE_VOLTAGE * MQ4_STATIC_RESISTOR)/volts)- MQ4_STATIC_RESISTOR; 
//    :
RsRo = (float)Rs / (float)mq4_Ro;  
// :
K = ((0.83*(pow((temp/10),2)))-(9.2*(temp/10))+ 25 - (hum*MQ4_HUM_WEIGHT))/100; 
//  
RsRo = RsRo - K; 

//    (  )
if (RsRo>0.437) 
//     :
{ppm = (pow((10/(RsRo*10)),(1/0.36152689)))*1000;} 
//     -  9999ppm:
else {ppm=9999;}
 
//    ( ,  ):
mq4_RsRo = RsRo; 
mq4_calib_value = K; 
mq4_adc_value = mq4_adc; 
mq4_Rs = Rs; 

    return ppm;
 }


Ppm计算功能(具有温度/湿度补偿和校正校准介质)
int mq4_full_work (float temp, float hum, float temp_cal, float hum_cal) 
//:    ,       
{
int ppm; 
int mq4_adc;
float volts;
int Rs;
float RsRo;
float K;
//  :
temp = temp + (20 - temp_cal);  

//   : 
mq4_adc = mq4_get_adc(); 
//    :
volts = mq4_adc/(MQ4_ADC_PRECISION/MQ4_REFERENCE_VOLTAGE); 

//     :
Rs = ((MQ4_REFERENCE_VOLTAGE * MQ4_STATIC_RESISTOR)/volts)- MQ4_STATIC_RESISTOR; 
//  :
RsRo = (float)Rs / (float)mq4_Ro;  
//  (   - MQ4_HUM_WEIGHT*(hum_cal-33)          ): 
K = ((0.83*(pow((temp/10),2)))-(9.2*(temp/10))+ 25 - (hum*MQ4_HUM_WEIGHT)+(MQ4_HUM_WEIGHT*(hum_cal-33)))/100; //
//   RsRo:
RsRo = RsRo - K; 

if (RsRo>0.437) ppm = (pow((10/(RsRo*10)),(1/0.36152689)))*1000; 
else {ppm=9999;}

//    ( ,  ) 
mq4_RsRo = RsRo; 
mq4_calib_value2 = K; 
mq4_adc_value = mq4_adc; 
mq4_Rs = Rs; 

   return ppm;
 }


ADC值
int mq4_get_adc (void)
 {
 int mq4_adc_bits; 
 HAL_ADC_Start(&MQ4_ADC);
 HAL_ADC_PollForConversion(&MQ4_ADC,100);
 mq4_adc_bits = HAL_ADC_GetValue(&MQ4_ADC);
 HAL_ADC_Stop(&MQ4_ADC);
    return mq4_adc_bits;
 }


校准
int mq4_calib_Ro(void)
{
float mq4_adc_volts;
int Rs;
int Ro;
int mq4_adc;
mq4_adc = mq4_get_adc(); 
mq4_adc_volts = (float)mq4_adc/((float)MQ4_ADC_PRECISION/MQ4_REFERENCE_VOLTAGE); 
//     
Rs = (((float)MQ4_REFERENCE_VOLTAGE * (float)MQ4_STATIC_RESISTOR)/mq4_adc_volts)- (float)MQ4_STATIC_RESISTOR;
//    1000 ppm (      RsRo 4.4  MQ-4):
Ro = Rs/MQ4_AIR_RSRO;
   return Ro;
 }


main.c


#include "main.h"
#include "adc.h"
#include "gpio.h"
#include "mq4.h"

int ppm_def;  //ppm  
int ppm_adv;  //ppm     
int ppm_full;  //ppm        

float mq4_temp_cal = 20; //    
float mq4_hum_cal = 33; //    
extern float mq4_calib_value; //   RsRo
extern float mq4_calib_value2; //   RsRo c   

int mq4_Ro = MQ4_RO_DEF; //   1000ppm   
extern int mq4_Rs;   //    
extern int mq4_adc_value; // 
extern float mq4_volts; //   
extern float  mq4_RsRo; //   .  . 1000 ppm

//  :
float tf = 0.0f, hf = 0.0f; //     

int main(void)
{
 HAL_Init();
 MX_GPIO_Init();
 MX_ADC1_Init();
}

while (1)
{
 //    :
 ppm_def = mq4_default_work();              
 ppm_adv = mq4_advanced_work(tf,hf);
 ppm_full= mq4_full_work(tf,hf,mq4_temp_cal,mq4_hum_cal);
 //   : 
  if(HAL_GPIO_ReadPin(KEY_1_GPIO_Port, KEY_1_Pin)==GPIO_PIN_RESET) 
   {
   mq4_Ro = mq4_calib_Ro(); // 
   mq4_temp_cal = tf;   //     
   mq4_hum_cal = hf;   //     
   }
}

使用实例


确定ppm值:


温度补偿计算功能(在这种情况下,在相同的湿度下):


在非标准条件下校准期间校正值:


结论


  1. , , . TGS2611 ( 15-20 MQ-4). header- ppm ( Graph 4.4.2).
  2. 1$ , .
  3. , , RsRo 0,5…0,8, ( ). ( 1000 ppm), .. , . , , – 4…5 RsRo .
  4. . , «» header- ( Y).
  5. , , . (20 , 33% ( 65% )).
  6. 3.8 RsRo. — 2.6, 1.2…1.5.
  7. , RL ( 20 , 10…47 ). High Precision Resistor.



All Articles