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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers F401RE.h Source File

F401RE.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 //  Update November 2019 - Radio Control Inputs good.
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, 5000, 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