Puntos sobre los sensores de gas de la serie MQ: comprensión profunda de la hoja de datos y la optimización


Después de comprar un detector de fugas de gas de centavo, hubo un deseo de desmontar todo en los estantes y descubrir qué está sucediendo dentro. Hay mucha información y artículos sobre sensores, pero la mayoría se limita a la distribución del módulo chino estándar, a veces los principios de funcionamiento. Sobre la determinación relativamente precisa de los valores absolutos de la información allí. Mirando hacia el futuro, diré que trataremos de exprimir todo de la hoja de datos, incluyendo: las funciones exactas de determinar "loros", corrección de temperatura y humedad, y algunas posibilidades de selección.

Por ejemplo, un sensor de gas combustible (principalmente metano) MQ-4. En resumen, el elemento sensor, debido a sus propiedades químicas, cambia la resistencia a diferentes concentraciones de gas y actúa como una resistencia del divisor de voltaje del que obtenemos el valor de voltaje a través del ADC. Estas propiedades se manifiestan a una cierta temperatura del elemento para el cual se debe calentar el sensor.


Arriba hay una representación esquemática de un sensor y un circuito divisor, donde H es una bobina de calentamiento (33 ohmios - aproximadamente 150 mA, las corrientes son demasiado grandes para embarcaciones con controladores, debe tenerse en cuenta al diseñar un circuito de alimentación), AV son las salidas de un elemento sensible con resistencia intercambiable dependiendo de la concentración de gas , RL es la segunda resistencia divisoria recomendada por la hoja de datos: 20 kOhm.

Comentario sobre la elección de un voltaje de referencia ADC (Vref)
Hanwei Vc = 5 , Winsen – Vc < 24 . , 3.3 , , . 5 .

Convertir ADC a ppm


En las salidas del divisor ADC, tomamos el valor de voltaje (Uadc) en función del cual podemos calcular la resistencia del sensor Rs (conociendo el valor de la segunda resistencia del divisor RL), es decir. Determine qué nos transmite exactamente el sensor:

Rs=(Vref×RL)/UadcRL


Con el valor de Rs, ya podemos determinar la concentración de gas de acuerdo con el gráfico de la hoja de datos. Se utiliza una relación Rs / Ro simple para determinar la concentración. Ro en este caso es la resistencia del elemento sensor a una concentración de gas de detección de 1000 ppm.

Comentario sobre los puntos de partida en los cálculos.
,
«Ro: sensor resistance at 1000ppm of CH4 in the clean air»
, 1000 ppm. «» . , « » , , 1800 ppb ( 1.8 ppm, 1000 ppm). , 4.4 Rs/Ro.


En esta etapa, gracias al ADC y la fórmula, solo conocemos el valor de la resistencia actual (Rs) de la que repeleremos. Asumiremos que lo medimos en aire limpio (a partir de gases detectados), a temperatura y humedad de calibración (según la hoja de datos 20, 65%). Un poco más tarde habrá un comentario interesante sobre la humedad a la que se realiza la calibración.

Por lo tanto, el valor de referencia Ro para el sensor MQ-4 es:

Ro=Rs/4.4



Comenta sobre la selección de humo
, , Rs/Ro – 1.8…0.43, – 3.8…2.6. . , , «» . . RsRo 2.8, «» :



El cálculo de la concentración real de gas es un poco complicado por la curvatura del gráfico y la falta de puntos de control distintos por los cuales se puede ajustar este gráfico. Además, el problema está en la baja expansión de la imagen, por lo que es necesario determinar los puntos de control píxel por píxel.

Para aclarar los cálculos, los valores más obvios están espaciados en una cuadrícula de coordenadas. Los puntos de control determinaron la función de la dependencia de ppm en Rs / Ro:

Comentario sobre límites de medición
400…10000 ppm. (Winsen/Hanwei) 200 400 ppm, 400. ppm Rs/Ro, x = ppm/1000; y= (Rs/Ro)*10:


El gráfico construido corresponde a la función:



Por lo tanto, el número de "loros" es reconocido por la fórmula:

Un poco sobre compensación de temperatura


Según el siguiente gráfico de la hoja de datos, se sabe que, según el entorno en el que se use el sensor, las lecturas se desvían de las reales:



Comentario sobre la humedad típica del entorno de medición.
, = 65%. RsRo/ppm ( ppm) RsRo/Temp ( ). Rs/Ro = 1 ppm=1000 20, : 33% 65%. . , , 33%. .

Para determinar con mayor precisión la dependencia de los indicadores del entorno, también se construyó un gráfico de funciones, el sensor está limitado a un rango de temperatura de -10 ° C ... +50 ° C (x = TEMP / 10; y = RsRo (error) * 100):


El gráfico corresponde a la función:

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



La base es un gráfico con una humedad del 33% (a juzgar por la intersección 1, es una calibración). Si presta atención a la humedad, el 1% de humedad desplaza el gráfico por 0.3 Y (en valores reales del ajuste, RsRo se dividirá entre 100; el coeficiente se usa en el gráfico para mayor claridad). "+25" cambia la posición del gráfico en Y para la humedad "cero", y "0.3 x HUM" devuelve la posición Y para la humedad real. Algunos cambios en el "peso" del 1% de humedad a temperaturas extremas tienen poca importancia y no se tienen en cuenta.

Nota importante: todo esto se aplica si la calibración se realiza en aire limpio a una humedad del 33% y una temperatura de 20 grados.

La fórmula puede calcular el valor de corrección RsRo (error), que deberá agregarse a los valores RsRo para compensar el impacto ambiental:


La tarea "con un asterisco" es aclarar la compensación durante la calibración en un entorno no estándar
, (20/33%), RsRo(error) :


Y – . X: . , , .

, , , .

, — .

Para calcular un valor ya compensado:


Transferimos la teoría al microcontrolador.


Para verificar el sensor, se utilizaron el microcontrolador STM32F407VET y la biblioteca HAL, los valores para la corrección se recibieron del sensor BME280. En el archivo de encabezado, definimos algunos valores constantes para nuestra configuración.

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; //     

Función de cálculo de ppm (sin correcciones)
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;
}


Función de cálculo de ppm con compensación de temperatura y humedad actuales
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;
 }


Función de cálculo de ppm (con compensación de temperatura / humedad y corrección para medio de calibración)
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;
 }


Valor de 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;
 }


Calibración
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;
 }


C Principal


#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;   //     
   }
}

Ejemplos de uso


Determinación del valor de ppm:


La función del cálculo de la compensación de temperatura (en este caso, a la misma humedad):


Corrección de valores durante la calibración en condiciones no estándar:


Conclusión


  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