[feat] reset negative drift compensation to default state
This commit is contained in:
parent
446efeb248
commit
3c012583b3
@ -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)
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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};
|
||||
neg_drift_comp[ch].reading_fixed = reading;
|
||||
|
||||
reading_fixed[ch] = 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)
|
||||
|
||||
@ -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);
|
||||
|
||||
Loading…
Reference in New Issue
Block a user