diff --git a/lark1fq/src/filter.c b/lark1fq/src/filter.c index b8f57f6..2b4489f 100755 --- a/lark1fq/src/filter.c +++ b/lark1fq/src/filter.c @@ -78,8 +78,8 @@ void filter_quadratic_process(void) float rative, peak; uint32_t pos_ravine, pos_peak; - pos_ravine = data_ltc1867.pos_ravine + SAMPLES_PER_PERIOD / 4 - CALC_POINTS / 2; - pos_peak = data_ltc1867.pos_peak + SAMPLES_PER_PERIOD / 4 - CALC_POINTS / 2; + pos_ravine = (data_ltc1867.sample_falling + data_ltc1867.sample_rising - CALC_POINTS) / 2; + pos_peak = (data_ltc1867.sample_falling - CALC_POINTS) / 2; for (uint8_t i = 0; i < 4; i++) { calc_quadratic_fit(data_ltc1867.p_calc[i] + pos_ravine, &coeff, CALC_POINTS); rative = coeff.c - coeff.b * coeff.b / (4.0f * coeff.a); diff --git a/lark1fq/src/ltc1867.c b/lark1fq/src/ltc1867.c index 718935a..a468c93 100755 --- a/lark1fq/src/ltc1867.c +++ b/lark1fq/src/ltc1867.c @@ -10,7 +10,8 @@ #include "stm32f4xx_tim.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"))); __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_flag = 0; /* 2 period complete, need calc */ 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++) { data_ltc1867.p_samp[i] = data_ltc1867_raw[0][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) { - static uint16_t pre_ref = 0; + static uint16_t pre_ref = 65535; uint16_t val[LTC1867_CH_CNT]; + float *p; TIM_ClearITPendingBit(TIM2, TIM_IT_Update); /* for control led IR */ data_ltc1867.ledir_cnt++; - if ((data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD / 2)) || \ - (data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD / 2 * 3))) { + if (data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD / 2)) { ltc1867_ledir_on(); - } else if ((data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD)) || \ - (data_ltc1867.ledir_cnt == (SAMPLES_PER_PERIOD * 2))) { + } else if (data_ltc1867.ledir_cnt >= SAMPLES_PER_PERIOD) { ltc1867_ledir_off(); + data_ltc1867.ledir_cnt = 0; } /* sample 5 channel adc data */ @@ -199,77 +200,39 @@ void TIM2_IRQHandler(void) /* ltc1867 original sample data */ for (uint8_t i = 0; i < 4; i++) { 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); } + data_ltc1867.sample_cnt++; + if (data_ltc1867.sample_cnt >= LTC1867_RAW_BUFF_SIZE) { + data_ltc1867.sample_cnt = 0; + } + + /* search point of 32768 */ + if ((pre_ref < 32768) && (val[0] >= 32768)) { + data_ltc1867.calc_cnt++; + data_ltc1867.sample_rising = data_ltc1867.sample_cnt; + data_ltc1867.sample_cnt = 0; + if ((data_ltc1867.sample_falling > SAMPLES_PER_PERIOD / 16 * 7) && \ + (data_ltc1867.sample_falling < SAMPLES_PER_PERIOD / 16 * 9) && \ + (data_ltc1867.sample_rising > SAMPLES_PER_PERIOD / 16 * 15) && \ + (data_ltc1867.sample_rising < SAMPLES_PER_PERIOD / 16 * 17)) { + /* exchange pointor of calc/samp data */ + for (uint8_t i = 0; i < 4; i++) { + p = data_ltc1867.p_calc[i]; + data_ltc1867.p_calc[i] = data_ltc1867.p_samp[i]; + 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]; /* channel 4 for ltc1867 detector temperature sample data */ adc_det_temp_from_ltc1867 = val[4]; - /* search point of 32768 */ - if ((pre_ref < 32768) && (val[0] >= 32768)) { - data_ltc1867.state_pos[data_ltc1867.state_idx] = data_ltc1867.ledir_cnt - 1; - data_ltc1867.state_edge[data_ltc1867.state_idx++] = 1; /* 1 for rising edge */ - } else if ((pre_ref >= 32768) && (val[0] < 32768)) { - data_ltc1867.state_pos[data_ltc1867.state_idx] = data_ltc1867.ledir_cnt - 1; - data_ltc1867.state_edge[data_ltc1867.state_idx++] = 0; /* 0 for falling edge */ - } - pre_ref = val[0]; - - /* 2 cycle complete */ - if (data_ltc1867.ledir_cnt >= SAMPLES_PER_PERIOD * 2) { - float *p; - /* exchange pointor of calc/samp data */ - for (uint8_t i = 0; i < 4; i++) { - p = data_ltc1867.p_calc[i]; - data_ltc1867.p_calc[i] = data_ltc1867.p_samp[i]; - data_ltc1867.p_samp[i] = p; - } - - /* ledir count need empty */ - data_ltc1867.ledir_cnt = 0; - 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(); debug_send_frame(); } diff --git a/lark1fq/src/ltc1867.h b/lark1fq/src/ltc1867.h index 36d1a68..e53c9b8 100755 --- a/lark1fq/src/ltc1867.h +++ b/lark1fq/src/ltc1867.h @@ -25,17 +25,14 @@ #define PIN_SPI_SDI (GPIO_Pin_7) struct data_ltc1867_s { - uint32_t calc_flag; /* double period complete, need calc */ - uint32_t calc_cnt; /* totle count of double period complete */ - 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 */ - uint8_t state_idx; /* 0~3 is available, sample 4 times of point 32768 */ - uint8_t state_edge[4]; /* 0 or 1 is available, 0:falling edge, 1:rising edge */ - 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_samp[4]; /* pointor for store sample data */ + uint32_t calc_flag; /* double period complete, need calc */ + uint32_t calc_cnt; /* totle count of double period complete */ + uint16_t ledir_cnt; /* index of led count, for togglr IR led */ + uint16_t sample_cnt; /* index of sample */ + uint16_t sample_falling; /* position of falling edge */ + uint16_t sample_rising; /* position of rising edge, is also total sample count */ + float *p_calc[4]; /* pointor for calculation */ + float *p_samp[4]; /* pointor for store sample data */ }; extern struct data_ltc1867_s data_ltc1867;