From 2e0727532fdc1e9eb5b72188182c7a8a7c4ab3fc Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Mon, 30 Mar 2009 00:20:05 +0200 Subject: * digital/asserv/src/asserv: - use a structure for PWM state. --- digital/asserv/src/asserv/pwm.h | 37 ++++++++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'digital/asserv/src/asserv/pwm.h') diff --git a/digital/asserv/src/asserv/pwm.h b/digital/asserv/src/asserv/pwm.h index fd141df7..7877d4eb 100644 --- a/digital/asserv/src/asserv/pwm.h +++ b/digital/asserv/src/asserv/pwm.h @@ -30,7 +30,19 @@ * (rounding after shifting bug). */ #define PWM_MAX 0x3f0 -extern int16_t pwm_left, pwm_right, pwm_aux0; +/** PWM control state. */ +struct pwm_t +{ + /** Current PWM value. */ + int16_t cur; + /** Maximum value. */ + int16_t max; + /** Minimum value (dead zone). */ + int16_t min; +}; + +extern struct pwm_t pwm_left, pwm_right, pwm_aux0; + extern uint8_t pwm_reverse; /** Define maximum PWM value for each output. */ @@ -55,12 +67,23 @@ extern uint8_t pwm_reverse; #define PWM_REVERSE_BIT_pwm_right _BV (1) #define PWM_REVERSE_BIT_pwm_aux0 _BV (2) -/** Set pwm value and saturate. */ -#define PWM_SET(pwm, value) \ - do { \ - (pwm) = (value); \ - UTILS_BOUND ((pwm), -PWM_MAX_FOR (pwm), PWM_MAX_FOR (pwm)); \ - } while (0) +/** State init macro. */ +#define PWM_INIT_FOR(x) \ + { 0, PWM_MAX_FOR (x), PWM_MIN_FOR (x) } + +/** Set PWM value. */ +static inline void +pwm_set (struct pwm_t *pwm, int16_t value) +{ + if (value > pwm->max) + pwm->cur = pwm->max; + else if (value < -pwm->max) + pwm->cur = -pwm->max; + else if (value > -pwm->min && value < pwm->min) + pwm->cur = 0; + else + pwm->cur = value; +} void pwm_init (void); -- cgit v1.2.3