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

brushless_motor.h

Committer:
JonFreeman
Date:
2019-01-19
Revision:
11:bfb73f083009
Parent:
10:e40d8724268a
Child:
12:d1d21a2941ef

File content as of revision 11:bfb73f083009:

/*  mbed brushless_motor library
    Jon Freeman
    December 2018
*/
#ifndef MBED_BRUSHLESSMOTOR_H
#define MBED_BRUSHLESSMOTOR_H

#include "mbed.h"
#include "DualBLS.h"

class   brushless_motor
{
    int32_t     angle_cnt;
    uint32_t    Hall_index[2], encoder_error_cnt;
    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;
    FastPWM maxI;
    InterruptIn H1;
    InterruptIn H2;
    InterruptIn H3;
    PortOut     OP;
    AnalogIn    Motor_I;
    void    Hall_change ()  ;
    int     read_Halls  ()  ;           //  Returns 3 bits of latest Hall sensor outputs
public:
    bool    dc_motor;
    struct  currents    {
        uint32_t    max, min, ave;
    }  I;
    uint32_t    current_samples[CURRENT_SAMPLES_AVERAGED];  //  Circular buffer where latest current readings get stored
    uint32_t    cs_ptr;
    uint32_t    RPM, PPS, tickleon;
    double      last_V, last_I;
//    brushless_motor   ()  {}   ;  //  can not use this with exotic elements PortOut, FastPWM etc
    brushless_motor   (PinName iadc, PinName pwv, PinName pwi, const uint16_t *, PinName h1, PinName h2, PinName h3, PortName, int)   ;   //  Constructor
    void    set_V_limit (double)    ;  //  Sets max motor voltage
    void    set_I_limit (double)    ;  //  Sets max motor current
    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
    bool    motor_is_brushless  ();
    void    high_side_off   ()  ;
    void    low_side_on     ()  ;
    void    raw_V_pwm   (int);
    void    sniff_current   ()  ;
}   ;   //MotorA, MotorB, or even Motor[2];

#endif