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

Revision:
10:e40d8724268a
Child:
11:bfb73f083009
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/brushless_motor.h	Tue Jan 15 09:03:57 2019 +0000
@@ -0,0 +1,73 @@
+/*  mbed brushless_motor library
+    Jon Freeman
+    December 2018
+*/
+#ifndef MBED_BRUSHLESSMOTOR_H
+#define MBED_BRUSHLESSMOTOR_H
+
+#include "mbed.h"
+
+class   brushless_motor
+{
+    uint32_t    Hall_total, visible_mode, inner_mode, edge_count_table[MAIN_LOOP_ITERATION_Hz]; //  to contain one seconds worth
+    uint32_t    latest_pulses_per_sec, Hall_tab_ptr, direction, ppstmp;
+    bool    moving_flag;
+    const   uint16_t * lut;
+    uint16_t    ttabl[34];
+    FastPWM * maxV, * maxI;
+    PortOut * Motor_Port;
+    InterruptIn * Hall1, * Hall2, * Hall3;
+public:
+    bool    dc_motor;
+    struct  currents    {
+        uint32_t    max, min, ave;
+    }  I;
+    int32_t     angle_cnt;
+    uint32_t    current_samples[CURRENT_SAMPLES_AVERAGED];  //  Circular buffer where latest current readings get stored
+    uint32_t    Hindex[2], tickleon, encoder_error_cnt;
+    uint32_t    RPM, PPS;
+    double      last_V, last_I;
+    brushless_motor   ()  {}  ;   //  Default constructor
+/**
+    brushless_motor   (PortOut * , FastPWM * , FastPWM * , const uint16_t *, InterruptIn **)  ;
+    
+    PortOut * is &MotA where MotA has been declared as below where PORT_A_MASK identifies which 6 bits of 16 bit port are used to energise motor
+    PortOut MotA    (PortA, PORT_A_MASK);   //  Activate output ports to motor drivers
+    
+    FastPWM * are e.g. &A_MAX_V_PWM, &A_MAX_I_PWM
+    
+    const uint16_t * is e.g. A_tabl defining which port bits set to which level 
+const   uint16_t    A_tabl[] = {  //  Origial table
+    0,  0,  0,  0,  0,  0,  0,  0,  //  Handbrake
+    0,  AWV,AVU,AWU,AUW,AUV,AVW,AUW,  //  Forward 0, WV1, VU1, WU1, UW1, UV1, VW1, 0,    //  JP, FR, SG, PWM = 1 0 1 1   Forward1
+    0,  AVW,AUV,AUW,AWU,AVU,AWV,AWU,  //  Reverse 0, VW1, UV1, UW1, WU1, VU1, WV1, 0,    //  JP, FR, SG, PWM = 1 1 0 1   Reverse1
+    0,  BRA,BRA,BRA,BRA,BRA,BRA,BRA,   //  Regenerative Braking
+    KEEP_L_MASK_A, KEEP_H_MASK_A   //  [32 and 33]
+}   ;
+
+InterruptIn ** is e.g. AHarr pointer to array of addresses of InterruptIns connected to Hall sensors
+InterruptIn * AHarr[] = {
+    &MAH1,
+    &MAH2,
+    &MAH3
+}   ;
+
+*/
+    brushless_motor   (PortOut * , FastPWM * , FastPWM * , const uint16_t *, InterruptIn **)  ;
+    void    set_V_limit (double)    ;  //  Sets max motor voltage
+    void    set_I_limit (double)    ;  //  Sets max motor current
+    void    Hall_change ()  ;           //  Called in response to edge on Hall input pin
+    void    motor_set   ()  ;           //  Energise Port with data determined by Hall sensors
+    void    direction_set   (int)  ;    //  sets 'direction' with bit pattern to eor with FORWARD or REVERSE in set_mode
+    bool    set_mode    (int);          //  sets mode to HANDBRAKE, FORWARD, REVERSE or REGENBRAKE
+    bool    is_moving   ()  ;           //  Returns true if one or more Hall transitions within last 31.25 milli secs
+    void    current_calc    ()  ;       //  Updates 3 uint32_t I.min, I.ave, I.max
+    uint32_t    pulses_per_sec   ()  ;  //  call this once per main loop pass to keep count = edges per sec
+    int     read_Halls  ()  ;           //  Returns 3 bits of latest Hall sensor outputs
+    bool    motor_is_brushless  ();
+    void    high_side_off   ()  ;
+    void    low_side_on     ()  ;
+    void    raw_V_pwm   (int);
+}   ;   //MotorA, MotorB, or even Motor[2];
+
+#endif