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 Apr 25 15:35:58 2020 +0000
Revision:
1:450090bdb6f4
Parent:
0:77803b3ee157
Child:
2:8e7b51353f32
About to pick this up again late Apr 2020.;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
JonFreeman 0:77803b3ee157 1 #include "Servo.h"
JonFreeman 0:77803b3ee157 2 #include "BufferedSerial.h"
JonFreeman 1:450090bdb6f4 3
JonFreeman 1:450090bdb6f4 4 #define SPEED_CONTROL_ENABLE // Includes engine revs servo control loop
JonFreeman 1:450090bdb6f4 5
JonFreeman 1:450090bdb6f4 6 const int TICKOVER_RPM = 2500;
JonFreeman 1:450090bdb6f4 7 const int MAX_RPM_LIMIT = 7500;
JonFreeman 1:450090bdb6f4 8 const double SERVO_MAX = 0.5;
JonFreeman 0:77803b3ee157 9 const int eeprom_page = 17; // Determines where in eeprom 'settings' reside
JonFreeman 0:77803b3ee157 10
JonFreeman 0:77803b3ee157 11 const int lut_seg_size = 60; // steps per thousand RPM
JonFreeman 0:77803b3ee157 12 const int lut_size = lut_seg_size * 8; // 8 segments - 0-1, 1-2, 2-3, 3-4 etc 000 rpm
JonFreeman 0:77803b3ee157 13
JonFreeman 1:450090bdb6f4 14 class VEXT_Data {
JonFreeman 1:450090bdb6f4 15 public:
JonFreeman 1:450090bdb6f4 16 uint32_t t_on, t_off, measured_pw_us, measured_period, rise_count, fall_count;
JonFreeman 1:450090bdb6f4 17 double duty_cycle () {
JonFreeman 1:450090bdb6f4 18 return (double) measured_pw_us / (double) measured_period;
JonFreeman 1:450090bdb6f4 19 } ;
JonFreeman 1:450090bdb6f4 20 VEXT_Data () { // constructor
JonFreeman 1:450090bdb6f4 21 t_on = t_off = measured_pw_us = measured_period = rise_count = fall_count = 0;
JonFreeman 1:450090bdb6f4 22 } ;
JonFreeman 1:450090bdb6f4 23 } ;
JonFreeman 1:450090bdb6f4 24
JonFreeman 0:77803b3ee157 25 class eeprom_settings {
JonFreeman 0:77803b3ee157 26 char settings [36];
JonFreeman 1:450090bdb6f4 27 double max_pwm_lut [lut_size + 4];
JonFreeman 0:77803b3ee157 28 // bool rd_24LC64 (int start_addr, char * dest, int length) ;
JonFreeman 0:77803b3ee157 29 // bool wr_24LC64 (int start_addr, char * dest, int length) ;
JonFreeman 0:77803b3ee157 30 // bool set_24LC64_internal_address (int start_addr) ;
JonFreeman 0:77803b3ee157 31 // bool ack_poll () ;
JonFreeman 0:77803b3ee157 32 void build_lut () ;
JonFreeman 0:77803b3ee157 33 public:
JonFreeman 0:77803b3ee157 34 eeprom_settings (); // Constructor
JonFreeman 1:450090bdb6f4 35 double get_pwm (int) ;
JonFreeman 0:77803b3ee157 36 char rd (uint32_t) ; // Read one setup char value from private buffer 'settings'
JonFreeman 1:450090bdb6f4 37 bool rd (char *, uint32_t) ; // Read one setup char value from private buffer 'settings'
JonFreeman 0:77803b3ee157 38 bool wr (char, uint32_t) ; // Write one setup char value to private buffer 'settings'
JonFreeman 0:77803b3ee157 39 bool save () ; // Write 'settings' buffer to EEPROM
JonFreeman 0:77803b3ee157 40 bool load () ; // Get 'settings' from EEPROM
JonFreeman 0:77803b3ee157 41 bool set_defaults (); // Put default settings into EEPROM and local buffer
JonFreeman 0:77803b3ee157 42 // uint32_t errs () ; // Return errors
JonFreeman 0:77803b3ee157 43 } ;
JonFreeman 0:77803b3ee157 44
JonFreeman 0:77803b3ee157 45 enum {RPM0, RPM1, RPM2, RPM3, RPM4, RPM5, RPM6, RPM7, RPM8,
JonFreeman 0:77803b3ee157 46 PWM_SCALE, FUT1, FUT2, FUT3, FUT4, FUT5} ; //
JonFreeman 0:77803b3ee157 47
JonFreeman 0:77803b3ee157 48 struct optpar {
JonFreeman 0:77803b3ee157 49 int min, max, def; // min, max, default
JonFreeman 0:77803b3ee157 50 const char * t; // description
JonFreeman 0:77803b3ee157 51 } ;
JonFreeman 0:77803b3ee157 52
JonFreeman 1:450090bdb6f4 53 const int MAX_PARAMS = 10;
JonFreeman 1:450090bdb6f4 54 struct parameters {
JonFreeman 1:450090bdb6f4 55 int32_t times[50];
JonFreeman 1:450090bdb6f4 56 int32_t position_in_list, last_time, numof_dbls;
JonFreeman 1:450090bdb6f4 57 double dbl[MAX_PARAMS];
JonFreeman 1:450090bdb6f4 58 } ;
JonFreeman 0:77803b3ee157 59
JonFreeman 1:450090bdb6f4 60 const int PWM_PERIOD_US = 2400 ;
JonFreeman 1:450090bdb6f4 61