Touch screen drivers control dashboard for miniature locomotive. Features meters for speed, volts, power. Switches for lights, horns. Drives multiple STM3_ESC brushless motor controllers for complete brushless loco system as used in "The Brute" - www.jons-workshop.com
Dependencies: TS_DISCO_F746NG mbed Servo LCD_DISCO_F746NG BSP_DISCO_F746NG QSPI_DISCO_F746NG AsyncSerial FastPWM
Diff: main.cpp
- Revision:
- 14:6bcec5ac21ca
- Parent:
- 12:a25bdf135348
--- a/main.cpp Mon Jan 14 16:51:16 2019 +0000
+++ b/main.cpp Mon Mar 04 17:47:27 2019 +0000
@@ -126,23 +126,30 @@
int bigImafptr;
double amps_longave, // internal use only
amps_latest, // update() called @ 32Hz. Value stored here is average over most recent 3125us
- amps_filtered; // Average of the BIGMAFSIZ most recent samples stored in latest
+ amps_filtered, // Average of the BIGMAFSIZ most recent samples stored in latest
+ amps_filtered2; // Average of the BIGMAFSIZ most recent samples stored in latest
public:
ammeter_reading () { // constructor
bigImafptr = 0;
- amps_longave = amps_latest = amps_filtered = 0.0;
+ amps_longave = amps_latest = amps_filtered = amps_filtered2 = 0.0;
for (int i = 0; i < BIGMAFSIZ; i++)
bigImaf[i] = 0.0;
}
void update () ; // Read ammeter core, store most recent 32ms or so worth in amps_latest, 250ms average in amps_filtered
double latest () ;
double filtered() ;
+ double filtered2() ;
} Ammeter ;
double ammeter_reading::latest () {
return amps_latest;
}
+double ammeter_reading::filtered2 () {
+// could use filter without buffer, weights result more towards more frecent samples
+ return amps_filtered2;
+}
+
double ammeter_reading::filtered () {
return amps_filtered;
}
@@ -156,6 +163,10 @@
if (bigImafptr >= BIGMAFSIZ)
bigImafptr = 0;
amps_filtered = amps_longave / BIGMAFSIZ;
+const double sampweight = (double)(1) / (double)BIGMAFSIZ;
+const double shrinkby = 1.0 - sampweight;
+ amps_filtered2 *= shrinkby;
+ amps_filtered2 += amps_latest * sampweight;
}
@@ -247,9 +258,9 @@
slider.direction = f_r_switch ? REV : FWD; // Only place in the code where direction gets set. Centre-Off power switch REV-OFF-FWD.
My_STM3_ESC_boards.set_I_limit (0.0);
- My_STM3_ESC_boards.set_V_limit (0.0);
- My_STM3_ESC_boards.message ("rb\r");
- throttle (0.0); // Set revs to idle. Start engine and warm up before powering up control
+ My_STM3_ESC_boards.set_V_limit (0.0); // zero power to motors
+ My_STM3_ESC_boards.message ("rb\r"); // regen brake mode
+ throttle (0.0); // Set revs to idle. Start engine and warm up before powering up control
pc.printf ("\r\n\n\nJon's Loco_TS_2018 Loco Controller ver %s starting, direction %s\r\n", const_version_string, slider.direction ? "Forward":"Reverse");
uint8_t lcd_status = touch_screen.Init(lcd.GetXSize(), lcd.GetYSize());
@@ -311,25 +322,7 @@
Speedo.set_value (My_STM3_ESC_boards.mph);
led_grn = !led_grn;
-/*
-Handbrake more sensibly implemented on STM3_ESC boards ?
-
- if (slider.state == PARK) {
- if (My_STM3_ESC_boards.mph > LOCO_HANDBRAKE_ESCAPE_SPEED / 4.0) {
- slider.handbrake_effort *= 1.1;
- if (slider.handbrake_effort > 0.55) slider.handbrake_effort = 0.55;
- set_run_mode (PARK);
- pc.printf ("Handbrake slipping, effort %.2f\r\n", slider.handbrake_effort);
- }
- if (My_STM3_ESC_boards.mph < 0.02) {
- slider.handbrake_effort *= 0.9;
- if (slider.handbrake_effort < 0.05) slider.handbrake_effort = 0.05;
- set_run_mode (PARK);
- pc.printf ("Handbrake not slipping, effort %.2f\r\n", slider.handbrake_effort);
- }
- }
-*/
- My_STM3_ESC_boards.request_mph (); // issues "'n'rpm\r", takes care of cycling through available boards in sequence
+ My_STM3_ESC_boards.request_mph (); // issues "'n'mph\r", takes care of cycling through available boards in sequence
// switch (qtr_sec) { // Can do sequential stuff quarter second apart here
// } // End of switch qtr_sec
qtr_sec++;
@@ -341,12 +334,13 @@
seconds = 0;
minutes++;
// do once per minute stuff here
- Controller_Error.report_any ();
+ Controller_Error.report_any (false); // Reset error having reported it once
} // fall back into once per second
if (seconds & 1)
Speedo.LED (0, LCD_COLOR_DARKGRAY);
else
Speedo.LED (0, LCD_COLOR_RED);
+// pc.printf ("Filter test %.3f, %.3f\r\n", Ammeter.filtered(), Ammeter.filtered2());
My_STM3_ESC_boards.message ("kd\r"); // Kick the WatchDog timers in the Twin BLDC drive boards
recent_distance += (My_STM3_ESC_boards.mph * (111.76 * 4.0)); // Convert mph to distance mm travelled in one second
uint32_t new_metres = ((uint32_t)recent_distance) / 1000;