From bcbb63ee749963c7b7c04d19ed1181b93455e87d Mon Sep 17 00:00:00 2001 From: Thomas Kolb Date: Fri, 29 Sep 2023 20:51:20 +0200 Subject: [PATCH] Added test program for the NTC calculation --- .gitignore | 4 +++ test/Makefile | 18 ++++++++++++++ test/ntc_calculation.c | 55 ++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+) create mode 100644 test/Makefile create mode 100644 test/ntc_calculation.c diff --git a/.gitignore b/.gitignore index f8f3e6b..28ffcd7 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,7 @@ # generated config HEX files utils/*.hex + +test/* +!test/*.c +!test/Makefile diff --git a/test/Makefile b/test/Makefile new file mode 100644 index 0000000..f6b6b8f --- /dev/null +++ b/test/Makefile @@ -0,0 +1,18 @@ +BUILD=debug + +CFLAGS = -ggdb -I../fxplib/include -DPOINTPOS=16 +LDFLAGS = -lm + +FXPLIB_A = ../fxplib/lib/debug/libfxp_x86.a + +default: ntc_calculation + +export CFLAGS +export BUILD +export PREFIX +export POSTFIX = x86 +$(FXPLIB_A): + cd ../fxplib && $(MAKE) + +ntc_calculation: ntc_calculation.c $(FXPLIB_A) + gcc -o $@ $(CFLAGS) $(LDFLAGS) $^ diff --git a/test/ntc_calculation.c b/test/ntc_calculation.c new file mode 100644 index 0000000..b29a640 --- /dev/null +++ b/test/ntc_calculation.c @@ -0,0 +1,55 @@ +#include +#include + +#include + +#include + +static fxp_t adc_val_to_pin_voltage(uint16_t adc_val) +{ + return fxp_div( + fxp_mult(FXP_FROM_INT((int32_t)adc_val), fxp_div(FXP_FROM_INT(33), FXP_FROM_INT(10))), + FXP_FROM_INT(4096)); +} + + +static fxp_t calc_temperature_ntc(uint16_t adc_val) +{ + // note: all resistor values in kΩ! The factor 1000 is removed from the numbers! + static const fxp_t ln_r_ntc_nom = 252323; // ln(47 kΩ) converted to fxp_t with 16 fractional bits + static const fxp_t r1 = FXP_FROM_INT(10); + static const fxp_t b_constant = FXP_FROM_INT(4125); + static const fxp_t ntc_temp_nom_inv = 220; // 1/(273.15+25) * 2**16 + static const fxp_t celsius2kelvin = 17901158; // (273.15) * 2**16 + + fxp_t v_r1 = adc_val_to_pin_voltage(adc_val); + fxp_t v_ref = fxp_div(FXP_FROM_INT(33), FXP_FROM_INT(10)); + + fxp_t r_ntc = fxp_div(fxp_mult(fxp_sub(v_ref, v_r1), r1), v_r1); + + fxp_t ln_r_ntc = fxp_from_float(logf(fxp_to_float(r_ntc))); + + fxp_t temp_k = fxp_div(FXP_FROM_INT(1), + fxp_add( + fxp_div( + fxp_sub( + ln_r_ntc, + ln_r_ntc_nom), + b_constant), + ntc_temp_nom_inv)); + + return fxp_sub(temp_k, celsius2kelvin); +} + + +int main(void) +{ + for(uint16_t adc_val = 128; adc_val < 4096; adc_val += 512) { + fxp_t temperature = calc_temperature_ntc(adc_val); + + float tempf = fxp_to_float(temperature); + float voltf = adc_val * 3.3f / 4096.0f; + + printf("%5.3f V => %7.2f °C\n", voltf, tempf); + } +}