[feat] reset negative drift compensation to default state

This commit is contained in:
zhji 2025-07-07 20:40:33 +08:00
parent 446efeb248
commit 3c012583b3
4 changed files with 50 additions and 28 deletions

View File

@ -54,6 +54,9 @@ void system_init(void)
ms5611_init(); ms5611_init();
calc_quadratic_fit_init(CALC_POINTS); calc_quadratic_fit_init(CALC_POINTS);
led_det_temperature_init(); led_det_temperature_init();
for (int ch = 0; ch < 4; ch++) {
concentration_neg_drift_compensation_init(ch);
}
} }
int main(void) int main(void)

View File

@ -368,6 +368,8 @@ uint8_t cali_zero_activate(uint8_t ch)
if (flag_cali_by_button == 0) { if (flag_cali_by_button == 0) {
data_cali_flash.word_remain = CALI_FLASH_WORD_CNT; data_cali_flash.word_remain = CALI_FLASH_WORD_CNT;
} }
/* reset negative drift compensation to default state */
concentration_neg_drift_compensation_init(ch);
return 0; return 0;
} }

View File

@ -4,6 +4,7 @@
#include "concentration.h" #include "concentration.h"
struct data_lookup_table_s data_lookup_table[4] __attribute__((section(".bss_ccm"))); 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 */ /* copy data from bitmap in flash to calc area */
void concentration_lookup_table_copy(uint8_t ch) 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) int32_t concentration_neg_drift_compensation(uint8_t ch, int32_t reading)
{ {
static uint8_t drift_update_enable[4] = {1, 1, 1, 1}; neg_drift_comp[ch].reading_fixed = reading;
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;
if(drift_update_enable[ch]) { if(neg_drift_comp[ch].drift_update_enable) {
if (reading < 0) { if (reading < 0) {
neg_reading_sum[ch] += reading; neg_drift_comp[ch].neg_reading_sum += reading;
neg_reading_num[ch] ++; neg_drift_comp[ch].neg_reading_num++;
reading_fixed[ch] = 0; neg_drift_comp[ch].reading_fixed = 0;
if(neg_reading_num[ch] >= 10) { if(neg_drift_comp[ch].neg_reading_num >= 10) {
zero_neg_drift[ch] = neg_reading_sum[ch] / neg_reading_num[ch]; neg_drift_comp[ch].zero_neg_drift = neg_drift_comp[ch].neg_reading_sum / neg_drift_comp[ch].neg_reading_num;
drift_update_enable[ch] = 0; neg_drift_comp[ch].drift_update_enable = 0;
neg_reading_num[ch] = 0; neg_drift_comp[ch].neg_reading_num = 0;
neg_reading_sum[ch] = 0; neg_drift_comp[ch].neg_reading_sum = 0;
} }
} else { } else {
neg_reading_num[ch] = 0; neg_drift_comp[ch].neg_reading_num = 0;
neg_reading_sum[ch] = 0; neg_drift_comp[ch].neg_reading_sum = 0;
} }
} }
if (zero_neg_drift[ch]) { if (neg_drift_comp[ch].zero_neg_drift) {
reading_fixed[ch] = reading - zero_neg_drift[ch]; neg_drift_comp[ch].reading_fixed = reading - neg_drift_comp[ch].zero_neg_drift;
if (reading_fixed[ch] < 0) { if (neg_drift_comp[ch].reading_fixed < 0) {
neg_fixed_num[ch]++; neg_drift_comp[ch].neg_fixed_num++;
if (neg_fixed_num[ch] >= 10) { if (neg_drift_comp[ch].neg_fixed_num >= 10) {
drift_update_enable[ch] = 1; neg_drift_comp[ch].drift_update_enable = 1;
neg_fixed_num[ch] = 0; neg_drift_comp[ch].neg_fixed_num = 0;
} }
} else { } 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) int32_t concentration_calc(uint8_t ch)

View File

@ -21,10 +21,20 @@ struct data_lookup_table_s {
float calc_b[LOOKUP_TABLE_CONCENTRATION_POINTS_MAX]; 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]; extern struct data_lookup_table_s data_lookup_table[4];
void concentration_lookup_table_copy(uint8_t ch); void concentration_lookup_table_copy(uint8_t ch);
void concentration_init(void); 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_neg_drift_compensation(uint8_t ch, int32_t reading);
int32_t concentration_calc(uint8_t ch); int32_t concentration_calc(uint8_t ch);
void concentration_loop(void); void concentration_loop(void);