Updated for the next revision of the motor board
MotorShield.cpp@8:e8985e8e9146, 2022-09-16 (annotated)
- Committer:
- adimmit
- Date:
- Fri Sep 16 01:20:50 2022 +0000
- Revision:
- 8:e8985e8e9146
- Parent:
- 7:e3a2ade56b79
updated for the new board;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
elijahsj | 0:f2ede00aed8a | 1 | /* Library to interface with 2.74 Motor Shield |
elijahsj | 3:2f46953e7c8b | 2 | ** Uses low level HAL libraries to enable high speed PWM |
elijahsj | 4:2b45973bdc67 | 3 | ** Use as follows: |
elijahsj | 4:2b45973bdc67 | 4 | ** - Create shield object and specify PWM period for the motors |
elijahsj | 4:2b45973bdc67 | 5 | ** - Set the duty cycle and direction for each motor |
elijahsj | 0:f2ede00aed8a | 6 | */ |
elijahsj | 0:f2ede00aed8a | 7 | |
elijahsj | 0:f2ede00aed8a | 8 | #include "mbed.h" |
elijahsj | 0:f2ede00aed8a | 9 | #include "MotorShield.h" |
elijahsj | 1:4c3c2b7337a6 | 10 | #include "HardwareSetup.h" |
elijahsj | 1:4c3c2b7337a6 | 11 | |
adimmit | 8:e8985e8e9146 | 12 | //MotorA pins |
adimmit | 8:e8985e8e9146 | 13 | DigitalOut enableA(PG_7); |
adimmit | 8:e8985e8e9146 | 14 | DigitalOut disableA(PG_4); |
adimmit | 8:e8985e8e9146 | 15 | //MotorB pins |
adimmit | 8:e8985e8e9146 | 16 | DigitalOut enableB(PE_4); |
adimmit | 8:e8985e8e9146 | 17 | DigitalOut disableB(PE_2); |
adimmit | 8:e8985e8e9146 | 18 | //MotorC pins |
adimmit | 8:e8985e8e9146 | 19 | DigitalOut enableC(PB_13); |
adimmit | 8:e8985e8e9146 | 20 | DigitalOut disableC(PB_4); |
adimmit | 8:e8985e8e9146 | 21 | //MotorD pins |
adimmit | 8:e8985e8e9146 | 22 | DigitalOut enableD(PA_14); |
adimmit | 8:e8985e8e9146 | 23 | DigitalOut disableD(PA_15); |
adimmit | 8:e8985e8e9146 | 24 | |
adimmit | 8:e8985e8e9146 | 25 | |
elijahsj | 3:2f46953e7c8b | 26 | MotorShield::MotorShield(int periodTicks) { |
elijahsj | 3:2f46953e7c8b | 27 | periodTickVal = periodTicks; |
elijahsj | 0:f2ede00aed8a | 28 | init(); |
elijahsj | 0:f2ede00aed8a | 29 | } |
elijahsj | 0:f2ede00aed8a | 30 | |
elijahsj | 0:f2ede00aed8a | 31 | void MotorShield::init() { |
elijahsj | 0:f2ede00aed8a | 32 | /** Initial config for the STM32H743 **/ |
elijahsj | 1:4c3c2b7337a6 | 33 | |
elijahsj | 3:2f46953e7c8b | 34 | initHardware(periodTickVal); // Setup PWM |
elijahsj | 3:2f46953e7c8b | 35 | wait_us(100); |
adimmit | 8:e8985e8e9146 | 36 | |
adimmit | 8:e8985e8e9146 | 37 | //enable the motor A driver |
adimmit | 8:e8985e8e9146 | 38 | enableA.write(1); |
adimmit | 8:e8985e8e9146 | 39 | disableA.write(0); |
adimmit | 8:e8985e8e9146 | 40 | //enable the motor B driver |
adimmit | 8:e8985e8e9146 | 41 | enableB.write(1); |
adimmit | 8:e8985e8e9146 | 42 | disableB.write(0); |
adimmit | 8:e8985e8e9146 | 43 | //enable the motor C driver |
adimmit | 8:e8985e8e9146 | 44 | enableC.write(1); |
adimmit | 8:e8985e8e9146 | 45 | disableC.write(0); |
adimmit | 8:e8985e8e9146 | 46 | //enable the motor D driver |
adimmit | 8:e8985e8e9146 | 47 | enableD.write(1); |
adimmit | 8:e8985e8e9146 | 48 | disableD.write(0); |
adimmit | 8:e8985e8e9146 | 49 | wait_us(100); |
elijahsj | 0:f2ede00aed8a | 50 | } |
elijahsj | 0:f2ede00aed8a | 51 | |
elijahsj | 5:d2dffc88e94d | 52 | void MotorShield::motorAWrite(float duty_cycle, int direction) { |
elijahsj | 5:d2dffc88e94d | 53 | int tick = (int)(periodTickVal * duty_cycle); |
elijahsj | 5:d2dffc88e94d | 54 | |
elijahsj | 3:2f46953e7c8b | 55 | if (direction){ |
elijahsj | 5:d2dffc88e94d | 56 | |
elijahsj | 5:d2dffc88e94d | 57 | TIM15->CCR2 = tick; |
adimmit | 8:e8985e8e9146 | 58 | TIM15->CCR1 = tick; |
elijahsj | 3:2f46953e7c8b | 59 | } |
elijahsj | 3:2f46953e7c8b | 60 | else { |
elijahsj | 5:d2dffc88e94d | 61 | TIM15->CCR2 = 0; |
adimmit | 8:e8985e8e9146 | 62 | TIM15->CCR1 = tick; |
elijahsj | 3:2f46953e7c8b | 63 | } |
elijahsj | 3:2f46953e7c8b | 64 | |
elijahsj | 0:f2ede00aed8a | 65 | } |
elijahsj | 0:f2ede00aed8a | 66 | |
elijahsj | 5:d2dffc88e94d | 67 | void MotorShield::motorBWrite(float duty_cycle, int direction) { |
elijahsj | 5:d2dffc88e94d | 68 | int tick = (int)(periodTickVal * duty_cycle); |
elijahsj | 5:d2dffc88e94d | 69 | |
elijahsj | 3:2f46953e7c8b | 70 | if (direction){ |
elijahsj | 5:d2dffc88e94d | 71 | TIM12->CCR2 = tick; |
adimmit | 8:e8985e8e9146 | 72 | TIM12->CCR1 = tick; |
elijahsj | 3:2f46953e7c8b | 73 | } |
elijahsj | 3:2f46953e7c8b | 74 | else { |
elijahsj | 5:d2dffc88e94d | 75 | TIM12->CCR2 = 0; |
elijahsj | 5:d2dffc88e94d | 76 | TIM12->CCR1 = tick; |
elijahsj | 3:2f46953e7c8b | 77 | } |
elijahsj | 5:d2dffc88e94d | 78 | |
elijahsj | 0:f2ede00aed8a | 79 | } |
elijahsj | 0:f2ede00aed8a | 80 | |
elijahsj | 5:d2dffc88e94d | 81 | void MotorShield::motorCWrite(float duty_cycle, int direction) { |
elijahsj | 5:d2dffc88e94d | 82 | int tick = (int)(periodTickVal * duty_cycle); |
elijahsj | 5:d2dffc88e94d | 83 | |
elijahsj | 3:2f46953e7c8b | 84 | if (direction){ |
adimmit | 8:e8985e8e9146 | 85 | TIM13->CCR1 = tick; |
elijahsj | 5:d2dffc88e94d | 86 | TIM14->CCR1 = tick; |
elijahsj | 0:f2ede00aed8a | 87 | } |
elijahsj | 3:2f46953e7c8b | 88 | else { |
elijahsj | 5:d2dffc88e94d | 89 | TIM13->CCR1 = tick; |
elijahsj | 5:d2dffc88e94d | 90 | TIM14->CCR1 = 0; |
elijahsj | 0:f2ede00aed8a | 91 | } |
elijahsj | 0:f2ede00aed8a | 92 | } |
elijahsj | 5:d2dffc88e94d | 93 | void MotorShield::motorDWrite(float duty_cycle, int direction) { |
elijahsj | 5:d2dffc88e94d | 94 | int tick = (int)(periodTickVal * duty_cycle); |
elijahsj | 5:d2dffc88e94d | 95 | |
elijahsj | 3:2f46953e7c8b | 96 | if (direction){ |
adimmit | 8:e8985e8e9146 | 97 | TIM17->CCR1 = tick; |
elijahsj | 5:d2dffc88e94d | 98 | TIM16->CCR1 = tick; |
elijahsj | 3:2f46953e7c8b | 99 | } |
elijahsj | 3:2f46953e7c8b | 100 | else { |
adimmit | 8:e8985e8e9146 | 101 | TIM17->CCR1 = tick; |
elijahsj | 3:2f46953e7c8b | 102 | TIM16->CCR1 = 0; |
elijahsj | 3:2f46953e7c8b | 103 | } |
elijahsj | 3:2f46953e7c8b | 104 | } |
elijahsj | 3:2f46953e7c8b | 105 | |
elijahsj | 7:e3a2ade56b79 | 106 | uint32_t MotorShield::readCurrentA() { |
elijahsj | 7:e3a2ade56b79 | 107 | return readADC1(0); |
elijahsj | 7:e3a2ade56b79 | 108 | } |
elijahsj | 7:e3a2ade56b79 | 109 | uint32_t MotorShield::readCurrentB() { |
elijahsj | 7:e3a2ade56b79 | 110 | return readADC1(1); |
elijahsj | 7:e3a2ade56b79 | 111 | } |
elijahsj | 7:e3a2ade56b79 | 112 | uint32_t MotorShield::readCurrentC() { |
elijahsj | 7:e3a2ade56b79 | 113 | return readADC2(1); |
elijahsj | 7:e3a2ade56b79 | 114 | } |
elijahsj | 7:e3a2ade56b79 | 115 | uint32_t MotorShield::readCurrentD() { |
elijahsj | 7:e3a2ade56b79 | 116 | return readADC2(0); |
elijahsj | 7:e3a2ade56b79 | 117 | } |
elijahsj | 7:e3a2ade56b79 | 118 | |
elijahsj | 3:2f46953e7c8b | 119 | void MotorShield::changePeriod(int periodTicks){ |
elijahsj | 3:2f46953e7c8b | 120 | periodTickVal = periodTicks; |
elijahsj | 3:2f46953e7c8b | 121 | init(); |
elijahsj | 3:2f46953e7c8b | 122 | } |