Jon Freeman / Mbed 2 deprecated Brushless_STM3_ESC_2019_10

Dependencies:   mbed BufferedSerial Servo PCT2075 FastPWM

Committer:
JonFreeman
Date:
Sat Nov 30 16:34:58 2019 +0000
Revision:
14:acaa1add097b
Parent:
13:ef7a06fa11de
Child:
16:d1e4b9ad3b8b
Proved inverter board for radio control inputs work.

Who changed what in which revision?

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