[fix] modify calc frequency from 2 period to 1 period
This commit is contained in:
parent
98ae861a70
commit
1015d759ea
@ -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);
|
||||||
|
|||||||
@ -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,77 +200,39 @@ 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++;
|
||||||
|
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 */
|
/* channel 4 for ltc1867 detector temperature sample data */
|
||||||
adc_det_temp_from_ltc1867 = val[4];
|
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();
|
cali_flash_write();
|
||||||
debug_send_frame();
|
debug_send_frame();
|
||||||
}
|
}
|
||||||
|
|||||||
@ -25,17 +25,14 @@
|
|||||||
#define PIN_SPI_SDI (GPIO_Pin_7)
|
#define PIN_SPI_SDI (GPIO_Pin_7)
|
||||||
|
|
||||||
struct data_ltc1867_s {
|
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 */
|
float *p_calc[4]; /* pointor for calculation */
|
||||||
uint16_t pos_ravine; /* position of ravine */
|
float *p_samp[4]; /* pointor for store sample data */
|
||||||
uint16_t pos_peak; /* position of peak */
|
|
||||||
float *p_calc[4]; /* pointor for calculation */
|
|
||||||
float *p_samp[4]; /* pointor for store sample data */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
extern struct data_ltc1867_s data_ltc1867;
|
extern struct data_ltc1867_s data_ltc1867;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user