aboutsummaryrefslogtreecommitdiff
path: root/spaghetti-monster/fsm-adc.c
diff options
context:
space:
mode:
authorSelene ToyKeeper2023-07-08 06:02:27 -0600
committerSelene ToyKeeper2023-07-08 06:02:27 -0600
commit20e8606889bae219626c23051fe7d74b4a67db12 (patch)
treec1521aa9f92d325ca515c42f2a8846880b45ff6e /spaghetti-monster/fsm-adc.c
parentFixed spurious voltage warnings in attiny1616 sleep mode. Fixed by SammysHP. (diff)
downloadanduril-20e8606889bae219626c23051fe7d74b4a67db12.tar.gz
anduril-20e8606889bae219626c23051fe7d74b4a67db12.tar.bz2
anduril-20e8606889bae219626c23051fe7d74b4a67db12.zip
Partially fixed oscillating aux LED voltage colors while asleep.
Amplitude is smaller, frequency is slower, but it can still happen sometimes at color boundaries on models with bright aux LEDs on high mode. (because that's not a measurement error, it's actually oscillating voltage) The Wurkkos TS11 in particular tends to bounce when crossing certain color boundaries, because the aux LEDs are bright and change the voltage enough to push it back and forth across the boundary. Also sped up voltage measurement during first few seconds after turning off, to compensate for slowdown caused by the lowpass filter... while slowing down measurements afterward to slow the oscillation. I tried a bunch of different methods, spanning a range of "stable but slow" to "fast but unstable", and kept code clauses for three representative methods. The one enabled by default is the best compromise I found to reduce the issue as much as possible while keeping readings reasonably responsive.
Diffstat (limited to 'spaghetti-monster/fsm-adc.c')
-rw-r--r--spaghetti-monster/fsm-adc.c23
1 files changed, 14 insertions, 9 deletions
diff --git a/spaghetti-monster/fsm-adc.c b/spaghetti-monster/fsm-adc.c
index d11cca8..31b250f 100644
--- a/spaghetti-monster/fsm-adc.c
+++ b/spaghetti-monster/fsm-adc.c
@@ -323,18 +323,23 @@ static inline void ADC_voltage_handler() {
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];
+ uint16_t r = adc_raw[0];
+ uint16_t s = 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; }
+ // fixed-rate lowpass, stable but very slow
+ // (move by only 0.5 ADC units per measurement, 1 ADC unit = 64)
+ if (r < s) { s -= 32; }
+ if (r > s) { s += 32; }
+ #elif 1
+ // 1/8th proportional lowpass, faster but less stable
+ int16_t diff = (r/8) - (s/8);
+ s += diff;
#else
- // weighted lowpass, faster but less stable
- v = (m>>1) + (v>>1);
+ // 50% proportional lowpass, fastest but least stable
+ s = (r>>1) + (s>>1);
#endif
- adc_smooth[0] = v;
- measurement = v;
+ adc_smooth[0] = s;
+ measurement = s;
}
#endif
else measurement = adc_smooth[0];