From 11dcf9a380ac98b8cb9f25c61494b9ffba5780c6 Mon Sep 17 00:00:00 2001 From: Guillaume Chevillot Date: Thu, 6 Mar 2008 09:32:45 +0100 Subject: Add support of right side --- analog/motor-power-avr/src/mp_pwm_R_.c | 206 +++++++++++++++++++++++++++++++++ 1 file changed, 206 insertions(+) create mode 100644 analog/motor-power-avr/src/mp_pwm_R_.c (limited to 'analog/motor-power-avr/src/mp_pwm_R_.c') diff --git a/analog/motor-power-avr/src/mp_pwm_R_.c b/analog/motor-power-avr/src/mp_pwm_R_.c new file mode 100644 index 00000000..5e2a4ea2 --- /dev/null +++ b/analog/motor-power-avr/src/mp_pwm_R_.c @@ -0,0 +1,206 @@ +/* "mp_pwm_R_.c" + * this file contains routines for managing the _R_ channel of mp board + * the command sed -e 's/_R_/_R_/g' can be used for generating the _R_ file + */ + +#include "mp_pwm_LR_.h" +#include "mp_pwm_R_.h" +#include "io.h" + +// static variables +static uint8_t state_R_; +static uint8_t state_R_cmd; +static uint8_t pwm_R_; + +// Le PC, afin de faire le saut calculé +//#define PC PC_REG + +// init +void init_pwm_R_ (void) { + state_R_cmd = CMD_STATE_HIGH_Z; + pwm_R_ = 0x00; + + // Set outputs to 0 (ie HIGH_Z) + _R_AL_0; + _R_AH_0; + _R_BL_0; + _R_BH_0; + + // status LEDs + _R_LED0_0; + _R_LED1_0; + + // Set IOs as outputs + _R_ACTIVATE_OUTPUTS; +} + +// PWM rising edge on timer overflow IT +ISR(OVF_R_vect) { + // programs the state which is ordered by the core code + state_R_ = state_R_cmd; + + // the falling of the other side may have delayed a few our IT + OCR_R_ = pwm_R_; + + //PC = PC + state_R_; // j'aurais bien aimé faire un calculated jump + + switch (state_R_) + { + case CMD_STATE_DIR_0: + // dir 0 + //rise_R_label0: + _R_BH_0; + _R_BL_1; + _R_AL_0; + _R_AH_1; + sei(); // set back interrupts + + // Display CMD_STATE on LEDs + _R_LED0_1; + _R_LED1_0; + + break; + + case CMD_STATE_DIR_1: + // dir 1 + //org rise_R_label0 + 0x10 + _R_AH_0; + _R_AL_1; + _R_BL_0; + _R_BH_1; + sei(); // set back interrupts + + // Display CMD_STATE on LEDs + _R_LED0_0; + _R_LED1_1; + + break; + + case CMD_STATE_BRAKE: + // switch to forced low steady state + //org rise_R_label0 + 0x20 + _R_AH_0; + _R_AL_1; + _R_BH_0; + _R_BL_1; + sei(); // set back interrupts + + // Display CMD_STATE on LEDs + _R_LED0_0; + _R_LED1_0; + + break; + + case CMD_STATE_HIGH_Z: + default: + // switch to high impedance steady state + //org rise_R_label0 + 0x30 + _R_AL_0; + _R_AH_0; + _R_BL_0; + _R_BH_0; + sei(); // set back interrupts + + // Display CMD_STATE on LEDs + _R_LED0_1; + _R_LED1_1; + + break; + + } +} + +// PWM falling edge on timer compare IT +ISR(COMP_R_vect) { + // PC = PC + state_R_; TODO :saut calculé ? + + switch (state_R_) + { + case CMD_STATE_DIR_0: + // in the case we are in 0x00 direction + //fall_R_label0: + _R_AH_0; + _R_AL_1; + sei(); // set back interrupts + + // Display CMD_STATE on LEDs + _R_LED0_0; + _R_LED1_0; + + break; + + case CMD_STATE_DIR_1: + // in the case we are in 0x10 direction + //org fall_R_label0 + 0x10 + _R_BH_0; + _R_BL_1; + sei(); // set back interrupts + + // Display CMD_STATE on LEDs + _R_LED0_0; + _R_LED1_0; + + break; + + case CMD_STATE_BRAKE: + // forced low + //org fall_R_label0 + 0x20 + sei(); // set back interrupts + break; + + case CMD_STATE_HIGH_Z: + default: + // left high Z + //org fall_R_label0 + 0x30 + sei(); // set back interrupts + break; + } +} + +// overcurrent detected by comparators +ISR(ILIM_R_vect) { + _R_AL_0; + _R_AH_0; + _R_BL_0; + _R_BH_0; + sei(); // set back interrupts + // following line orders to keep high Z state when faling edge will arrive + state_R_ = CMD_STATE_HIGH_Z; + return; +} + +// starts the motor +void start_motor_R_ (uint8_t pwmspeed, uint8_t direction) { + // checking direction + if (direction) + { + state_R_cmd = CMD_STATE_DIR_1; + } + else + { + state_R_cmd = CMD_STATE_DIR_0; + } + + // setting pwm value + if (pwmspeed == 0) + {// brake + state_R_cmd = CMD_STATE_BRAKE; + pwm_R_ = 0; + } + else + { + // adding offset + pwmspeed = pwmspeed + PWM_OFFSET_LR_; + + // clamp the value + UTILS_BOUND(pwmspeed, PWM_MIN_LR_, PWM_MAX_LR_); + + // Apply the value + pwm_R_ = pwmspeed; + } +} + +// puts motor in high Z +void stop_motor_R_ (void) { + state_R_ = CMD_STATE_HIGH_Z; +} -- cgit v1.2.3