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:
Mon Mar 04 17:51:08 2019 +0000
Revision:
12:d1d21a2941ef
Parent:
11:bfb73f083009
STM3 ESC dual motor controller boards. Always 'Work In Progress', working snapshot March 2019

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 11:bfb73f083009 1 #include "mbed.h"
JonFreeman 11:bfb73f083009 2
JonFreeman 11:bfb73f083009 3 #ifndef MBED_DUALBLS_H
JonFreeman 11:bfb73f083009 4 #define MBED_DUALBLS_H
JonFreeman 11:bfb73f083009 5
JonFreeman 12:d1d21a2941ef 6 //#define USING_DC_MOTORS // Uncomment this to play with Dinosaur DC motors
JonFreeman 3:ecb00e0e8d68 7
JonFreeman 12:d1d21a2941ef 8 #include "BufferedSerial.h"
JonFreeman 12:d1d21a2941ef 9 const int MOTOR_HANDBRAKE = 0,
JonFreeman 12:d1d21a2941ef 10 MOTOR_FORWARD = 8,
JonFreeman 12:d1d21a2941ef 11 MOTOR_REVERSE = 16,
JonFreeman 12:d1d21a2941ef 12 MOTOR_REGENBRAKE = 24;
JonFreeman 12:d1d21a2941ef 13
JonFreeman 12:d1d21a2941ef 14 const int TIMEOUT_SECONDS = 2;
JonFreeman 5:ca86a7848d54 15
JonFreeman 5:ca86a7848d54 16 /* Please Do Not Alter these */
JonFreeman 12:d1d21a2941ef 17 const int PWM_PRESECALER_DEFAULT = 2,
JonFreeman 8:93203f473f6e 18 VOLTAGE_READ_INTERVAL_US = 50, // Interrupts timed every 50 micro sec, runs around loop performing 1 A-D conversion per pass
JonFreeman 5:ca86a7848d54 19 MAIN_LOOP_REPEAT_TIME_US = 31250, // 31250 us, with TACHO_TAB_SIZE = 32 means tacho_ticks_per_time is tacho_ticks_per_second
JonFreeman 5:ca86a7848d54 20 MAIN_LOOP_ITERATION_Hz = 1000000 / MAIN_LOOP_REPEAT_TIME_US,
JonFreeman 12:d1d21a2941ef 21 // CURRENT_SAMPLES_AVERAGED = 100, // Current is spikey. Reading smoothed by using average of this many latest current readings
JonFreeman 8:93203f473f6e 22 PWM_HZ = 15000, // chosen to be above cutoff frequency of average human ear
JonFreeman 12:d1d21a2941ef 23 // PWM_HZ = 8000, // chosen to be above cutoff frequency of average human ear - clearly audible annoying noise
JonFreeman 8:93203f473f6e 24 MAX_PWM_TICKS = (SystemCoreClock / (PWM_HZ * PWM_PRESECALER_DEFAULT)),
JonFreeman 5:ca86a7848d54 25 TICKLE_TIMES = 100 ,
JonFreeman 5:ca86a7848d54 26 WATCHDOG_RELOAD = (TIMEOUT_SECONDS * 8); // WatchDog counter ticked down in 8Hz loop
JonFreeman 5:ca86a7848d54 27
JonFreeman 5:ca86a7848d54 28 /* End of Please Do Not Alter these */
JonFreeman 3:ecb00e0e8d68 29 const double PI = 4.0 * atan(1.0),
JonFreeman 3:ecb00e0e8d68 30 TWOPI = 8.0 * atan(1.0);
JonFreeman 5:ca86a7848d54 31
JonFreeman 11:bfb73f083009 32 enum {COM_SOURCES, COM1, COM2, HAND, RC_IN1, RC_IN2,THEEND} ;
JonFreeman 11:bfb73f083009 33
JonFreeman 12:d1d21a2941ef 34 enum {MOTADIR, MOTBDIR, MOTAPOLES, MOTBPOLES, ISHUNTA, ISHUNTB, SVO1, SVO2, RCIN1, RCIN2,
JonFreeman 12:d1d21a2941ef 35 COMM_SRC, BOARD_ID, TOP_SPEED, WHEELDIA, MOTPIN, WHEELGEAR,
JonFreeman 12:d1d21a2941ef 36 FUT1, FUT2, FUT3, FUT4, FUT5} ; //
JonFreeman 5:ca86a7848d54 37
JonFreeman 12:d1d21a2941ef 38 enum {
JonFreeman 12:d1d21a2941ef 39 FAULT_0,
JonFreeman 12:d1d21a2941ef 40 FAULT_EEPROM,
JonFreeman 12:d1d21a2941ef 41 FAULT_BOARD_ID,
JonFreeman 12:d1d21a2941ef 42 FAULT_COM_LINE_LEN,
JonFreeman 12:d1d21a2941ef 43 FAULT_COM_LINE_NOMATCH,
JonFreeman 12:d1d21a2941ef 44 FAULT_COM_LINE_LEN_PC,
JonFreeman 12:d1d21a2941ef 45 FAULT_COM_LINE_LEN_TS,
JonFreeman 12:d1d21a2941ef 46 FAULT_COM_LINE_NOMATCH_PC,
JonFreeman 12:d1d21a2941ef 47 FAULT_COM_LINE_NOMATCH_TS,
JonFreeman 12:d1d21a2941ef 48 FAULT_UNRECOGNISED_STATE,
JonFreeman 12:d1d21a2941ef 49 FAULT_MAX,
JonFreeman 12:d1d21a2941ef 50 NUMOF_REPORTABLE_TS_ERRORS
JonFreeman 12:d1d21a2941ef 51 } ;
JonFreeman 12:d1d21a2941ef 52
JonFreeman 12:d1d21a2941ef 53 class error_handling_Jan_2019
JonFreeman 12:d1d21a2941ef 54 {
JonFreeman 12:d1d21a2941ef 55 int32_t ESC_fault[NUMOF_REPORTABLE_TS_ERRORS] ; // Some number of reportable error codes, accessible through set and read members
JonFreeman 12:d1d21a2941ef 56 public:
JonFreeman 12:d1d21a2941ef 57 error_handling_Jan_2019 () { // default constructor
JonFreeman 12:d1d21a2941ef 58 for (int i = 0; i < (sizeof(ESC_fault) / sizeof(int32_t)); i++)
JonFreeman 12:d1d21a2941ef 59 ESC_fault[i] = 0;
JonFreeman 12:d1d21a2941ef 60 }
JonFreeman 12:d1d21a2941ef 61 void set (uint32_t, int32_t) ;
JonFreeman 12:d1d21a2941ef 62 void clr (uint32_t) ;
JonFreeman 12:d1d21a2941ef 63 uint32_t read (uint32_t) ;
JonFreeman 12:d1d21a2941ef 64 bool all_good () ;
JonFreeman 12:d1d21a2941ef 65 void report_any (bool) ; // retain ? true or false
JonFreeman 6:f289a49c1eae 66 } ;
JonFreeman 10:e40d8724268a 67
JonFreeman 12:d1d21a2941ef 68 enum {SOURCE_PC, SOURCE_TS} ;
JonFreeman 12:d1d21a2941ef 69 const int BROADCAST = '\r';
JonFreeman 12:d1d21a2941ef 70 const int MAX_PARAMS = 20;
JonFreeman 12:d1d21a2941ef 71 const int MAX_CMD_LEN = 220;
JonFreeman 12:d1d21a2941ef 72
JonFreeman 12:d1d21a2941ef 73 struct parameters {
JonFreeman 12:d1d21a2941ef 74 struct kb_command const * command_list;
JonFreeman 12:d1d21a2941ef 75 BufferedSerial * com; // pc or com2
JonFreeman 12:d1d21a2941ef 76 int32_t position_in_list, numof_dbls, target_unit, source, numof_menu_items;
JonFreeman 12:d1d21a2941ef 77 double dbl[MAX_PARAMS];
JonFreeman 12:d1d21a2941ef 78 bool respond, resp_always;
JonFreeman 12:d1d21a2941ef 79 } ;
JonFreeman 12:d1d21a2941ef 80
JonFreeman 12:d1d21a2941ef 81 class cli_2019 {
JonFreeman 12:d1d21a2941ef 82 struct kb_command const * commandlist ;
JonFreeman 12:d1d21a2941ef 83 int clindex;
JonFreeman 12:d1d21a2941ef 84 char cmdline[MAX_CMD_LEN + 8];
JonFreeman 12:d1d21a2941ef 85 char * cmdline_ptr;
JonFreeman 12:d1d21a2941ef 86 parameters a ;
JonFreeman 12:d1d21a2941ef 87 public:
JonFreeman 12:d1d21a2941ef 88 cli_2019 (BufferedSerial * comport, kb_command const * list, int list_len, int source) {
JonFreeman 12:d1d21a2941ef 89 a.com = comport ;
JonFreeman 12:d1d21a2941ef 90 a.command_list = commandlist = list ;
JonFreeman 12:d1d21a2941ef 91 a.numof_menu_items = list_len ;
JonFreeman 12:d1d21a2941ef 92 a.source = source ;
JonFreeman 12:d1d21a2941ef 93 cmdline_ptr = cmdline;
JonFreeman 12:d1d21a2941ef 94 clindex = 0;
JonFreeman 12:d1d21a2941ef 95 if (source == SOURCE_PC)
JonFreeman 12:d1d21a2941ef 96 a.resp_always = true;
JonFreeman 12:d1d21a2941ef 97 else
JonFreeman 12:d1d21a2941ef 98 a.resp_always = false;
JonFreeman 12:d1d21a2941ef 99 } ;
JonFreeman 12:d1d21a2941ef 100 void core () ;
JonFreeman 12:d1d21a2941ef 101 void test () ;
JonFreeman 12:d1d21a2941ef 102 } ;
JonFreeman 12:d1d21a2941ef 103
JonFreeman 12:d1d21a2941ef 104 class eeprom_settings {
JonFreeman 12:d1d21a2941ef 105 I2C i2c;
JonFreeman 12:d1d21a2941ef 106 uint32_t errors;
JonFreeman 12:d1d21a2941ef 107 char settings [36];
JonFreeman 12:d1d21a2941ef 108 bool rd_24LC64 (int start_addr, char * dest, int length) ;
JonFreeman 12:d1d21a2941ef 109 bool wr_24LC64 (int start_addr, char * dest, int length) ;
JonFreeman 12:d1d21a2941ef 110 bool set_24LC64_internal_address (int start_addr) ;
JonFreeman 12:d1d21a2941ef 111 bool ack_poll () ;
JonFreeman 12:d1d21a2941ef 112 public:
JonFreeman 12:d1d21a2941ef 113 eeprom_settings (PinName sda, PinName scl); // Constructor
JonFreeman 12:d1d21a2941ef 114 char rd (uint32_t) ; // Read one setup char value from private buffer 'settings'
JonFreeman 12:d1d21a2941ef 115 bool wr (char, uint32_t) ; // Write one setup char value to private buffer 'settings'
JonFreeman 12:d1d21a2941ef 116 bool save () ; // Write 'settings' buffer to EEPROM
JonFreeman 12:d1d21a2941ef 117 bool set_defaults (); // Put default settings into EEPROM and local buffer
JonFreeman 12:d1d21a2941ef 118 uint32_t errs () ; // Return errors
JonFreeman 12:d1d21a2941ef 119 } ;
JonFreeman 12:d1d21a2941ef 120
JonFreeman 12:d1d21a2941ef 121
JonFreeman 12:d1d21a2941ef 122
JonFreeman 12:d1d21a2941ef 123
JonFreeman 11:bfb73f083009 124 #endif
JonFreeman 11:bfb73f083009 125