From c513f5ade8a605721f0d9c859b1ba0a1f3949963 Mon Sep 17 00:00:00 2001 From: px4dev Date: Sun, 5 Aug 2012 16:31:04 -0700 Subject: Adjust some scaling factors for more precise PWM output. --- nuttx/configs/px4fmu/src/up_pwm_servo.c | 6 ++++-- nuttx/configs/px4io/src/drv_pwm_servo.c | 6 ++++-- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'nuttx') diff --git a/nuttx/configs/px4fmu/src/up_pwm_servo.c b/nuttx/configs/px4fmu/src/up_pwm_servo.c index 05daf1e97..adb9b5030 100644 --- a/nuttx/configs/px4fmu/src/up_pwm_servo.c +++ b/nuttx/configs/px4fmu/src/up_pwm_servo.c @@ -164,10 +164,10 @@ pwm_timer_init(unsigned timer) rDCR(timer) = 0; /* configure the timer to free-run at 1MHz */ - rPSC(timer) = pwm_timers[timer].clock_freq / 1000000; + rPSC(timer) = (pwm_timers[timer].clock_freq / 1000000) - 1; /* and update at the desired rate */ - rARR(timer) = 1000000 / pwm_update_rate; + rARR(timer) = (1000000 / pwm_update_rate) - 1; /* generate an update event; reloads the counter and all registers */ rEGR(timer) = GTIM_EGR_UG; @@ -234,6 +234,8 @@ up_pwm_servo_set(unsigned channel, servo_position_t value) return -1; /* configure the channel */ + if (value > 0) + value--; switch (pwm_channels[channel].timer_channel) { case 1: rCCR1(timer) = value; diff --git a/nuttx/configs/px4io/src/drv_pwm_servo.c b/nuttx/configs/px4io/src/drv_pwm_servo.c index 7f3238da3..4d821cba6 100644 --- a/nuttx/configs/px4io/src/drv_pwm_servo.c +++ b/nuttx/configs/px4io/src/drv_pwm_servo.c @@ -96,10 +96,10 @@ pwm_timer_init(unsigned timer) rDCR(timer) = 0; /* configure the timer to free-run at 1MHz */ - rPSC(timer) = cfg->timers[timer].clock_freq / 1000000; + rPSC(timer) = (cfg->timers[timer].clock_freq / 1000000) -1; /* and update at the desired rate */ - rARR(timer) = 1000000 / cfg->update_rate; + rARR(timer) = (1000000 / cfg->update_rate) - 1; /* generate an update event; reloads the counter and all registers */ rEGR(timer) = GTIM_EGR_UG; @@ -166,6 +166,8 @@ pwm_channel_set(unsigned channel, servo_position_t value) return; /* configure the channel */ + if (value > 0) + value--; switch (cfg->channels[channel].timer_channel) { case 1: rCCR1(timer) = value; -- cgit v1.2.3