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-03-04
Revision:
12:d1d21a2941ef
Parent:
11:bfb73f083009

File content as of revision 12:d1d21a2941ef:

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

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

class   brushless_motor
{
    int32_t     angle_cnt;
    uint32_t    Hall_index[2], encoder_error_cnt, motor_poles, current_sense_rs_offset;
    uint32_t    Hall_total,         //  Incremented on every Hall sensor transition
                Hall_previous,
                visible_mode, 
                inner_mode; 
    uint32_t    direction;
    int         temp_tick;
    double      RPM_filter, dv_by_dt;
    double      target_speed;
    bool        moving_flag;
    const       uint16_t * lut;
    AnalogIn    Motor_I;
    FastPWM     maxV,   maxI;
    InterruptIn H1, H2, H3;     //  Inputs for motor Hall sensors
    PortOut     OP;
    void        Hall_change ()  ;
    int         read_Halls  ()  ;           //  Returns 3 bits of latest Hall sensor outputs
    uint32_t    max_rpm ;
    double      V_clamp ;   //  Used to limit top speed
    double      numof_current_sense_rs;
public:
#ifdef  USING_DC_MOTORS
    bool    dc_motor;
#endif
    uint32_t    tickleon;
    double      Idbl;
    double      last_V, last_I;
    double      dRPM, dMPH, s[8];
//    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, uint32_t)   ;   //  Constructor
    bool    poles       (int)   ;   //  Set number of motor poles - 4, 6, or 8
    void    set_speed   (double)    ;   //  Sets target_speed
    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 MOTOR_FORWARD or MOTOR_REVERSE in set_mode
    bool    set_mode    (int);          //  sets mode to MOTOR_HANDBRAKE, MOTOR_FORWARD, MOTOR_REVERSE or MOTOR_REGENBRAKE
    bool    is_moving   ()  ;           //  Returns true if one or more Hall transitions within last 31.25 milli secs
    void    speed_monitor_and_control   ()  ;  //  call this once per main loop pass (32Hz) to keep count = edges per sec
    void    high_side_off   ()  ;
//    void    low_side_on     ()  ;
    void    sniff_current   ()  ;           //  Call this every 200us to update Idbl
}   ;   //MotorA, MotorB, or even Motor[2];

#endif