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

Committer:
JonFreeman
Date:
Sun Aug 16 14:13:19 2020 +0000
Revision:
17:cc9b854295d6
Parent:
8:93203f473f6e
August 2020. Checked Radio Control input ops.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 7:6deaeace9a3e 1 // 5TH JUNE 2018 NONE OF THIS IS RIGHT YET !!
JonFreeman 7:6deaeace9a3e 2 // Hoped to select servo functions from user info stored on EEROM. Too difficult. Do not define servo as in and out
JonFreeman 7:6deaeace9a3e 3 // Port A -> MotorA, Port B -> MotorB
JonFreeman 7:6deaeace9a3e 4 const uint16_t
JonFreeman 8:93203f473f6e 5 AUL = 1 << 1, // Feb 2018 Now using DGD21032 mosfet drivers via 74HC00 pwm gates (low side) - GOOD, works well with auto-tickle of high side drivers
JonFreeman 8:93203f473f6e 6 AVL = 1 << 2, // These are which port bits connect to which mosfet driver
JonFreeman 8:93203f473f6e 7 AWL = 1 << 3,
JonFreeman 7:6deaeace9a3e 8
JonFreeman 8:93203f473f6e 9 AUH = 1 << 4,
JonFreeman 8:93203f473f6e 10 AVH = 1 << 5,
JonFreeman 8:93203f473f6e 11 AWH = 1 << 6,
JonFreeman 7:6deaeace9a3e 12
JonFreeman 7:6deaeace9a3e 13 AUV = AUH | AVL, // Each of 6 possible output energisations made up of one hi and one low
JonFreeman 7:6deaeace9a3e 14 AVU = AVH | AUL,
JonFreeman 7:6deaeace9a3e 15 AUW = AUH | AWL,
JonFreeman 7:6deaeace9a3e 16 AWU = AWH | AUL,
JonFreeman 7:6deaeace9a3e 17 AVW = AVH | AWL,
JonFreeman 7:6deaeace9a3e 18 AWV = AWH | AVL,
JonFreeman 7:6deaeace9a3e 19
JonFreeman 7:6deaeace9a3e 20 KEEP_L_MASK_A = AUL | AVL | AWL,
JonFreeman 7:6deaeace9a3e 21 KEEP_H_MASK_A = AUH | AVH | AWH,
JonFreeman 7:6deaeace9a3e 22
JonFreeman 7:6deaeace9a3e 23 BRA = AUL | AVL | AWL, // All low side switches on (and all high side off) for braking
JonFreeman 7:6deaeace9a3e 24
JonFreeman 7:6deaeace9a3e 25 BUL = 1 << 0, // Likewise for MotorB but different port bits on different port
JonFreeman 7:6deaeace9a3e 26 BVL = 1 << 1,
JonFreeman 7:6deaeace9a3e 27 BWL = 1 << 2,
JonFreeman 7:6deaeace9a3e 28
JonFreeman 7:6deaeace9a3e 29 BUH = 1 << 10,
JonFreeman 8:93203f473f6e 30 BVH = 1 << 11,
JonFreeman 8:93203f473f6e 31 BWH = 1 << 3,
JonFreeman 7:6deaeace9a3e 32
JonFreeman 7:6deaeace9a3e 33 BUV = BUH | BVL,
JonFreeman 7:6deaeace9a3e 34 BVU = BVH | BUL,
JonFreeman 7:6deaeace9a3e 35 BUW = BUH | BWL,
JonFreeman 7:6deaeace9a3e 36 BWU = BWH | BUL,
JonFreeman 7:6deaeace9a3e 37 BVW = BVH | BWL,
JonFreeman 7:6deaeace9a3e 38 BWV = BWH | BVL,
JonFreeman 7:6deaeace9a3e 39
JonFreeman 7:6deaeace9a3e 40 KEEP_L_MASK_B = BUL | BVL | BWL,
JonFreeman 7:6deaeace9a3e 41 KEEP_H_MASK_B = BUH | BVH | BWH,
JonFreeman 7:6deaeace9a3e 42
JonFreeman 7:6deaeace9a3e 43 BRB = BUL | BVL | BWL,
JonFreeman 7:6deaeace9a3e 44
JonFreeman 7:6deaeace9a3e 45 PORT_A_MASK = AUL | AVL | AWL | AUH | AVH | AWH, // NEW METHOD FOR DGD21032 MOSFET DRIVERS
JonFreeman 7:6deaeace9a3e 46 PORT_B_MASK = BUL | BVL | BWL | BUH | BVH | BWH;
JonFreeman 8:93203f473f6e 47 // Use Ports E and G - best first guess July 2018
JonFreeman 8:93203f473f6e 48 PortOut MotA (PortE, PORT_A_MASK); // Activate output ports to motor drivers
JonFreeman 8:93203f473f6e 49 PortOut MotB (PortG, PORT_B_MASK);
JonFreeman 7:6deaeace9a3e 50
JonFreeman 7:6deaeace9a3e 51 // Pin 1 VBAT NET +3V3
JonFreeman 7:6deaeace9a3e 52
JonFreeman 7:6deaeace9a3e 53 //DigitalIn J3 (PC_13, PullUp);// Pin 2 Jumper pulls to GND, R floats Hi
JonFreeman 8:93203f473f6e 54 InterruptIn Temperature_pin (PD_7);// Pin ?? June 2018 - taken for temperature sensor - hard wired to T1 due to wrong thought T1 could be InterruptIn
JonFreeman 7:6deaeace9a3e 55
JonFreeman 7:6deaeace9a3e 56
JonFreeman 7:6deaeace9a3e 57 // Pin 3 PC14-OSC32_IN NET O32I
JonFreeman 7:6deaeace9a3e 58 // Pin 4 PC15-OSC32_OUT NET O32O
JonFreeman 7:6deaeace9a3e 59 // Pin 5 PH0-OSC_IN NET PH1
JonFreeman 7:6deaeace9a3e 60 // Pin 6 PH1-OSC_OUT NET PH1
JonFreeman 7:6deaeace9a3e 61 // Pin 7 NRST NET NRST
JonFreeman 7:6deaeace9a3e 62 AnalogIn Ain_DriverPot (PC_0); // Pin 8 Spare Analogue in, net SAIN fitted with external pull-down
JonFreeman 7:6deaeace9a3e 63 AnalogIn Ain_SystemVolts (PC_1); // Pin 9
JonFreeman 7:6deaeace9a3e 64 AnalogIn Motor_A_Current (PC_2); // Pin 10
JonFreeman 7:6deaeace9a3e 65 AnalogIn Motor_B_Current (PC_3); // Pin 11
JonFreeman 7:6deaeace9a3e 66 // Pin 12 VSSA/VREF- NET GND
JonFreeman 7:6deaeace9a3e 67 // Pin 13 VDDA/VREF+ NET +3V3
JonFreeman 7:6deaeace9a3e 68 // Pin 14 Port_A AUL
JonFreeman 7:6deaeace9a3e 69 // Pin 15 Port_A AUH
JonFreeman 7:6deaeace9a3e 70 // Pins 16, 17 BufferedSerial pc
JonFreeman 8:93203f473f6e 71 BufferedSerial pc (PD_8, PD_9, 512, 4, NULL); // Pins 16, 17 tx, rx to pc via usb lead
JonFreeman 7:6deaeace9a3e 72 // Pin 18 VSS NET GND
JonFreeman 7:6deaeace9a3e 73 // Pin 19 VDD NET +3V3
JonFreeman 7:6deaeace9a3e 74 // Pin 20 Port_A AWL
JonFreeman 7:6deaeace9a3e 75 // Pin 21 DigitalOut led1(LED1);
JonFreeman 8:93203f473f6e 76 DigitalOut LED (PB_0); // Pin ?? as fitted to Nucleo board. Other leds use PB_7 and PB_14
JonFreeman 7:6deaeace9a3e 77 // Pin 22 Port_A AVL
JonFreeman 7:6deaeace9a3e 78 // Pin 23 Port_A AVH
JonFreeman 8:93203f473f6e 79 InterruptIn MBH2 (PD_1); // Pin ??
JonFreeman 8:93203f473f6e 80 InterruptIn MBH3 (PD_3); // Pin ??
JonFreeman 7:6deaeace9a3e 81 // Pin 26 Port_B BUL
JonFreeman 7:6deaeace9a3e 82 // Pin 27 Port_B BVL
JonFreeman 7:6deaeace9a3e 83 // Pin 28 Port_B BWL
JonFreeman 7:6deaeace9a3e 84 // Pin 29 Port_B BUH
JonFreeman 7:6deaeace9a3e 85 // Pin 30 VCAP1
JonFreeman 7:6deaeace9a3e 86 // Pin 31 VSS
JonFreeman 7:6deaeace9a3e 87 // Pin 32 VDD
JonFreeman 7:6deaeace9a3e 88 // Pin 33 Port_B BVH
JonFreeman 7:6deaeace9a3e 89 // Pin 34 Port_B BWH
JonFreeman 8:93203f473f6e 90
JonFreeman 8:93203f473f6e 91 //DigitalOut T4 (PB_14); // Pin **
JonFreeman 8:93203f473f6e 92 //DigitalOut T3 (PB_15); // Pin **
JonFreeman 8:93203f473f6e 93
JonFreeman 7:6deaeace9a3e 94 // BufferedSerial com2 pins 37 Tx, 38 Rx
JonFreeman 8:93203f473f6e 95 BufferedSerial com2 (PC_10, PC_11); // Pins 37, 38 tx, rx to XBee module
JonFreeman 8:93203f473f6e 96 FastPWM A_MAX_V_PWM (PC_8, PWM_PRESECALER_DEFAULT), // Pin 39 pwm3/3
JonFreeman 8:93203f473f6e 97 A_MAX_I_PWM (PC_9, PWM_PRESECALER_DEFAULT); // pin 40, prescaler value pwm3/4
JonFreeman 7:6deaeace9a3e 98 //InterruptIn MotB_Hall (PA_8); // Pin 41
JonFreeman 7:6deaeace9a3e 99 // Pin 41 Port_A AWH
JonFreeman 7:6deaeace9a3e 100 // BufferedSerial com3 pins 42 Tx, 43 Rx
JonFreeman 7:6deaeace9a3e 101 //InterruptIn tryseredge (PA_9);
JonFreeman 8:93203f473f6e 102
JonFreeman 8:93203f473f6e 103 BufferedSerial com3 (PC_12, PD_2); // Pins 42, 43 tx, rx to any aux module
JonFreeman 8:93203f473f6e 104
JonFreeman 7:6deaeace9a3e 105 // 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 7:6deaeace9a3e 106 // No.
JonFreeman 7:6deaeace9a3e 107
JonFreeman 7:6deaeace9a3e 108 // Feb 2018 Pins 44 and 45 now liberated, could use for serial or other uses
JonFreeman 7:6deaeace9a3e 109 //BufferedSerial extra_ser (PA_11, PA_12); // Pins 44, 45 tx, rx to XBee module
JonFreeman 7:6deaeace9a3e 110 DigitalOut T2 (PA_11); // Pin 44
JonFreeman 7:6deaeace9a3e 111 // was DigitalOut T1 (PA_12); // Pin 45
JonFreeman 7:6deaeace9a3e 112
JonFreeman 7:6deaeace9a3e 113
JonFreeman 7:6deaeace9a3e 114 //InterruptIn T1 (PA_12); // Pin 45 now input counting pulses from LMT01 temperature sensor
JonFreeman 7:6deaeace9a3e 115 // InterruptIn DOES NOT WORK ON PA_12. Boards are being made, will have to wire link PA12 to PC13
JonFreeman 8:93203f473f6e 116 //DigitalIn T1 (PA_12);
JonFreeman 7:6deaeace9a3e 117 ////InterruptIn T1 (PC_13); // Pin 45 now input counting pulses from LMT01 temperature sensor
JonFreeman 7:6deaeace9a3e 118
JonFreeman 7:6deaeace9a3e 119
JonFreeman 7:6deaeace9a3e 120
JonFreeman 7:6deaeace9a3e 121 // Pin 46 SWDIO
JonFreeman 7:6deaeace9a3e 122 // Pin 47 VSS
JonFreeman 7:6deaeace9a3e 123 // Pin 48 VDD
JonFreeman 7:6deaeace9a3e 124 // Pin 49 SWCLK
JonFreeman 7:6deaeace9a3e 125
JonFreeman 7:6deaeace9a3e 126 //Was DigitalOut T5 (PA_15); // Pin 50
JonFreeman 7:6deaeace9a3e 127 DigitalIn T5 (PA_15); // Pin 50 now fwd/rev from remote control box if fitted
JonFreeman 8:93203f473f6e 128 InterruptIn MAH1 (PD_4); // Pin 51
JonFreeman 8:93203f473f6e 129 InterruptIn MAH2 (PD_5); // Pin 52
JonFreeman 8:93203f473f6e 130 InterruptIn MAH3 (PD_6); // Pin 53
JonFreeman 8:93203f473f6e 131 InterruptIn MBH1 (PD_0); // Pin 54
JonFreeman 7:6deaeace9a3e 132 DigitalOut T6 (PB_3); // Pin 55
JonFreeman 8:93203f473f6e 133 FastPWM B_MAX_V_PWM (PE_13, PWM_PRESECALER_DEFAULT), // Pin 56 pwm3/3
JonFreeman 8:93203f473f6e 134 B_MAX_I_PWM (PE_14, PWM_PRESECALER_DEFAULT); // pin 57, prescaler value pwm3/4
JonFreeman 7:6deaeace9a3e 135
JonFreeman 8:93203f473f6e 136 I2C i2c (PB_9, PB_8); // Pins 58, 59 For 24LC64 eeprom
JonFreeman 7:6deaeace9a3e 137 // Pin 60 BOOT0
JonFreeman 7:6deaeace9a3e 138
JonFreeman 7:6deaeace9a3e 139 // Servo pins, 2 off. Configured as Input to read radio control receiver
JonFreeman 7:6deaeace9a3e 140 // If used as servo output, code gives pin to 'Servo' - seems to work
JonFreeman 8:93203f473f6e 141 InterruptIn Servo1_i (PF_14); // Pin 61 to read output from rc rx
JonFreeman 8:93203f473f6e 142 InterruptIn Servo2_i (PF_15); // Pin 62 to read output from rc rx
JonFreeman 7:6deaeace9a3e 143
JonFreeman 7:6deaeace9a3e 144 // Pin 63 VSS
JonFreeman 7:6deaeace9a3e 145 // Pin 64 VDD
JonFreeman 7:6deaeace9a3e 146 // SYSTEM CONSTANTS
JonFreeman 7:6deaeace9a3e 147