diff --git a/lark1fq/main.c b/lark1fq/main.c index 18b2f9b..b5745a9 100755 --- a/lark1fq/main.c +++ b/lark1fq/main.c @@ -54,6 +54,9 @@ void system_init(void) ms5611_init(); calc_quadratic_fit_init(CALC_POINTS); led_det_temperature_init(); + for (int ch = 0; ch < 4; ch++) { + concentration_neg_drift_compensation_init(ch); + } } int main(void) diff --git a/lark1fq/src/cali.c b/lark1fq/src/cali.c index 47aa2b0..4407293 100755 --- a/lark1fq/src/cali.c +++ b/lark1fq/src/cali.c @@ -368,6 +368,8 @@ uint8_t cali_zero_activate(uint8_t ch) if (flag_cali_by_button == 0) { data_cali_flash.word_remain = CALI_FLASH_WORD_CNT; } + /* reset negative drift compensation to default state */ + concentration_neg_drift_compensation_init(ch); return 0; } diff --git a/lark1fq/src/concentration.c b/lark1fq/src/concentration.c index 5c300a5..d6abe74 100755 --- a/lark1fq/src/concentration.c +++ b/lark1fq/src/concentration.c @@ -4,6 +4,7 @@ #include "concentration.h" struct data_lookup_table_s data_lookup_table[4] __attribute__((section(".bss_ccm"))); +struct neg_drift_comp_s neg_drift_comp[4]; /* copy data from bitmap in flash to calc area */ void concentration_lookup_table_copy(uint8_t ch) @@ -38,47 +39,53 @@ void concentration_init(void) } } +void concentration_neg_drift_compensation_init(uint8_t ch) +{ + if (ch >= 4) { + return; + } + neg_drift_comp[ch].drift_update_enable = 1; + neg_drift_comp[ch].neg_reading_num = 0; + neg_drift_comp[ch].neg_fixed_num = 0; + neg_drift_comp[ch].neg_reading_sum = 0; + neg_drift_comp[ch].zero_neg_drift = 0; + neg_drift_comp[ch].reading_fixed = 0; +} + int32_t concentration_neg_drift_compensation(uint8_t ch, int32_t reading) { - static uint8_t drift_update_enable[4] = {1, 1, 1, 1}; - static uint8_t neg_reading_num[4] = {0, 0, 0, 0}; - static int32_t neg_reading_sum[4] = {0, 0, 0, 0}; - static int32_t zero_neg_drift[4] = {0, 0, 0, 0}; - static int32_t reading_fixed[4] = {0, 0, 0, 0}; - static uint8_t neg_fixed_num[4] = {0, 0, 0, 0}; - - reading_fixed[ch] = reading; + neg_drift_comp[ch].reading_fixed = reading; - if(drift_update_enable[ch]) { + if(neg_drift_comp[ch].drift_update_enable) { if (reading < 0) { - neg_reading_sum[ch] += reading; - neg_reading_num[ch] ++; - reading_fixed[ch] = 0; - if(neg_reading_num[ch] >= 10) { - zero_neg_drift[ch] = neg_reading_sum[ch] / neg_reading_num[ch]; - drift_update_enable[ch] = 0; - neg_reading_num[ch] = 0; - neg_reading_sum[ch] = 0; + neg_drift_comp[ch].neg_reading_sum += reading; + neg_drift_comp[ch].neg_reading_num++; + neg_drift_comp[ch].reading_fixed = 0; + if(neg_drift_comp[ch].neg_reading_num >= 10) { + neg_drift_comp[ch].zero_neg_drift = neg_drift_comp[ch].neg_reading_sum / neg_drift_comp[ch].neg_reading_num; + neg_drift_comp[ch].drift_update_enable = 0; + neg_drift_comp[ch].neg_reading_num = 0; + neg_drift_comp[ch].neg_reading_sum = 0; } } else { - neg_reading_num[ch] = 0; - neg_reading_sum[ch] = 0; + neg_drift_comp[ch].neg_reading_num = 0; + neg_drift_comp[ch].neg_reading_sum = 0; } } - if (zero_neg_drift[ch]) { - reading_fixed[ch] = reading - zero_neg_drift[ch]; - if (reading_fixed[ch] < 0) { - neg_fixed_num[ch]++; - if (neg_fixed_num[ch] >= 10) { - drift_update_enable[ch] = 1; - neg_fixed_num[ch] = 0; + if (neg_drift_comp[ch].zero_neg_drift) { + neg_drift_comp[ch].reading_fixed = reading - neg_drift_comp[ch].zero_neg_drift; + if (neg_drift_comp[ch].reading_fixed < 0) { + neg_drift_comp[ch].neg_fixed_num++; + if (neg_drift_comp[ch].neg_fixed_num >= 10) { + neg_drift_comp[ch].drift_update_enable = 1; + neg_drift_comp[ch].neg_fixed_num = 0; } } else { - neg_fixed_num[ch] = 0; + neg_drift_comp[ch].neg_fixed_num = 0; } } - return ((reading_fixed[ch] > 0) ? reading_fixed[ch] : 0); + return ((neg_drift_comp[ch].reading_fixed > 0) ? neg_drift_comp[ch].reading_fixed : 0); } int32_t concentration_calc(uint8_t ch) diff --git a/lark1fq/src/concentration.h b/lark1fq/src/concentration.h index c3c945a..6fb9c4f 100755 --- a/lark1fq/src/concentration.h +++ b/lark1fq/src/concentration.h @@ -21,10 +21,20 @@ struct data_lookup_table_s { float calc_b[LOOKUP_TABLE_CONCENTRATION_POINTS_MAX]; }; +struct neg_drift_comp_s { + uint8_t drift_update_enable; + uint8_t neg_reading_num; + uint8_t neg_fixed_num; + int32_t neg_reading_sum; + int32_t zero_neg_drift; + int32_t reading_fixed; +}; + extern struct data_lookup_table_s data_lookup_table[4]; void concentration_lookup_table_copy(uint8_t ch); void concentration_init(void); +void concentration_neg_drift_compensation_init(uint8_t ch); int32_t concentration_neg_drift_compensation(uint8_t ch, int32_t reading); int32_t concentration_calc(uint8_t ch); void concentration_loop(void);