From 6aa0c014072a6f1bc9decd4c1ed73a8eced50018 Mon Sep 17 00:00:00 2001 From: Nicolas Schodet Date: Thu, 12 Apr 2012 01:00:56 +0200 Subject: digital/avr/modules/motor/output: add brake control --- digital/avr/modules/motor/output/output.h | 9 +++++++++ digital/avr/modules/motor/output/output.txt | 4 ++++ digital/avr/modules/motor/output/pwm_ocr/output_pwm_ocr.avr.c | 11 +++++++++-- 3 files changed, 22 insertions(+), 2 deletions(-) (limited to 'digital') diff --git a/digital/avr/modules/motor/output/output.h b/digital/avr/modules/motor/output/output.h index a2b19b69..9de2e1d9 100644 --- a/digital/avr/modules/motor/output/output.h +++ b/digital/avr/modules/motor/output/output.h @@ -41,6 +41,8 @@ struct output_t int16_t max; /** Minimum value (dead zone). */ int16_t min; + /** Engage brake if supported. */ + uint8_t brake; /** Reverse this output. */ uint8_t reverse; }; @@ -54,6 +56,13 @@ output_init (uint8_t index, output_t *output); void output_set (output_t *output, int16_t value); +/** Engage or not brake. */ +extern inline void +output_brake (output_t *output, uint8_t brake) +{ + output->brake = brake; +} + /** Set output reverse flag. */ extern inline void output_set_reverse (output_t *output, uint8_t reverse) diff --git a/digital/avr/modules/motor/output/output.txt b/digital/avr/modules/motor/output/output.txt index e63ca61a..7ab24aa5 100644 --- a/digital/avr/modules/motor/output/output.txt +++ b/digital/avr/modules/motor/output/output.txt @@ -25,6 +25,10 @@ filter value (saturation with `max`, dead zone with `min`, optional negation if `reverse` is set) and store it for next update. Each output hardware will reflect this value once `output_update` is called. +You can engage of disengage brake using `output_brake` if the output hardware +supports it. Brake is always engaged once a non zero output value is +requested. It will also be updated once `output_update` is called. + An output can be reversed by setting the `reverse` field before `output_init` is called or using `output_set_reverse` function. diff --git a/digital/avr/modules/motor/output/pwm_ocr/output_pwm_ocr.avr.c b/digital/avr/modules/motor/output/pwm_ocr/output_pwm_ocr.avr.c index 635b9bef..a75e350b 100644 --- a/digital/avr/modules/motor/output/pwm_ocr/output_pwm_ocr.avr.c +++ b/digital/avr/modules/motor/output/pwm_ocr/output_pwm_ocr.avr.c @@ -165,8 +165,7 @@ output_pwm_ocr_update_output (uint8_t index, volatile uint16_t *ocr, else { /* Brake is engaged on first non null value. */ - if (brake_io_port) - *brake_io_port |= _BV (brake_io_bit); + output_pwm_ocr[index].output->brake = 1; /* Convert signed value to sign and absolute value. */ if (value < 0) { @@ -179,6 +178,14 @@ output_pwm_ocr_update_output (uint8_t index, volatile uint16_t *ocr, *ocr = value + AC_OUTPUT_PWM_OCR_OFFSET; } } + /* Update brake. */ + if (brake_io_port) + { + if (output_pwm_ocr[index].output->brake) + *brake_io_port |= _BV (brake_io_bit); + else + *brake_io_port &= ~_BV (brake_io_bit); + } } void -- cgit v1.2.3