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