From add925bba0692dce7532a6e8454f5020118d157d Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Sat, 12 Jun 2021 16:47:59 +0200 Subject: [PATCH] Fixed temperature measurement --- src/measurement.c | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/measurement.c b/src/measurement.c index be963e0..dd112fe 100644 --- a/src/measurement.c +++ b/src/measurement.c @@ -17,20 +17,23 @@ static fxp_t calibration_factors[ADC_NUM_CHANNELS-1]; // all except temperature; /* Temperature sensor calibration value address */ #define TEMP110_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7C2)) #define TEMP30_CAL_ADDR ((uint16_t*) ((uint32_t) 0x1FFFF7B8)) -#define VDD_CALIB ((uint16_t) (330)) /* calibration voltage = 3,30V - DO NOT CHANGE */ -#define VDD_APPLI ((uint16_t) (330)) /* actual supply voltage */ +#define VDD_CALIB ((int32_t) (330)) /* calibration voltage = 3,30V - DO NOT CHANGE */ +#define VDD_APPLI ((int32_t) (330)) /* actual supply voltage */ /* function for temperature conversion */ static fxp_t calc_temperature(uint16_t adc_val) { - fxp_t temperature = FXP_FROM_INT( - ((int32_t)adc_val * VDD_APPLI / VDD_CALIB) - - (int32_t)*TEMP30_CAL_ADDR); + int32_t temperature_raw = ((int32_t)adc_val * VDD_APPLI / VDD_CALIB) + - (int32_t)(*TEMP30_CAL_ADDR); - temperature = fxp_mult(temperature, FXP_FROM_INT(110 - 30)); - temperature = fxp_div(temperature, FXP_FROM_INT(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR)); + fxp_t temperature = FXP_FROM_INT(temperature_raw); - return fxp_add(temperature, FXP_FROM_INT(30)); + fxp_t scale_dividend = FXP_FROM_INT(110 - 30); + fxp_t scale_divisor = FXP_FROM_INT((int32_t)(*TEMP110_CAL_ADDR - *TEMP30_CAL_ADDR)); + + fxp_t scale = fxp_div(scale_dividend, scale_divisor); + + return fxp_add(fxp_mult(temperature, scale), FXP_FROM_INT(30)); } @@ -71,7 +74,7 @@ void measurement_init(void) ANALOG_INPUT_U_SW, // U_SW ANALOG_INPUT_I_SOLAR, // I_Solar ANALOG_INPUT_I_LOAD, // I_Load - 16 // Temperature sensor + ADC_CHANNEL_TEMP // Temperature sensor }; // Convert calibration factors to fixed-point numbers for direct use