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
F411RE.h
00001 #include "STM3_ESC.h" 00002 // Feb 2018 Now using DGD21032 mosfet drivers via 74HC00 pwm gates (low side) - GOOD, works well with auto-tickle of high side drivers 00003 00004 // Jan 2019 Trying to add two Radio Control inputs on PC_14 and PC_15, previously connected to unused LF Xtal. 00005 // Problem - Appears to conflict with serial port used for comms with controller 00006 // Earlier efforts to use 'Servo' ports as 'you choose' between I/O failed as pins not capable of use as 'InterruptIn' 00007 00008 // CORRECTION Comms problem with Touch Screen was insufficient pull-up on STM3_ESC opto. Change R12 from 1k to 470R 00009 00010 // Experiment disabling RC inputs to see if clearing serial conflict is possible 00011 00012 00013 // Port A -> MotorA, Port B -> MotorB 00014 const uint16_t 00015 // This is where port bits get assigned to motor output phase switches. 00016 // Phases are U, V and W. 00017 // Each phase uses two bits, one for the low side switch, one for the high side switch. 00018 //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 00019 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 00020 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 00021 // Using port bit info in the two lines above, the compiler sorts all this into creation of lookup table 00022 // to provide correct energisation sequencing as motors rotate. 00023 // You need concern yourself no further about any of this. 00024 00025 00026 AUL = (1 << MotorA_port_bits[0]), 00027 AVL = (1 << MotorA_port_bits[1]), // These are which port bits connect to which mosfet driver 00028 AWL = (1 << MotorA_port_bits[2]), 00029 00030 AUH = (1 << MotorA_port_bits[3]), 00031 AVH = (1 << MotorA_port_bits[4]), 00032 AWH = (1 << MotorA_port_bits[5]), 00033 00034 AUHVL = AUH | AVL, // Each of 6 possible output energisations made up of one hi and one low 00035 AVHUL = AVH | AUL, 00036 AUHWL = AUH | AWL, 00037 AWHUL = AWH | AUL, 00038 AVHWL = AVH | AWL, 00039 AWHVL = AWH | AVL, 00040 00041 KEEP_L_MASK_A = AUL | AVL | AWL, 00042 KEEP_H_MASK_A = AUH | AVH | AWH, 00043 00044 BRA = AUL | AVL | AWL, // All low side switches on (and all high side off) for braking 00045 00046 BUL = (1 << MotorB_port_bits[0]), // Likewise for MotorB but different port bits on different port 00047 BVL = (1 << MotorB_port_bits[1]), 00048 BWL = (1 << MotorB_port_bits[2]), 00049 00050 BUH = (1 << MotorB_port_bits[3]), 00051 BVH = (1 << MotorB_port_bits[4]), 00052 BWH = (1 << MotorB_port_bits[5]), 00053 00054 BUHVL = BUH | BVL, 00055 BVHUL = BVH | BUL, 00056 BUHWL = BUH | BWL, 00057 BWHUL = BWH | BUL, 00058 BVHWL = BVH | BWL, 00059 BWHVL = BWH | BVL, 00060 00061 KEEP_L_MASK_B = BUL | BVL | BWL, 00062 KEEP_H_MASK_B = BUH | BVH | BWH, 00063 00064 BRB = BUL | BVL | BWL, 00065 00066 PORT_A_MASK = AUL | AVL | AWL | AUH | AVH | AWH, // NEW METHOD FOR DGD21032 MOSFET DRIVERS 00067 PORT_B_MASK = BUL | BVL | BWL | BUH | BVH | BWH; 00068 00069 //PortOut MotA (PortA, PORT_A_MASK); // Activate output ports to motor drivers 00070 //PortOut MotB (PortB, PORT_B_MASK); 00071 00072 // Pin 1 VBAT NET +3V3 00073 00074 //DigitalIn J3 (PC_13, PullUp);// Pin 2 Jumper pulls to GND, R floats Hi 00075 #ifdef TEMP_SENSOR_ENABLE 00076 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 00077 #endif 00078 00079 // Pin 3 PC14-OSC32_IN NET O32I Xtal chucked off these pins, now needed for RC inputs 00080 // Pin 4 PC15-OSC32_OUT NET O32O 00081 // Pin 5 PH0-OSC_IN NET PH1 00082 // Pin 6 PH1-OSC_OUT NET PH1 00083 // Pin 7 NRST NET NRST 00084 AnalogIn Ain_DriverPot (PC_0); // Pin 8 Spare Analogue in, net SAIN fitted with external pull-down 00085 AnalogIn Ain_SystemVolts (PC_1); // Pin 9 00086 #define MOT_A_I_ADC PC_2 00087 #define MOT_B_I_ADC PC_3 00088 //AnalogIn Motor_A_Current (PC_2); // Pin 10 00089 //AnalogIn Motor_B_Current (PC_3); // Pin 11 00090 // Pin 12 VSSA/VREF- NET GND 00091 // Pin 13 VDDA/VREF+ NET +3V3 00092 // Pin 14 Port_A AUL 00093 // Pin 15 Port_A AUH 00094 // Pins 16, 17 BufferedSerial pc 00095 BufferedSerial pc (PA_2, PA_3, 2048, 4, NULL); // Pins 16, 17 tx, rx to pc via usb lead 00096 // Pin 18 VSS NET GND 00097 // Pin 19 VDD NET +3V3 00098 // Pin 20 Port_A AWL 00099 // Pin 21 DigitalOut led1(LED1); 00100 DigitalOut LED (PA_5); // Pin 21 00101 // Pin 22 Port_A AVL 00102 // Pin 23 Port_A AVH 00103 //InterruptIn MBH2 (PC_4); // Pin 24 00104 //InterruptIn MBH3 (PC_5); // Pin 25 00105 #define _MBH2 PC_4 00106 #define _MBH3 PC_5 00107 // Pin 26 Port_B BUL 00108 // Pin 27 Port_B BVL 00109 // Pin 28 Port_B BWL 00110 // Pin 29 Port_B BUH 00111 // Pin 30 VCAP1 00112 // Pin 31 VSS 00113 // Pin 32 VDD 00114 // Pin 33 Port_B BVH 00115 // Pin 34 Port_B BWH 00116 DigitalOut T4 (PB_14); // Pin 35 00117 DigitalOut T3 (PB_15); // Pin 36 00118 // BufferedSerial com2 pins 37 Tx, 38 Rx 00119 BufferedSerial com2 (PC_6, PC_7); // Pins 37, 38 tx, rx to Touch Screen Controller 00120 #define APWMV PC_8 00121 #define APWMI PC_9 00122 //FastPWM A_MAX_V_PWM (PC_8, PWM_PRESECALER_DEFAULT), // Pin 39 pwm3/3 00123 // A_MAX_I_PWM (PC_9, PWM_PRESECALER_DEFAULT); // pin 40, prescaler value pwm3/4 00124 //InterruptIn MotB_Hall (PA_8); // Pin 41 00125 // Pin 41 Port_A AWH 00126 // BufferedSerial com3 pins 42 Tx, 43 Rx 00127 //InterruptIn tryseredge (PA_9); 00128 BufferedSerial com3 (PA_9, PA_10); // Pins 42, 43 tx, rx to any aux module 00129 // 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 ! 00130 // No. 00131 00132 // Feb 2018 Pins 44 and 45 now liberated, could use for serial or other uses 00133 //BufferedSerial extra_ser (PA_11, PA_12); // Pins 44, 45 tx, rx to XBee module 00134 DigitalOut T2 (PA_11); // Pin 44 00135 // was DigitalOut T1 (PA_12); // Pin 45 00136 00137 00138 //InterruptIn T1 (PA_12); // Pin 45 now input counting pulses from LMT01 temperature sensor 00139 // InterruptIn DOES NOT WORK ON PA_12. Boards are being made, will have to wire link PA12 to PC13 00140 DigitalIn T1 (PA_12); 00141 ////InterruptIn T1 (PC_13); // Pin 45 now input counting pulses from LMT01 temperature sensor 00142 00143 00144 00145 // Pin 46 SWDIO 00146 // Pin 47 VSS 00147 // Pin 48 VDD 00148 // Pin 49 SWCLK 00149 00150 //Was DigitalOut T5 (PA_15); // Pin 50 00151 DigitalIn T5 (PA_15); // Pin 50 now fwd/rev from remote control box if fitted 00152 #define _MAH1 PC_10 // Pin 51 00153 #define _MAH2 PC_11 // Pin 52 00154 #define _MAH3 PC_12 // Pin 53 00155 //InterruptIn MBH1 (PD_2); // Pin 54 00156 #define _MBH1 PD_2 00157 DigitalOut T6 (PB_3); // Pin 55 00158 #define BPWMV PB_4 00159 #define BPWMI PB_5 00160 //FastPWM B_MAX_V_PWM (PB_4, PWM_PRESECALER_DEFAULT), // Pin 56 pwm3/3 00161 // B_MAX_I_PWM (PB_5, PWM_PRESECALER_DEFAULT); // pin 57, prescaler value pwm3/4 00162 00163 //I2C i2c (PB_7, PB_6); // Pins 58, 59 For 24LC64 eeprom 00164 #define SDA_PIN PB_7 00165 #define SCL_PIN PB_6 00166 // Pin 60 BOOT0 00167 00168 // Servo pins, 2 off. Configured as Input to read radio control receiver 00169 // ** Update December 2018 ** 00170 // These pins can not be used as InterruptIn. 00171 // Can be used as outputs by 'Servo' 00172 // If used as servo output, code gives pin to 'Servo' - seems to work 00173 //InterruptIn Servo1_i (PB_8); // Pin 61 to read output from rc rx 00174 //InterruptIn Servo2_i (PB_9); // Pin 62 to read output from rc rx 00175 // *** NOTE *** Above InterruptIn Servo using PB pins seems not to work, probably due to other Port B pins used as PortOut (try PortInOut?) 00176 // Nov 2018 - Yet to try using PC14, PC15, free now as 32k768 xtal not fitted 00177 00178 00179 // Pin 63 VSS 00180 // Pin 64 VDD 00181 // SYSTEM CONSTANTS 00182 // December 2018 ** NEED TO PROVE SERVO OUT WORKS ** YES, DONE. 00183 Servo Servo1 (PB_8) ; 00184 // Servos[0] = & Servo1; 00185 Servo Servo2 (PB_9) ; 00186 // Servos[1] = & Servo2; 00187
Generated on Tue Jul 19 2022 12:28:36 by 1.7.2