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
Diff: cli.cpp
- Revision:
- 2:8e7b51353f32
- Parent:
- 1:450090bdb6f4
- Child:
- 3:43cb067ecd00
--- a/cli.cpp Sat Apr 25 15:35:58 2020 +0000 +++ b/cli.cpp Mon Jun 08 13:46:52 2020 +0000 @@ -15,11 +15,11 @@ //extern int ver, vef, measured_pw_us; extern void set_throttle_limit (struct parameters & a) ; -extern void speed_control_factor_set (struct parameters & a) ; +//extern void speed_control_factor_set (struct parameters & a) ; extern void query_system (struct parameters & a) ; extern uint32_t ReadEngineRPM () ; extern double Read_BatteryVolts () ; -extern void Read_Ammeter (double *) ; +//extern void Read_Ammeter (double *) ; @@ -34,6 +34,32 @@ extern BufferedSerial pc; #endif //extern double test_pot; // These used in knifeandfork code testing only +extern void maketable () ; + +void table_tweak_cmd (struct parameters & a) { // Requires two params. First '20', '25' etc representing hundreds RPM. Second 0 to 99 percent + char txt[100]; + uint32_t d[3]; + txt[0] = 0; + if (a.numof_dbls != 2) + sprintf (txt, "Need 2 params, got %d, ", a.numof_dbls); + else { + d[2] = (uint32_t)a.dbl[0]; + d[0] = d[2] / 5; + d[1] = (uint32_t)a.dbl[1]; + if (d[0] > 16 || d[1] > 99 || d[2] != d[0] * 5) + sprintf (txt + strlen(txt), "Param out of range %d, %d, ", d[2], d[1]); + else { + pc.printf ("Off to reset table %d RPM, %d percent\r\n", d[2] * 100, d[1]); + user_settings.wr ((char)d[1], d[0]); + user_settings.save (); + maketable (); + } + } + if (txt[0]) + pc.printf ("Errors in table_tweak_cmd - %s\r\n", txt); + else + pc.printf ("Good in table_tweak_cmd, RPM=%d, percentage=%d\r\n", d[0] * 500, d[1]); +} //extern int numof_eeprom_options2 ; //extern struct optpar const option_list2[] ; @@ -97,38 +123,39 @@ } -void gpcmd (struct parameters & a) { +/*void gpcmd (struct parameters & a) { pc.printf ("pwm=%.3f\r\n", user_settings.get_pwm ((int)a.dbl[0])); -} +}*/ extern VEXT_Data Field; -void rfcmd (struct parameters & a) { - pc.printf ("Field.measured_period = %d, Field.measured_pw_us = %d, duty_cycle = %.3f\r\n", Field.measured_period, Field.measured_pw_us, Field.duty_cycle()); +void rfcmd (struct parameters & a) { // Note casts all wrong here, values are 64 bit + pc.printf ("Field.measured_period = %u", (uint32_t)Field.measured_period); + pc.printf (", Field.measured_pw_us = %u, duty_cycle = %.3f\r\n", (uint32_t)Field.measured_pw_us, Field.duty_cycle()); } -extern void set_RPM_demand (uint32_t d) ; +//extern void set_RPM_demand (uint32_t d) ; -void set_rpm_cmd (struct parameters & a) { +/*void set_rpm_cmd (struct parameters & a) { pc.printf ("setting RPM to %d\r\n",(int)a.dbl[0]); set_RPM_demand ((uint32_t)a.dbl[0]); -} +}*/ -void speedcmd (struct parameters & a) { +/*void speedcmd (struct parameters & a) { int s = ReadEngineRPM (); pc.printf ("speed %d, pwm %.3f\r\n", s, user_settings.get_pwm(s)); -} +}*/ void vcmd (struct parameters & a) { pc.printf ("volts %.2f\r\n", Read_BatteryVolts()); } -void icmd (struct parameters & a) { +/*void icmd (struct parameters & a) { double results[4]; //double * ampsptr = Read_Ammeter(results) ; pc.printf ("amps %.3f, offset %.3f\r\n", results[0], results[1]); -} +}*/ extern void set_servo (double p) ; // Only for test, called from cli @@ -159,20 +186,21 @@ struct kb_command const command_list[] = { {"?", "Lists available commands, same as ls", menucmd}, + {"tt", "Table Tweak - 2 params RPM/100, percentage 0-99", table_tweak_cmd}, {"rf", "Check rise and fall on VEXT", rfcmd}, - {"s", "Speed, RPM", speedcmd}, +// {"s", "Speed, RPM", speedcmd}, {"v", "Read Battery volts", vcmd}, - {"i", "Read Ammeter", icmd}, +// {"i", "Read Ammeter", icmd}, {"p", "Set PWM 0 to 2400???", p_cmd}, {"q", "Query system - toggle message stream on/off", query_system}, - {"gp","Get pwm from RPM", gpcmd}, +// {"gp","Get pwm from RPM", gpcmd}, {"mode", "See or set eeprom values", mode19_cmd}, {"nu", "do nothing", null_cmd}, #ifndef SPEED_CONTROL_ENABLE // Includes engine revs servo control loop {"ser","set throttle servo direct 0 - 99", set_servo_cmd}, #endif - {"sf","set speed control factor", speed_control_factor_set}, - {"sv","set engine RPM demand 2500 - 6000", set_rpm_cmd}, +// {"sf","set speed control factor", speed_control_factor_set}, +// {"sv","set engine RPM demand 2500 - 6000", set_rpm_cmd}, {"tl","set throttle_limit 0.0-1.0", set_throttle_limit}, };