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 Aug 16 14:13:19 2020 +0000
Revision:
17:cc9b854295d6
Parent:
14:acaa1add097b
August 2020. Checked Radio Control input ops.

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 12:d1d21a2941ef 6 #include "mbed.h"
JonFreeman 13:ef7a06fa11de 7 #include "STM3_ESC.h"
JonFreeman 12:d1d21a2941ef 8 #include "BufferedSerial.h"
JonFreeman 12:d1d21a2941ef 9 extern BufferedSerial pc;
JonFreeman 12:d1d21a2941ef 10
JonFreeman 12:d1d21a2941ef 11 /*class error_handling_Jan_2019
JonFreeman 12:d1d21a2941ef 12 {
JonFreeman 12:d1d21a2941ef 13 int32_t TS_fault[NUMOF_REPORTABLE_TS_ERRORS] ; // Some number of reportable error codes, accessible through set and read members
JonFreeman 12:d1d21a2941ef 14 public:
JonFreeman 12:d1d21a2941ef 15 error_handling_Jan_2019 () { // default constructor
JonFreeman 12:d1d21a2941ef 16 for (int i = 0; i < (sizeof(TS_fault) / sizeof(int32_t)); i++)
JonFreeman 12:d1d21a2941ef 17 TS_fault[i] = 0;
JonFreeman 12:d1d21a2941ef 18 }
JonFreeman 12:d1d21a2941ef 19 void set (uint32_t, int32_t) ;
JonFreeman 12:d1d21a2941ef 20 uint32_t read (uint32_t) ;
JonFreeman 12:d1d21a2941ef 21 bool all_good () ;
JonFreeman 12:d1d21a2941ef 22 void report_any () ;
JonFreeman 12:d1d21a2941ef 23 } ;
JonFreeman 12:d1d21a2941ef 24 */
JonFreeman 12:d1d21a2941ef 25
JonFreeman 12:d1d21a2941ef 26 const char * FaultList[] = {
JonFreeman 12:d1d21a2941ef 27 /*
JonFreeman 12:d1d21a2941ef 28 FAULT_0,
JonFreeman 12:d1d21a2941ef 29 FAULT_EEPROM,
JonFreeman 12:d1d21a2941ef 30 FAULT_BOARD_ID,
JonFreeman 12:d1d21a2941ef 31 FAULT_COM_LINE_LEN,
JonFreeman 12:d1d21a2941ef 32 FAULT_COM_LINE_NOMATCH,
JonFreeman 12:d1d21a2941ef 33 FAULT_COM_LINE_LEN_PC,
JonFreeman 12:d1d21a2941ef 34 FAULT_COM_LINE_LEN_TS,
JonFreeman 12:d1d21a2941ef 35 FAULT_COM_LINE_NOMATCH_PC,
JonFreeman 12:d1d21a2941ef 36 FAULT_COM_LINE_NOMATCH_TS,
JonFreeman 12:d1d21a2941ef 37 FAULT_MAX,
JonFreeman 12:d1d21a2941ef 38 NUMOF_REPORTABLE_TS_ERRORS
JonFreeman 12:d1d21a2941ef 39 */
JonFreeman 12:d1d21a2941ef 40 "Zero",
JonFreeman 12:d1d21a2941ef 41 "EEPROM",
JonFreeman 12:d1d21a2941ef 42 "board ID",
JonFreeman 12:d1d21a2941ef 43 "com line len",
JonFreeman 12:d1d21a2941ef 44 "com line nomatch",
JonFreeman 12:d1d21a2941ef 45 "com line len",
JonFreeman 12:d1d21a2941ef 46 "com line len",
JonFreeman 12:d1d21a2941ef 47 "com no match",
JonFreeman 12:d1d21a2941ef 48 "com no match",
JonFreeman 12:d1d21a2941ef 49 "max",
JonFreeman 12:d1d21a2941ef 50 "endoflist",
JonFreeman 12:d1d21a2941ef 51 " ",
JonFreeman 12:d1d21a2941ef 52 } ;
JonFreeman 12:d1d21a2941ef 53
JonFreeman 12:d1d21a2941ef 54 bool error_handling_Jan_2019::all_good () {
JonFreeman 12:d1d21a2941ef 55 for (int i = 0; i < NUMOF_REPORTABLE_TS_ERRORS; i++)
JonFreeman 12:d1d21a2941ef 56 if (ESC_fault[i])
JonFreeman 12:d1d21a2941ef 57 return false;
JonFreeman 12:d1d21a2941ef 58 return true;
JonFreeman 12:d1d21a2941ef 59 }
JonFreeman 12:d1d21a2941ef 60
JonFreeman 12:d1d21a2941ef 61 /**void error_handling_Jan_2019::set (uint32_t err_no, int32_t bits_to_set) {
JonFreeman 12:d1d21a2941ef 62 Used to set bits in error int
JonFreeman 12:d1d21a2941ef 63 Uses OR to set new bits without clearing other bits set previously
JonFreeman 12:d1d21a2941ef 64 */
JonFreeman 12:d1d21a2941ef 65 void error_handling_Jan_2019::set (uint32_t err_no, int32_t bits_to_set) {
JonFreeman 12:d1d21a2941ef 66 if (bits_to_set) {
JonFreeman 12:d1d21a2941ef 67 pc.printf ("At Error.set, err_no %d, bits %lx\r\n", err_no, bits_to_set);
JonFreeman 12:d1d21a2941ef 68 ESC_fault[err_no] |= bits_to_set; // Uses OR to set new bits without clearing other bits set previously
JonFreeman 12:d1d21a2941ef 69 }
JonFreeman 12:d1d21a2941ef 70 }
JonFreeman 12:d1d21a2941ef 71
JonFreeman 12:d1d21a2941ef 72 /**void error_handling_Jan_2019::clr (uint32_t err_no) {
JonFreeman 12:d1d21a2941ef 73 Used to clear all bits in error int
JonFreeman 12:d1d21a2941ef 74 */
JonFreeman 12:d1d21a2941ef 75 void error_handling_Jan_2019::clr (uint32_t err_no) {
JonFreeman 12:d1d21a2941ef 76 ESC_fault[err_no] = 0;
JonFreeman 12:d1d21a2941ef 77 }
JonFreeman 12:d1d21a2941ef 78
JonFreeman 12:d1d21a2941ef 79 uint32_t error_handling_Jan_2019::read (uint32_t err_no) {
JonFreeman 12:d1d21a2941ef 80 return ESC_fault[err_no];
JonFreeman 12:d1d21a2941ef 81 }
JonFreeman 12:d1d21a2941ef 82
JonFreeman 12:d1d21a2941ef 83 void error_handling_Jan_2019::report_any (bool retain) {
JonFreeman 12:d1d21a2941ef 84 for (int i = 0; i < NUMOF_REPORTABLE_TS_ERRORS; i++) {
JonFreeman 12:d1d21a2941ef 85 if (ESC_fault[i]) {
JonFreeman 12:d1d21a2941ef 86 pc.printf ("Error report, number %d, value %d, %s\r\n", i, ESC_fault[i], FaultList[i]);
JonFreeman 12:d1d21a2941ef 87 if (!retain)
JonFreeman 12:d1d21a2941ef 88 ESC_fault[i] = 0;
JonFreeman 12:d1d21a2941ef 89 }
JonFreeman 12:d1d21a2941ef 90 }
JonFreeman 12:d1d21a2941ef 91 }
JonFreeman 12:d1d21a2941ef 92