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;