summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--digital/avr/modules/motor/output/output.h9
-rw-r--r--digital/avr/modules/motor/output/output.txt4
-rw-r--r--digital/avr/modules/motor/output/pwm_ocr/output_pwm_ocr.avr.c11
3 files changed, 22 insertions, 2 deletions
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