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.
main.cpp@14:4b5df635f248, 2017-02-07 (annotated)
- Committer:
- fmferrari
- Date:
- Tue Feb 07 12:20:57 2017 +0000
- Revision:
- 14:4b5df635f248
- Parent:
- 13:831eab218c33
- Child:
- 15:b39f568faa27
Unfiltered "working" version;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
fmferrari | 14:4b5df635f248 | 1 | |
fmferrari | 0:1e567a5a99c3 | 2 | |
fmferrari | 0:1e567a5a99c3 | 3 | #include "mbed.h" |
fmferrari | 6:cb71171a7108 | 4 | #include "EKF.h" |
fmferrari | 0:1e567a5a99c3 | 5 | |
fmferrari | 12:bf3e3b87224e | 6 | |
fmferrari | 0:1e567a5a99c3 | 7 | |
fmferrari | 13:831eab218c33 | 8 | Timer OutputTimer; |
fmferrari | 13:831eab218c33 | 9 | Timer MacroTime; |
fmferrari | 14:4b5df635f248 | 10 | Ticker TimerforIteration; |
fmferrari | 14:4b5df635f248 | 11 | |
fmferrari | 12:bf3e3b87224e | 12 | Serial TRANSMIT(SERIAL_TX, SERIAL_RX); |
fmferrari | 13:831eab218c33 | 13 | |
fmferrari | 12:bf3e3b87224e | 14 | AnalogIn VoltageSensor(PA_0); |
fmferrari | 12:bf3e3b87224e | 15 | AnalogIn CurrentSensor(PA_1); |
fmferrari | 14:4b5df635f248 | 16 | AnalogIn TemperatureSensor(PA_4); |
fmferrari | 12:bf3e3b87224e | 17 | DigitalOut DATATRANSMISSION(LED1); |
fmferrari | 14:4b5df635f248 | 18 | InterruptIn OnOrOff(USER_BUTTON); |
fmferrari | 14:4b5df635f248 | 19 | |
fmferrari | 12:bf3e3b87224e | 20 | float VoltageMeas = 0; |
fmferrari | 12:bf3e3b87224e | 21 | float CurrentMeas = 0; |
fmferrari | 14:4b5df635f248 | 22 | float TemperatureMeas=0; |
fmferrari | 14:4b5df635f248 | 23 | |
fmferrari | 12:bf3e3b87224e | 24 | float Result_V = 0; |
fmferrari | 12:bf3e3b87224e | 25 | float Result_I = 0; |
fmferrari | 14:4b5df635f248 | 26 | float Result_T = 0; |
fmferrari | 14:4b5df635f248 | 27 | |
fmferrari | 12:bf3e3b87224e | 28 | float MinStepRes = 0; |
fmferrari | 12:bf3e3b87224e | 29 | float SocOutput = 0.0f; |
fmferrari | 12:bf3e3b87224e | 30 | float R0Output=0.0f; |
fmferrari | 13:831eab218c33 | 31 | float Q0Output=0.0f; |
fmferrari | 14:4b5df635f248 | 32 | float mVoltRange = 3300; // This is the supplay voltage of ADC (or MCU) |
fmferrari | 14:4b5df635f248 | 33 | float ADCres = 65536; // This is the ADC resolution oxFFFF |
fmferrari | 14:4b5df635f248 | 34 | int Count=0; |
fmferrari | 14:4b5df635f248 | 35 | |
fmferrari | 14:4b5df635f248 | 36 | float MaxCurrentAmp=150; |
fmferrari | 14:4b5df635f248 | 37 | float MaxTemperature=80; |
fmferrari | 14:4b5df635f248 | 38 | float MaxdSpaceOut=6; |
fmferrari | 14:4b5df635f248 | 39 | float CircuitGain=0.546; |
fmferrari | 14:4b5df635f248 | 40 | |
fmferrari | 14:4b5df635f248 | 41 | bool ButtonPressed=0.0f; |
fmferrari | 14:4b5df635f248 | 42 | bool StateEKF=1.0f; |
fmferrari | 14:4b5df635f248 | 43 | |
fmferrari | 14:4b5df635f248 | 44 | //TURN THE PROCESS OR ON OFF |
fmferrari | 14:4b5df635f248 | 45 | void pressed() |
fmferrari | 14:4b5df635f248 | 46 | { |
fmferrari | 14:4b5df635f248 | 47 | EKF_initialize(); |
fmferrari | 14:4b5df635f248 | 48 | OutputTimer.reset(); |
fmferrari | 14:4b5df635f248 | 49 | MacroTime.reset(); |
fmferrari | 14:4b5df635f248 | 50 | |
fmferrari | 14:4b5df635f248 | 51 | if (StateEKF) { |
fmferrari | 14:4b5df635f248 | 52 | StateEKF =0; |
fmferrari | 14:4b5df635f248 | 53 | |
fmferrari | 14:4b5df635f248 | 54 | } else { |
fmferrari | 14:4b5df635f248 | 55 | StateEKF = 1; |
fmferrari | 14:4b5df635f248 | 56 | |
fmferrari | 14:4b5df635f248 | 57 | |
fmferrari | 14:4b5df635f248 | 58 | } |
fmferrari | 14:4b5df635f248 | 59 | } |
fmferrari | 0:1e567a5a99c3 | 60 | |
fmferrari | 12:bf3e3b87224e | 61 | |
fmferrari | 14:4b5df635f248 | 62 | //USE THE FUNCTION WITH A TIMER TO STEP AT KNOWN TIME LENGTHS |
fmferrari | 14:4b5df635f248 | 63 | void ITERATE() |
fmferrari | 14:4b5df635f248 | 64 | { |
fmferrari | 14:4b5df635f248 | 65 | |
fmferrari | 14:4b5df635f248 | 66 | // SAMPLE THE ADCs |
fmferrari | 14:4b5df635f248 | 67 | VoltageMeas = VoltageSensor.read_u16(); |
fmferrari | 14:4b5df635f248 | 68 | CurrentMeas = CurrentSensor.read_u16(); |
fmferrari | 14:4b5df635f248 | 69 | TemperatureMeas=TemperatureSensor.read_u16(); |
fmferrari | 14:4b5df635f248 | 70 | |
fmferrari | 14:4b5df635f248 | 71 | //CALCULATE THE RESOLUTION OF EACH BIT |
fmferrari | 14:4b5df635f248 | 72 | MinStepRes = (mVoltRange / ADCres); |
fmferrari | 14:4b5df635f248 | 73 | |
fmferrari | 14:4b5df635f248 | 74 | // CONVERT MEASURED VALUES TO ACTUAL SCALED VALUES |
fmferrari | 14:4b5df635f248 | 75 | Result_V = ((MinStepRes * VoltageMeas))/1000; |
fmferrari | 14:4b5df635f248 | 76 | Result_I = ((MinStepRes * CurrentMeas))/1000; |
fmferrari | 14:4b5df635f248 | 77 | Result_T = ((MinStepRes * TemperatureMeas))/1000; |
fmferrari | 14:4b5df635f248 | 78 | |
fmferrari | 12:bf3e3b87224e | 79 | |
fmferrari | 14:4b5df635f248 | 80 | // INPUT THE DATA TO THE EKF_STEP |
fmferrari | 14:4b5df635f248 | 81 | |
fmferrari | 14:4b5df635f248 | 82 | //ADJUST FOR THE CIRCUIT GAIN |
fmferrari | 14:4b5df635f248 | 83 | EKF_U.Voltage=Result_V/CircuitGain; |
fmferrari | 14:4b5df635f248 | 84 | EKF_U.Current=(Result_I/CircuitGain-MaxdSpaceOut/2)*(2*MaxCurrentAmp/MaxdSpaceOut); |
fmferrari | 14:4b5df635f248 | 85 | EKF_U.TemperatureIn=Result_T*(MaxTemperature/MaxdSpaceOut)/CircuitGain; |
fmferrari | 14:4b5df635f248 | 86 | // EKF_U.TemperatureIn=25; |
fmferrari | 14:4b5df635f248 | 87 | EKF_U.TimeStep=MacroTime.read()-EKF_U.MacroTime; |
fmferrari | 14:4b5df635f248 | 88 | EKF_U.MacroTime=MacroTime.read(); |
fmferrari | 14:4b5df635f248 | 89 | |
fmferrari | 14:4b5df635f248 | 90 | // STEP THE EKF MODEL |
fmferrari | 14:4b5df635f248 | 91 | EKF_step(); |
fmferrari | 14:4b5df635f248 | 92 | |
fmferrari | 14:4b5df635f248 | 93 | //FLASH THE LIGHT |
fmferrari | 14:4b5df635f248 | 94 | DATATRANSMISSION=1; |
fmferrari | 14:4b5df635f248 | 95 | |
fmferrari | 14:4b5df635f248 | 96 | //TRANSMIT DATA |
fmferrari | 14:4b5df635f248 | 97 | TRANSMIT.printf("%f \n", EKF_Y.SOC); |
fmferrari | 14:4b5df635f248 | 98 | TRANSMIT.printf("%f \n", EKF_Y.R0); |
fmferrari | 14:4b5df635f248 | 99 | TRANSMIT.printf("%f \n", EKF_Y.Q0); |
fmferrari | 14:4b5df635f248 | 100 | |
fmferrari | 14:4b5df635f248 | 101 | TRANSMIT.printf(" %f \n",EKF_U.Voltage); |
fmferrari | 14:4b5df635f248 | 102 | TRANSMIT.printf("%f \n", EKF_U.Current); |
fmferrari | 14:4b5df635f248 | 103 | TRANSMIT.printf("%f \n", EKF_U.TemperatureIn); |
fmferrari | 14:4b5df635f248 | 104 | |
fmferrari | 14:4b5df635f248 | 105 | TRANSMIT.printf("%f \n", EKF_U.MacroTime); |
fmferrari | 14:4b5df635f248 | 106 | TRANSMIT.printf("%f \n", EKF_U.TimeStep); |
fmferrari | 14:4b5df635f248 | 107 | |
fmferrari | 14:4b5df635f248 | 108 | } |
fmferrari | 12:bf3e3b87224e | 109 | |
fmferrari | 12:bf3e3b87224e | 110 | |
fmferrari | 13:831eab218c33 | 111 | int main() |
fmferrari | 13:831eab218c33 | 112 | { |
fmferrari | 0:1e567a5a99c3 | 113 | while(1) { |
fmferrari | 14:4b5df635f248 | 114 | |
fmferrari | 14:4b5df635f248 | 115 | OnOrOff.fall(&pressed); |
fmferrari | 13:831eab218c33 | 116 | |
fmferrari | 14:4b5df635f248 | 117 | |
fmferrari | 13:831eab218c33 | 118 | |
fmferrari | 14:4b5df635f248 | 119 | // MAIN LOOP ACTIVATED FROM BUTTON BEING PRESSED |
fmferrari | 14:4b5df635f248 | 120 | while(StateEKF) { |
fmferrari | 14:4b5df635f248 | 121 | TimerforIteration.attach(&ITERATE,0.1); |
fmferrari | 14:4b5df635f248 | 122 | //START TIMER AND LED |
fmferrari | 14:4b5df635f248 | 123 | MacroTime.start(); |
fmferrari | 14:4b5df635f248 | 124 | OutputTimer.start(); |
fmferrari | 14:4b5df635f248 | 125 | DATATRANSMISSION=0; |
fmferrari | 13:831eab218c33 | 126 | } |
fmferrari | 10:c4f0c3a5223f | 127 | } |
fmferrari | 10:c4f0c3a5223f | 128 | |
fmferrari | 13:831eab218c33 | 129 | } |