Dual Brushless Motor ESC, 10-62V, up to 50A per motor. Motors ganged or independent, multiple control input methods, cycle-by-cycle current limit, speed mode and torque mode control. Motors tiny to kW. Speed limit and other parameters easily set in firmware. As used in 'The Brushless Brutalist' locomotive - www.jons-workshop.com. See also Model Engineer magazine June-October 2019.
Dependencies: mbed BufferedSerial Servo PCT2075 FastPWM
Update 17th August 2020 Radio control inputs completed
F411RE.h@13:ef7a06fa11de, 2019-09-29 (annotated)
- Committer:
- JonFreeman
- Date:
- Sun Sep 29 16:34:37 2019 +0000
- Revision:
- 13:ef7a06fa11de
Stable code as at end of 2019 running season
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
JonFreeman | 13:ef7a06fa11de | 1 | #include "STM3_ESC.h" |
JonFreeman | 13:ef7a06fa11de | 2 | // Feb 2018 Now using DGD21032 mosfet drivers via 74HC00 pwm gates (low side) - GOOD, works well with auto-tickle of high side drivers |
JonFreeman | 13:ef7a06fa11de | 3 | |
JonFreeman | 13:ef7a06fa11de | 4 | // Jan 2019 Trying to add two Radio Control inputs on PC_14 and PC_15, previously connected to unused LF Xtal. |
JonFreeman | 13:ef7a06fa11de | 5 | // Problem - Appears to conflict with serial port used for comms with controller |
JonFreeman | 13:ef7a06fa11de | 6 | // Earlier efforts to use 'Servo' ports as 'you choose' between I/O failed as pins not capable of use as 'InterruptIn' |
JonFreeman | 13:ef7a06fa11de | 7 | |
JonFreeman | 13:ef7a06fa11de | 8 | // CORRECTION Comms problem with Touch Screen was insufficient pull-up on STM3_ESC opto. Change R12 from 1k to 470R |
JonFreeman | 13:ef7a06fa11de | 9 | |
JonFreeman | 13:ef7a06fa11de | 10 | // Experiment disabling RC inputs to see if clearing serial conflict is possible |
JonFreeman | 13:ef7a06fa11de | 11 | |
JonFreeman | 13:ef7a06fa11de | 12 | |
JonFreeman | 13:ef7a06fa11de | 13 | // Port A -> MotorA, Port B -> MotorB |
JonFreeman | 13:ef7a06fa11de | 14 | const uint16_t |
JonFreeman | 13:ef7a06fa11de | 15 | // This is where port bits get assigned to motor output phase switches. |
JonFreeman | 13:ef7a06fa11de | 16 | // Phases are U, V and W. |
JonFreeman | 13:ef7a06fa11de | 17 | // Each phase uses two bits, one for the low side switch, one for the high side switch. |
JonFreeman | 13:ef7a06fa11de | 18 | //MotorN_port_bits[] = {UL, VL, WL, UH, VH, WH}, // Order must be as shown - 3 low side switches U,V,W followed by 3 high side switches U,V,W |
JonFreeman | 13:ef7a06fa11de | 19 | MotorA_port_bits[] = {0, 6, 4, 1, 7, 8}, // List of port A bits used to drive motor A UL, VL, WL, UH, VH, WH |
JonFreeman | 13:ef7a06fa11de | 20 | MotorB_port_bits[] = {0, 1, 2, 10, 12, 13}, // List of port B bits used to drive motor B UL, VL, WL, UH, VH, WH |
JonFreeman | 13:ef7a06fa11de | 21 | // Using port bit info in the two lines above, the compiler sorts all this into creation of lookup table |
JonFreeman | 13:ef7a06fa11de | 22 | // to provide correct energisation sequencing as motors rotate. |
JonFreeman | 13:ef7a06fa11de | 23 | // You need concern yourself no further about any of this. |
JonFreeman | 13:ef7a06fa11de | 24 | |
JonFreeman | 13:ef7a06fa11de | 25 | |
JonFreeman | 13:ef7a06fa11de | 26 | AUL = (1 << MotorA_port_bits[0]), |
JonFreeman | 13:ef7a06fa11de | 27 | AVL = (1 << MotorA_port_bits[1]), // These are which port bits connect to which mosfet driver |
JonFreeman | 13:ef7a06fa11de | 28 | AWL = (1 << MotorA_port_bits[2]), |
JonFreeman | 13:ef7a06fa11de | 29 | |
JonFreeman | 13:ef7a06fa11de | 30 | AUH = (1 << MotorA_port_bits[3]), |
JonFreeman | 13:ef7a06fa11de | 31 | AVH = (1 << MotorA_port_bits[4]), |
JonFreeman | 13:ef7a06fa11de | 32 | AWH = (1 << MotorA_port_bits[5]), |
JonFreeman | 13:ef7a06fa11de | 33 | |
JonFreeman | 13:ef7a06fa11de | 34 | AUHVL = AUH | AVL, // Each of 6 possible output energisations made up of one hi and one low |
JonFreeman | 13:ef7a06fa11de | 35 | AVHUL = AVH | AUL, |
JonFreeman | 13:ef7a06fa11de | 36 | AUHWL = AUH | AWL, |
JonFreeman | 13:ef7a06fa11de | 37 | AWHUL = AWH | AUL, |
JonFreeman | 13:ef7a06fa11de | 38 | AVHWL = AVH | AWL, |
JonFreeman | 13:ef7a06fa11de | 39 | AWHVL = AWH | AVL, |
JonFreeman | 13:ef7a06fa11de | 40 | |
JonFreeman | 13:ef7a06fa11de | 41 | KEEP_L_MASK_A = AUL | AVL | AWL, |
JonFreeman | 13:ef7a06fa11de | 42 | KEEP_H_MASK_A = AUH | AVH | AWH, |
JonFreeman | 13:ef7a06fa11de | 43 | |
JonFreeman | 13:ef7a06fa11de | 44 | BRA = AUL | AVL | AWL, // All low side switches on (and all high side off) for braking |
JonFreeman | 13:ef7a06fa11de | 45 | |
JonFreeman | 13:ef7a06fa11de | 46 | BUL = (1 << MotorB_port_bits[0]), // Likewise for MotorB but different port bits on different port |
JonFreeman | 13:ef7a06fa11de | 47 | BVL = (1 << MotorB_port_bits[1]), |
JonFreeman | 13:ef7a06fa11de | 48 | BWL = (1 << MotorB_port_bits[2]), |
JonFreeman | 13:ef7a06fa11de | 49 | |
JonFreeman | 13:ef7a06fa11de | 50 | BUH = (1 << MotorB_port_bits[3]), |
JonFreeman | 13:ef7a06fa11de | 51 | BVH = (1 << MotorB_port_bits[4]), |
JonFreeman | 13:ef7a06fa11de | 52 | BWH = (1 << MotorB_port_bits[5]), |
JonFreeman | 13:ef7a06fa11de | 53 | |
JonFreeman | 13:ef7a06fa11de | 54 | BUHVL = BUH | BVL, |
JonFreeman | 13:ef7a06fa11de | 55 | BVHUL = BVH | BUL, |
JonFreeman | 13:ef7a06fa11de | 56 | BUHWL = BUH | BWL, |
JonFreeman | 13:ef7a06fa11de | 57 | BWHUL = BWH | BUL, |
JonFreeman | 13:ef7a06fa11de | 58 | BVHWL = BVH | BWL, |
JonFreeman | 13:ef7a06fa11de | 59 | BWHVL = BWH | BVL, |
JonFreeman | 13:ef7a06fa11de | 60 | |
JonFreeman | 13:ef7a06fa11de | 61 | KEEP_L_MASK_B = BUL | BVL | BWL, |
JonFreeman | 13:ef7a06fa11de | 62 | KEEP_H_MASK_B = BUH | BVH | BWH, |
JonFreeman | 13:ef7a06fa11de | 63 | |
JonFreeman | 13:ef7a06fa11de | 64 | BRB = BUL | BVL | BWL, |
JonFreeman | 13:ef7a06fa11de | 65 | |
JonFreeman | 13:ef7a06fa11de | 66 | PORT_A_MASK = AUL | AVL | AWL | AUH | AVH | AWH, // NEW METHOD FOR DGD21032 MOSFET DRIVERS |
JonFreeman | 13:ef7a06fa11de | 67 | PORT_B_MASK = BUL | BVL | BWL | BUH | BVH | BWH; |
JonFreeman | 13:ef7a06fa11de | 68 | |
JonFreeman | 13:ef7a06fa11de | 69 | //PortOut MotA (PortA, PORT_A_MASK); // Activate output ports to motor drivers |
JonFreeman | 13:ef7a06fa11de | 70 | //PortOut MotB (PortB, PORT_B_MASK); |
JonFreeman | 13:ef7a06fa11de | 71 | |
JonFreeman | 13:ef7a06fa11de | 72 | // Pin 1 VBAT NET +3V3 |
JonFreeman | 13:ef7a06fa11de | 73 | |
JonFreeman | 13:ef7a06fa11de | 74 | //DigitalIn J3 (PC_13, PullUp);// Pin 2 Jumper pulls to GND, R floats Hi |
JonFreeman | 13:ef7a06fa11de | 75 | #ifdef TEMP_SENSOR_ENABLE |
JonFreeman | 13:ef7a06fa11de | 76 | InterruptIn Temperature_pin (PC_13);// Pin 2 June 2018 - taken for temperature sensor - hard wired to T1 due to wrong thought T1 could be InterruptIn |
JonFreeman | 13:ef7a06fa11de | 77 | #endif |
JonFreeman | 13:ef7a06fa11de | 78 | |
JonFreeman | 13:ef7a06fa11de | 79 | // Pin 3 PC14-OSC32_IN NET O32I Xtal chucked off these pins, now needed for RC inputs |
JonFreeman | 13:ef7a06fa11de | 80 | // Pin 4 PC15-OSC32_OUT NET O32O |
JonFreeman | 13:ef7a06fa11de | 81 | // Pin 5 PH0-OSC_IN NET PH1 |
JonFreeman | 13:ef7a06fa11de | 82 | // Pin 6 PH1-OSC_OUT NET PH1 |
JonFreeman | 13:ef7a06fa11de | 83 | // Pin 7 NRST NET NRST |
JonFreeman | 13:ef7a06fa11de | 84 | AnalogIn Ain_DriverPot (PC_0); // Pin 8 Spare Analogue in, net SAIN fitted with external pull-down |
JonFreeman | 13:ef7a06fa11de | 85 | AnalogIn Ain_SystemVolts (PC_1); // Pin 9 |
JonFreeman | 13:ef7a06fa11de | 86 | #define MOT_A_I_ADC PC_2 |
JonFreeman | 13:ef7a06fa11de | 87 | #define MOT_B_I_ADC PC_3 |
JonFreeman | 13:ef7a06fa11de | 88 | //AnalogIn Motor_A_Current (PC_2); // Pin 10 |
JonFreeman | 13:ef7a06fa11de | 89 | //AnalogIn Motor_B_Current (PC_3); // Pin 11 |
JonFreeman | 13:ef7a06fa11de | 90 | // Pin 12 VSSA/VREF- NET GND |
JonFreeman | 13:ef7a06fa11de | 91 | // Pin 13 VDDA/VREF+ NET +3V3 |
JonFreeman | 13:ef7a06fa11de | 92 | // Pin 14 Port_A AUL |
JonFreeman | 13:ef7a06fa11de | 93 | // Pin 15 Port_A AUH |
JonFreeman | 13:ef7a06fa11de | 94 | // Pins 16, 17 BufferedSerial pc |
JonFreeman | 13:ef7a06fa11de | 95 | BufferedSerial pc (PA_2, PA_3, 2048, 4, NULL); // Pins 16, 17 tx, rx to pc via usb lead |
JonFreeman | 13:ef7a06fa11de | 96 | // Pin 18 VSS NET GND |
JonFreeman | 13:ef7a06fa11de | 97 | // Pin 19 VDD NET +3V3 |
JonFreeman | 13:ef7a06fa11de | 98 | // Pin 20 Port_A AWL |
JonFreeman | 13:ef7a06fa11de | 99 | // Pin 21 DigitalOut led1(LED1); |
JonFreeman | 13:ef7a06fa11de | 100 | DigitalOut LED (PA_5); // Pin 21 |
JonFreeman | 13:ef7a06fa11de | 101 | // Pin 22 Port_A AVL |
JonFreeman | 13:ef7a06fa11de | 102 | // Pin 23 Port_A AVH |
JonFreeman | 13:ef7a06fa11de | 103 | //InterruptIn MBH2 (PC_4); // Pin 24 |
JonFreeman | 13:ef7a06fa11de | 104 | //InterruptIn MBH3 (PC_5); // Pin 25 |
JonFreeman | 13:ef7a06fa11de | 105 | #define _MBH2 PC_4 |
JonFreeman | 13:ef7a06fa11de | 106 | #define _MBH3 PC_5 |
JonFreeman | 13:ef7a06fa11de | 107 | // Pin 26 Port_B BUL |
JonFreeman | 13:ef7a06fa11de | 108 | // Pin 27 Port_B BVL |
JonFreeman | 13:ef7a06fa11de | 109 | // Pin 28 Port_B BWL |
JonFreeman | 13:ef7a06fa11de | 110 | // Pin 29 Port_B BUH |
JonFreeman | 13:ef7a06fa11de | 111 | // Pin 30 VCAP1 |
JonFreeman | 13:ef7a06fa11de | 112 | // Pin 31 VSS |
JonFreeman | 13:ef7a06fa11de | 113 | // Pin 32 VDD |
JonFreeman | 13:ef7a06fa11de | 114 | // Pin 33 Port_B BVH |
JonFreeman | 13:ef7a06fa11de | 115 | // Pin 34 Port_B BWH |
JonFreeman | 13:ef7a06fa11de | 116 | DigitalOut T4 (PB_14); // Pin 35 |
JonFreeman | 13:ef7a06fa11de | 117 | DigitalOut T3 (PB_15); // Pin 36 |
JonFreeman | 13:ef7a06fa11de | 118 | // BufferedSerial com2 pins 37 Tx, 38 Rx |
JonFreeman | 13:ef7a06fa11de | 119 | BufferedSerial com2 (PC_6, PC_7); // Pins 37, 38 tx, rx to Touch Screen Controller |
JonFreeman | 13:ef7a06fa11de | 120 | #define APWMV PC_8 |
JonFreeman | 13:ef7a06fa11de | 121 | #define APWMI PC_9 |
JonFreeman | 13:ef7a06fa11de | 122 | //FastPWM A_MAX_V_PWM (PC_8, PWM_PRESECALER_DEFAULT), // Pin 39 pwm3/3 |
JonFreeman | 13:ef7a06fa11de | 123 | // A_MAX_I_PWM (PC_9, PWM_PRESECALER_DEFAULT); // pin 40, prescaler value pwm3/4 |
JonFreeman | 13:ef7a06fa11de | 124 | //InterruptIn MotB_Hall (PA_8); // Pin 41 |
JonFreeman | 13:ef7a06fa11de | 125 | // Pin 41 Port_A AWH |
JonFreeman | 13:ef7a06fa11de | 126 | // BufferedSerial com3 pins 42 Tx, 43 Rx |
JonFreeman | 13:ef7a06fa11de | 127 | //InterruptIn tryseredge (PA_9); |
JonFreeman | 13:ef7a06fa11de | 128 | BufferedSerial com3 (PA_9, PA_10); // Pins 42, 43 tx, rx to any aux module |
JonFreeman | 13:ef7a06fa11de | 129 | // PA_9 is Tx. I wonder, can we also use InterruptIn on this pin to generate interrupts on tx bit transitions ? Let's find out ! |
JonFreeman | 13:ef7a06fa11de | 130 | // No. |
JonFreeman | 13:ef7a06fa11de | 131 | |
JonFreeman | 13:ef7a06fa11de | 132 | // Feb 2018 Pins 44 and 45 now liberated, could use for serial or other uses |
JonFreeman | 13:ef7a06fa11de | 133 | //BufferedSerial extra_ser (PA_11, PA_12); // Pins 44, 45 tx, rx to XBee module |
JonFreeman | 13:ef7a06fa11de | 134 | DigitalOut T2 (PA_11); // Pin 44 |
JonFreeman | 13:ef7a06fa11de | 135 | // was DigitalOut T1 (PA_12); // Pin 45 |
JonFreeman | 13:ef7a06fa11de | 136 | |
JonFreeman | 13:ef7a06fa11de | 137 | |
JonFreeman | 13:ef7a06fa11de | 138 | //InterruptIn T1 (PA_12); // Pin 45 now input counting pulses from LMT01 temperature sensor |
JonFreeman | 13:ef7a06fa11de | 139 | // InterruptIn DOES NOT WORK ON PA_12. Boards are being made, will have to wire link PA12 to PC13 |
JonFreeman | 13:ef7a06fa11de | 140 | DigitalIn T1 (PA_12); |
JonFreeman | 13:ef7a06fa11de | 141 | ////InterruptIn T1 (PC_13); // Pin 45 now input counting pulses from LMT01 temperature sensor |
JonFreeman | 13:ef7a06fa11de | 142 | |
JonFreeman | 13:ef7a06fa11de | 143 | |
JonFreeman | 13:ef7a06fa11de | 144 | |
JonFreeman | 13:ef7a06fa11de | 145 | // Pin 46 SWDIO |
JonFreeman | 13:ef7a06fa11de | 146 | // Pin 47 VSS |
JonFreeman | 13:ef7a06fa11de | 147 | // Pin 48 VDD |
JonFreeman | 13:ef7a06fa11de | 148 | // Pin 49 SWCLK |
JonFreeman | 13:ef7a06fa11de | 149 | |
JonFreeman | 13:ef7a06fa11de | 150 | //Was DigitalOut T5 (PA_15); // Pin 50 |
JonFreeman | 13:ef7a06fa11de | 151 | DigitalIn T5 (PA_15); // Pin 50 now fwd/rev from remote control box if fitted |
JonFreeman | 13:ef7a06fa11de | 152 | #define _MAH1 PC_10 // Pin 51 |
JonFreeman | 13:ef7a06fa11de | 153 | #define _MAH2 PC_11 // Pin 52 |
JonFreeman | 13:ef7a06fa11de | 154 | #define _MAH3 PC_12 // Pin 53 |
JonFreeman | 13:ef7a06fa11de | 155 | //InterruptIn MBH1 (PD_2); // Pin 54 |
JonFreeman | 13:ef7a06fa11de | 156 | #define _MBH1 PD_2 |
JonFreeman | 13:ef7a06fa11de | 157 | DigitalOut T6 (PB_3); // Pin 55 |
JonFreeman | 13:ef7a06fa11de | 158 | #define BPWMV PB_4 |
JonFreeman | 13:ef7a06fa11de | 159 | #define BPWMI PB_5 |
JonFreeman | 13:ef7a06fa11de | 160 | //FastPWM B_MAX_V_PWM (PB_4, PWM_PRESECALER_DEFAULT), // Pin 56 pwm3/3 |
JonFreeman | 13:ef7a06fa11de | 161 | // B_MAX_I_PWM (PB_5, PWM_PRESECALER_DEFAULT); // pin 57, prescaler value pwm3/4 |
JonFreeman | 13:ef7a06fa11de | 162 | |
JonFreeman | 13:ef7a06fa11de | 163 | //I2C i2c (PB_7, PB_6); // Pins 58, 59 For 24LC64 eeprom |
JonFreeman | 13:ef7a06fa11de | 164 | #define SDA_PIN PB_7 |
JonFreeman | 13:ef7a06fa11de | 165 | #define SCL_PIN PB_6 |
JonFreeman | 13:ef7a06fa11de | 166 | // Pin 60 BOOT0 |
JonFreeman | 13:ef7a06fa11de | 167 | |
JonFreeman | 13:ef7a06fa11de | 168 | // Servo pins, 2 off. Configured as Input to read radio control receiver |
JonFreeman | 13:ef7a06fa11de | 169 | // ** Update December 2018 ** |
JonFreeman | 13:ef7a06fa11de | 170 | // These pins can not be used as InterruptIn. |
JonFreeman | 13:ef7a06fa11de | 171 | // Can be used as outputs by 'Servo' |
JonFreeman | 13:ef7a06fa11de | 172 | // If used as servo output, code gives pin to 'Servo' - seems to work |
JonFreeman | 13:ef7a06fa11de | 173 | //InterruptIn Servo1_i (PB_8); // Pin 61 to read output from rc rx |
JonFreeman | 13:ef7a06fa11de | 174 | //InterruptIn Servo2_i (PB_9); // Pin 62 to read output from rc rx |
JonFreeman | 13:ef7a06fa11de | 175 | // *** NOTE *** Above InterruptIn Servo using PB pins seems not to work, probably due to other Port B pins used as PortOut (try PortInOut?) |
JonFreeman | 13:ef7a06fa11de | 176 | // Nov 2018 - Yet to try using PC14, PC15, free now as 32k768 xtal not fitted |
JonFreeman | 13:ef7a06fa11de | 177 | |
JonFreeman | 13:ef7a06fa11de | 178 | |
JonFreeman | 13:ef7a06fa11de | 179 | // Pin 63 VSS |
JonFreeman | 13:ef7a06fa11de | 180 | // Pin 64 VDD |
JonFreeman | 13:ef7a06fa11de | 181 | // SYSTEM CONSTANTS |
JonFreeman | 13:ef7a06fa11de | 182 | // December 2018 ** NEED TO PROVE SERVO OUT WORKS ** YES, DONE. |
JonFreeman | 13:ef7a06fa11de | 183 | Servo Servo1 (PB_8) ; |
JonFreeman | 13:ef7a06fa11de | 184 | // Servos[0] = & Servo1; |
JonFreeman | 13:ef7a06fa11de | 185 | Servo Servo2 (PB_9) ; |
JonFreeman | 13:ef7a06fa11de | 186 | // Servos[1] = & Servo2; |
JonFreeman | 13:ef7a06fa11de | 187 |