diff options
| author | Selene ToyKeeper | 2021-08-16 04:56:54 -0600 |
|---|---|---|
| committer | Selene ToyKeeper | 2021-08-16 04:56:54 -0600 |
| commit | efbdb48966a7676d0f3158f89f5fe9205e6c333a (patch) | |
| tree | b6fd2350bd8c3e1019ae67351a10587381944833 | |
| parent | set KR4 default floor higher at Hank's request, (diff) | |
| download | anduril-efbdb48966a7676d0f3158f89f5fe9205e6c333a.tar.gz anduril-efbdb48966a7676d0f3158f89f5fe9205e6c333a.tar.bz2 anduril-efbdb48966a7676d0f3158f89f5fe9205e6c333a.zip | |
made dynamic PWM phase-correct; replaced brute-force phase reset to avoid flickering
(I didn't see any flickering on my lights, but SammysHP reported it was visible)
Diffstat (limited to '')
| -rw-r--r-- | spaghetti-monster/fsm-ramping.c | 41 |
1 files changed, 22 insertions, 19 deletions
diff --git a/spaghetti-monster/fsm-ramping.c b/spaghetti-monster/fsm-ramping.c index 503f90f..1a08149 100644 --- a/spaghetti-monster/fsm-ramping.c +++ b/spaghetti-monster/fsm-ramping.c @@ -153,30 +153,33 @@ void set_level(uint8_t level) { #endif // ifdef USE_TINT_RAMPING #ifdef USE_DYN_PWM + uint16_t top = PWM_GET(pwm_tops, level); + #ifdef PWM1_CNT + // wait to ensure compare match won't be missed + // (causes visible flickering when missed, because the counter + // goes all the way to 65535 before returning) + // (see attiny1634 reference manual page 103 for a warning about + // the timing of changing the TOP value (section 12.8.4)) + // to be safe, allow at least 64 cycles to update TOP + while(PWM1_CNT > (top - 64)) {} + #endif // pulse frequency modulation, a.k.a. dynamic PWM - PWM1_TOP = PWM_GET(pwm_tops, level); + PWM1_TOP = top; + + // repeat for other channels if necessary #ifdef PMW2_TOP - PWM2_TOP = PWM_GET(pwm_tops, level); + #ifdef PWM2_CNT + while(PWM2_CNT > (top - 64)) {} + #endif + PWM2_TOP = top; #endif #ifdef PMW3_TOP - PWM3_TOP = PWM_GET(pwm_tops, level); - #endif - - // reset the phase, to avoid random long pulses - // see attiny1634 reference manual page 103 for a warning about - // the timing of changing the TOP value (section 12.8.4) - // (we don't care about being phase-correct, so the brute-force - // approach can be used to reset it here) - #ifdef PWM1_CNT - PWM1_CNT = 0; - #endif - #ifdef PWM2_CNT - PWM2_CNT = 0; - #endif - #ifdef PWM3_CNT - PWM3_CNT = 0; + #ifdef PWM3_CNT + while(PWM3_CNT > (top - 64)) {} + #endif + PWM3_TOP = top; #endif - #endif + #endif // ifdef USE_DYN_PWM } #endif // ifdef OVERRIDE_SET_LEVEL #ifdef USE_DYNAMIC_UNDERCLOCKING |
