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

Revision:
1:0fabe6fdb55b
Parent:
0:435bf84ce48a
Child:
2:04761b196473
--- a/main.cpp	Thu Mar 01 11:29:28 2018 +0000
+++ b/main.cpp	Wed Mar 07 08:29:18 2018 +0000
@@ -2,7 +2,6 @@
 #include "DualBLS.h"
 #include "BufferedSerial.h"
 #include "FastPWM.h"
-#include "MPL3115A2.h"
 /*  STM32F401RE - compile using NUCLEO-F401RE
 //  PROJECT -   Dual Brushless Motor Controller -   March 2018.
 
@@ -139,10 +138,6 @@
 I2C i2c                     (PB_7, PB_6);   //  Pins 58, 59 For 24LC64 eeprom
 //  Pin 60  BOOT0
 
-//MPL3115A2(PinName sda, PinName scl, int addr) ;
-//MPL3115A2 PressureSensor    (PB_7, PB_6, 0xa0) ;
-//double  PressureSensor.getPressure  ();
-
 #ifdef  SERVO1_IN
 InterruptIn Servo1_i    (PB_8); //  Pin 61  to read output from rc rx
 #endif
@@ -347,7 +342,7 @@
     PortOut * Motor_Port;
 public:
     uint32_t    current_samples[CURRENT_SAMPLES_AVERAGED];  //  Circular buffer where latest current readings get stored
-    uint32_t    index;
+    uint32_t    Hindex;
     motor   ()  {}  ;   //  Default constructor
     motor   (PortOut * , FastPWM * , FastPWM * , const uint16_t * )  ;
     void    set_V_limit (double)    ;  //  Sets max motor voltage
@@ -356,6 +351,7 @@
     bool    set_mode    (int);
     void    current_calc    ()  ;
     uint32_t    pulses_per_sec   ()  ;    //  call this once per main loop pass to keep count = edges per sec
+    int     read_Halls  ()  ;
 }   ;   //MotorA, MotorB;
 
 motor   MotorA  (&MotA, &A_MAX_V_PWM, &A_MAX_I_PWM, A_tabl);
@@ -366,7 +362,7 @@
     maxV = _maxV_;
     maxI = _maxI_;
     Hall_total = mode = 0;  //  mode can be only 0, 8, 16 or 24, lut row select for Handbrake, Forward, Reverse, or Regen Braking
-    index = 0;
+    Hindex = 0;
     Hall_tab_ptr = 0;
     latest_pulses_per_sec = 0;
     for (int i = 0; i < MAIN_LOOP_ITERATION_Hz; i++)
@@ -386,6 +382,10 @@
     lut = lutptr;
 }
 
+int     motor::read_Halls  ()  {
+    return  Hindex;
+}
+
 void    motor::current_calc ()
 {
     I.min = 0x0fffffff; //  samples are 16 bit
@@ -453,91 +453,91 @@
 {
     Hall_total++;
     mode &= 0x038L; //  safety
-    *Motor_Port = lut[mode + index];
+    *Motor_Port = lut[mode + Hindex];
 }
 void    MAH1r    ()
 {
-    MotorA.index = 1;
-    if  (MAH2 != 0) MotorA.index |= 2;
-    if  (MAH3 != 0) MotorA.index |= 4;
+    MotorA.Hindex = 1;
+    if  (MAH2 != 0) MotorA.Hindex |= 2;
+    if  (MAH3 != 0) MotorA.Hindex |= 4;
     MotorA.Hall_change  ();
 }
 void    MAH1f    ()
 {
-    MotorA.index = 0;
-    if  (MAH2 != 0) MotorA.index |= 2;
-    if  (MAH3 != 0) MotorA.index |= 4;
+    MotorA.Hindex = 0;
+    if  (MAH2 != 0) MotorA.Hindex |= 2;
+    if  (MAH3 != 0) MotorA.Hindex |= 4;
     MotorA.Hall_change  ();
 }
 void    MAH2r    ()
 {
-    MotorA.index = 2;
-    if  (MAH1 != 0) MotorA.index |= 1;
-    if  (MAH3 != 0) MotorA.index |= 4;
+    MotorA.Hindex = 2;
+    if  (MAH1 != 0) MotorA.Hindex |= 1;
+    if  (MAH3 != 0) MotorA.Hindex |= 4;
     MotorA.Hall_change  ();
 }
 void    MAH2f    ()
 {
-    MotorA.index = 0;
-    if  (MAH1 != 0) MotorA.index |= 1;
-    if  (MAH3 != 0) MotorA.index |= 4;
+    MotorA.Hindex = 0;
+    if  (MAH1 != 0) MotorA.Hindex |= 1;
+    if  (MAH3 != 0) MotorA.Hindex |= 4;
     MotorA.Hall_change  ();
 }
 void    MAH3r    ()
 {
-    MotorA.index = 4;
-    if  (MAH1 != 0) MotorA.index |= 1;
-    if  (MAH2 != 0) MotorA.index |= 2;
+    MotorA.Hindex = 4;
+    if  (MAH1 != 0) MotorA.Hindex |= 1;
+    if  (MAH2 != 0) MotorA.Hindex |= 2;
     MotorA.Hall_change  ();
 }
 void    MAH3f    ()
 {
-    MotorA.index = 0;
-    if  (MAH1 != 0) MotorA.index |= 1;
-    if  (MAH2 != 0) MotorA.index |= 2;
+    MotorA.Hindex = 0;
+    if  (MAH1 != 0) MotorA.Hindex |= 1;
+    if  (MAH2 != 0) MotorA.Hindex |= 2;
     MotorA.Hall_change  ();
 }
 
 void    MBH1r    ()
 {
-    MotorB.index = 1;
-    if  (MBH2 != 0) MotorB.index |= 2;
-    if  (MBH3 != 0) MotorB.index |= 4;
+    MotorB.Hindex = 1;
+    if  (MBH2 != 0) MotorB.Hindex |= 2;
+    if  (MBH3 != 0) MotorB.Hindex |= 4;
     MotorB.Hall_change  ();
 }
 void    MBH1f    ()
 {
-    MotorB.index = 0;
-    if  (MBH2 != 0) MotorB.index |= 2;
-    if  (MBH3 != 0) MotorB.index |= 4;
+    MotorB.Hindex = 0;
+    if  (MBH2 != 0) MotorB.Hindex |= 2;
+    if  (MBH3 != 0) MotorB.Hindex |= 4;
     MotorB.Hall_change  ();
 }
 void    MBH2r    ()
 {
-    MotorB.index = 2;
-    if  (MBH1 != 0) MotorB.index |= 1;
-    if  (MBH3 != 0) MotorB.index |= 4;
+    MotorB.Hindex = 2;
+    if  (MBH1 != 0) MotorB.Hindex |= 1;
+    if  (MBH3 != 0) MotorB.Hindex |= 4;
     MotorB.Hall_change  ();
 }
 void    MBH2f    ()
 {
-    MotorB.index = 0;
-    if  (MBH1 != 0) MotorB.index |= 1;
-    if  (MBH3 != 0) MotorB.index |= 4;
+    MotorB.Hindex = 0;
+    if  (MBH1 != 0) MotorB.Hindex |= 1;
+    if  (MBH3 != 0) MotorB.Hindex |= 4;
     MotorB.Hall_change  ();
 }
 void    MBH3r    ()
 {
-    MotorB.index = 4;
-    if  (MBH1 != 0) MotorB.index |= 1;
-    if  (MBH2 != 0) MotorB.index |= 2;
+    MotorB.Hindex = 4;
+    if  (MBH1 != 0) MotorB.Hindex |= 1;
+    if  (MBH2 != 0) MotorB.Hindex |= 2;
     MotorB.Hall_change  ();
 }
 void    MBH3f    ()
 {
-    MotorB.index = 0;
-    if  (MBH1 != 0) MotorB.index |= 1;
-    if  (MBH2 != 0) MotorB.index |= 2;
+    MotorB.Hindex = 0;
+    if  (MBH1 != 0) MotorB.Hindex |= 1;
+    if  (MBH2 != 0) MotorB.Hindex |= 2;
     MotorB.Hall_change  ();
 }
 
@@ -703,10 +703,13 @@
             j++;
             if  (j > 6)    {   //  Send some status info out of serial port every second and a bit or thereabouts
                 j = 0;
-//double  pres = PressureSensor.getPressure  ();
+            uint8_t stat;
+            stat = PressureSensor.getFstatus();
+double  pres = PressureSensor.getPressure  ();
+//double  tmpr = PressureSensor.getTemperature  ();
 //double  pres = PressureSensor.getTemperature  ();
-                pc.printf   ("Apps %d, Bpps %d, sys_timer %d\r\n", Apps, Bpps, sys_timer);
-//                pc.printf   ("Apps %d, Bpps %d, sys_timer %d, pressure %.2f\r\n", Apps, Bpps, sys_timer, pres);
+//                pc.printf   ("Apps %d, Bpps %d, sys_timer %d\r\n", Apps, Bpps, sys_timer);
+                pc.printf   ("Apps %d, Bpps %d, sys_timer %d, status %d, pressure %.2f\r\n", Apps, Bpps, sys_timer, stat, pres);
                 //            pc.printf   ("V=%+.1f, I=%+.1f, CtrlOut %.3f, RPM %d, %s\r\n", Read_BatteryVolts(), AmpsReading, ControlOut, ReadEngineRPM(), engine_warm ? "Running mode" : "Startup mode");
             }
         }   //  End of if(flag_8Hz)