Code for 'Smart Regulator' featured in 'Model Engineer', November 2020 on. Contains all work to August 2020 including all code described. Top level algorithm development is quite spares, leaving some work for you! Any questions - jon@jons-workshop.com

Dependencies:   mbed BufferedSerial Servo2 PCT2075 I2CEeprom FastPWM

Committer:
JonFreeman
Date:
Sat Dec 05 12:40:17 2020 +0000
Revision:
5:6ca3e7ffc553
Parent:
3:43cb067ecd00
Code for 'Smart Regulator' to August 2020, published as is. Basic low-level functions all thoroughly tested and debugged, top level algorithms have scope for further development - over to you! For help contact jon @ jons-workshop[.com

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 3:43cb067ecd00 1 #include "mbed.h"
JonFreeman 3:43cb067ecd00 2 #include "Servo.h"
JonFreeman 3:43cb067ecd00 3 extern Timer microsecs; // 64 bit counter, rolls over in half million years
JonFreeman 3:43cb067ecd00 4
JonFreeman 3:43cb067ecd00 5 const uint32_t TICKOVER_RPM = 1500; //2500;
JonFreeman 3:43cb067ecd00 6 const uint32_t MIN_RPM = 1600; //3600;
JonFreeman 3:43cb067ecd00 7 const uint32_t MAX_RPM = 3600; //6500;
JonFreeman 3:43cb067ecd00 8 const uint32_t MAX_RPM_LIMIT = 4000; //7500; // Used in building lookup table
JonFreeman 3:43cb067ecd00 9 //const double RPM_ERR_DENOM = (MAX_RPM_LIMIT * 20.0); // Larger -> more stable, Smaller -> faster response
JonFreeman 3:43cb067ecd00 10 const double RPM_ERR_DENOM = (MAX_RPM_LIMIT * 12.0); // Larger -> more stable, Smaller -> faster response
JonFreeman 3:43cb067ecd00 11 //const uint32_t RPM_DEADBAND = (MAX_RPM_LIMIT / 125); // Does not attempt to correct speed errors below this
JonFreeman 3:43cb067ecd00 12 const uint32_t RPM_DEADBAND = (MAX_RPM_LIMIT / 180); // Does not attempt to correct speed errors below this
JonFreeman 3:43cb067ecd00 13 const uint32_t DEBOUNCE_US = (45000000 / MAX_RPM);
JonFreeman 3:43cb067ecd00 14
JonFreeman 3:43cb067ecd00 15 const double RPM_FILTER_FACTOR = 0.25;
JonFreeman 3:43cb067ecd00 16 const double MIN_WORKING_THROTTLE = 0.23;
JonFreeman 3:43cb067ecd00 17 const double MAX_WORKING_THROTTLE = 0.99;
JonFreeman 3:43cb067ecd00 18 /* Cleans magneto pulses, calculates and attempts to maintain RPM */
JonFreeman 3:43cb067ecd00 19 class Engine_Manager {
JonFreeman 3:43cb067ecd00 20 uint32_t latest_RPM_reading, core_call_count;
JonFreeman 3:43cb067ecd00 21 uint64_t magt0, magt1, time_since_last_spark, new_time, last_update_time;
JonFreeman 3:43cb067ecd00 22 double servo_position, filtered_measured_RPM, requested_RPM;
JonFreeman 3:43cb067ecd00 23 InterruptIn MagnetoSignal;
JonFreeman 3:43cb067ecd00 24 DigitalOut CleanedMagneto;
JonFreeman 3:43cb067ecd00 25 Servo Speed_ControlServo;
JonFreeman 3:43cb067ecd00 26 // const uint32_t debounce;
JonFreeman 3:43cb067ecd00 27 void RPM_update ();
JonFreeman 3:43cb067ecd00 28 void MagRise ();
JonFreeman 3:43cb067ecd00 29 void MagFall ();
JonFreeman 3:43cb067ecd00 30 void magneto_timeoutC ();
JonFreeman 3:43cb067ecd00 31 bool magneto_stretch;
JonFreeman 3:43cb067ecd00 32 bool running_flag;
JonFreeman 3:43cb067ecd00 33 bool rpm_in_run_range;
JonFreeman 3:43cb067ecd00 34 Timeout magneto_timoC;
JonFreeman 3:43cb067ecd00 35 // Timer microseconds;
JonFreeman 3:43cb067ecd00 36 public:
JonFreeman 3:43cb067ecd00 37 Engine_Manager (PinName magneto_signal, PinName cleaned_output, PinName for_servo) ; //
JonFreeman 5:6ca3e7ffc553 38 void Set_Speed_Lever (double);
JonFreeman 3:43cb067ecd00 39 bool running ();
JonFreeman 3:43cb067ecd00 40 void manager_core();
JonFreeman 3:43cb067ecd00 41 double get_servo_position ();
JonFreeman 3:43cb067ecd00 42 uint32_t RPM_latest ();
JonFreeman 3:43cb067ecd00 43 uint32_t RPM_filtered();
JonFreeman 3:43cb067ecd00 44 uint32_t get_RPM_requested () ; // Returns latest requested RPM
JonFreeman 3:43cb067ecd00 45 uint32_t set_RPM_literal (uint32_t); // Returns latest measured RPM
JonFreeman 3:43cb067ecd00 46 uint32_t set_RPM_percent (uint32_t); // Returns latest measured RPM
JonFreeman 3:43cb067ecd00 47 uint32_t RPM_percent_to_actual (uint32_t); // Returns RPM actual calculated from percent
JonFreeman 3:43cb067ecd00 48 } ;
JonFreeman 3:43cb067ecd00 49