summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier Ortigues <o.ortigues@gmail.com>2018-02-23 15:41:51 +0100
committerDamien George <damien.p.george@gmail.com>2018-03-05 11:39:44 +1100
commitb691aa0aaeb9f55f96d9ed39f214f0a9e555c94d (patch)
treed33d3c01099173eff3e10ffcfcbbeec9f3f2edb3
parent0acf868bb72e0b94683f447baa367999d401b770 (diff)
esp8266/esppwm: Always start timer to avoid glitch from full to nonfull.
The PWM at full value was not considered as an "active" channel so if no other channel was used the timer used to mange PWM was not started. So when another duty value was set the PWM timer restarted and there was a visible glitch when driving LEDs. Such a glitch can be seen with the following code (assuming active-low LED on pin 0): p = machine.PWM(machine.Pin(0)) p.duty(1023) # full width, LED is off p.duty(1022) # LED flashes brightly then goes dim This patch fixes the glitch.
-rw-r--r--ports/esp8266/esppwm.c13
1 files changed, 3 insertions, 10 deletions
diff --git a/ports/esp8266/esppwm.c b/ports/esp8266/esppwm.c
index f56eafc1b..33eaf3b9a 100644
--- a/ports/esp8266/esppwm.c
+++ b/ports/esp8266/esppwm.c
@@ -190,11 +190,8 @@ pwm_start(void)
// start
gpio_output_set(local_single[0].gpio_set, local_single[0].gpio_clear, pwm_gpio, 0);
- // yeah, if all channels' duty is 0 or 255, don't need to start timer, otherwise start...
- if (*local_channel != 1) {
- pwm_timer_down = 0;
- RTC_REG_WRITE(FRC1_LOAD_ADDRESS, local_single[0].h_time);
- }
+ pwm_timer_down = 0;
+ RTC_REG_WRITE(FRC1_LOAD_ADDRESS, local_single[0].h_time);
}
if (pwm_toggle == 1) {
@@ -319,11 +316,7 @@ pwm_tim1_intr_handler(void *dummy)
pwm_current_channel = 0;
- if (*pwm_channel != 1) {
- RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time);
- } else {
- pwm_timer_down = 1;
- }
+ RTC_REG_WRITE(FRC1_LOAD_ADDRESS, pwm_single[pwm_current_channel].h_time);
} else {
gpio_output_set(pwm_single[pwm_current_channel].gpio_set,
pwm_single[pwm_current_channel].gpio_clear,