Mengotori sensor gas Seri MQ - pemahaman mendalam tentang lembar data dan penyetelan


Setelah membeli detektor kebocoran gas sen, ada keinginan untuk membongkar semua yang ada di rak dan mencari tahu apa yang terjadi di dalam. Ada banyak informasi dan artikel tentang sensor, tetapi sebagian besar terbatas pada pinout dari modul standar Cina, kadang-kadang prinsip-prinsip operasi. Tentang penentuan nilai absolut yang relatif akurat dari informasi di sana. Ke depan, saya akan mengatakan bahwa kami akan mencoba untuk memeras segala sesuatu dari lembar data, termasuk: fungsi yang tepat untuk menentukan "burung beo", koreksi suhu dan kelembaban, dan beberapa kemungkinan pilihan.

Misalnya, sensor gas yang mudah terbakar (terutama metana) MQ-4. Singkatnya, elemen sensor, karena sifat kimianya, mengubah resistensi pada konsentrasi gas yang berbeda, dan bertindak sebagai resistor pembagi tegangan yang darinya kita mendapatkan nilai tegangan melalui ADC. Sifat-sifat ini dimanifestasikan pada suhu tertentu dari elemen di mana sensor harus dipanaskan.


Di atas adalah representasi skematik dari sensor dan sirkuit pembagi, di mana H adalah koil pemanas (33 Ohm - sekitar 150 mA, arus terlalu besar untuk kerajinan dengan pengontrol, harus diperhitungkan saat merancang rangkaian daya), AV adalah output dari elemen sensitif dengan resistansi yang dapat dipertukarkan tergantung pada konsentrasi gas , RL adalah resistor pembagi kedua yang direkomendasikan oleh datasheet - 20 kOhm.

Komentar untuk memilih tegangan referensi ADC (Vref)
Hanwei Vc = 5 , Winsen – Vc < 24 . , 3.3 , , . 5 .

Ubah ADC ke ppm


Pada output pembagi ADC, kita mengambil nilai tegangan (Uadc) berdasarkan yang kita dapat menghitung resistansi sensor Rs (mengetahui nilai resistor kedua pembagi RL), yaitu. tentukan apa yang sebenarnya ditransmisikan sensor kepada kami:

Rs=(Vref×RL)/UadcRL


Dengan nilai Rs, kita sudah dapat menentukan konsentrasi gas sesuai dengan grafik dari lembar data. Rs / Ro rasio sederhana digunakan untuk menentukan konsentrasi. Ro dalam hal ini adalah resistansi elemen sensor pada konsentrasi gas deteksi 1000 ppm.

Komentar tentang titik awal dalam perhitungan
,
«Ro: sensor resistance at 1000ppm of CH4 in the clean air»
, 1000 ppm. «» . , « » , , 1800 ppb ( 1.8 ppm, 1000 ppm). , 4.4 Rs/Ro.


Pada tahap ini, berkat ADC dan formula, kita hanya tahu nilai resistance saat ini (Rs) dari mana kita akan menolak. Kami berasumsi bahwa kami mengukurnya di udara bersih (dari gas yang terdeteksi), pada suhu dan kelembaban kalibrasi (pada 20 lembar data, 65%). Beberapa saat kemudian akan ada komentar yang menarik tentang kelembaban di mana kalibrasi dilakukan.

Dengan demikian, nilai referensi Ro untuk sensor MQ-4 adalah:

Ro=Rs/4.4



Mengomentari pilihan asap
, , Rs/Ro – 1.8…0.43, – 3.8…2.6. . , , «» . . RsRo 2.8, «» :



Perhitungan konsentrasi gas aktual sedikit rumit oleh kelengkungan grafik, dan tidak adanya titik kontrol yang berbeda di mana grafik ini dapat disesuaikan. Juga, masalahnya adalah ekspansi rendah dari gambar, karena itu perlu untuk menentukan titik kontrol piksel demi piksel.

Untuk memperjelas perhitungan, nilai-nilai yang paling jelas ditempatkan pada kotak koordinat. Poin kontrol menentukan fungsi ketergantungan ppm pada Rs / Ro:

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


Grafik yang dibangun sesuai dengan fungsi:



Dengan demikian, jumlah "parrot" dikenali oleh rumus:

Sedikit tentang kompensasi suhu


Berdasarkan grafik lembar data berikut, diketahui bahwa, tergantung pada lingkungan di mana sensor digunakan, bacaan menyimpang dari yang sebenarnya:



Komentar tentang kelembaban khas lingkungan pengukuran
, = 65%. RsRo/ppm ( ppm) RsRo/Temp ( ). Rs/Ro = 1 ppm=1000 20, : 33% 65%. . , , 33%. .

Untuk lebih akurat menentukan ketergantungan indikator pada lingkungan, grafik fungsi juga dibuat, sensor dibatasi pada kisaran suhu -10 ° C ... +50 ° C (x = TEMP / 10; y = RsRo (kesalahan) * 100):


Grafik sesuai dengan fungsi:

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



Basis adalah grafik dengan kelembaban 33% (itu, dilihat dari persimpangan 1, adalah kalibrasi satu). Jika Anda memperhatikan kelembaban, maka kelembaban 1% menggeser grafik sebesar 0,3 Y (nilai riil penyesuaian RsRo akan dibagi dengan 100 - koefisien digunakan dalam grafik untuk kejelasan). "+25" menggeser posisi grafik di Y untuk kelembaban "nol"; "0,3 x HUM" mengembalikan posisi Y untuk kelembaban yang sebenarnya. Beberapa perubahan dalam "berat" kelembaban 1% pada suhu ekstrem tidak begitu penting dan tidak diperhitungkan.

Catatan penting: semua ini berlaku jika kalibrasi dilakukan di udara bersih pada kelembaban 33% dan suhu 20 derajat.

Nilai koreksi RsRo (kesalahan), yang perlu ditambahkan ke nilai RsRo untuk mengkompensasi dampak lingkungan, dapat dihitung dengan rumus:


Tugas "dengan tanda bintang" adalah untuk mengklarifikasi kompensasi selama kalibrasi di lingkungan yang tidak standar
, (20/33%), RsRo(error) :


Y – . X: . , , .

, , , .

, — .

Untuk menghitung nilai yang sudah dikompensasi:


Kami mentransfer teorinya ke mikrokontroler


Untuk memeriksa sensor, mikrokontroler STM32F407VET dan perpustakaan HAL digunakan, nilai untuk koreksi diterima dari sensor BME280. Di file header, kami menetapkan beberapa nilai konstan untuk pengaturan kami.

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

Fungsi perhitungan Ppm (tidak ada koreksi)
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;
}


Fungsi perhitungan Ppm dengan kompensasi untuk suhu dan kelembaban saat ini
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;
 }


Fungsi perhitungan Ppm (dengan kompensasi suhu / kelembaban dan koreksi untuk media kalibrasi)
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;
 }


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


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

Contoh penggunaan


Menentukan nilai ppm:


Fungsi perhitungan kompensasi suhu (dalam hal ini, pada kelembaban yang sama):


Koreksi nilai selama kalibrasi dalam kondisi non-standar:


Kesimpulan


  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