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
Diff: brushless_motor.h
- Revision:
- 16:d1e4b9ad3b8b
- Parent:
- 14:acaa1add097b
- Child:
- 17:cc9b854295d6
--- a/brushless_motor.h Sat Nov 30 18:40:30 2019 +0000
+++ b/brushless_motor.h Tue Jun 09 09:20:19 2020 +0000
@@ -18,45 +18,43 @@
visible_mode, // One of MOTOR_HANDBRAKE, MOTOR_FORWARD, MOTOR_REVERSE, MOTOR_REGENBRAKE
inner_mode;
uint32_t direction;
- int temp_tick;
- double RPM_filter, dv_by_dt;
- double target_speed;
+ double RPM_filter; //, dv_by_dt;
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 motor_voltage_refresh () ;
void Hall_change () ;
- int read_Halls () ; // Returns 3 bits of latest Hall sensor outputs
- uint32_t max_rpm ;
+ uint32_t 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;
+// double numof_current_sense_rs;
+ double last_V, last_I, current_scale;
public:
-#ifdef USING_DC_MOTORS // deprecated
- bool dc_motor;
-#endif
uint32_t tickleon;
double Idbl;
- double last_V, last_I;
- double dRPM, dMPH,
- sdbl[8]; // Filter coefficients for filtering RPM and MPH reading stuff, I think!
- // Used in brushless_motor::speed_monitor_and_control ()
+ double dRPM, dMPH;
// 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 () ;
+ brushless_motor (PinName iadc, PinName pwv, PinName pwi, const uint16_t *, PinName h1, PinName h2, PinName h3, PortName, uint16_t, uint32_t) ; // Constructor
+ bool poles (uint32_t) ; // Set number of motor poles - 4, 6, or 8
+ 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 set_direction (uint32_t) ; // sets 'direction' with bit pattern to eor with MOTOR_FORWARD or MOTOR_REVERSE in set_mode
+ void brake (double brake_effort) ;
+// uint32_t get_direction () ;
+ bool set_mode (uint32_t); // sets mode to MOTOR_HANDBRAKE, MOTOR_FORWARD, MOTOR_REVERSE or MOTOR_REGENBRAKE
+ uint32_t get_mode () ;
+ 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
+ void sniff_current () ; // Call this every 200us to update Idbl
+ void I_scale (double);
+ bool exists () ; // New May 2020 - reports presence or absence of motor
} ; //MotorA, MotorB, or even Motor[2];
#endif