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:
- 11:bfb73f083009
- Parent:
- 10:e40d8724268a
- Child:
- 12:d1d21a2941ef
--- a/brushless_motor.h Tue Jan 15 09:03:57 2019 +0000
+++ b/brushless_motor.h Sat Jan 19 11:45:01 2019 +0000
@@ -6,68 +6,50 @@
#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, * maxI;
- PortOut * Motor_Port;
- InterruptIn * Hall1, * Hall2, * Hall3;
+ 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;
- 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;
+ uint32_t cs_ptr;
+ uint32_t RPM, PPS, tickleon;
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 **) ;
+// 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 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);
+ void sniff_current () ;
} ; //MotorA, MotorB, or even Motor[2];
#endif