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:
Mon Jun 08 13:46:52 2020 +0000
Revision:
2:8e7b51353f32
Parent:
1:450090bdb6f4
Child:
3:43cb067ecd00
About to revamp i2c

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 2:8e7b51353f32 4 //#define SPEED_CONTROL_ENABLE // Includes engine revs servo control loop
JonFreeman 1:450090bdb6f4 5
JonFreeman 2:8e7b51353f32 6 const uint32_t TICKOVER_RPM = 2500;
JonFreeman 2:8e7b51353f32 7 const uint32_t PWM_OFF_RPM_LIMIT = (TICKOVER_RPM * 9) / 10;
JonFreeman 2:8e7b51353f32 8 const uint32_t MAX_RPM_LIMIT = 7500;
JonFreeman 2:8e7b51353f32 9 const double MAX_FIELD_PWM = 0.47;
JonFreeman 2:8e7b51353f32 10 const double SERVO_MAX = 0.5;
JonFreeman 2:8e7b51353f32 11 const double DRIVER_NEUTRAL = 0.18;
JonFreeman 2:8e7b51353f32 12 const uint32_t eeprom_page = 17; // Determines where in eeprom 'settings' reside
JonFreeman 0:77803b3ee157 13
JonFreeman 2:8e7b51353f32 14 //const int lut_seg_size = 60; // steps per thousand RPM
JonFreeman 2:8e7b51353f32 15 //const int lut_size = lut_seg_size * 8; // 8 segments - 0-1, 1-2, 2-3, 3-4 etc 000 rpm
JonFreeman 0:77803b3ee157 16
JonFreeman 1:450090bdb6f4 17 class VEXT_Data {
JonFreeman 1:450090bdb6f4 18 public:
JonFreeman 2:8e7b51353f32 19 uint64_t t_on, t_off, measured_pw_us, measured_period, rise_count, fall_count;
JonFreeman 1:450090bdb6f4 20 double duty_cycle () {
JonFreeman 1:450090bdb6f4 21 return (double) measured_pw_us / (double) measured_period;
JonFreeman 1:450090bdb6f4 22 } ;
JonFreeman 1:450090bdb6f4 23 VEXT_Data () { // constructor
JonFreeman 2:8e7b51353f32 24 t_on = t_off = measured_pw_us = measured_period = rise_count = fall_count = 0L;
JonFreeman 1:450090bdb6f4 25 } ;
JonFreeman 1:450090bdb6f4 26 } ;
JonFreeman 1:450090bdb6f4 27
JonFreeman 0:77803b3ee157 28 class eeprom_settings {
JonFreeman 0:77803b3ee157 29 char settings [36];
JonFreeman 0:77803b3ee157 30 public:
JonFreeman 0:77803b3ee157 31 eeprom_settings (); // Constructor
JonFreeman 0:77803b3ee157 32 char rd (uint32_t) ; // Read one setup char value from private buffer 'settings'
JonFreeman 1:450090bdb6f4 33 bool rd (char *, uint32_t) ; // Read one setup char value from private buffer 'settings'
JonFreeman 0:77803b3ee157 34 bool wr (char, uint32_t) ; // Write one setup char value to private buffer 'settings'
JonFreeman 0:77803b3ee157 35 bool save () ; // Write 'settings' buffer to EEPROM
JonFreeman 0:77803b3ee157 36 bool load () ; // Get 'settings' from EEPROM
JonFreeman 0:77803b3ee157 37 bool set_defaults (); // Put default settings into EEPROM and local buffer
JonFreeman 0:77803b3ee157 38 // uint32_t errs () ; // Return errors
JonFreeman 0:77803b3ee157 39 } ;
JonFreeman 0:77803b3ee157 40
JonFreeman 0:77803b3ee157 41 enum {RPM0, RPM1, RPM2, RPM3, RPM4, RPM5, RPM6, RPM7, RPM8,
JonFreeman 0:77803b3ee157 42 PWM_SCALE, FUT1, FUT2, FUT3, FUT4, FUT5} ; //
JonFreeman 0:77803b3ee157 43
JonFreeman 0:77803b3ee157 44 struct optpar {
JonFreeman 0:77803b3ee157 45 int min, max, def; // min, max, default
JonFreeman 0:77803b3ee157 46 const char * t; // description
JonFreeman 0:77803b3ee157 47 } ;
JonFreeman 0:77803b3ee157 48
JonFreeman 2:8e7b51353f32 49 const int MAX_PARAMS = 12; // Up from 10 May 2020
JonFreeman 1:450090bdb6f4 50 struct parameters {
JonFreeman 1:450090bdb6f4 51 int32_t times[50];
JonFreeman 1:450090bdb6f4 52 int32_t position_in_list, last_time, numof_dbls;
JonFreeman 1:450090bdb6f4 53 double dbl[MAX_PARAMS];
JonFreeman 1:450090bdb6f4 54 } ;
JonFreeman 0:77803b3ee157 55
JonFreeman 2:8e7b51353f32 56 const int PWM_PERIOD_US = 1800 ; // Was 2400, May want to reduce this, note would require change of resistor value on board
JonFreeman 1:450090bdb6f4 57