购买一分钱的气体泄漏检测仪后,人们希望将架子上的所有东西都拆下来,找出里面发生了什么。关于传感器的信息和文章很多,但大多数仅限于标准中文模块的引脚排列,有时还包括操作原理。关于相对准确地确定那里的信息的绝对值。展望未来,我要说的是,我们将尝试从数据表中挤出所有内容,包括:确定“鹦鹉”的确切功能,温度和湿度校正以及一些选择的可能性。例如,可燃气体传感器(主要是甲烷)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.