STM3 ESC dual brushless motor controller. 10-60v, motor power rating tiny to kW. Ganged or independent motor control As used in 'The Brute' locomotive - www.jons-workshop.com
Dependencies: mbed BufferedSerial Servo FastPWM
DualBLS.h@12:d1d21a2941ef, 2019-03-04 (annotated)
- 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?
User | Revision | Line number | New 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 |