diff options
| author | Selene ToyKeeper | 2021-12-08 15:31:00 -0700 |
|---|---|---|
| committer | Selene ToyKeeper | 2021-12-08 15:31:00 -0700 |
| commit | 3f6a9fe82d892a1fca198169a7d3ed7bba58f902 (patch) | |
| tree | d03923dd8133400648f940c35d42eb6bac72ca92 /spaghetti-monster/fsm-adc.c | |
| parent | fixed Ramp 3H with Anduril 2 style turbo (diff) | |
| download | anduril-3f6a9fe82d892a1fca198169a7d3ed7bba58f902.tar.gz anduril-3f6a9fe82d892a1fca198169a7d3ed7bba58f902.tar.bz2 anduril-3f6a9fe82d892a1fca198169a7d3ed7bba58f902.zip | |
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)
Diffstat (limited to 'spaghetti-monster/fsm-adc.c')
| -rw-r--r-- | spaghetti-monster/fsm-adc.c | 22 |
1 files changed, 20 insertions, 2 deletions
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 |
