From a1590577d2fa7330b871ac421a1566f6d5881834 Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Sun, 19 Apr 2026 18:54:44 +0200 Subject: [PATCH] added fixed point exponential average filters --- fw/filter.h | 15 +++++++++++++++ fw/main.c | 12 ++++++++---- 2 files changed, 23 insertions(+), 4 deletions(-) create mode 100644 fw/filter.h diff --git a/fw/filter.h b/fw/filter.h new file mode 100644 index 0000000..b1aaf6e --- /dev/null +++ b/fw/filter.h @@ -0,0 +1,15 @@ +#ifndef _FILTER_H +#define _FILTER_H + + +// Fixed-Point Exponential Moving Average +// alpha = 1/2^k +// x: output value +// s: current sample +#define U16_FP_EMA_K2(x, s) (u16)((((u32)(x)<<2) - (x) + (s)) >> 2) +#define U16_FP_EMA_K4(x, s) (u16)((((u32)(x)<<4) - (x) + (s)) >> 4) +#define U16_FP_EMA_K8(x, s) (u16)((((u32)(x)<<8) - (x) + (s)) >> 8) +#define U16_FP_EMA_K16(x, s) (u16)((((u32)(x)<<16) - (x) + (s)) >> 16) + + +#endif // _FILTER_H diff --git a/fw/main.c b/fw/main.c index 54d8aa7..c390a3e 100644 --- a/fw/main.c +++ b/fw/main.c @@ -5,6 +5,7 @@ #include "lib_i2c.h" #include "display.h" +#include "filter.h" // Pin definitions @@ -199,13 +200,16 @@ __attribute__((noreturn)) int main(void) u8g2 = display_init(); for (;;) { + static uint16_t tip_mv, vbus_mv, current_ma; + static int16_t temp_k; + poll_input(); // usb u32 start = funSysTick32(); - uint16_t vbus_mv = ((u32)funAnalogRead(VBUS_ADC_CHANNEL)*VCC_MV*11)/4096; - uint16_t current_ma = get_current_ma(funAnalogRead(CURRENT_ADC_CHANNEL)); - int16_t temp_k = get_temp_k(funAnalogRead(NTC_ADC_CHANNEL)); - uint16_t tip_mv = ((u32)funAnalogRead(TEMP_ADC_CHANNEL)*VCC_MV)/4096; + vbus_mv = U16_FP_EMA_K2(vbus_mv, ((u32)funAnalogRead(VBUS_ADC_CHANNEL)*VCC_MV*11)/4096); + current_ma = U16_FP_EMA_K2(current_ma, get_current_ma(funAnalogRead(CURRENT_ADC_CHANNEL))); + temp_k = U16_FP_EMA_K2(temp_k, get_temp_k(funAnalogRead(NTC_ADC_CHANNEL))); + tip_mv = U16_FP_EMA_K2(tip_mv, (u32)(funAnalogRead(TEMP_ADC_CHANNEL)*VCC_MV)/4096); u8g2_ClearBuffer(u8g2); u8g2_SetBitmapMode(u8g2, 1);