From 870a83d684ea984ef582287b6a58323452d01a31 Mon Sep 17 00:00:00 2001 From: zhji Date: Sat, 20 Apr 2024 20:40:11 +0800 Subject: [PATCH] [fix] modify output value from sum to pp --- lark1fq/src/debug.h | 12 +++---- lark1fq/src/filter.c | 45 +------------------------- lark1fq/src/filter.h | 19 +++-------- lark1fq/src/ltc1867.c | 73 +++++++++---------------------------------- lark1fq/src/ltc1867.h | 4 ++- 5 files changed, 28 insertions(+), 125 deletions(-) diff --git a/lark1fq/src/debug.h b/lark1fq/src/debug.h index 61504b2..4168ab1 100755 --- a/lark1fq/src/debug.h +++ b/lark1fq/src/debug.h @@ -14,13 +14,11 @@ #define DEBUG_UART_BAUDRATE (2 * 1000 * 1000) #define DEBUG_CH_RAW (0 * 4) -#define DEBUG_CH_SUM_1 (1 * 4) -#define DEBUG_CH_SUM_2 (2 * 4) -#define DEBUG_CH_MEDIAN (3 * 4) -#define DEBUG_CH_WINDOW (4 * 4) -#define DEBUG_CH_ADC_RAW (5 * 4) -#define DEBUG_CH_ADC_FILTER (6 * 4) -#define DEBUG_CHAN_MAX (7 * 4) +#define DEBUG_CH_MEDIAN (1 * 4) +#define DEBUG_CH_WINDOW (2 * 4) +#define DEBUG_CH_ADC_RAW (3 * 4) +#define DEBUG_CH_ADC_FILTER (4 * 4) +#define DEBUG_CHAN_MAX (5 * 4) struct debug_data_s { uint8_t enable; diff --git a/lark1fq/src/filter.c b/lark1fq/src/filter.c index 42e9eff..43ad42c 100755 --- a/lark1fq/src/filter.c +++ b/lark1fq/src/filter.c @@ -4,10 +4,6 @@ #include "debug.h" #include "user_misc.h" -static uint32_t sum_gas1[FILTER_SUM_LEN_GAS1] __attribute__((section(".bss_ccm"))); -static uint32_t sum_gas2[FILTER_SUM_LEN_GAS2] __attribute__((section(".bss_ccm"))); -static uint32_t sum_gas3[FILTER_SUM_LEN_GAS3] __attribute__((section(".bss_ccm"))); -static uint32_t sum_gas4[FILTER_SUM_LEN_GAS4] __attribute__((section(".bss_ccm"))); static struct list_s median_gas1[FILTER_MEDIAN_LEN_GAS1] __attribute__((section(".bss_ccm"))); static struct list_s median_gas2[FILTER_MEDIAN_LEN_GAS2] __attribute__((section(".bss_ccm"))); static struct list_s median_gas3[FILTER_MEDIAN_LEN_GAS3] __attribute__((section(".bss_ccm"))); @@ -22,26 +18,18 @@ struct data_filter_s data_filter[4] __attribute__((section(".bss_ccm"))); void filter_init(void) { /* data_filter parameter init */ - data_filter[0].sum_len = FILTER_SUM_LEN_GAS1; - data_filter[0].sum_buff = sum_gas1; data_filter[0].median_len = FILTER_MEDIAN_LEN_GAS1; data_filter[0].median_buff = median_gas1; data_filter[0].window_len = FILTER_WINDOW_LEN_GAS1; data_filter[0].window_buff = window_gas1; - data_filter[1].sum_len = FILTER_SUM_LEN_GAS2; - data_filter[1].sum_buff = sum_gas2; data_filter[1].median_len = FILTER_MEDIAN_LEN_GAS2; data_filter[1].median_buff = median_gas2; data_filter[1].window_len = FILTER_WINDOW_LEN_GAS2; data_filter[1].window_buff = window_gas2; - data_filter[2].sum_len = FILTER_SUM_LEN_GAS3; - data_filter[2].sum_buff = sum_gas3; data_filter[2].median_len = FILTER_MEDIAN_LEN_GAS3; data_filter[2].median_buff = median_gas3; data_filter[2].window_len = FILTER_WINDOW_LEN_GAS3; data_filter[2].window_buff = window_gas3; - data_filter[3].sum_len = FILTER_SUM_LEN_GAS4; - data_filter[3].sum_buff = sum_gas4; data_filter[3].median_len = FILTER_MEDIAN_LEN_GAS4; data_filter[3].median_buff = median_gas4; data_filter[3].window_len = FILTER_WINDOW_LEN_GAS4; @@ -50,14 +38,6 @@ void filter_init(void) for (uint8_t i = 0; i < 4; i++) { uint16_t len; - /* sum filter init */ - len = data_filter[i].sum_len; - for (uint16_t j = 0; j < len; j++) { - data_filter[i].sum_buff[j] = 0; - } - data_filter[i].sum_sum = 0; - data_filter[i].sum_idx = 0; - /* media filter init */ data_filter[i].median_idx = 0; len = data_filter[i].median_len; @@ -96,28 +76,6 @@ void filter_input_data(uint8_t channel, uint32_t data) data_filter[channel].input = data; } -void filter_sum_process(void) -{ - uint32_t sum, val; - uint16_t idx; - - for (uint8_t i = 0; i < 4; i++) { - idx = data_filter[i].sum_idx; - sum = data_filter[i].sum_sum; - val = data_filter[i].input; - debug_write_data(DEBUG_CH_SUM_1 + i, (float)val); - sum = sum - data_filter[i].sum_buff[idx]; - data_filter[i].sum_buff[idx] = val; - sum = sum + val; - data_filter[i].sum_sum = sum; - debug_write_data(DEBUG_CH_SUM_2 + i, (float)(data_filter[i].sum_sum)); - data_filter[i].sum_idx++; - if (data_filter[i].sum_idx >= data_filter[i].sum_len) { - data_filter[i].sum_idx = 0; - } - } -} - void filter_median_process(void) { struct list_s *list, *iter; @@ -131,7 +89,7 @@ void filter_median_process(void) list->prev->next = list->next; /* connect prev to next */ list->next->prev = list->prev; /* connect next to prev */ /* add new node */ - data = data_filter[i].sum_sum; + data = data_filter[i].input; data_filter[i].median_buff[idx].data = data; len = data_filter[i].median_len + 1; data_filter[i].head.data = 0xFFFFFFFF; @@ -207,7 +165,6 @@ void filter_loop(void) return; } flag.filter = data_ltc1867.calc_flag; - filter_sum_process(); filter_median_process(); filter_window_process(); filter_output_process(); diff --git a/lark1fq/src/filter.h b/lark1fq/src/filter.h index 1c91fa9..b7178ed 100755 --- a/lark1fq/src/filter.h +++ b/lark1fq/src/filter.h @@ -7,15 +7,10 @@ #include "stm32f4xx.h" -#define FILTER_SUM_LEN_GAS1 (8 * 2) -#define FILTER_SUM_LEN_GAS2 (8 * 2) -#define FILTER_SUM_LEN_GAS3 (8 * 2) -#define FILTER_SUM_LEN_GAS4 (8 * 2) - -#define FILTER_MEDIAN_LEN_GAS1 (128) -#define FILTER_MEDIAN_LEN_GAS2 (64) -#define FILTER_MEDIAN_LEN_GAS3 (64) -#define FILTER_MEDIAN_LEN_GAS4 (64) +#define FILTER_MEDIAN_LEN_GAS1 (2048) +#define FILTER_MEDIAN_LEN_GAS2 (256) +#define FILTER_MEDIAN_LEN_GAS3 (256) +#define FILTER_MEDIAN_LEN_GAS4 (256) #define FILTER_WINDOW_LEN_GAS1 (256) #define FILTER_WINDOW_LEN_GAS2 (32) @@ -31,11 +26,6 @@ struct list_s { struct data_filter_s { uint32_t input; - uint16_t sum_len; - uint16_t sum_idx; - uint32_t *sum_buff; - uint32_t sum_sum; - uint16_t median_len; uint16_t median_idx; struct list_s head; @@ -51,7 +41,6 @@ struct data_filter_s { extern void filter_init(void); extern void filter_input_data(uint8_t channel, uint32_t data); -extern void filter_sum_process(void); extern void filter_median_process(void); extern void filter_window_process(void); extern void filter_output_process(void); diff --git a/lark1fq/src/ltc1867.c b/lark1fq/src/ltc1867.c index aad2c42..312a025 100755 --- a/lark1fq/src/ltc1867.c +++ b/lark1fq/src/ltc1867.c @@ -101,10 +101,6 @@ void ltc1867_init(void) ltc1867_transfer(ltc1867_spi_data[LTC1867_CH_CNT - 1]); /* data_ltc1867 init */ - data_ltc1867.sum[0] = 0; /* store temporary sum of half period sum */ - data_ltc1867.sum[1] = 0; - data_ltc1867.sum[2] = 0; - data_ltc1867.sum[3] = 0; data_ltc1867.calc_flag = 0; /* half period complete, need calc */ data_ltc1867.ledir_cnt = 0; /* index of led count, for togglr IR led */ data_ltc1867.val_idx = 0; /* index of value in half period, for sum */ @@ -176,6 +172,7 @@ uint16_t ltc1867_transfer(uint16_t data_send) void TIM2_IRQHandler(void) { uint16_t val[LTC1867_CH_CNT]; + static uint16_t ref_pre = 32768; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); @@ -196,65 +193,25 @@ void TIM2_IRQHandler(void) val[i] = ltc1867_transfer(ltc1867_spi_data[i]); /* read convert data and send next channel information */ } /* split 2 for loop, because sample timing is strict, only place important code in sample duration */ - for (uint8_t i = 0; i < 4; i++) { - data_ltc1867.sum[i] += diff32768(val[i]); /* add every channel original data for next process */ - debug_write_data(DEBUG_CH_RAW + i, (float)val[i]); /* channel 0~3 for ltc1867 original sample data */ - } - adc_det_temp_from_ltc1867 = val[4]; /* channel 4 for ltc1867 detector temperature sample data */ - data_ltc1867.val_idx++; - if ((data_ltc1867.val_idx >= CALC_CNT) && (data_ltc1867.locked != 0)) { - data_ltc1867.val_idx = 0; - if (cli_data_comb.force_available & CLI_FORCE_FILTER_INPUT1_MASK) { - filter_input_data(0, cli_data_comb.force_data[CLI_FORCE_FILTER_INPUT1] / FILTER_SUM_LEN_GAS1); - } else { - filter_input_data(0, data_ltc1867.sum[0]); + if ((val[0] >= 32768) && (ref_pre < 32786)) { + for (uint8_t i = 0; i < 4; i++) { + data_ltc1867.pp[i] = data_ltc1867.max[i] - data_ltc1867.min[i]; + filter_input_data(i, data_ltc1867.pp[i]); + data_ltc1867.min[i] = 32768; + data_ltc1867.max[i] = 32768; } - if (cli_data_comb.force_available & CLI_FORCE_FILTER_INPUT2_MASK) { - filter_input_data(1, cli_data_comb.force_data[CLI_FORCE_FILTER_INPUT2] / FILTER_SUM_LEN_GAS2); - } else { - filter_input_data(1, data_ltc1867.sum[1]); - } - if (cli_data_comb.force_available & CLI_FORCE_FILTER_INPUT3_MASK) { - filter_input_data(2, cli_data_comb.force_data[CLI_FORCE_FILTER_INPUT3] / FILTER_SUM_LEN_GAS3); - } else { - filter_input_data(2, data_ltc1867.sum[2]); - } - if (cli_data_comb.force_available & CLI_FORCE_FILTER_INPUT4_MASK) { - filter_input_data(3, cli_data_comb.force_data[CLI_FORCE_FILTER_INPUT4] / FILTER_SUM_LEN_GAS4); - } else { - filter_input_data(3, data_ltc1867.sum[3]); - } - data_ltc1867.sum[0] = 0; - data_ltc1867.sum[1] = 0; - data_ltc1867.sum[2] = 0; - data_ltc1867.sum[3] = 0; data_ltc1867.calc_flag++; } - - if (data_ltc1867.warm > 0) { - /* in warm stage */ - data_ltc1867.warm--; - } else { - /* warm complete */ - if (data_ltc1867.locked > 0) { - /* nothing, normal running state */ - } else { - /* has not locked wave */ - static uint16_t pre_ref = 32768; - if ((pre_ref < 32768) && (val[0] >= 32768)) { - /* meet lock condition */ - data_ltc1867.sum[0] = diff32768(val[0]); - data_ltc1867.sum[1] = diff32768(val[1]); - data_ltc1867.sum[2] = diff32768(val[2]); - data_ltc1867.sum[3] = diff32768(val[3]); - data_ltc1867.val_idx = 1; - data_ltc1867.locked = 1; - } else { - /* not meet lock condition */ - pre_ref = val[0]; - } + ref_pre = val[0]; + for (uint8_t i = 0; i < 4; i++) { + debug_write_data(DEBUG_CH_RAW + i, (float)val[i]); /* channel 0~3 for ltc1867 original sample data */ + if (val[i] < data_ltc1867.min[i]) { + data_ltc1867.min[i] = val[i]; + } else if (val[i] > data_ltc1867.max[i]) { + data_ltc1867.max[i] = val[i]; } } + adc_det_temp_from_ltc1867 = val[4]; /* channel 4 for ltc1867 detector temperature sample data */ cali_flash_write(); debug_send_frame(); } diff --git a/lark1fq/src/ltc1867.h b/lark1fq/src/ltc1867.h index c76fb83..01e0d9c 100755 --- a/lark1fq/src/ltc1867.h +++ b/lark1fq/src/ltc1867.h @@ -25,7 +25,9 @@ #define PIN_SPI_SDI (GPIO_Pin_7) struct data_ltc1867_s { - uint32_t sum[4]; /* store temporary sum of half period sum */ + uint16_t min[4]; + uint16_t max[4]; + uint16_t pp[4]; /* store peak-to-peak value */ uint32_t calc_flag; /* half period complete, need calc */ uint16_t ledir_cnt; /* index of led count, for togglr IR led */ uint16_t val_idx; /* index of value in half period, for sum */