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: main.cpp
- Revision:
- 1:0fabe6fdb55b
- Parent:
- 0:435bf84ce48a
- Child:
- 2:04761b196473
--- a/main.cpp Thu Mar 01 11:29:28 2018 +0000
+++ b/main.cpp Wed Mar 07 08:29:18 2018 +0000
@@ -2,7 +2,6 @@
#include "DualBLS.h"
#include "BufferedSerial.h"
#include "FastPWM.h"
-#include "MPL3115A2.h"
/* STM32F401RE - compile using NUCLEO-F401RE
// PROJECT - Dual Brushless Motor Controller - March 2018.
@@ -139,10 +138,6 @@
I2C i2c (PB_7, PB_6); // Pins 58, 59 For 24LC64 eeprom
// Pin 60 BOOT0
-//MPL3115A2(PinName sda, PinName scl, int addr) ;
-//MPL3115A2 PressureSensor (PB_7, PB_6, 0xa0) ;
-//double PressureSensor.getPressure ();
-
#ifdef SERVO1_IN
InterruptIn Servo1_i (PB_8); // Pin 61 to read output from rc rx
#endif
@@ -347,7 +342,7 @@
PortOut * Motor_Port;
public:
uint32_t current_samples[CURRENT_SAMPLES_AVERAGED]; // Circular buffer where latest current readings get stored
- uint32_t index;
+ uint32_t Hindex;
motor () {} ; // Default constructor
motor (PortOut * , FastPWM * , FastPWM * , const uint16_t * ) ;
void set_V_limit (double) ; // Sets max motor voltage
@@ -356,6 +351,7 @@
bool set_mode (int);
void current_calc () ;
uint32_t pulses_per_sec () ; // call this once per main loop pass to keep count = edges per sec
+ int read_Halls () ;
} ; //MotorA, MotorB;
motor MotorA (&MotA, &A_MAX_V_PWM, &A_MAX_I_PWM, A_tabl);
@@ -366,7 +362,7 @@
maxV = _maxV_;
maxI = _maxI_;
Hall_total = mode = 0; // mode can be only 0, 8, 16 or 24, lut row select for Handbrake, Forward, Reverse, or Regen Braking
- index = 0;
+ Hindex = 0;
Hall_tab_ptr = 0;
latest_pulses_per_sec = 0;
for (int i = 0; i < MAIN_LOOP_ITERATION_Hz; i++)
@@ -386,6 +382,10 @@
lut = lutptr;
}
+int motor::read_Halls () {
+ return Hindex;
+}
+
void motor::current_calc ()
{
I.min = 0x0fffffff; // samples are 16 bit
@@ -453,91 +453,91 @@
{
Hall_total++;
mode &= 0x038L; // safety
- *Motor_Port = lut[mode + index];
+ *Motor_Port = lut[mode + Hindex];
}
void MAH1r ()
{
- MotorA.index = 1;
- if (MAH2 != 0) MotorA.index |= 2;
- if (MAH3 != 0) MotorA.index |= 4;
+ MotorA.Hindex = 1;
+ if (MAH2 != 0) MotorA.Hindex |= 2;
+ if (MAH3 != 0) MotorA.Hindex |= 4;
MotorA.Hall_change ();
}
void MAH1f ()
{
- MotorA.index = 0;
- if (MAH2 != 0) MotorA.index |= 2;
- if (MAH3 != 0) MotorA.index |= 4;
+ MotorA.Hindex = 0;
+ if (MAH2 != 0) MotorA.Hindex |= 2;
+ if (MAH3 != 0) MotorA.Hindex |= 4;
MotorA.Hall_change ();
}
void MAH2r ()
{
- MotorA.index = 2;
- if (MAH1 != 0) MotorA.index |= 1;
- if (MAH3 != 0) MotorA.index |= 4;
+ MotorA.Hindex = 2;
+ if (MAH1 != 0) MotorA.Hindex |= 1;
+ if (MAH3 != 0) MotorA.Hindex |= 4;
MotorA.Hall_change ();
}
void MAH2f ()
{
- MotorA.index = 0;
- if (MAH1 != 0) MotorA.index |= 1;
- if (MAH3 != 0) MotorA.index |= 4;
+ MotorA.Hindex = 0;
+ if (MAH1 != 0) MotorA.Hindex |= 1;
+ if (MAH3 != 0) MotorA.Hindex |= 4;
MotorA.Hall_change ();
}
void MAH3r ()
{
- MotorA.index = 4;
- if (MAH1 != 0) MotorA.index |= 1;
- if (MAH2 != 0) MotorA.index |= 2;
+ MotorA.Hindex = 4;
+ if (MAH1 != 0) MotorA.Hindex |= 1;
+ if (MAH2 != 0) MotorA.Hindex |= 2;
MotorA.Hall_change ();
}
void MAH3f ()
{
- MotorA.index = 0;
- if (MAH1 != 0) MotorA.index |= 1;
- if (MAH2 != 0) MotorA.index |= 2;
+ MotorA.Hindex = 0;
+ if (MAH1 != 0) MotorA.Hindex |= 1;
+ if (MAH2 != 0) MotorA.Hindex |= 2;
MotorA.Hall_change ();
}
void MBH1r ()
{
- MotorB.index = 1;
- if (MBH2 != 0) MotorB.index |= 2;
- if (MBH3 != 0) MotorB.index |= 4;
+ MotorB.Hindex = 1;
+ if (MBH2 != 0) MotorB.Hindex |= 2;
+ if (MBH3 != 0) MotorB.Hindex |= 4;
MotorB.Hall_change ();
}
void MBH1f ()
{
- MotorB.index = 0;
- if (MBH2 != 0) MotorB.index |= 2;
- if (MBH3 != 0) MotorB.index |= 4;
+ MotorB.Hindex = 0;
+ if (MBH2 != 0) MotorB.Hindex |= 2;
+ if (MBH3 != 0) MotorB.Hindex |= 4;
MotorB.Hall_change ();
}
void MBH2r ()
{
- MotorB.index = 2;
- if (MBH1 != 0) MotorB.index |= 1;
- if (MBH3 != 0) MotorB.index |= 4;
+ MotorB.Hindex = 2;
+ if (MBH1 != 0) MotorB.Hindex |= 1;
+ if (MBH3 != 0) MotorB.Hindex |= 4;
MotorB.Hall_change ();
}
void MBH2f ()
{
- MotorB.index = 0;
- if (MBH1 != 0) MotorB.index |= 1;
- if (MBH3 != 0) MotorB.index |= 4;
+ MotorB.Hindex = 0;
+ if (MBH1 != 0) MotorB.Hindex |= 1;
+ if (MBH3 != 0) MotorB.Hindex |= 4;
MotorB.Hall_change ();
}
void MBH3r ()
{
- MotorB.index = 4;
- if (MBH1 != 0) MotorB.index |= 1;
- if (MBH2 != 0) MotorB.index |= 2;
+ MotorB.Hindex = 4;
+ if (MBH1 != 0) MotorB.Hindex |= 1;
+ if (MBH2 != 0) MotorB.Hindex |= 2;
MotorB.Hall_change ();
}
void MBH3f ()
{
- MotorB.index = 0;
- if (MBH1 != 0) MotorB.index |= 1;
- if (MBH2 != 0) MotorB.index |= 2;
+ MotorB.Hindex = 0;
+ if (MBH1 != 0) MotorB.Hindex |= 1;
+ if (MBH2 != 0) MotorB.Hindex |= 2;
MotorB.Hall_change ();
}
@@ -703,10 +703,13 @@
j++;
if (j > 6) { // Send some status info out of serial port every second and a bit or thereabouts
j = 0;
-//double pres = PressureSensor.getPressure ();
+ uint8_t stat;
+ stat = PressureSensor.getFstatus();
+double pres = PressureSensor.getPressure ();
+//double tmpr = PressureSensor.getTemperature ();
//double pres = PressureSensor.getTemperature ();
- pc.printf ("Apps %d, Bpps %d, sys_timer %d\r\n", Apps, Bpps, sys_timer);
-// pc.printf ("Apps %d, Bpps %d, sys_timer %d, pressure %.2f\r\n", Apps, Bpps, sys_timer, pres);
+// pc.printf ("Apps %d, Bpps %d, sys_timer %d\r\n", Apps, Bpps, sys_timer);
+ pc.printf ("Apps %d, Bpps %d, sys_timer %d, status %d, pressure %.2f\r\n", Apps, Bpps, sys_timer, stat, pres);
// pc.printf ("V=%+.1f, I=%+.1f, CtrlOut %.3f, RPM %d, %s\r\n", Read_BatteryVolts(), AmpsReading, ControlOut, ReadEngineRPM(), engine_warm ? "Running mode" : "Startup mode");
}
} // End of if(flag_8Hz)