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 4:28cc0cf01570, committed 2020-08-07
- Comitter:
- JonFreeman
- Date:
- Fri Aug 07 13:06:03 2020 +0000
- Parent:
- 3:43cb067ecd00
- Child:
- 5:6ca3e7ffc553
- Commit message:
- Ready to test Aug.2020 pcb
Changed in this revision
--- a/Alternator.h Mon Jul 27 08:44:59 2020 +0000 +++ b/Alternator.h Fri Aug 07 13:06:03 2020 +0000 @@ -1,5 +1,5 @@ -//#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/gps_mod.cpp Mon Jul 27 08:44:59 2020 +0000
+++ b/gps_mod.cpp Fri Aug 07 13:06:03 2020 +0000
@@ -1,6 +1,6 @@
#include "mbed.h"
-#ifdef GPS_
+//#ifdef GPS_
#include "mbed.h"
#include "gps_mod.h"
@@ -236,6 +236,7 @@
sprintf (datestr, "%d %s 20%d", date, &month_tab[month], strtol(&destptr[comma_positions[7] + 5], NULL, 10));
break;
case 5: // VTG ,T , ,M,0.098,N,0.181,K,A*2A course over ground and ground speed
+ //Adafruit $GPVTG,165.48,T,,M,0.03,N,0.06,K,A*37
//$ GPVTG 309.62,T , ,M,0.13, N,0.2, K*6E
sprintf (speed_mphourstr, "%.1fmph", km2miles * strtod(destptr + comma_positions[5] + 1, NULL));
newdata = true;
@@ -262,4 +263,4 @@
return 0;
} // end of int gps_mod::update()
-#endif
+//#endif
--- a/main.cpp Mon Jul 27 08:44:59 2020 +0000
+++ b/main.cpp Fri Aug 07 13:06:03 2020 +0000
@@ -5,7 +5,7 @@
#include "LM75B.h" // New I2C temp sensor code March 2020 (to suit possible next board issue, harmless otherwise)
#include "rpm.h"
#include "field.h"
-//#include "gps_mod.h"
+#include "gps_mod.h"
//#include "baro.h"
#ifdef TARGET_NUCLEO_L432KC // 24LC and LM75 work
@@ -73,45 +73,45 @@
// INPUTS :
AnalogIn Ain_Link_Volts (A6); // Sniff of alternator output, not used in control loop as done using analogue MCP1630
-AnalogIn Ammeter_In (A1); // Output of ASC709LLFTR ammeter chip (pin 20), used to increase engine revs if need be
-//AnalogIn Ammeter_Ref (A0); // Ref output from ASC709LLFTR used to set ammeter zero (pin 25)
+AnalogIn Ammeter_In (A0); // Output of ASC709LLFTR ammeter chip (pin 20), used to increase engine revs if need be
// Nov 2019. Not convinced Ext_Rev_Demand is useful ** July 2020 - repurposed, voltmeter Field_Supply_V
//AnalogIn Ext_Rev_Demand (D3); // Servo determines engine revs, servo out to be higher of Ext_Rev_Demand and internal calc
AnalogIn Field_Supply_V (D3); // Servo determines engine revs, servo out to be higher of Ext_Rev_Demand and internal calc
-AnalogIn Driver_Pot (A3); // If whole control system can be made to fit
+AnalogIn Driver_Pot (A1); // Moved 31/07/2020 from A3 to free up A3 for use as AnalogOut
BufferedSerial gps_module (D1, D0, 2048, 4, NULL); // For gps - added July 2020
/*
- MODULE PIN USAGE
-1 PA_9 D1 LocalCom Tx FUTURE i2c to enable 3rd independent pwm
-2 PA_10 D0 LocalCom Rx FUTURE i2c to enable 3rd independent pwm
+ MODULE PIN USAGE - Updated Aug 2020
+1 PA_9 D1 LocalCom Tx
+2 PA_10 D0 LocalCom Rx GPS maybe
3 NRST
4 GND
-5 PA12_D2 NEW June 2019 - Output engine tacho cleaned-up, brought out to testpoint 4
-6 PB_0 D3 AnalogIn Ext_Rev_Demand
+5 PA12_D2 InterruptIn VEXT PWM controller output folded back for cpu to monitor, useful on test to read what pwm required to do what
+6 PB_0 D3 AnalogIn Field supply voltage
7 PB_7 D4 SDA i2c to 24LC memory
8 PB_6 D5 SCL i2c to 24LC memory
-9 PB_12 D6 PwmOut PWM_OSC_IN Timebase for pwm, also determines max duty ratio
+9 PB_12 D6 DigitalOut CHARGE_PUMP new Aug 2020
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
-14 PB_5 D11 // InterruptIn VEXT PWM controller output folded back for cpu to monitor, useful on test to read what pwm required to do what
-15 PB_4 D12 Scope_probe
-16 PB_3 D13 LED Onboard LED
+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
17 3V3
18 AREF
-19 PA_0 A0 AnalogIn Ammeter_Ref
-20 PA_1 A1 AnalogIn Ammeter_In
-21 PA_3 A2 PWM analogue out
-22 PA_4 A3 AnalogIn Driver_Pot
-23 PA_5 A4 n.c. SDA_IN paralleled to i2c pin, necessary because i2c has to be bit banged
-24 PA_6 A5 n.c. SCL_IN paralleled to i2c pin, necessary because i2c has to be bit banged
-25 PA_7 A6 AnalogIn V_Sample system link voltage
-26 PA_2 A7 Not used
+19 PA_0 A0 AnalogIn Driver Pot
+20 PA_1 A1 AnalogIn Ammeter_In
+21 PA_3 A2 PwmOut PWM_OSC_IN Timebase for pwm, also determines max duty ratio
+//22 PA_4 A3 AnalogOut A_OUT control signal to following traction motor ESC
+22 PA_4 A3 AnalogOut REF_VAR reference voltage to MCP1630, allows software to set alternator output voltage
+23 PA_5 A4 AnalogOut A_OUT control signal to following traction motor ESC
+24 PA_6 A5 Spare
+25 PA_7 A6 AnalogIn V_Sample system link voltage
+26 PA_2 A7 Not useable, taken by uart
27 5V
28 NRST
29 GND
@@ -128,7 +128,8 @@
//InterruptIn VEXT (D2); // PWM controller output folded back for cpu to monitor, useful on test to read what pwm required to do what
// Note D2 still used but taken to field class object
// OUTPUTS :
-
+AnalogOut REF_VAR (A4); // Variable REF to MCP1630 enables software control of output voltage - NEW Aug 2020
+AnalogOut A_OUT (A3); // Control voltage out to traction motor ESCs
DigitalOut Scope_probe (D12); // Handy pin to hang scope probe onto while developing code
DigitalOut myled (LED1); // Green LED on board is PB_3 D13
//PwmOut PWM_OSC_IN (A2); // Can alter prescaler can not use A5 NOW DONE IN CLASS
@@ -140,11 +141,11 @@
extern char * get_mode_text (uint32_t mode) ;
-
+DigitalOut CHARGE_PUMP (D6);
I2CEeprom eeprom (SDA_PIN, SCL_PIN, 0xa0, eeprom_page_size, 8192, 100000);
extern ee_settings_2020 user_settings ;
-Engine_Manager Engine (D9, D11, D10); // Pins are magneto in, cleaned magneto out, servo, const debounce time microsecs
-FieldControl Field (A2, D2); // PWM pin for MCP1630, InterruptIn for signal out of MCP1630
+Engine_Manager Engine (D9, D11, D10); // Pins are magneto in, cleaned magneto out, servo
+FieldControl Field (A2, D2); // PWM pin for MCP1630 PWM_OSC_IN, InterruptIn for signal out of MCP1630 VEXTFB
PCT2075 temp_sensor( SDA_PIN, SCL_PIN ); // or LM75B temp_sensor( p?, p? ); Added March 2020
//class MPL3115A2 baro ;
@@ -179,18 +180,18 @@
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;
switch (t) {
- case 0:
+ case 0: // Alternator output voltage
flag_link_V_rd = true;
break;
- case 1:
+ case 1: // Ammeter
flag_A_rd = true;
break;
- case 2:
+ case 2: // Driver's Pot
flag_Pot_rd = true;
-// raw_amp_offset = Ammeter_Ref.read(); // Feb 2020 Not convinced this is useful
break;
- case 3:
+ case 3: // Field supply voltage
flag_field_V_rd = true;
break;
// case 4:
@@ -294,16 +295,20 @@
// Programme Entry Point
int main()
{
+ const double PI = (2.0 * acos(0.0));
const double filt = 0.2;
const double ampfilt = 0.2;
const double vfilt = 0.2;
// local variable declarations
double driver_pot = 0.0, dtmp;
+// double theta = 0.0;
int32_t temp, startup_delay, print_position = 0;
int32_t field_pct = 0, auto_test_timer = 0, auto_test_state = AUTO_TEST_INACTIVE, auto_test_step = 0;
bool up_and_running = false;
char text[64];
-
+
+ A_OUT = 0.0;
+ REF_VAR = 0.0;
microsecs.reset() ; // timer = 0
microsecs.start () ; // 64 bit, counts micro seconds and times out in half million years
@@ -328,8 +333,8 @@
while (1) { // Loop forever, repeats synchroised by waiting for ticker Interrupt Service Routine to set 'loop_flag' true
while (!loop_flag) { // Most of the time is spent in this loop, repeatedly re-checking for commands from pc port
#ifdef GPS_
- while (gps_module.readable())
- pc.putc (gps_module.getc());
+// while (gps_module.readable())
+// pc.putc (gps_module.getc());
#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
@@ -360,6 +365,12 @@
#ifdef GPS_
gps.update ();
#endif
+/* theta += 0.05;
+ if (theta > PI)
+ theta -= 2.0 * PI;
+ sinout = 0.5 + sin(theta) / 2.0;
+ cosout = 0.5 + cos(theta) / 2.0;
+*/
// END 100Hz stuff
if (flag_25Hz) {
flag_25Hz = false;