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:
Sun Sep 29 16:34:37 2019 +0000
Revision:
13:ef7a06fa11de
Parent:
DualBLS.h@12:d1d21a2941ef
Child:
14:acaa1add097b
Stable code as at end of 2019 running season

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