购买一分钱的气体泄漏检测仪后,人们希望将架子上的所有东西都拆下来,找出里面发生了什么。关于传感器的信息和文章很多,但大多数仅限于标准中文模块的引脚排列,有时还包括操作原理。关于相对准确地确定那里的信息的绝对值。展望未来,我要说的是,我们将尝试从数据表中挤出所有内容,包括:确定“鹦鹉”的确切功能,温度和湿度校正以及一些选择的可能性。例如,可燃气体传感器(主要是甲烷)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的值,我们已经可以根据数据表中的图表确定气体浓度。简单的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为:
评论烟雾选择, , 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):该图对应于以下功能:
基础是湿度为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 
#define MQ4_REFERENCE_VOLTAGE 3.3f 
#define MQ4_STATIC_RESISTOR 20000 
#define MQ4_RO_DEF 13600 
#define MQ4_HUM_WEIGHT 0.3f 
#define MQ4_AIR_RSRO 4.4f 
#endif 
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; 
float mq4_calib_value;  
float mq4_calib_value2; 
extern int mq4_Ro; 
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;} 
 
 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;} 
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;  
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 - 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;
Ro = Rs/MQ4_AIR_RSRO;
   return Ro;
 }
 main.c
#include "main.h"
#include "adc.h"
#include "gpio.h"
#include "mq4.h"
int ppm_def;  
int ppm_adv;  
int ppm_full;  
float mq4_temp_cal = 20; 
float mq4_hum_cal = 33; 
extern float mq4_calib_value; 
extern float mq4_calib_value2; 
int mq4_Ro = MQ4_RO_DEF; 
extern int mq4_Rs;   
extern int mq4_adc_value; 
extern float mq4_volts; 
extern float  mq4_RsRo; 
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值:温度补偿计算功能(在这种情况下,在相同的湿度下):在非标准条件下校准期间校正值:结论
- , , . TGS2611 ( 15-20 MQ-4). header- ppm ( Graph 4.4.2).
 - 1$ , .
 - , , RsRo 0,5…0,8, ( ). ( 1000 ppm), .. , . , , – 4…5 RsRo .
 - . , «» header- ( Y).
 - , , . (20 , 33% ( 65% )).
 - 3.8 RsRo. — 2.6, 1.2…1.5.
 - , RL ( 20 , 10…47 ). High Precision Resistor.