[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_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;

View File

@ -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();

View File

@ -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);

View File

@ -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 */
if ((val[0] >= 32768) && (ref_pre < 32786)) {
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 */
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;
}
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++;
}
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();
}

View File

@ -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 */