diff options
| author | Selene ToyKeeper | 2023-07-08 06:02:27 -0600 |
|---|---|---|
| committer | Selene ToyKeeper | 2023-07-08 06:02:27 -0600 |
| commit | 20e8606889bae219626c23051fe7d74b4a67db12 (patch) | |
| tree | c1521aa9f92d325ca515c42f2a8846880b45ff6e /spaghetti-monster/fsm-adc.c | |
| parent | Fixed spurious voltage warnings in attiny1616 sleep mode. Fixed by SammysHP. (diff) | |
| download | anduril-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.c | 23 |
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]; |
