[fix] modify calc frequency from 2 period to 1 period

This commit is contained in:
zhji 2024-08-31 16:46:43 +08:00
parent 98ae861a70
commit 1015d759ea
3 changed files with 45 additions and 85 deletions

View File

@ -78,8 +78,8 @@ void filter_quadratic_process(void)
float rative, peak; float rative, peak;
uint32_t pos_ravine, pos_peak; uint32_t pos_ravine, pos_peak;
pos_ravine = data_ltc1867.pos_ravine + SAMPLES_PER_PERIOD / 4 - CALC_POINTS / 2; pos_ravine = (data_ltc1867.sample_falling + data_ltc1867.sample_rising - CALC_POINTS) / 2;
pos_peak = data_ltc1867.pos_peak + SAMPLES_PER_PERIOD / 4 - CALC_POINTS / 2; pos_peak = (data_ltc1867.sample_falling - CALC_POINTS) / 2;
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
calc_quadratic_fit(data_ltc1867.p_calc[i] + pos_ravine, &coeff, CALC_POINTS); calc_quadratic_fit(data_ltc1867.p_calc[i] + pos_ravine, &coeff, CALC_POINTS);
rative = coeff.c - coeff.b * coeff.b / (4.0f * coeff.a); rative = coeff.c - coeff.b * coeff.b / (4.0f * coeff.a);

View File

@ -10,7 +10,8 @@
#include "stm32f4xx_tim.h" #include "stm32f4xx_tim.h"
#include "stm32f4xx_spi.h" #include "stm32f4xx_spi.h"
float data_ltc1867_raw[2][4][SAMPLES_PER_PERIOD * 2] __attribute__((section(".bss_ccm"))); #define LTC1867_RAW_BUFF_SIZE (SAMPLES_PER_PERIOD / 4 * 5)
float data_ltc1867_raw[2][4][LTC1867_RAW_BUFF_SIZE] __attribute__((section(".bss_ccm")));
struct data_ltc1867_s data_ltc1867 __attribute__((section(".bss_ccm"))); struct data_ltc1867_s data_ltc1867 __attribute__((section(".bss_ccm")));
__attribute__((section(".data_ccm"))) uint16_t ltc1867_spi_data[LTC1867_CH_CNT] = {0xC400, 0x9400, 0xD400, 0xA400, 0x8400}; /* order: ch1, ch2, ch3, ch4, ch0 */ __attribute__((section(".data_ccm"))) uint16_t ltc1867_spi_data[LTC1867_CH_CNT] = {0xC400, 0x9400, 0xD400, 0xA400, 0x8400}; /* order: ch1, ch2, ch3, ch4, ch0 */
@ -103,7 +104,7 @@ void ltc1867_init(void)
data_ltc1867.calc_cnt = 0; data_ltc1867.calc_cnt = 0;
data_ltc1867.calc_flag = 0; /* 2 period complete, need calc */ data_ltc1867.calc_flag = 0; /* 2 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.state_idx = 0; /* index for search point of 32768 */ data_ltc1867.sample_cnt = 0; /* index for search point of 32768 */
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
data_ltc1867.p_samp[i] = data_ltc1867_raw[0][i]; data_ltc1867.p_samp[i] = data_ltc1867_raw[0][i];
data_ltc1867.p_calc[i] = data_ltc1867_raw[1][i]; data_ltc1867.p_calc[i] = data_ltc1867_raw[1][i];
@ -173,19 +174,19 @@ uint16_t ltc1867_transfer(uint16_t data_send)
void TIM2_IRQHandler(void) void TIM2_IRQHandler(void)
{ {
static uint16_t pre_ref = 0; static uint16_t pre_ref = 65535;
uint16_t val[LTC1867_CH_CNT]; uint16_t val[LTC1867_CH_CNT];
float *p;
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
/* for control led IR */ /* for control led IR */
data_ltc1867.ledir_cnt++; data_ltc1867.ledir_cnt++;
if ((data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD / 2)) || \ if (data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD / 2)) {
(data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD / 2 * 3))) {
ltc1867_ledir_on(); ltc1867_ledir_on();
} else if ((data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD)) || \ } else if (data_ltc1867.ledir_cnt >= SAMPLES_PER_PERIOD) {
(data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD * 2))) {
ltc1867_ledir_off(); ltc1867_ledir_off();
data_ltc1867.ledir_cnt = 0;
} }
/* sample 5 channel adc data */ /* sample 5 channel adc data */
@ -199,76 +200,38 @@ void TIM2_IRQHandler(void)
/* ltc1867 original sample data */ /* ltc1867 original sample data */
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
float val_f = (float)val[i]; /* convert to float */ float val_f = (float)val[i]; /* convert to float */
data_ltc1867.p_samp[i][data_ltc1867.ledir_cnt - 1] = val_f; data_ltc1867.p_samp[i][data_ltc1867.sample_cnt] = val_f;
debug_write_data(DEBUG_CH_RAW + i, val_f); debug_write_data(DEBUG_CH_RAW + i, val_f);
} }
data_ltc1867.sample_cnt++;
/* channel 4 for ltc1867 detector temperature sample data */ if (data_ltc1867.sample_cnt >= LTC1867_RAW_BUFF_SIZE) {
adc_det_temp_from_ltc1867 = val[4]; data_ltc1867.sample_cnt = 0;
}
/* search point of 32768 */ /* search point of 32768 */
if ((pre_ref < 32768) && (val[0] >= 32768)) { if ((pre_ref < 32768) && (val[0] >= 32768)) {
data_ltc1867.state_pos[data_ltc1867.state_idx] = data_ltc1867.ledir_cnt - 1; data_ltc1867.calc_cnt++;
data_ltc1867.state_edge[data_ltc1867.state_idx++] = 1; /* 1 for rising edge */ data_ltc1867.sample_rising = data_ltc1867.sample_cnt;
} else if ((pre_ref >= 32768) && (val[0] < 32768)) { data_ltc1867.sample_cnt = 0;
data_ltc1867.state_pos[data_ltc1867.state_idx] = data_ltc1867.ledir_cnt - 1; if ((data_ltc1867.sample_falling > SAMPLES_PER_PERIOD / 16 * 7) && \
data_ltc1867.state_edge[data_ltc1867.state_idx++] = 0; /* 0 for falling edge */ (data_ltc1867.sample_falling < SAMPLES_PER_PERIOD / 16 * 9) && \
} (data_ltc1867.sample_rising > SAMPLES_PER_PERIOD / 16 * 15) && \
pre_ref = val[0]; (data_ltc1867.sample_rising < SAMPLES_PER_PERIOD / 16 * 17)) {
/* 2 cycle complete */
if (data_ltc1867.ledir_cnt >= SAMPLES_PER_PERIOD * 2) {
float *p;
/* exchange pointor of calc/samp data */ /* exchange pointor of calc/samp data */
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < 4; i++) {
p = data_ltc1867.p_calc[i]; p = data_ltc1867.p_calc[i];
data_ltc1867.p_calc[i] = data_ltc1867.p_samp[i]; data_ltc1867.p_calc[i] = data_ltc1867.p_samp[i];
data_ltc1867.p_samp[i] = p; data_ltc1867.p_samp[i] = p;
} }
data_ltc1867.calc_flag++; /* trig calc */
}
} else if ((pre_ref >= 32768) && (val[0] < 32768)) {
data_ltc1867.sample_falling = data_ltc1867.sample_cnt;
}
pre_ref = val[0];
/* ledir count need empty */ /* channel 4 for ltc1867 detector temperature sample data */
data_ltc1867.ledir_cnt = 0; adc_det_temp_from_ltc1867 = val[4];
data_ltc1867.calc_cnt++;
/* check whether the data meets requirements */
if (data_ltc1867.state_idx == 4) {
if ((data_ltc1867.state_pos[0] < SAMPLES_PER_PERIOD / 4) && \
(data_ltc1867.state_pos[1] >= SAMPLES_PER_PERIOD / 2) && (data_ltc1867.state_pos[1] < SAMPLES_PER_PERIOD / 4 * 3) && \
(data_ltc1867.state_pos[2] >= SAMPLES_PER_PERIOD) && (data_ltc1867.state_pos[2] < SAMPLES_PER_PERIOD / 4 * 5) && \
(data_ltc1867.state_pos[3] >= SAMPLES_PER_PERIOD / 2 * 3) && (data_ltc1867.state_pos[3] < SAMPLES_PER_PERIOD / 4 * 7)) {
/* pos is head */
if ((data_ltc1867.state_edge[0] == 0) && (data_ltc1867.state_edge[1] == 1) && (data_ltc1867.state_edge[2] == 0) && (data_ltc1867.state_edge[3] == 1)) {
data_ltc1867.state = 1; /* first ravine late */
data_ltc1867.pos_peak = data_ltc1867.state_pos[1];
data_ltc1867.pos_ravine = data_ltc1867.state_pos[2];
data_ltc1867.calc_flag++; /* trig calc */
} else if ((data_ltc1867.state_edge[0] == 1) && (data_ltc1867.state_edge[1] == 0) && (data_ltc1867.state_edge[2] == 1) && (data_ltc1867.state_edge[3] == 0)) {
data_ltc1867.state = 3; /* first peak late */
data_ltc1867.pos_ravine = data_ltc1867.state_pos[1];
data_ltc1867.pos_peak = data_ltc1867.state_pos[2];
data_ltc1867.calc_flag++; /* trig calc */
}
} else if ((data_ltc1867.state_pos[0] >= SAMPLES_PER_PERIOD / 4) && (data_ltc1867.state_pos[0] < SAMPLES_PER_PERIOD / 2) && \
(data_ltc1867.state_pos[1] >= SAMPLES_PER_PERIOD / 4 * 3) && (data_ltc1867.state_pos[1] < SAMPLES_PER_PERIOD) && \
(data_ltc1867.state_pos[2] >= SAMPLES_PER_PERIOD / 4 * 5) && (data_ltc1867.state_pos[2] < SAMPLES_PER_PERIOD / 2 * 3) && \
(data_ltc1867.state_pos[3] >= SAMPLES_PER_PERIOD / 4 * 7) && (data_ltc1867.state_pos[3] < SAMPLES_PER_PERIOD *2)) {
/* pos is later */
if ((data_ltc1867.state_edge[0] == 0) && (data_ltc1867.state_edge[1] == 1) && (data_ltc1867.state_edge[2] == 0) && (data_ltc1867.state_edge[3] == 1)) {
data_ltc1867.state = 2; /* first peak ahead */
data_ltc1867.pos_ravine = data_ltc1867.state_pos[0];
data_ltc1867.pos_peak = data_ltc1867.state_pos[1];
data_ltc1867.calc_flag++; /* trig calc */
} else if ((data_ltc1867.state_edge[0] == 1) && (data_ltc1867.state_edge[1] == 0) && (data_ltc1867.state_edge[2] == 1) && (data_ltc1867.state_edge[3] == 0)) {
data_ltc1867.state = 0; /* first ravine ahead */
data_ltc1867.pos_peak = data_ltc1867.state_pos[0];
data_ltc1867.pos_ravine = data_ltc1867.state_pos[1];
data_ltc1867.calc_flag++; /* trig calc */
}
}
}
data_ltc1867.state_idx = 0;
}
cali_flash_write(); cali_flash_write();
debug_send_frame(); debug_send_frame();

View File

@ -28,12 +28,9 @@ struct data_ltc1867_s {
uint32_t calc_flag; /* double period complete, need calc */ uint32_t calc_flag; /* double period complete, need calc */
uint32_t calc_cnt; /* totle count of double period complete */ uint32_t calc_cnt; /* totle count of double period complete */
uint16_t ledir_cnt; /* index of led count, for togglr IR led */ uint16_t ledir_cnt; /* index of led count, for togglr IR led */
uint8_t state; /* 0~3 is available, 0:first ravine ahead, 1:first ravine late, 2:first peak ahead, 3:first peak late */ uint16_t sample_cnt; /* index of sample */
uint8_t state_idx; /* 0~3 is available, sample 4 times of point 32768 */ uint16_t sample_falling; /* position of falling edge */
uint8_t state_edge[4]; /* 0 or 1 is available, 0:falling edge, 1:rising edge */ uint16_t sample_rising; /* position of rising edge, is also total sample count */
uint16_t state_pos[4]; /* position of every edge, 0~(SAMPLES_PER_PERIOD*2-1) is available */
uint16_t pos_ravine; /* position of ravine */
uint16_t pos_peak; /* position of peak */
float *p_calc[4]; /* pointor for calculation */ float *p_calc[4]; /* pointor for calculation */
float *p_samp[4]; /* pointor for store sample data */ float *p_samp[4]; /* pointor for store sample data */
}; };