Punktierung über Gassensoren der MQ-Serie - tiefes Verständnis des Datenblattes und der Abstimmung


Nach dem Kauf eines Penny-Gas-Lecksuchers bestand der Wunsch, alles in den Regalen zu zerlegen und herauszufinden, was im Inneren vor sich geht. Es gibt viele Informationen und Artikel zu Sensoren, aber die meisten beschränken sich auf die Pinbelegung des chinesischen Standardmoduls, manchmal auf die Funktionsprinzipien. Über relativ genaue Bestimmung der absoluten Werte der Informationen dort. Mit Blick auf die Zukunft werde ich sagen, dass wir versuchen werden, alles aus dem Datenblatt herauszuholen, einschließlich: der genauen Funktionen zur Bestimmung von „Papageien“, der Temperatur- und Feuchtigkeitskorrektur und einiger Auswahlmöglichkeiten.

Zum Beispiel ein Sensor für brennbare Gase (hauptsächlich Methan) MQ-4. Kurz gesagt, das Sensorelement ändert aufgrund seiner chemischen Eigenschaften den Widerstand bei verschiedenen Gaskonzentrationen und wirkt als Widerstand des Spannungsteilers, von dem wir den Spannungswert über den ADC erhalten. Diese Eigenschaften zeigen sich bei einer bestimmten Temperatur des Elements, für das der Sensor erwärmt werden muss.


Oben ist eine schematische Darstellung eines Sensors und einer Teilerschaltung dargestellt, wobei H eine Heizspule ist (33 Ohm - etwa 150 mA, Ströme sind zu groß für Fahrzeuge mit Steuerungen, dies muss beim Entwurf eines Stromkreises berücksichtigt werden). AV sind die Ausgänge eines empfindlichen Elements mit austauschbarem Widerstand in Abhängigkeit von der Gaskonzentration , RL ist der zweite im Datenblatt empfohlene Teilerwiderstand - 20 kOhm.

Kommentar zur Auswahl einer ADC-Referenzspannung (Vref)
Hanwei Vc = 5 , Winsen – Vc < 24 . , 3.3 , , . 5 .

Konvertieren Sie ADC in ppm


An den Ausgängen des ADC-Teilers nehmen wir den Spannungswert (Uadc), auf dessen Grundlage wir den Widerstand des Sensors Rs berechnen können (Kenntnis des Wertes des zweiten Widerstands des Teilers RL), d.h. Bestimmen Sie, was genau der Sensor an uns sendet:

Rs=(Vref×RL)/UadcRL


Mit dem Wert von Rs können wir bereits die Gaskonzentration gemäß der Grafik aus dem Datenblatt bestimmen. Ein einfaches Rs / Ro-Verhältnis wird verwendet, um die Konzentration zu bestimmen. Ro ist in diesem Fall der Widerstand des Sensorelements bei einer Detektionsgaskonzentration von 1000 ppm.

Kommentar zu den Startpunkten in den Berechnungen
,
«Ro: sensor resistance at 1000ppm of CH4 in the clean air»
, 1000 ppm. «» . , « » , , 1800 ppb ( 1.8 ppm, 1000 ppm). , 4.4 Rs/Ro.


Zu diesem Zeitpunkt kennen wir dank des ADC und der Formel nur den Wert des Stromwiderstands (Rs), von dem wir abstoßen werden. Wir gehen davon aus, dass wir es in sauberer (von detektierten Gasen) Luft bei einer Kalibrierungstemperatur und -feuchtigkeit gemessen haben (um 20 ° Datenblatt, 65%). Wenig später wird es einen interessanten Kommentar zur Luftfeuchtigkeit geben, bei der die Kalibrierung durchgeführt wird.

Somit ist der Referenzwert Ro für den MQ-4-Sensor:

Ro=Rs/4.4



Kommentar zur Rauchauswahl
, , Rs/Ro – 1.8…0.43, – 3.8…2.6. . , , «» . . RsRo 2.8, «» :



Die Berechnung der tatsächlichen Gaskonzentration ist durch die Krümmung des Diagramms und das Fehlen eindeutiger Kontrollpunkte, mit denen dieses Diagramm angepasst werden kann, etwas kompliziert. Das Problem liegt auch in der geringen Ausdehnung des Bildes, weshalb es notwendig ist, die Kontrollpunkte Pixel für Pixel zu bestimmen.

Zur Verdeutlichung der Berechnungen werden die offensichtlichsten Werte in einem Koordinatengitter angeordnet. Die Kontrollpunkte bestimmten die Funktion der Abhängigkeit von ppm von Rs / Ro:

Messgrenzen kommentieren
400…10000 ppm. (Winsen/Hanwei) 200 400 ppm, 400. ppm Rs/Ro, x = ppm/1000; y= (Rs/Ro)*10:


Der konstruierte Graph entspricht der Funktion:



Somit wird die Anzahl der "Papageien" durch die Formel erkannt:

Ein bisschen über Temperaturkompensation


Basierend auf dem folgenden Datenblattdiagramm ist bekannt, dass die Messwerte je nach Umgebung, in der der Sensor verwendet wird, von den tatsächlichen abweichen:



Kommentar zur typischen Luftfeuchtigkeit der Messumgebung
, = 65%. RsRo/ppm ( ppm) RsRo/Temp ( ). Rs/Ro = 1 ppm=1000 20, : 33% 65%. . , , 33%. .

Um die Abhängigkeit der Indikatoren von der Umgebung genauer zu bestimmen, wurde auch ein Funktionsdiagramm erstellt. Der Sensor ist auf einen Temperaturbereich von -10 ° C ... +50 ° C (x = TEMP / 10; y = RsRo (Fehler) * 100) begrenzt:


Die Grafik entspricht der Funktion:

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



Die Basis ist ein Diagramm mit einer Luftfeuchtigkeit von 33% (nach dem Schnittpunkt 1 ist es ein Kalibrierungsdiagramm). Wenn Sie auf die Luftfeuchtigkeit achten, verschiebt 1% Luftfeuchtigkeit das Diagramm um 0,3 Y (in realen Werten der Anpassung wird RsRo durch 100 geteilt - der Koeffizient wird im Diagramm zur Verdeutlichung verwendet). "+25" verschiebt die Diagrammposition in Y für "Null" Luftfeuchtigkeit, "0,3 x HUM" gibt die Y-Position für tatsächliche Luftfeuchtigkeit zurück. Eine gewisse Änderung des „Gewichts“ von 1% Luftfeuchtigkeit bei extremen Temperaturen ist von geringer Bedeutung und wird nicht berücksichtigt.

Wichtiger Hinweis: All dies gilt, wenn die Kalibrierung in sauberer Luft bei einer Luftfeuchtigkeit von 33% und einer Temperatur von 20 Grad durchgeführt wird.

Der Korrekturwert RsRo (Fehler), der zu den RsRo-Werten addiert werden muss, um die Umweltbelastung zu kompensieren, kann wie folgt berechnet werden:


Die Aufgabe "mit einem Sternchen" besteht darin, die Kompensation während der Kalibrierung in einer nicht standardmäßigen Umgebung zu klären
, (20/33%), RsRo(error) :


Y – . X: . , , .

, , , .

, — .

So berechnen Sie einen bereits kompensierten Wert:


Wir übertragen die Theorie auf den Mikrocontroller


Zum Testen des Sensors wurden der Mikrocontroller STM32F407VET und die HAL-Bibliothek verwendet, die Korrekturwerte wurden vom BME280-Sensor empfangen. In der Header-Datei definieren wir einige konstante Werte für unser Setup.

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-Berechnungsfunktion (keine Korrekturen)
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-Berechnungsfunktion mit Kompensation für aktuelle Temperatur und Luftfeuchtigkeit
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-Berechnungsfunktion (mit Temperatur- / Feuchtigkeitskompensation und Korrektur für Kalibriermedium)
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-Wert
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;
 }


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


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

Beispiele für die Verwendung


Bestimmung des ppm-Wertes:


Die Funktion der Berechnung der Temperaturkompensation (in diesem Fall bei gleicher Luftfeuchtigkeit):


Korrektur von Werten während der Kalibrierung unter nicht standardmäßigen Bedingungen:


Fazit


  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