基于STM32的学习记录--MQ系列计算公式
所有的MQ系列传感器都需要一定的预热时间进行一个精度的校准
MQ-2
定义
//R2-1K. #define SMOG_PIN46_R 1000 //烟雾传感器管脚4、6接出到地的电阻值 #define SMOG_READ_TIMES 10 //定义烟雾传感器读取次数,读这么多次,然后取平均值
计算
//读取烟雾传感器的电压值 u16 Smog_Get_Vol(void) { u32 temp_val=0; u8 t; for(t=0;t<SMOG_READ_TIMES;t++) { temp_val+=Get_Adc2(SMOG_ADC_CHX); //读取ADC值 delay_ms(5); } temp_val/=SMOG_READ_TIMES;//得到平均值 printf("Smog_ADC_Val:%d ", temp_val); return (u16)temp_val; } //分析从烟雾传感器获取的电压值,通过公式计算出可燃气体的浓度值 //设Rs为传感器的体电阻,其中气体浓度上升,将导致Rs下降。而Rs的下降则会导致,MQ-2的4脚、6脚对地输出的电压增大。 //所以气体浓度增大,其输出的电压也会增大。因Rs在不同气体中有不同的浓度值,所以该函数仅作为参考. u16 Smog_Trans_Concentration(void) { u16 ulVal = 0; u16 temp_val = Smog_Get_Vol(); u16 Rs; Rs = SMOG_PIN46_R*(4096.0/temp_val - 1); printf("Smog_Rs_Val:%d ", Rs); ulVal = Rs;//这里填写公式根据Rs计算气体浓度 return ulVal; }
MQ-4
定义
#define MAX_CONVERTED_VALUE 4095 /* Max converted value */ #define VREF 3300
公式
float MQ4_Get_Vol(void) { u32 temp_val=0; u8 t; for(t=0;t<SMOG_READ_TIMES;t++) { temp_val+=ADC_ConvertedValue[1]; //读取ADC值 Delay_ms(SMOG_READ_TIMES); } temp_val/=5;//得到平均值 return (u16)temp_val; } u16 MQ_4_Value(void) { u16 ppm = 0; u16 temp = MQ4_Get_Vol(); printf("%d ",temp); ppm =temp*VREF/MAX_CONVERTED_VALUE ; return ppm; }
MQ-7
定义
#define CAL_PPM 10 // 校准环境中PPM值 #define RL 10 // RL阻值
公式
static float R0; // 传感器校准函数 void MQ7_PPM_Calibration(float RS) { R0 = RS / pow(CAL_PPM / 98.322, 1 / -1.458f); } // 获取传感器的值 float MQ7_GetPPM(void) { float Vrl = 3.3f * ADC_ConvertedValue[3]/ 4095.f; float RS = (3.3f - Vrl) / Vrl * RL; MQ7_PPM_Calibration(RS); float ppm = 98.322f * pow(RS/R0, -1.458f); return ppm; }
MQ-135
定义
#define MAX_CONVERTED_VALUE 4095 /* Max converted value */ #define VREF 3300
公式
//读取MQ-135传感器的电压值 float MQ135_Get_Vol(void) { u32 temp_val=0; u8 t; for(t=0;t<SMOG_READ_TIMES;t++) { temp_val+=ADC_ConvertedValue[2]; //读取ADC值 Delay_ms(SMOG_READ_TIMES); } temp_val/=5;//得到平均值 return (u16)temp_val; } u16 MQ_135_Value(void) { u16 ppm = 0; u16 temp = MQ135_Get_Vol(); printf("%d ",temp); ppm =temp*3300/4095 ; return ppm; }
上一篇:
通过多线程提高代码的执行效率例子