Pointillé sur les capteurs de gaz de la série MQ - compréhension approfondie de la fiche technique et du réglage


Après avoir acheté un détecteur de fuite de gaz, il y avait un désir de tout démonter sur les étagères et de savoir ce qui se passe à l'intérieur. Il y a beaucoup d'informations et d'articles sur les capteurs, mais la plupart se limitent au brochage du module chinois standard, parfois aux principes de fonctionnement. À propos de la détermination relativement précise des valeurs absolues des informations. À l'avenir, je dirai que nous allons essayer de tout extraire de la fiche technique, y compris: les fonctions exactes de détermination des "perroquets", la correction de la température et de l'humidité et certaines possibilités de sélection.

Par exemple, un capteur de gaz combustible (principalement du méthane) MQ-4. En bref, l'élément capteur, en raison de ses propriétés chimiques, change de résistance à différentes concentrations de gaz et agit comme une résistance du diviseur de tension dont nous obtenons la valeur de tension via l'ADC. Ces propriétés se manifestent à une certaine température de l'élément pour lequel le capteur doit être chauffé.


Ci-dessus est une représentation schématique d'un capteur et d'un circuit diviseur, où H est une bobine de chauffage (33 Ohms - environ 150 mA, les courants sont trop importants pour les bateaux équipés de contrôleurs, il doit être pris en compte lors de la conception d'un circuit de puissance), AV sont les sorties d'un élément sensible à résistance interchangeable en fonction de la concentration de gaz , RL est la deuxième résistance de diviseur recommandée par la fiche technique - 20 kOhm.

Commentaire sur le choix d'une tension de référence ADC (Vref)
Hanwei Vc = 5 , Winsen – Vc < 24 . , 3.3 , , . 5 .

Convertir ADC en ppm


Aux sorties du diviseur ADC, nous prenons la valeur de tension (Uadc) sur la base de laquelle nous pouvons calculer la résistance du capteur Rs (connaissant la valeur de la deuxième résistance du diviseur RL), c'est-à-dire déterminer exactement ce que le capteur nous transmet:

Rs=(Vref×RL)/UadcRL


Avec la valeur de Rs, nous pouvons déjà déterminer la concentration de gaz selon le graphique de la fiche technique. Un simple rapport Rs / Ro est utilisé pour déterminer la concentration. Ro dans ce cas est la résistance de l'élément capteur à une concentration de gaz de détection de 1000 ppm.

Commentaire sur les points de départ dans les calculs
,
«Ro: sensor resistance at 1000ppm of CH4 in the clean air»
, 1000 ppm. «» . , « » , , 1800 ppb ( 1.8 ppm, 1000 ppm). , 4.4 Rs/Ro.


A ce stade, grâce à l'ADC et à la formule, on ne connaît que la valeur de la résistance de courant (Rs) dont on va se repousser. Nous supposerons que nous l'avons mesuré dans de l'air propre (à partir de gaz détectés), à la température et à l'humidité d'étalonnage (par fiche technique 20C, 65%). Un peu plus tard, il y aura un commentaire intéressant sur l'humidité à laquelle l'étalonnage est effectué.

Ainsi, la valeur de référence Ro pour le capteur MQ-4 est:

Ro=Rs/4.4



Commentaire sur la sélection de fumée
, , Rs/Ro – 1.8…0.43, – 3.8…2.6. . , , «» . . RsRo 2.8, «» :



Le calcul de la concentration réelle de gaz est un peu compliqué par la courbure du graphique et le manque de points de contrôle distincts permettant d'ajuster ce graphique. De plus, le problème réside dans la faible expansion de l'image, à cause de laquelle il est nécessaire de déterminer les points de contrôle pixel par pixel.

Pour clarifier les calculs, les valeurs les plus évidentes sont espacées sur une grille de coordonnées. Les points de contrôle ont déterminé la fonction de la dépendance de ppm à Rs / Ro:

Commentaire sur les limites de mesure
400…10000 ppm. (Winsen/Hanwei) 200 400 ppm, 400. ppm Rs/Ro, x = ppm/1000; y= (Rs/Ro)*10:


Le graphique construit correspond à la fonction:



Ainsi, le nombre de "perroquets" est reconnu par la formule:

Un peu sur la compensation de température


Sur la base du graphique de la fiche technique suivante, il est connu que, selon l'environnement dans lequel le capteur est utilisé, les lectures s'écartent des valeurs réelles:



Commentaire sur l'humidité typique de l'environnement de mesure
, = 65%. RsRo/ppm ( ppm) RsRo/Temp ( ). Rs/Ro = 1 ppm=1000 20, : 33% 65%. . , , 33%. .

Pour déterminer plus précisément la dépendance des indicateurs vis-à-vis de l'environnement, un graphique de fonction a également été construit, le capteur est limité à une plage de température de -10 ° C ... + 50 ° C (x = TEMP / 10; y = RsRo (erreur) * 100):


Le graphique correspond à la fonction:

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



La base est un graphique avec une humidité de 33% (il, à en juger par l'intersection 1, est un étalonnage). Si vous faites attention à l'humidité, 1% d'humidité décale le graphique de 0,3 Y (en valeurs réelles de l'ajustement, RsRo sera divisé par 100 - le coefficient est utilisé dans le graphique pour plus de clarté). «+25» décale la position du graphique en Y pour une humidité «nulle», «0,3 x HUM» renvoie la position Y pour une humidité réelle. Certains changements dans le «poids» de 1% d'humidité à des températures extrêmes ont peu d'importance et ne sont pas pris en compte.

Remarque importante: tout cela s'applique si l'étalonnage est effectué à l'air propre à une humidité de 33% et une température de 20 degrés.

La valeur de correction RsRo (erreur), qui devra être ajoutée aux valeurs RsRo pour compenser l'impact environnemental, peut être calculée par la formule:


La tâche "avec un astérisque" est de clarifier la compensation lors de l'étalonnage dans un environnement non standard
, (20/33%), RsRo(error) :


Y – . X: . , , .

, , , .

, — .

Pour calculer une valeur déjà compensée:


Nous transférons la théorie au microcontrôleur


Pour tester le capteur, le microcontrôleur STM32F407VET et la bibliothèque HAL ont été utilisés, les valeurs de correction ont été reçues du capteur BME280. Dans le fichier d'en-tête, nous définissons des valeurs constantes pour notre configuration.

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

Fonction de calcul de Ppm (pas de corrections)
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;
}


Fonction de calcul du Ppm avec compensation de la température et de l'humidité actuelles
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;
 }


Fonction de calcul du Ppm (avec compensation température / humidité et correction pour le milieu d'étalonnage)
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;
 }


Valeur 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;
 }


Étalonnage
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;
 }


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

Exemples d'utilisation


Déterminer la valeur ppm:


La fonction du calcul de la compensation de température (dans ce cas, à la même humidité):


Correction des valeurs lors de l'étalonnage dans des conditions non standard:


Conclusion


  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