aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster/fsm-adc.c
diff options
context:
space:
mode:
authorSelene ToyKeeper2021-12-08 15:31:00 -0700
committerSelene ToyKeeper2021-12-08 15:31:00 -0700
commit3f6a9fe82d892a1fca198169a7d3ed7bba58f902 (patch)
treed03923dd8133400648f940c35d42eb6bac72ca92 /spaghetti-monster/fsm-adc.c
parentfixed Ramp 3H with Anduril 2 style turbo (diff)
downloadanduril-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 '')
-rw-r--r--spaghetti-monster/fsm-adc.c22
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