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

Files at this revision

API Documentation at this revision

Comitter:
JonFreeman
Date:
Sun Aug 16 14:13:19 2020 +0000
Parent:
16:d1e4b9ad3b8b
Commit message:
August 2020. Checked Radio Control input ops.

Changed in this revision

24LC64_eeprom.cpp Show annotated file Show diff for this revision Revisions of this file
brushless_motor.cpp Show annotated file Show diff for this revision Revisions of this file
brushless_motor.h Show annotated file Show diff for this revision Revisions of this file
cli_BLS_nortos.cpp Show annotated file Show diff for this revision Revisions of this file
main.cpp Show annotated file Show diff for this revision Revisions of this file
--- a/24LC64_eeprom.cpp	Tue Jun 09 09:20:19 2020 +0000
+++ b/24LC64_eeprom.cpp	Sun Aug 16 14:13:19 2020 +0000
@@ -385,7 +385,7 @@
         if  (i2c.write(addr_wr) == ACK)
             i2cfree = true;
         else
-            wait_ms   (1);
+            wait_us   (1000);   //  June 2020 changed from wait_ms as now deprecated
     }
     return  i2cfree;
 }
--- a/brushless_motor.cpp	Tue Jun 09 09:20:19 2020 +0000
+++ b/brushless_motor.cpp	Sun Aug 16 14:13:19 2020 +0000
@@ -20,7 +20,7 @@
     : Motor_I(iadc), maxV(pwv,PWM_PRESECALER_DEFAULT), maxI(pwi,PWM_PRESECALER_DEFAULT), H1(px), H2(py), H3(pz), OP(pn, port_bit_mask)      //  Constructor
 */
 brushless_motor::brushless_motor    (PinName iadc, PinName pwv, PinName pwi, 
-    const uint16_t * lutptr, PinName px, PinName py, PinName pz, PortName pn, uint16_t port_bit_mask, uint32_t rnum) 
+    const uint16_t * lutptr, PinName px, PinName py, PinName pz, PortName pn, const uint16_t port_bit_mask, const uint32_t rnum) 
     : Motor_I(iadc), maxV(pwv,PWM_PRESECALER_DEFAULT), maxI(pwi,PWM_PRESECALER_DEFAULT), H1(px), H2(py), H3(pz), OP(pn, port_bit_mask)      //  Constructor
 {    //  Constructor
     OP = 0;
--- a/brushless_motor.h	Tue Jun 09 09:20:19 2020 +0000
+++ b/brushless_motor.h	Sun Aug 16 14:13:19 2020 +0000
@@ -38,7 +38,7 @@
     double      dRPM, dMPH;
                                 
 //    brushless_motor   ()  {}   ;  //  can not use this with exotic elements PortOut, FastPWM etc
-    brushless_motor   (PinName iadc, PinName pwv, PinName pwi, const uint16_t *, PinName h1, PinName h2, PinName h3, PortName, uint16_t, uint32_t)   ;   //  Constructor
+    brushless_motor   (PinName iadc, PinName pwv, PinName pwi, const uint16_t *, PinName h1, PinName h2, PinName h3, PortName, const uint16_t, const uint32_t)   ;   //  Constructor
     bool        poles       (uint32_t)   ;   //  Set number of motor poles - 4, 6, or 8
     void        set_V_limit (double)    ;  //  Sets max motor voltage
     void        set_I_limit (double)    ;  //  Sets max motor current
--- a/cli_BLS_nortos.cpp	Tue Jun 09 09:20:19 2020 +0000
+++ b/cli_BLS_nortos.cpp	Sun Aug 16 14:13:19 2020 +0000
@@ -28,7 +28,7 @@
 extern  error_handling_Jan_2019     ESC_Error    ;         //  Provides array usable to store error codes.
 extern  int     WatchDog;           //  from main
 extern  bool    WatchDogEnable;     //  from main
-extern  bool    read_temperature    (float & t) ;   //  from main March 2020
+//extern  bool    read_temperature    (float & t) ;   //  from main March 2020
 
 extern  brushless_motor MotorA, MotorB;     //  Controlling two motors together or individually
 extern  const char *    get_version    ()  ;    //  Need this as extern const char can not be made to work. This returns & const_version_string
@@ -202,7 +202,7 @@
 *   void    temperature_cmd  (struct parameters & a)  {
 *   Few boards have temperature sensor fitted. Now only supports LM75B i2c sensor
 */
-void    read_temperature_cmd  (struct parameters & a)  {
+/*void    read_temperature_cmd  (struct parameters & a)  {
     float   t = -99.25;
     if  (a.respond) {
         a.com->printf ("tem%c ", user_settings.rd(BOARD_ID));
@@ -211,7 +211,7 @@
         else
             a.com->printf   ("Temp sensor not fitted\r\n");
     }
-}
+}*/
 
 /**
 *void    rpm_cmd (struct parameters & a) //  to report e.g. RPM 1000 1000 ; speed for both motors
@@ -364,6 +364,12 @@
         a.com->printf ("who%c\r%s", user_settings.rd(BOARD_ID), a.source == SOURCE_PC ? "\n" : "");
 }
 
+extern  void    rcins_report ()  ;
+void    qrc_cmd (struct parameters & a)     //  report RC1 and RC2 input condition and activity
+{
+    rcins_report    ();
+}
+
 /**
 *void    rcin_pccmd (struct parameters & a)
 *
@@ -450,7 +456,7 @@
     {"?v", "Report system bus voltage", sysV_report},
     {"?i", "Report motor both currents", sysI_report},
     {"who", "search for connected units, e.g. 3who returs 'who3' if found", who_cmd},
-    {"tem", "report temperature", read_temperature_cmd},
+//    {"tem", "report temperature", read_temperature_cmd},
     {"mph", "read loco speed miles per hour", mph_cmd},
     {"?s", "read loco speed miles per hour", mph_cmd},       //  Shorter-hand added 17th May 2020
 //    {"ssl", "set speed limit e.g. 10.7", ssl_cmd},              //  NEW July 2019
@@ -479,17 +485,18 @@
     {"?v", "Report system bus voltage", sysV_report},
     {"?i", "Report motor both currents", sysI_report},
     {"?w", "show WatchDog timer contents", wd_report},
+    {"kd", "kick the dog, reloads WatchDog", kd_cmd},
     {"who", "search for connected units, e.g. 3who returs 'who3' if found", who_cmd},
     {"us", "read or set user settings in eeprom", user_settings_cmd},                                 //  Big change Jan 2019
     {"ssl", "set speed limit e.g. 10.7", ssl_cmd},              //  NEW July 2019 ONLY HERE FOR TEST, normal use is from Touch Screen only.
     {"sbe", "set brake effectiveness 5 to 90 percent", brake_eff_set_cmd},              //  NEW May 2020
 //    {"erase", "set eeprom contents to all 0xff", erase_cmd},
-    {"tem", "report temperature", read_temperature_cmd},                                     //  Reports -50 when sensor not fitted
-    {"kd", "kick the dog, reloads WatchDog", kd_cmd},
+//    {"tem", "report temperature", read_temperature_cmd},                                     //  Reports -50 when sensor not fitted
     {"ver", "Version", ver_cmd},
     {"rpm", "read motor pair speeds", rpm_cmd},
-    {"mph", "read loco speed miles per hour", mph_cmd},
+//    {"mph", "read loco speed miles per hour", mph_cmd},
     {"?s", "read loco speed miles per hour", mph_cmd},
+    {"?rc", "report RC1 and RC2 input condition and activity", qrc_cmd},
 //    {"rvi", "read most recent values sent to pwms", rvi_cmd},
 //    {"rdi", "read motor currents and power voltage", rdi_cmd},
 //    {"bc", "bogie constants - wheel dia, motor pinion, wheel gear", bogie_constants_report_cmd},
--- a/main.cpp	Tue Jun 09 09:20:19 2020 +0000
+++ b/main.cpp	Sun Aug 16 14:13:19 2020 +0000
@@ -202,13 +202,13 @@
     return  "1.0.y2020.m05.d21\0";  //  Version string, readable using 'ver' serial command
 }
 
-bool    read_temperature    (float & t) {
+/*bool    read_temperature    (float & t) {
 //    pc.printf   ("test param temp = %7.3f\r\n", t);
     if  (!temp_sensor_exists)
         return  false;
     t = temp_sensor;
     return  true;
-}
+}*/
 
 void    setVI_A   (double v, double i)
 {
@@ -448,6 +448,11 @@
     RC_chan_2.set_chanmode  (user_settings.rd(RCIN2), user_settings.rd(RCIN2REVERSE))  ;
 }
 
+void    rcins_report    ()  {
+    pc.printf   ("RC1 pulsewidth %d, period %d, pulsecount %d\r\n", RC_chan_1.pulsewidth(), RC_chan_1.period(), RC_chan_1.pulsecount());
+    pc.printf   ("RC2 pulsewidth %d, period %d, pulsecount %d\r\n", RC_chan_2.pulsewidth(), RC_chan_2.period(), RC_chan_2.pulsecount());
+    pc.printf   ("\r\n");
+}
 
 int main()  //  Programme entry point
 {