Federico Ferrari / Mbed 2 deprecated BMS_OX_FMF

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }