From 3f6a9fe82d892a1fca198169a7d3ed7bba58f902 Mon Sep 17 00:00:00 2001 From: Selene ToyKeeper Date: Wed, 8 Dec 2021 15:31:00 -0700 Subject: added a compile option for USE_LOWPASS_WHILE_ASLEEP, but it doesn't actually fix the issue I was hoping it'd fix, so it's disabled by default (when the battery is right on a threshold between colors for aux LED "voltage" mode, it can bounce between colors until the cell isn't on the boundary any more... but a simple lowpass doesn't really help) (but I also didn't want to throw out the code, in case it's useful later as a reference for a more effective solution) --- spaghetti-monster/anduril/cfg-ff-rot66.h | 5 +++-- .../anduril/cfg-mateminco-mf01-mini.h | 4 +++- spaghetti-monster/anduril/config-default.h | 4 ++++ spaghetti-monster/fsm-adc.c | 22 ++++++++++++++++++++-- spaghetti-monster/fsm-standby.c | 2 ++ 5 files changed, 32 insertions(+), 5 deletions(-) diff --git a/spaghetti-monster/anduril/cfg-ff-rot66.h b/spaghetti-monster/anduril/cfg-ff-rot66.h index 03b74db..e2d5ff7 100644 --- a/spaghetti-monster/anduril/cfg-ff-rot66.h +++ b/spaghetti-monster/anduril/cfg-ff-rot66.h @@ -49,5 +49,6 @@ //#undef USE_TACTICAL_STROBE_MODE // reduce size a bit -#define NO_LOWPASS_WHILE_ASLEEP - +#ifdef USE_LOWPASS_WHILE_ASLEEP +#undef USE_LOWPASS_WHILE_ASLEEP +#endif diff --git a/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h b/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h index 09b684f..b5c3b12 100644 --- a/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h +++ b/spaghetti-monster/anduril/cfg-mateminco-mf01-mini.h @@ -59,5 +59,7 @@ //#undef USE_2C_STYLE_CONFIG // reduce size a bit -#define NO_LOWPASS_WHILE_ASLEEP +#ifdef USE_LOWPASS_WHILE_ASLEEP +#undef USE_LOWPASS_WHILE_ASLEEP +#endif diff --git a/spaghetti-monster/anduril/config-default.h b/spaghetti-monster/anduril/config-default.h index 406e98b..77b5c6b 100644 --- a/spaghetti-monster/anduril/config-default.h +++ b/spaghetti-monster/anduril/config-default.h @@ -189,5 +189,9 @@ // (defined here so config files can override it) #define USE_DYNAMIC_UNDERCLOCKING +// if the aux LEDs oscillate between "full battery" and "empty battery" +// while in "voltage" mode, enable this to reduce the amplitude of +// those oscillations +//#define USE_LOWPASS_WHILE_ASLEEP #endif diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c index 975d12e..c5401ea 100644 --- a/spaghetti-monster/fsm-adc.c +++ b/spaghetti-monster/fsm-adc.c @@ -306,10 +306,28 @@ static inline void ADC_voltage_handler() { uint16_t measurement; // latest ADC value - if (adc_reset) { // while asleep, or just after waking, don't lowpass + if (adc_reset) { // just after waking, don't lowpass measurement = adc_raw[0]; - adc_smooth[0] = measurement; // no lowpass while asleep + adc_smooth[0] = measurement; // no lowpass, just use the latest value } + #ifdef USE_LOWPASS_WHILE_ASLEEP + else if (go_to_standby) { // weaker lowpass while asleep + // occasionally the aux LED color can oscillate during standby, + // while using "voltage" mode ... so try to reduce the oscillation + uint16_t m = adc_raw[0]; + uint16_t v = adc_smooth[0]; + #if 0 + // fixed-rate lowpass, slow, more stable but takes longer to settle + if (m < v) { v -= 64; } + if (m > v) { v += 64; } + #else + // weighted lowpass, faster but less stable + v = (m>>1) + (v>>1); + #endif + adc_smooth[0] = v; + measurement = v; + } + #endif else measurement = adc_smooth[0]; // values stair-step between intervals of 64, with random variations diff --git a/spaghetti-monster/fsm-standby.c b/spaghetti-monster/fsm-standby.c index c450bca..0ae6a2f 100644 --- a/spaghetti-monster/fsm-standby.c +++ b/spaghetti-monster/fsm-standby.c @@ -73,7 +73,9 @@ void sleep_until_eswitch_pressed() go_to_standby = 0; } if (irq_adc) { // ADC done measuring + #ifndef USE_LOWPASS_WHILE_ASLEEP adc_reset = 1; // don't lowpass while asleep + #endif adc_deferred_enable = 1; adc_deferred(); //ADC_off(); // takes care of itself -- cgit v1.2.3