Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed BufferedSerial Servo2 PCT2075 I2CEeprom FastPWM
Revision 5:6ca3e7ffc553, committed 2020-12-05
- Comitter:
- JonFreeman
- Date:
- Sat Dec 05 12:40:17 2020 +0000
- Parent:
- 4:28cc0cf01570
- Commit message:
- 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
Changed in this revision
--- a/Alternator.h Fri Aug 07 13:06:03 2020 +0000 +++ b/Alternator.h Sat Dec 05 12:40:17 2020 +0000 @@ -1,5 +1,8 @@ +/******************************************************************************* + DON'T FORGET TO REMOVE SOLDER LINKS SB16 AND SB18 ON L432KC BOARD +*******************************************************************************/ -#define GPS_ // Not the crap one I tried! +//#define GPS_ // Not the crap one I tried! const double ALTERNATOR_DESIGN_VOLTAGE = 14.0; // Used to scale down max field pwm when available voltage higher than this const double DRIVER_NEUTRAL = 0.18; // Proportion of driver's pot travel deemed to be zero power request
--- a/Servo.lib Fri Aug 07 13:06:03 2020 +0000 +++ b/Servo.lib Sat Dec 05 12:40:17 2020 +0000 @@ -1,1 +1,1 @@ -https://os.mbed.com/users/simon/code/Servo/#94980819591d +https://os.mbed.com/users/JonFreeman/code/Servo2/#94980819591d
--- a/cli.cpp Fri Aug 07 13:06:03 2020 +0000 +++ b/cli.cpp Sat Dec 05 12:40:17 2020 +0000 @@ -20,6 +20,8 @@ extern double Read_Link_Volts () ; extern double Read_Field_Volts () ; extern double Read_Ammeter () ; +extern void charge_pump_override (parameters & a) ; // 0 disables, !0 enables charge pump +extern void set_v_out_opamp (parameters & a) ; // 0 to 1.0 sets opamp output in range 0 to 5v, charge pump permitting //bool ee_settings_2020::wr (char c, uint32_t i) { // Write one setup char value to private buffer 'settings' /* @@ -264,6 +266,8 @@ struct kb_command const command_list[] = { {"?", "Lists available commands, same as ls", menucmd}, + {"cp", "Charge pump disable (0), enable (!0)", charge_pump_override}, + {"vo", "Set out volts to ESC 0 - 100 pct", set_v_out_opamp}, {"ft", "Test Field.set_for_speed fn", test_Fsfs_cmd}, {"at", "Initiate Auto Test sequence", auto_test_kickoff_cmd}, {"svod", "Set servo sense 0 or 1", servodir_cmd},
--- a/main.cpp Fri Aug 07 13:06:03 2020 +0000 +++ b/main.cpp Sat Dec 05 12:40:17 2020 +0000 @@ -1,3 +1,6 @@ +/******************************************************************************* + DON'T FORGET TO REMOVE SOLDER LINKS SB16 AND SB18 ON NUCLEO-L432KC BOARD +*******************************************************************************/ #include "mbed.h" #include "Alternator.h" #include "BufferedSerial.h" @@ -6,6 +9,7 @@ #include "rpm.h" #include "field.h" #include "gps_mod.h" + //#include "baro.h" #ifdef TARGET_NUCLEO_L432KC // 24LC and LM75 work @@ -97,7 +101,7 @@ 10 N.C. 11 N.C. 12 PA_8 D9 InterruptIn pulse_tacho from engine magneto, used to measure rpm -13 PA_11 D10 Speed_Control servo +13 PA_11 D10 Servo 14 PB_5 D11 NEW June 2019 - Output engine tacho cleaned-up, brought out to testpoint 4 NOT REALLY USEFUL 15 PB_4 D12 Scope_probe NOT REALLY USEFUL 16 PB_3 D13 LED Onboard LED @@ -173,6 +177,8 @@ bool auto_test_flag = false; +bool charge_pump_enable = true; + enum {SAFE_NOTHING, POT_SERVO_DIRECT, VARIABLE_VOLTAGE, FIXED_VOLTAGE, ENG_REVS_CTRL, POT_SETS_ENGINE_RPM, CURRENT_FEEDBACK_CTRL, AUTO_TEST} ; /* End of Global variable declarations */ @@ -180,7 +186,8 @@ void ISR_fast_interrupt () { static uint32_t t = 0, u25 = 0; Scope_probe = 1; // To show how much time spent in interrupt handler - CHARGE_PUMP = !CHARGE_PUMP; + if (charge_pump_enable) + CHARGE_PUMP = !CHARGE_PUMP; switch (t) { case 0: // Alternator output voltage flag_link_V_rd = true; @@ -240,7 +247,8 @@ double Read_Field_Volts () { - return field_volt_reading * 42.85; // divisor fiddled to make voltage reading correct ! +// return field_volt_reading * 42.85; // divisor fiddled to make voltage reading correct ! + return field_volt_reading * 40.12; // divisor fiddled to make voltage reading correct ! } double Read_Ammeter () @@ -249,10 +257,27 @@ } -void query_system (struct parameters & a) { +void query_system (parameters & a) { query_toggle = !query_toggle; } +void set_v_out_opamp (double a) { // 0 to 1.0 sets opamp output in range 0 to 5v, charge pump permitting + A_OUT = a; +} +void set_v_out_opamp (parameters & a) { // 0 to 1.0 sets opamp output in range 0 to 5v, charge pump permitting + A_OUT = a.dbl[0] / 100.0; +} + +void charge_pump_override (int a) { // 0 disables, !0 enables charge pump + if (a == 0) + charge_pump_enable = false; + else + charge_pump_enable = true; +} +void charge_pump_override (parameters & a) { // 0 disables, !0 enables charge pump + charge_pump_override ((int)a.dbl[0]); +} + void set_pwm (double d) { // Range 0.0 to 1.0 called from cli Field.set_pwm (d); } @@ -324,7 +349,7 @@ Field.maketable () ; // Here to ensure eeprom has been setup Field.set_for_speed (0); - Engine.Speed_Control (((double)user_settings.rd(WARMUP_SERVO_POS)) / 100.0); + Engine.Set_Speed_Lever (((double)user_settings.rd(WARMUP_SERVO_POS)) / 100.0); startup_delay = user_settings.rd(WARM_UP_DELAY); pc.printf ("Operating Mode is [%s]\r\n", get_mode_text (user_settings.rd(OP_MODE))); @@ -338,22 +363,22 @@ #endif command_line_interpreter () ; // Proceed beyond here once loop_timer ticker ISR has set loop_flag true // A to D converters all read at 100 Hz - if (flag_link_V_rd) { + if (flag_link_V_rd) { // Reads main alternator output and/or traction battery voltage flag_link_V_rd = false; link_volt_reading *= (1.0 - vfilt); // link_volt_reading += vfilt * (double) Ain_Link_Volts.read(); // Volt fiddle factor NOT corrected here } - if (flag_Pot_rd) { + if (flag_Pot_rd) { // Reads Driver's speed control potentiometer flag_Pot_rd = false; driver_pot *= (1.0 - filt); driver_pot += filt * ((double)Driver_Pot.read() * 1.5); // Includes bodge around zener over-clipping input } - if (flag_A_rd) { + if (flag_A_rd) { // Reads ammeter - user wires this to suit their purpose flag_A_rd = false; amp_reading *= (1.0 - ampfilt); - amp_reading += ampfilt * ((double) Ammeter_In.read() - 0.5); // Amp range NOT corrected here + amp_reading += ampfilt * ((double) Ammeter_In.read() - 0.495); // Amp range NOT corrected here BUT OFFSET IS } - if (flag_field_V_rd) { + if (flag_field_V_rd) { // Reads 'Field Positive' supply - from battery via diode, also alternator rectifier out flag_field_V_rd = false; field_volt_reading *= (1.0 - vfilt); // field_volt_reading += vfilt * (double) Field_Supply_V.read(); // Volt fiddle factor NOT corrected here @@ -401,16 +426,19 @@ "6\tControl Engine by Current Load", */ case SAFE_NOTHING: // Safe nothing mode for cli cmd testing - // Use this to test command line commands e.g. Speed_Control, direct field setting etc + // Use this to test command line commands e.g. Set_Speed_Lever, direct field setting etc break; case POT_SERVO_DIRECT: // Driver_pot --> servo direct. Field OFF - Engine.Speed_Control (driver_pot); - Field.set_for_speed (0); // Safe, no output +// Engine.Set_Speed_Lever (driver_pot); + Engine.Set_Speed_Lever (driver_pot); + REF_VAR = driver_pot; +// Field.set_for_speed (0); // Safe, no output + Field.set_for_speed (3000); // Safe, no output break; case VARIABLE_VOLTAGE: // Variable Voltage - Engine.Speed_Control (driver_pot); // Driver_pot --> servo direct. Field ON + Engine.Set_Speed_Lever (driver_pot); // Driver_pot --> servo direct. Field ON if (driver_pot > DRIVER_NEUTRAL) // if pot not close to zero Field.set_for_speed (Engine.RPM_latest()); // according to RPM else @@ -522,7 +550,7 @@ if (startup_delay == 0) { up_and_running = true; pc.printf ("Warmup ended, starting proper ops\r\n"); - Engine.Speed_Control (0.0); + Engine.Set_Speed_Lever (0.0); } else { pc.printf ("In Startup warmup delay %d\r", startup_delay--);
--- a/rpm.cpp Fri Aug 07 13:06:03 2020 +0000 +++ b/rpm.cpp Sat Dec 05 12:40:17 2020 +0000 @@ -18,7 +18,7 @@ // microsecs.reset () ; // timer = 0 // microsecs.start () ; // 64 bit, counts micro seconds and times out in half million years servo_position = MIN_WORKING_THROTTLE; - Speed_Control (MIN_WORKING_THROTTLE); + Set_Speed_Lever (MIN_WORKING_THROTTLE); }; void Engine_Manager::magneto_timeoutC () @@ -75,7 +75,7 @@ return (uint32_t)filtered_measured_RPM; } -void Engine_Manager::Speed_Control (double th) // Make this private once all throttle refs local +void Engine_Manager::Set_Speed_Lever (double th) // Make this private once all throttle refs local { if (user_settings.rd(SERVO_DIR) == 0) Speed_ControlServo = th; @@ -91,13 +91,13 @@ if (!rpm_in_run_range) { // Transition from idle to working revs rpm_in_run_range = true; servo_position = MIN_WORKING_THROTTLE; // set throttle to probably somewhere near low useful revs - Speed_Control (MIN_WORKING_THROTTLE); + Set_Speed_Lever (MIN_WORKING_THROTTLE); } // Endof transition from idle to working revs } // Endof Runnable or make runnable else { // requested rpm are below useful, so kill engine if (rpm_in_run_range) { // detect transition from useful work to idle servo_position = 0.0; - Speed_Control (0.0); + Set_Speed_Lever (0.0); rpm_in_run_range = false; } } @@ -148,7 +148,7 @@ servo_position = MIN_WORKING_THROTTLE; if (servo_position > MAX_WORKING_THROTTLE) servo_position = MAX_WORKING_THROTTLE; - Speed_Control (servo_position); // Update signal to engine throttle control servo + Set_Speed_Lever (servo_position); // Update signal to engine throttle control servo } break; default:
--- a/rpm.h Fri Aug 07 13:06:03 2020 +0000 +++ b/rpm.h Sat Dec 05 12:40:17 2020 +0000 @@ -35,7 +35,7 @@ // Timer microseconds; public: Engine_Manager (PinName magneto_signal, PinName cleaned_output, PinName for_servo) ; // - void Speed_Control (double); + void Set_Speed_Lever (double); bool running (); void manager_core(); double get_servo_position ();