From 51518f0d4c8f23b1b23bb7342f56a1082adb9ec4 Mon Sep 17 00:00:00 2001 From: Steven Cooreman Date: Mon, 1 Jun 2015 11:37:34 +0200 Subject: [PATCH] Failed to account for PWM prescaler on high frequencies. --- .../targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c index ae0f981a16..f956f57533 100644 --- a/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c +++ b/libraries/mbed/targets/hal/TARGET_Silicon_Labs/TARGET_EFM32/pwmout_api.c @@ -139,7 +139,7 @@ void pwmout_write(pwmout_t *obj, float value) value = 1; } - float pulse_period_in_s = obj->period_cycles / (float) pwm_clockfreq; + float pulse_period_in_s = obj->period_cycles / ((float) (pwm_clockfreq >> pwm_prescaler_div)); pwmout_pulsewidth(obj, value * pulse_period_in_s); } @@ -192,7 +192,7 @@ void pwmout_period_us(pwmout_t *obj, int us) void pwmout_pulsewidth(pwmout_t *obj, float seconds) { - obj->width_cycles = pwm_clockfreq * seconds; + obj->width_cycles = (uint32_t) (((float) (pwm_clockfreq >> pwm_prescaler_div)) * seconds); TIMER_CompareBufSet(PWM_TIMER, obj->channel, obj->width_cycles); }