Fix for PWM output found by testing against FPGA shield

Two issues:
* Downcasting too early
* Potential for a uint32_t overflow in an intermediate calculation

Passing test requires #11005 to be merged.
pull/11007/head
Steven Cooreman 2019-07-09 22:38:53 +01:00
parent 28eb39c724
commit 476dc6e46a
1 changed files with 2 additions and 2 deletions

View File

@ -342,13 +342,13 @@ void pwmout_pulsewidth(pwmout_t *obj, float seconds)
void pwmout_pulsewidth_ms(pwmout_t *obj, int ms) void pwmout_pulsewidth_ms(pwmout_t *obj, int ms)
{ {
uint16_t width_cycles = (uint16_t) ((REFERENCE_FREQUENCY >> pwm_prescaler_div) * ms) / 1000; uint16_t width_cycles = (uint16_t) (((REFERENCE_FREQUENCY >> pwm_prescaler_div) * ms) / 1000);
TIMER_CompareBufSet(PWM_TIMER, obj->channel, width_cycles); TIMER_CompareBufSet(PWM_TIMER, obj->channel, width_cycles);
} }
void pwmout_pulsewidth_us(pwmout_t *obj, int us) void pwmout_pulsewidth_us(pwmout_t *obj, int us)
{ {
uint16_t width_cycles = (uint16_t) ((REFERENCE_FREQUENCY >> pwm_prescaler_div) * us) / 1000000; uint16_t width_cycles = (uint16_t) (((uint64_t)(REFERENCE_FREQUENCY >> pwm_prescaler_div) * (uint64_t)us) / 1000000UL);
TIMER_CompareBufSet(PWM_TIMER, obj->channel, width_cycles); TIMER_CompareBufSet(PWM_TIMER, obj->channel, width_cycles);
} }