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
Diff: F401RE.h
- Revision:
- 10:e40d8724268a
- Parent:
- 9:ac2412df01be
- Child:
- 11:bfb73f083009
--- a/F401RE.h Sat Nov 10 17:08:21 2018 +0000 +++ b/F401RE.h Tue Jan 15 09:03:57 2019 +0000 @@ -1,41 +1,63 @@ -// Hoped to select servo functions from user info stored on EEROM. Too difficult. Do not define servo as in and out +// Feb 2018 Now using DGD21032 mosfet drivers via 74HC00 pwm gates (low side) - GOOD, works well with auto-tickle of high side drivers + +// Jan 2019 Trying to add two Radio Control inputs on PC_14 and PC_15, previously connected to unused LF Xtal. +// Problem - Appears to conflict with serial port used for comms with controller +// Earlier efforts to use 'Servo' ports as 'you choose' between I/O failed as pins not capable of use as 'InterruptIn' + +// Experiment disabling RC inputs to see if clearing serial conflict is possible + +//#define RC1IN +//#define RC2IN + + // Port A -> MotorA, Port B -> MotorB const uint16_t -AUL = 1 << 0, // Feb 2018 Now using DGD21032 mosfet drivers via 74HC00 pwm gates (low side) - GOOD, works well with auto-tickle of high side drivers -AVL = 1 << 6, // These are which port bits connect to which mosfet driver -AWL = 1 << 4, +// This is where port bits get assigned to motor output phase switches. +// Phases are U, V and W. +// Each phase uses two bits, one for the low side switch, one for the high side switch. +//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 +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 +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 +// Using port bit info in the two lines above, the compiler sorts all this into creation of lookup table +// to provide correct energisation sequencing as motors rotate. +// You need concern yourself no further about any of this. + -AUH = 1 << 1, -AVH = 1 << 7, -AWH = 1 << 8, +AUL = (1 << MotorA_port_bits[0]), +AVL = (1 << MotorA_port_bits[1]), // These are which port bits connect to which mosfet driver +AWL = (1 << MotorA_port_bits[2]), -AUV = AUH | AVL, // Each of 6 possible output energisations made up of one hi and one low -AVU = AVH | AUL, -AUW = AUH | AWL, -AWU = AWH | AUL, -AVW = AVH | AWL, -AWV = AWH | AVL, +AUH = (1 << MotorA_port_bits[3]), +AVH = (1 << MotorA_port_bits[4]), +AWH = (1 << MotorA_port_bits[5]), + +AUHVL = AUH | AVL, // Each of 6 possible output energisations made up of one hi and one low +AVHUL = AVH | AUL, +AUHWL = AUH | AWL, +AWHUL = AWH | AUL, +AVHWL = AVH | AWL, +AWHVL = AWH | AVL, KEEP_L_MASK_A = AUL | AVL | AWL, KEEP_H_MASK_A = AUH | AVH | AWH, BRA = AUL | AVL | AWL, // All low side switches on (and all high side off) for braking -BUL = 1 << 0, // Likewise for MotorB but different port bits on different port -BVL = 1 << 1, -BWL = 1 << 2, +BUL = (1 << MotorB_port_bits[0]), // Likewise for MotorB but different port bits on different port +BVL = (1 << MotorB_port_bits[1]), +BWL = (1 << MotorB_port_bits[2]), -BUH = 1 << 10, -BVH = 1 << 12, -BWH = 1 << 13, +BUH = (1 << MotorB_port_bits[3]), +BVH = (1 << MotorB_port_bits[4]), +BWH = (1 << MotorB_port_bits[5]), -BUV = BUH | BVL, -BVU = BVH | BUL, -BUW = BUH | BWL, -BWU = BWH | BUL, -BVW = BVH | BWL, -BWV = BWH | BVL, +BUHVL = BUH | BVL, +BVHUL = BVH | BUL, +BUHWL = BUH | BWL, +BWHUL = BWH | BUL, +BVHWL = BVH | BWL, +BWHVL = BWH | BVL, KEEP_L_MASK_B = BUL | BVL | BWL, KEEP_H_MASK_B = BUH | BVH | BWH, @@ -54,7 +76,14 @@ 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 -// Pin 3 PC14-OSC32_IN NET O32I +#ifdef RC1IN +InterruptIn RC_1_in (PC_14); //New Dec 2018 tryiing to find pins to use for servo in +#endif +#ifdef RC2IN +InterruptIn RC_2_in (PC_15); //Yes, PC_14 and PC_15 do work +#endif + +// Pin 3 PC14-OSC32_IN NET O32I Xtal chucked off these pins, now needed for RC inputs // Pin 4 PC15-OSC32_OUT NET O32O // Pin 5 PH0-OSC_IN NET PH1 // Pin 6 PH1-OSC_OUT NET PH1 @@ -133,9 +162,12 @@ // Pin 60 BOOT0 // Servo pins, 2 off. Configured as Input to read radio control receiver +// ** Update December 2018 ** +// These pins can not be used as InterruptIn. +// Can be used as outputs by 'Servo' // If used as servo output, code gives pin to 'Servo' - seems to work -InterruptIn Servo1_i (PB_8); // Pin 61 to read output from rc rx -InterruptIn Servo2_i (PB_9); // Pin 62 to read output from rc rx +//InterruptIn Servo1_i (PB_8); // Pin 61 to read output from rc rx +//InterruptIn Servo2_i (PB_9); // Pin 62 to read output from rc rx // *** NOTE *** Above InterruptIn Servo using PB pins seems not to work, probably due to other Port B pins used as PortOut (try PortInOut?) // Nov 2018 - Yet to try using PC14, PC15, free now as 32k768 xtal not fitted