summaryrefslogtreecommitdiffhomepage
path: root/analog/motor-power-avr/src/mp_pwm_L_.c
diff options
context:
space:
mode:
Diffstat (limited to 'analog/motor-power-avr/src/mp_pwm_L_.c')
-rw-r--r--analog/motor-power-avr/src/mp_pwm_L_.c175
1 files changed, 175 insertions, 0 deletions
diff --git a/analog/motor-power-avr/src/mp_pwm_L_.c b/analog/motor-power-avr/src/mp_pwm_L_.c
new file mode 100644
index 00000000..b7ef3732
--- /dev/null
+++ b/analog/motor-power-avr/src/mp_pwm_L_.c
@@ -0,0 +1,175 @@
+#include "mp_pwm_LR_.h"
+#include "mp_pwm_L_.h"
+
+
+
+// Le PC, afin de faire le saut calculé
+#define PC PC_REG
+
+// Les sorties de contrôdu pont en H
+// A/B : branche du pont
+// H/L : High ou Low
+// _L_ : pont Left
+#define _L_AL // TODO ! à conpléter !
+#define _L_AH // TODO ! à conpléter !
+#define _L_BL // TODO ! à conpléter !
+#define _L_BH // TODO ! à conpléter !
+
+// static variables
+static uint8_t state_L_;
+static uint8_t state_L_cmd = 0x03;
+static uint8_t pwm_L_;
+
+
+// this file contains routines for managing the _L_ channel of mp board
+// the command sed -e 's/_L_/_R_/g' can be used for generating the _R_ file
+//
+// rising edge = timer overflow = TOV interrupt (TODO : à programmer)
+void rise_L_ (void) {
+ // programs the state which is ordered by the core code
+ state_L_ = state_L_cmd;
+
+ // the falling of the other side may have delayed a few our IT
+ OCR_L_ = pwm_L_ + Timer_L_; // TODO: OCR_L_value shall be > than x%
+
+ //PC = PC + state_L_; // j'aurais bien aimé faire un calculated jump
+
+ switch (state_L_)
+ {
+ case 0x00:
+ // dir 0
+ //rise_L_label0:
+ _L_BH = 0;
+ _L_BL = 1;
+ _L_AL = 0;
+ _L_AH = 1;
+ sei(); // set back interrupts
+ return;
+ break;
+
+ case 0x01:
+ // dir 1
+ //org rise_L_label0 + 0x10
+ _L_AH = 0;
+ _L_AL = 1;
+ _L_BL = 0;
+ _L_BH = 1;
+ sei(); // set back interrupts
+ return;
+ break;
+
+ case 0x02:
+ // switch to forced low steady state
+ //org rise_L_label0 + 0x20
+ _L_AH = 0;
+ _L_AL = 1;
+ _L_BH = 0;
+ _L_BL = 1;
+ sei(); // set back interrupts
+ return;
+ break;
+
+ case 0x03:
+ // switch to high impedance steady state
+ //org rise_L_label0 + 0x30
+ _L_AL = 0;
+ _L_AH = 0;
+ _L_BL = 0;
+ _L_BH = 0;
+ sei(); // set back interrupts
+ return;
+ break;
+
+ }
+
+}
+
+// falling edge = timer crossing OCR : OCn interrupt (TODO : à programmer)
+void fall_L_ (void) {
+ // PC = PC + state_L_; TODO :saut calculé ?
+
+ switch (state_L_)
+ {
+ case 0x00:
+ // in the case we are in 0x00 direction
+ _L_AH = 0;
+ _L_AL = 1;
+ sei(); // set back interrupts
+ return;
+ break;
+
+ case 0x01:
+ // in the case we are in 0x10 direction
+ //org fall_L_label0 + 0x10
+ _L_BH = 0;
+ _L_BL = 1;
+ sei(); // set back interrupts
+ return;
+ break;
+
+ case 0x02:
+ // forced low
+ //org fall_L_label0 + 0x20
+ sei(); // set back interrupts
+ return;
+ break;
+
+ case 0x03:
+ // left high Z
+ //org fall_L_label0 + 0x30
+ sei(); // set back interrupts
+ return;
+ break;
+ }
+}
+
+
+// overcurrent detected by comparators
+void ovc_L_ (void) {
+ _L_AL = 0;
+ _L_AH = 0;
+ _L_BL = 0;
+ _L_BH = 0;
+ sei(); // set back interrupts
+ // following line orders to keep high Z state when faling edge will arrive
+ state_L_ = 0x30;
+ return;
+}
+
+// starts the motor
+void start_motor_L_ (uint8_t pwmspeed, uint8_t direction) {
+ // checking direction
+ if (direction)
+ {
+ state_L_cmd = 0x10;
+ }
+ else
+ {
+ state_L_cmd = 0x00;
+ }
+
+ // setting pwm value
+ if (pwmspeed == 0)
+ {// brake
+ state_L_cmd = 0x20;
+ pwm_L_ = 0;
+ }
+ else if (pwmspeed > PWM_MAX_LR_)
+ {// over PWM_MAX_LR_
+ pwm_L_ = PWM_MAX_LR_ + PWM_OFFSET_LR_;
+ }
+ else if (pwmspeed < PWM_MIN_LR_)
+ {// under PWM_MIN_LR_
+ pwm_L_ = PWM_MIN_LR_ + PWM_OFFSET_LR_;
+ }
+ else
+ {// correct PWM value
+ pwm_L_ = pwmspeed + PWM_OFFSET_LR_;
+ }
+}
+
+// puts motor in high Z
+void stop_motor_L_ (void) {
+ state_L_ = 0x30;
+}
+