[fix] modify output value from sum to pp

This commit is contained in:
zhji 2024-04-20 20:40:11 +08:00
parent a725f6c565
commit 870a83d684
5 changed files with 28 additions and 125 deletions

View File

@ -14,13 +14,11 @@
#define DEBUG_UART_BAUDRATE (2 * 1000 * 1000) #define DEBUG_UART_BAUDRATE (2 * 1000 * 1000)
#define DEBUG_CH_RAW (0 * 4) #define DEBUG_CH_RAW (0 * 4)
#define DEBUG_CH_SUM_1 (1 * 4) #define DEBUG_CH_MEDIAN (1 * 4)
#define DEBUG_CH_SUM_2 (2 * 4) #define DEBUG_CH_WINDOW (2 * 4)
#define DEBUG_CH_MEDIAN (3 * 4) #define DEBUG_CH_ADC_RAW (3 * 4)
#define DEBUG_CH_WINDOW (4 * 4) #define DEBUG_CH_ADC_FILTER (4 * 4)
#define DEBUG_CH_ADC_RAW (5 * 4) #define DEBUG_CHAN_MAX (5 * 4)
#define DEBUG_CH_ADC_FILTER (6 * 4)
#define DEBUG_CHAN_MAX (7 * 4)
struct debug_data_s { struct debug_data_s {
uint8_t enable; uint8_t enable;

View File

@ -4,10 +4,6 @@
#include "debug.h" #include "debug.h"
#include "user_misc.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_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_gas2[FILTER_MEDIAN_LEN_GAS2] __attribute__((section(".bss_ccm")));
static struct list_s median_gas3[FILTER_MEDIAN_LEN_GAS3] __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) void filter_init(void)
{ {
/* data_filter parameter init */ /* 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_len = FILTER_MEDIAN_LEN_GAS1;
data_filter[0].median_buff = median_gas1; data_filter[0].median_buff = median_gas1;
data_filter[0].window_len = FILTER_WINDOW_LEN_GAS1; data_filter[0].window_len = FILTER_WINDOW_LEN_GAS1;
data_filter[0].window_buff = window_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_len = FILTER_MEDIAN_LEN_GAS2;
data_filter[1].median_buff = median_gas2; data_filter[1].median_buff = median_gas2;
data_filter[1].window_len = FILTER_WINDOW_LEN_GAS2; data_filter[1].window_len = FILTER_WINDOW_LEN_GAS2;
data_filter[1].window_buff = window_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_len = FILTER_MEDIAN_LEN_GAS3;
data_filter[2].median_buff = median_gas3; data_filter[2].median_buff = median_gas3;
data_filter[2].window_len = FILTER_WINDOW_LEN_GAS3; data_filter[2].window_len = FILTER_WINDOW_LEN_GAS3;
data_filter[2].window_buff = window_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_len = FILTER_MEDIAN_LEN_GAS4;
data_filter[3].median_buff = median_gas4; data_filter[3].median_buff = median_gas4;
data_filter[3].window_len = FILTER_WINDOW_LEN_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++) { for (uint8_t i = 0; i < 4; i++) {
uint16_t len; 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 */ /* media filter init */
data_filter[i].median_idx = 0; data_filter[i].median_idx = 0;
len = data_filter[i].median_len; 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; 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) void filter_median_process(void)
{ {
struct list_s *list, *iter; struct list_s *list, *iter;
@ -131,7 +89,7 @@ void filter_median_process(void)
list->prev->next = list->next; /* connect prev to next */ list->prev->next = list->next; /* connect prev to next */
list->next->prev = list->prev; /* connect next to prev */ list->next->prev = list->prev; /* connect next to prev */
/* add new node */ /* add new node */
data = data_filter[i].sum_sum; data = data_filter[i].input;
data_filter[i].median_buff[idx].data = data; data_filter[i].median_buff[idx].data = data;
len = data_filter[i].median_len + 1; len = data_filter[i].median_len + 1;
data_filter[i].head.data = 0xFFFFFFFF; data_filter[i].head.data = 0xFFFFFFFF;
@ -207,7 +165,6 @@ void filter_loop(void)
return; return;
} }
flag.filter = data_ltc1867.calc_flag; flag.filter = data_ltc1867.calc_flag;
filter_sum_process();
filter_median_process(); filter_median_process();
filter_window_process(); filter_window_process();
filter_output_process(); filter_output_process();

View File

@ -7,15 +7,10 @@
#include "stm32f4xx.h" #include "stm32f4xx.h"
#define FILTER_SUM_LEN_GAS1 (8 * 2) #define FILTER_MEDIAN_LEN_GAS1 (2048)
#define FILTER_SUM_LEN_GAS2 (8 * 2) #define FILTER_MEDIAN_LEN_GAS2 (256)
#define FILTER_SUM_LEN_GAS3 (8 * 2) #define FILTER_MEDIAN_LEN_GAS3 (256)
#define FILTER_SUM_LEN_GAS4 (8 * 2) #define FILTER_MEDIAN_LEN_GAS4 (256)
#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_WINDOW_LEN_GAS1 (256) #define FILTER_WINDOW_LEN_GAS1 (256)
#define FILTER_WINDOW_LEN_GAS2 (32) #define FILTER_WINDOW_LEN_GAS2 (32)
@ -31,11 +26,6 @@ struct list_s {
struct data_filter_s { struct data_filter_s {
uint32_t input; 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_len;
uint16_t median_idx; uint16_t median_idx;
struct list_s head; struct list_s head;
@ -51,7 +41,6 @@ struct data_filter_s {
extern void filter_init(void); extern void filter_init(void);
extern void filter_input_data(uint8_t channel, uint32_t data); 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_median_process(void);
extern void filter_window_process(void); extern void filter_window_process(void);
extern void filter_output_process(void); extern void filter_output_process(void);

View File

@ -101,10 +101,6 @@ void ltc1867_init(void)
ltc1867_transfer(ltc1867_spi_data[LTC1867_CH_CNT - 1]); ltc1867_transfer(ltc1867_spi_data[LTC1867_CH_CNT - 1]);
/* data_ltc1867 init */ /* 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.calc_flag = 0; /* half period complete, need calc */
data_ltc1867.ledir_cnt = 0; /* index of led count, for togglr IR led */ 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 */ 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) void TIM2_IRQHandler(void)
{ {
uint16_t val[LTC1867_CH_CNT]; uint16_t val[LTC1867_CH_CNT];
static uint16_t ref_pre = 32768;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); 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 */ 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 */ /* split 2 for loop, because sample timing is strict, only place important code in sample duration */
if ((val[0] >= 32768) && (ref_pre < 32786)) {
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
data_ltc1867.sum[i] += diff32768(val[i]); /* add every channel original data for next process */ data_ltc1867.pp[i] = data_ltc1867.max[i] - data_ltc1867.min[i];
debug_write_data(DEBUG_CH_RAW + i, (float)val[i]); /* channel 0~3 for ltc1867 original sample data */ filter_input_data(i, data_ltc1867.pp[i]);
data_ltc1867.min[i] = 32768;
data_ltc1867.max[i] = 32768;
} }
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 (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++; data_ltc1867.calc_flag++;
} }
ref_pre = val[0];
if (data_ltc1867.warm > 0) { for (uint8_t i = 0; i < 4; i++) {
/* in warm stage */ debug_write_data(DEBUG_CH_RAW + i, (float)val[i]); /* channel 0~3 for ltc1867 original sample data */
data_ltc1867.warm--; if (val[i] < data_ltc1867.min[i]) {
} else { data_ltc1867.min[i] = val[i];
/* warm complete */ } else if (val[i] > data_ltc1867.max[i]) {
if (data_ltc1867.locked > 0) { data_ltc1867.max[i] = val[i];
/* 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];
}
} }
} }
adc_det_temp_from_ltc1867 = val[4]; /* channel 4 for ltc1867 detector temperature sample data */
cali_flash_write(); cali_flash_write();
debug_send_frame(); debug_send_frame();
} }

View File

@ -25,7 +25,9 @@
#define PIN_SPI_SDI (GPIO_Pin_7) #define PIN_SPI_SDI (GPIO_Pin_7)
struct data_ltc1867_s { 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 */ uint32_t calc_flag; /* half period complete, need calc */
uint16_t ledir_cnt; /* index of led count, for togglr IR led */ uint16_t ledir_cnt; /* index of led count, for togglr IR led */
uint16_t val_idx; /* index of value in half period, for sum */ uint16_t val_idx; /* index of value in half period, for sum */