mov det temperature sample from internal ADC to LTC1867

This commit is contained in:
zhji 2024-04-04 16:16:41 +08:00
parent 8ebe10e99f
commit 23c8d51951
5 changed files with 55 additions and 9 deletions

View File

@ -2,6 +2,8 @@ include_directories(.)
include_directories(../../driver/stddriver/inc) include_directories(../../driver/stddriver/inc)
include_directories(../../driver/cmsis/inc) include_directories(../../driver/cmsis/inc)
add_definitions(-DDET_TEMPERATURE_LTC1867)
file(GLOB FILELIST file(GLOB FILELIST
device.c device.c
user_misc.c user_misc.c

View File

@ -14,6 +14,7 @@ A3 = 7.7743300e-8*/
static float Ncp15wCoeff[4] = {2.3088245e-3, 2.1731924e-4, 1.7282124e-6, 7.7743300e-8}; static float Ncp15wCoeff[4] = {2.3088245e-3, 2.1731924e-4, 1.7282124e-6, 7.7743300e-8};
static uint16_t adc_data[4][12] __attribute__((section(".bss_ccm"))); static uint16_t adc_data[4][12] __attribute__((section(".bss_ccm")));
static uint16_t adc_data_sort[12] __attribute__((section(".bss_ccm"))); static uint16_t adc_data_sort[12] __attribute__((section(".bss_ccm")));
uint16_t adc_det_temp_from_ltc1867 __attribute__((section(".bss_ccm")));
float adc_to_resistance(uint16_t adc_value) float adc_to_resistance(uint16_t adc_value)
{ {
@ -25,6 +26,16 @@ float adc_to_resistance(uint16_t adc_value)
return (float)value1 / (float)value2; return (float)value1 / (float)value2;
} }
float adc_to_resistance16(uint16_t adc_value)
{
uint32_t value1, value2;
value1 = 100 * (uint32_t)adc_value;
value2 = 65536 - (uint32_t)adc_value;
return (float)value1 / (float)value2;
}
uint32_t adc_rtot(uint16_t adc_value) uint32_t adc_rtot(uint16_t adc_value)
{ {
int i = 0; int i = 0;
@ -42,6 +53,23 @@ uint32_t adc_rtot(uint16_t adc_value)
return (uint32_t)t; return (uint32_t)t;
} }
uint32_t adc_rtot16(uint16_t adc_value)
{
int i = 0;
float t = 0;
float rtemp;
rtemp = adc_to_resistance16(adc_value);
rtemp = logf(rtemp);
for(i = 3; i >= 0; i--) {
t = t * rtemp + Ncp15wCoeff[i];
}
t = 100.0f / t; /* unit: 0.01K */
return (uint32_t)t;
}
void adc_input_data(uint8_t ch, uint16_t data) void adc_input_data(uint8_t ch, uint16_t data)
{ {
static uint8_t idx[4] = {0, 0, 0, 0}; static uint8_t idx[4] = {0, 0, 0, 0};
@ -56,7 +84,7 @@ void adc_input_data(uint8_t ch, uint16_t data)
uint16_t adc_get_filter_data(uint8_t ch) uint16_t adc_get_filter_data(uint8_t ch)
{ {
uint32_t i, j, min_idx; uint32_t i, j, min_idx;
uint16_t sum; uint32_t sum;
/* copy data to buffer */ /* copy data to buffer */
for (i = 0; i < ADC_FILTER_LEN - 1; i++) { for (i = 0; i < ADC_FILTER_LEN - 1; i++) {
@ -81,8 +109,8 @@ uint16_t adc_get_filter_data(uint8_t ch)
for (i = 2; i < ADC_FILTER_LEN - 2; i++) { for (i = 2; i < ADC_FILTER_LEN - 2; i++) {
sum += adc_data_sort[i]; sum += adc_data_sort[i];
} }
sum = (sum + 4) / (ADC_FILTER_LEN - 4); sum = (sum + (ADC_FILTER_LEN - 4) / 2) / (ADC_FILTER_LEN - 4);
return sum; return (uint16_t)sum;
} }
void adc_init(void) void adc_init(void)
@ -142,10 +170,20 @@ void adc_loop(void)
} }
ms = system_tick_cnt; ms = system_tick_cnt;
val = adc_read(); val = adc_read();
#ifdef DET_TEMPERATURE_LTC1867
if (ch == 0) {
val = adc_det_temp_from_ltc1867;
}
#endif
debug_write_data(20 + ch, (float)val); debug_write_data(20 + ch, (float)val);
adc_input_data(ch, val); /* input data from ADC to sort buffer */ adc_input_data(ch, val); /* input data from ADC to sort buffer */
if (ch == 0) { if (ch == 0) {
val = adc_get_filter_data(ch); val = adc_get_filter_data(ch);
#ifdef DET_TEMPERATURE_LTC1867
value = adc_rtot16(val);
#else
value = adc_rtot(val);
#endif
value = adc_rtot(val); value = adc_rtot(val);
debug_write_data(24 + ch, (float)value); debug_write_data(24 + ch, (float)value);
device_data.detector_temperature = value; device_data.detector_temperature = value;

View File

@ -12,7 +12,9 @@
extern uint32_t system_tick_cnt; extern uint32_t system_tick_cnt;
float adc_to_resistance(uint16_t adc_value); float adc_to_resistance(uint16_t adc_value);
float adc_to_resistance16(uint16_t adc_value);
uint32_t adc_rtot(uint16_t adc_value); uint32_t adc_rtot(uint16_t adc_value);
uint32_t adc_rtot16(uint16_t adc_value);
void adc_input_data(uint8_t ch, uint16_t data); void adc_input_data(uint8_t ch, uint16_t data);
uint16_t adc_get_filter_data(uint8_t ch); uint16_t adc_get_filter_data(uint8_t ch);
void adc_init(void); void adc_init(void);

View File

@ -13,7 +13,7 @@
#define diff32768(data) ((data > 32768) ? (data - 32768) : (32768 - data)) #define diff32768(data) ((data > 32768) ? (data - 32768) : (32768 - data))
struct data_ltc1867_s data_ltc1867 __attribute__((section(".bss_ccm"))); struct data_ltc1867_s data_ltc1867 __attribute__((section(".bss_ccm")));
static const uint16_t ltc1867_spi_data[4] = {0xC400, 0x9400, 0xD400, 0x8400}; /* order: ch1, ch2, ch3, ch0 */ static const uint16_t ltc1867_spi_data[LTC1867_CH_CNT] = {0xC400, 0x9400, 0xD400, 0xA400, 0x8400}; /* order: ch1, ch2, ch3, ch4, ch0 */
void ltc1867_init(void) void ltc1867_init(void)
{ {
@ -98,7 +98,7 @@ void ltc1867_init(void)
SPI_Init(SPI1, &SPI_InitStructure); SPI_Init(SPI1, &SPI_InitStructure);
SPI_Cmd(SPI1, ENABLE); SPI_Cmd(SPI1, ENABLE);
ltc1867_spi_select(); ltc1867_spi_select();
ltc1867_transfer(ltc1867_spi_data[3]); 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[0] = 0; /* store temporary sum of half period sum */
@ -175,7 +175,7 @@ uint16_t ltc1867_transfer(uint16_t data_send)
void TIM2_IRQHandler(void) void TIM2_IRQHandler(void)
{ {
uint16_t val[4]; uint16_t val[LTC1867_CH_CNT];
TIM_ClearITPendingBit(TIM2, TIM_IT_Update); TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
@ -188,8 +188,8 @@ void TIM2_IRQHandler(void)
data_ltc1867.ledir_cnt = 0; data_ltc1867.ledir_cnt = 0;
} }
/* sample 4 channel adc data */ /* sample 5 channel adc data */
for (uint8_t i = 0; i < 4; i++) { for (uint8_t i = 0; i < LTC1867_CH_CNT; i++) {
ltc1867_conv(); /* this point start convert */ ltc1867_conv(); /* this point start convert */
ltc1867_delay(); /* delay 3.5us for convert time, reference for LTC1867 datasheet */ ltc1867_delay(); /* delay 3.5us for convert time, reference for LTC1867 datasheet */
ltc1867_spi_select(); /* convert complete, make convert pin low for reading sample data by SPI */ ltc1867_spi_select(); /* convert complete, make convert pin low for reading sample data by SPI */
@ -198,8 +198,9 @@ void TIM2_IRQHandler(void)
/* 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++) { for (uint8_t i = 0; i < 4; i++) {
data_ltc1867.sum[i] += diff32768(val[i]); /* add every channel original data for next process */ data_ltc1867.sum[i] += diff32768(val[i]); /* add every channel original data for next process */
debug_write_data(i, (float)val[i]); /* channel 1~4 for ltc1867 original sample data */ debug_write_data(i, (float)val[i]); /* channel 0~3 for ltc1867 original sample data */
} }
adc_det_temp_from_ltc1867 = val[4]; /* channel 4 for ltc1867 detector temperature sample data */
data_ltc1867.val_idx++; data_ltc1867.val_idx++;
if ((data_ltc1867.val_idx >= CALC_CNT) && (data_ltc1867.locked != 0)) { if ((data_ltc1867.val_idx >= CALC_CNT) && (data_ltc1867.locked != 0)) {
data_ltc1867.val_idx = 0; data_ltc1867.val_idx = 0;

View File

@ -12,6 +12,8 @@
#define TIMER_PERIOD_SAMPLE (TIMER_SRC_FREQ / LEDIR_FREQ / SAMPLES_PER_PERIOD - 1) #define TIMER_PERIOD_SAMPLE (TIMER_SRC_FREQ / LEDIR_FREQ / SAMPLES_PER_PERIOD - 1)
#define TIMER_PERIOD_DELAY (TIMER_SRC_FREQ / 1000 / 1000 * 35 / 10 - 1) /* 3.5us */ #define TIMER_PERIOD_DELAY (TIMER_SRC_FREQ / 1000 / 1000 * 35 / 10 - 1) /* 3.5us */
#define LTC1867_CH_CNT (5)
#define PORT_LEDIR (GPIOB) #define PORT_LEDIR (GPIOB)
#define PIN_LEDIR (GPIO_Pin_0) #define PIN_LEDIR (GPIO_Pin_0)
#define PORT_LTC1867 (GPIOA) #define PORT_LTC1867 (GPIOA)
@ -32,6 +34,7 @@ struct data_ltc1867_s {
}; };
extern struct data_ltc1867_s data_ltc1867; extern struct data_ltc1867_s data_ltc1867;
extern uint16_t adc_det_temp_from_ltc1867;
void ltc1867_init(void); void ltc1867_init(void);
void ltc1867_ledir_on(void); void ltc1867_ledir_on(void);