From f042d7a4d7197d87798bc9727e9df094a3edd7c1 Mon Sep 17 00:00:00 2001 From: Damien George Date: Mon, 29 Sep 2014 14:15:01 +0100 Subject: [PATCH] stmhal: Fix edge case for timer PWM of 100%. Also improve precision of calculating PWM percent in integer mode. Also update teensy with edge case fix. --- stmhal/timer.c | 9 ++++----- teensy/timer.c | 4 ++-- 2 files changed, 6 insertions(+), 7 deletions(-) diff --git a/stmhal/timer.c b/stmhal/timer.c index 026d11c815..14ef3cc4a9 100644 --- a/stmhal/timer.c +++ b/stmhal/timer.c @@ -326,7 +326,7 @@ STATIC uint32_t compute_pwm_value_from_percent(uint32_t period, mp_obj_t percent STATIC mp_obj_t compute_percent_from_pwm_value(uint32_t period, uint32_t cmp) { #if MICROPY_PY_BUILTINS_FLOAT float percent; - if (cmp > period) { + if (cmp >= period) { percent = 100.0; } else { percent = (float)cmp * 100.0 / ((float)period); @@ -334,11 +334,10 @@ STATIC mp_obj_t compute_percent_from_pwm_value(uint32_t period, uint32_t cmp) { return mp_obj_new_float(percent); #else mp_int_t percent; - if (cmp > period) { + if (cmp >= period) { percent = 100; - } else if (period > MAX_PERIOD_DIV_100) { - // We divide the top and bottom by 128, and then do the math. - percent = (cmp / 128) * 100 / (period / 128); + } else if (cmp > MAX_PERIOD_DIV_100) { + percent = cmp / (period / 100); } else { percent = cmp * 100 / period; } diff --git a/teensy/timer.c b/teensy/timer.c index d7892039a5..81450698b3 100644 --- a/teensy/timer.c +++ b/teensy/timer.c @@ -175,7 +175,7 @@ STATIC uint32_t compute_pwm_value_from_percent(uint32_t period, mp_obj_t percent STATIC mp_obj_t compute_percent_from_pwm_value(uint32_t period, uint32_t cmp) { #if MICROPY_PY_BUILTINS_FLOAT float percent = (float)cmp * 100.0 / (float)period; - if (cmp > period) { + if (cmp >= period) { percent = 100.0; } else { percent = (float)cmp * 100.0 / (float)period; @@ -183,7 +183,7 @@ STATIC mp_obj_t compute_percent_from_pwm_value(uint32_t period, uint32_t cmp) { return mp_obj_new_float(percent); #else mp_int_t percent; - if (cmp > period) { + if (cmp >= period) { percent = 100; } else { percent = cmp * 100 / period;