[fix] modify output value from sum to pp
This commit is contained in:
parent
a725f6c565
commit
870a83d684
@ -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;
|
||||||
|
|||||||
@ -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();
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
@ -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 */
|
||||||
for (uint8_t i = 0; i < 4; i++) {
|
if ((val[0] >= 32768) && (ref_pre < 32786)) {
|
||||||
data_ltc1867.sum[i] += diff32768(val[i]); /* add every channel original data for next process */
|
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 */
|
data_ltc1867.pp[i] = data_ltc1867.max[i] - data_ltc1867.min[i];
|
||||||
}
|
filter_input_data(i, data_ltc1867.pp[i]);
|
||||||
adc_det_temp_from_ltc1867 = val[4]; /* channel 4 for ltc1867 detector temperature sample data */
|
data_ltc1867.min[i] = 32768;
|
||||||
data_ltc1867.val_idx++;
|
data_ltc1867.max[i] = 32768;
|
||||||
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();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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 */
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user