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: Alternator.h
- Revision:
- 2:8e7b51353f32
- Parent:
- 1:450090bdb6f4
- Child:
- 3:43cb067ecd00
--- a/Alternator.h Sat Apr 25 15:35:58 2020 +0000
+++ b/Alternator.h Mon Jun 08 13:46:52 2020 +0000
@@ -1,38 +1,34 @@
#include "Servo.h"
#include "BufferedSerial.h"
-#define SPEED_CONTROL_ENABLE // Includes engine revs servo control loop
+//#define SPEED_CONTROL_ENABLE // Includes engine revs servo control loop
-const int TICKOVER_RPM = 2500;
-const int MAX_RPM_LIMIT = 7500;
-const double SERVO_MAX = 0.5;
-const int eeprom_page = 17; // Determines where in eeprom 'settings' reside
+const uint32_t TICKOVER_RPM = 2500;
+const uint32_t PWM_OFF_RPM_LIMIT = (TICKOVER_RPM * 9) / 10;
+const uint32_t MAX_RPM_LIMIT = 7500;
+const double MAX_FIELD_PWM = 0.47;
+const double SERVO_MAX = 0.5;
+const double DRIVER_NEUTRAL = 0.18;
+const uint32_t eeprom_page = 17; // Determines where in eeprom 'settings' reside
-const int lut_seg_size = 60; // steps per thousand RPM
-const int lut_size = lut_seg_size * 8; // 8 segments - 0-1, 1-2, 2-3, 3-4 etc 000 rpm
+//const int lut_seg_size = 60; // steps per thousand RPM
+//const int lut_size = lut_seg_size * 8; // 8 segments - 0-1, 1-2, 2-3, 3-4 etc 000 rpm
class VEXT_Data {
public:
- uint32_t t_on, t_off, measured_pw_us, measured_period, rise_count, fall_count;
+ uint64_t t_on, t_off, measured_pw_us, measured_period, rise_count, fall_count;
double duty_cycle () {
return (double) measured_pw_us / (double) measured_period;
} ;
VEXT_Data () { // constructor
- t_on = t_off = measured_pw_us = measured_period = rise_count = fall_count = 0;
+ t_on = t_off = measured_pw_us = measured_period = rise_count = fall_count = 0L;
} ;
} ;
class eeprom_settings {
char settings [36];
- double max_pwm_lut [lut_size + 4];
-// bool rd_24LC64 (int start_addr, char * dest, int length) ;
-// bool wr_24LC64 (int start_addr, char * dest, int length) ;
-// bool set_24LC64_internal_address (int start_addr) ;
-// bool ack_poll () ;
- void build_lut () ;
public:
eeprom_settings (); // Constructor
- double get_pwm (int) ;
char rd (uint32_t) ; // Read one setup char value from private buffer 'settings'
bool rd (char *, uint32_t) ; // Read one setup char value from private buffer 'settings'
bool wr (char, uint32_t) ; // Write one setup char value to private buffer 'settings'
@@ -50,12 +46,12 @@
const char * t; // description
} ;
-const int MAX_PARAMS = 10;
+const int MAX_PARAMS = 12; // Up from 10 May 2020
struct parameters {
int32_t times[50];
int32_t position_in_list, last_time, numof_dbls;
double dbl[MAX_PARAMS];
} ;
-const int PWM_PERIOD_US = 2400 ;
+const int PWM_PERIOD_US = 1800 ; // Was 2400, May want to reduce this, note would require change of resistor value on board