Team Fox / Mbed 2 deprecated BAE_QM_MAR9

Dependencies:   FreescaleIAP mbed-rtos mbed

Fork of workinQM_5thJan_azad by Team Fox

Committer:
lakshya
Date:
Sat Jun 04 11:29:13 2016 +0000
Revision:
19:79e69017c855
Parent:
17:fc782f7548c6
Child:
20:949d13045431
before going home

Who changed what in which revision?

UserRevisionLine numberNew contents of line
sakthipriya 0:7b4c00e3912f 1 #include "EPS.h"
sakthipriya 0:7b4c00e3912f 2 #include "pin_config.h"
sakthipriya 6:036d08b62785 3 #include "iostream"
sakthipriya 0:7b4c00e3912f 4 /***********************************************global variable declaration***************************************************************/
sakthipriya 0:7b4c00e3912f 5 extern uint32_t BAE_STATUS;
sakthipriya 0:7b4c00e3912f 6 extern uint32_t BAE_ENABLE;
sakthipriya 6:036d08b62785 7 extern uint8_t BAE_data[74];
sakthipriya 6:036d08b62785 8 extern char BAE_chardata[74];
sakthipriya 0:7b4c00e3912f 9
sakthipriya 0:7b4c00e3912f 10 //m_I2C.frequency(10000)
lakshya 15:e09aaaccf134 11 const char RCOMP0= 0x97;// don't know what it is now
sakthipriya 0:7b4c00e3912f 12 BAE_HK_actual actual_data;
sakthipriya 0:7b4c00e3912f 13 BAE_HK_quant quant_data;
sakthipriya 0:7b4c00e3912f 14 BAE_HK_min_max bae_HK_minmax;
sakthipriya 0:7b4c00e3912f 15 BAE_HK_arch arch_data;
sakthipriya 0:7b4c00e3912f 16
sakthipriya 5:bb592f3185cc 17
sakthipriya 0:7b4c00e3912f 18 //......................................Peripheral declarations.........................................................//
sakthipriya 0:7b4c00e3912f 19 Serial pc_eps(USBTX,USBRX);
sakthipriya 3:07e15677a75c 20
sakthipriya 0:7b4c00e3912f 21 I2C m_I2C(PIN85,PIN84);
sakthipriya 0:7b4c00e3912f 22 DigitalOut TRXY(TRXY_DR_EN); //active high
sakthipriya 0:7b4c00e3912f 23 DigitalOut TRZ(TRZ_DR_EN); //active high
sakthipriya 0:7b4c00e3912f 24 DigitalOut EN3V3A(ENBL3V3A);
sakthipriya 0:7b4c00e3912f 25 DigitalOut EN_BTRY_HT(BATT_HEAT);
sakthipriya 0:7b4c00e3912f 26 //DigitalIn BTRY_HT_OUTPUT(BATT_HEAT_OUTPUT);
sakthipriya 3:07e15677a75c 27 //AnalogIn Vbatt_ang(VBATT);
sakthipriya 3:07e15677a75c 28 AnalogIn Batt_voltage(PIN20); //Battery voltage
sakthipriya 3:07e15677a75c 29
lakshya 15:e09aaaccf134 30 SPI spi_bt(PIN99,PIN100,PIN98); //MOSI,MISO,SLK // battery temp something 3
lakshya 15:e09aaaccf134 31 DigitalOut ssn1(PIN19); //Slave select1 // low line master talks
sakthipriya 2:c823d84b4cb0 32 DigitalOut ssn2(PIN21);//Slave select2
sakthipriya 2:c823d84b4cb0 33 //DigitalOut PS(PTB0);
sakthipriya 2:c823d84b4cb0 34 //DigitalOut HS(PTB1);
sakthipriya 2:c823d84b4cb0 35
sakthipriya 3:07e15677a75c 36 AnalogIn CurrentInput(PIN54); // Input from Current Multiplexer //PIN54
sakthipriya 3:07e15677a75c 37 AnalogIn VoltageInput(PIN53); // Input from Voltage Multiplexer //PIN53
sakthipriya 3:07e15677a75c 38 AnalogIn BAE_temp_sensor(PIN55); //Input from BAE temp sensor
sakthipriya 3:07e15677a75c 39
lakshya 15:e09aaaccf134 40 /*mux for reading value one by one*/
sakthipriya 3:07e15677a75c 41 DigitalOut SelectLinea3 (PIN46); // MSB of Select Lines
sakthipriya 3:07e15677a75c 42 DigitalOut SelectLinea2 (PIN45);
sakthipriya 3:07e15677a75c 43 DigitalOut SelectLinea1 (PIN44);
sakthipriya 3:07e15677a75c 44 DigitalOut SelectLinea0 (PIN43); // LSB of Select Lines
sakthipriya 3:07e15677a75c 45
sakthipriya 3:07e15677a75c 46 DigitalOut SelectLineb3 (PIN56); // MSB of Select Lines
sakthipriya 3:07e15677a75c 47 DigitalOut SelectLineb2 (PIN57);
sakthipriya 3:07e15677a75c 48 DigitalOut SelectLineb1 (PIN58);
sakthipriya 3:07e15677a75c 49 DigitalOut SelectLineb0 (PIN59); // LSB of Select Lines
sakthipriya 0:7b4c00e3912f 50
sakthipriya 0:7b4c00e3912f 51 //*********************************************************flags********************************************************//
sakthipriya 0:7b4c00e3912f 52 extern char EPS_INIT_STATUS ;
sakthipriya 0:7b4c00e3912f 53 extern char EPS_BATTERY_GAUGE_STATUS ;
sakthipriya 0:7b4c00e3912f 54 extern char EPS_MAIN_STATUS;
sakthipriya 0:7b4c00e3912f 55 extern char EPS_BATTERY_TEMP_STATUS ;
sakthipriya 0:7b4c00e3912f 56 extern char EPS_STATUS ;
sakthipriya 0:7b4c00e3912f 57
sakthipriya 0:7b4c00e3912f 58 extern char EPS_BATTERY_HEAT_ENABLE ;
sakthipriya 0:7b4c00e3912f 59
sakthipriya 0:7b4c00e3912f 60 //........................................... FUCTIONS.................................................//
sakthipriya 0:7b4c00e3912f 61
sakthipriya 0:7b4c00e3912f 62 void FCTN_EPS_INIT()
sakthipriya 0:7b4c00e3912f 63 {
sakthipriya 0:7b4c00e3912f 64 printf("\n\r eps init \n");
sakthipriya 0:7b4c00e3912f 65 EPS_INIT_STATUS = 's' ; //set EPS_INIT_STATUS flag
sakthipriya 3:07e15677a75c 66 // FLAG();
sakthipriya 0:7b4c00e3912f 67 FCTN_BATTERYGAUGE_INIT();
sakthipriya 3:07e15677a75c 68 FCTN_BATTTEMP_INIT();
sakthipriya 0:7b4c00e3912f 69 EN3V3A = 1; //enable dc dc converter A
lakshya 15:e09aaaccf134 70 char value=alertFlags(); // initialization part of battery gauge
sakthipriya 0:7b4c00e3912f 71 unsigned short value_u= (short int )value;
sakthipriya 0:7b4c00e3912f 72 value_u &=0x0001;
sakthipriya 0:7b4c00e3912f 73 if(value_u ==0x0001) // battery gauge not initialised
sakthipriya 0:7b4c00e3912f 74 {
sakthipriya 0:7b4c00e3912f 75 actual_data.power_mode = 1;
sakthipriya 0:7b4c00e3912f 76 EPS_BATTERY_GAUGE_STATUS = 'c'; //clear EPS_BATTERY_GAUGE_STATUS
sakthipriya 0:7b4c00e3912f 77 }
sakthipriya 0:7b4c00e3912f 78 else
sakthipriya 0:7b4c00e3912f 79 {
sakthipriya 0:7b4c00e3912f 80 actual_data.Batt_gauge_actual[1] = soc();
lakshya 15:e09aaaccf134 81 actual_data.Batt_voltage_actual = Batt_voltage.read()*3.3; //1 corresponds to 3.3 scaling factor
lakshya 19:79e69017c855 82 //actual_data.Batt_voltage_data = Batt_voltage.read();/*changed 1.0*/
sakthipriya 0:7b4c00e3912f 83 FCTN_EPS_POWERMODE(actual_data.Batt_gauge_actual[1]);
sakthipriya 0:7b4c00e3912f 84 EPS_BATTERY_GAUGE_STATUS = 's'; //set EPS_BATTERY_GAUGE_STATUS
sakthipriya 0:7b4c00e3912f 85 }
sakthipriya 0:7b4c00e3912f 86
sakthipriya 0:7b4c00e3912f 87 EPS_INIT_STATUS = 'c' ; //clear EPS_INIT_STATUS flag
sakthipriya 0:7b4c00e3912f 88
sakthipriya 0:7b4c00e3912f 89 }
sakthipriya 0:7b4c00e3912f 90
sakthipriya 0:7b4c00e3912f 91 //----------------------------------------------------Power algo code--------------------------------------------------------------------//
lakshya 15:e09aaaccf134 92 /*update the power modes*/
lakshya 15:e09aaaccf134 93
sakthipriya 0:7b4c00e3912f 94 void FCTN_EPS_POWERMODE(float soc) //dummy algo
sakthipriya 0:7b4c00e3912f 95 {
sakthipriya 0:7b4c00e3912f 96 if(soc >= 80)
sakthipriya 0:7b4c00e3912f 97 actual_data.power_mode = 4;
sakthipriya 0:7b4c00e3912f 98 else if(soc >= 70 & soc < 80)
sakthipriya 0:7b4c00e3912f 99 actual_data.power_mode = 3;
sakthipriya 0:7b4c00e3912f 100 else if(soc >= 60 & soc < 70)
sakthipriya 0:7b4c00e3912f 101 actual_data.power_mode = 2;
sakthipriya 0:7b4c00e3912f 102 else if(soc < 60)
sakthipriya 0:7b4c00e3912f 103 actual_data.power_mode = 1;
sakthipriya 0:7b4c00e3912f 104 }
sakthipriya 0:7b4c00e3912f 105
sakthipriya 0:7b4c00e3912f 106 //...................................................HK...........................................//
lakshya 15:e09aaaccf134 107 /*reading values*/
lakshya 19:79e69017c855 108 uint16_t val_read;
lakshya 19:79e69017c855 109 float readval;
sakthipriya 3:07e15677a75c 110
sakthipriya 3:07e15677a75c 111 void FCTN_HK_MAIN()
sakthipriya 3:07e15677a75c 112 {
sakthipriya 3:07e15677a75c 113 int Iteration=0;
sakthipriya 3:07e15677a75c 114
sakthipriya 3:07e15677a75c 115 SelectLinea0=0;
sakthipriya 3:07e15677a75c 116 SelectLinea1=0;
sakthipriya 3:07e15677a75c 117 SelectLinea2=0;
sakthipriya 3:07e15677a75c 118 SelectLinea3=0;
sakthipriya 3:07e15677a75c 119
sakthipriya 3:07e15677a75c 120 SelectLineb0=0;
sakthipriya 3:07e15677a75c 121 SelectLineb1=0;
sakthipriya 3:07e15677a75c 122 SelectLineb2=0;
sakthipriya 3:07e15677a75c 123 SelectLineb3=0;
sakthipriya 3:07e15677a75c 124
sakthipriya 3:07e15677a75c 125 //collecting data
sakthipriya 3:07e15677a75c 126 for(Iteration=0; Iteration<16; Iteration++){
lakshya 19:79e69017c855 127 wait_ms(100);
lakshya 19:79e69017c855 128 readval=VoltageInput.read();
lakshya 19:79e69017c855 129 wait_ms(10);
sakthipriya 3:07e15677a75c 130 actual_data.voltage_actual[Iteration]=VoltageInput.read();
lakshya 19:79e69017c855 131 val_read=VoltageInput.read_u16();
lakshya 19:79e69017c855 132 //wait_ms(80);
lakshya 19:79e69017c855 133 printf("\n\ractual reading voltage%f",readval);
lakshya 19:79e69017c855 134 printf("\n\ractual raw data vol %f ",actual_data.voltage_actual[Iteration]);
lakshya 19:79e69017c855 135 printf("\n\ractual raw data vol in uint16_t %x ",val_read);
sakthipriya 3:07e15677a75c 136 actual_data.current_actual[Iteration]=CurrentInput.read();
lakshya 19:79e69017c855 137 readval=CurrentInput.read();
lakshya 19:79e69017c855 138 printf("\n\ractual reading curr%f",readval);
lakshya 19:79e69017c855 139 //wait_ms(80);
lakshya 19:79e69017c855 140
lakshya 19:79e69017c855 141 /* SelectLinea0=!(SelectLinea0);
sakthipriya 3:07e15677a75c 142 if(Iteration%2==1)
sakthipriya 3:07e15677a75c 143 SelectLinea1=!(SelectLinea1);
sakthipriya 3:07e15677a75c 144 if(Iteration%4==3)
sakthipriya 3:07e15677a75c 145 SelectLinea2=!(SelectLinea2);
sakthipriya 3:07e15677a75c 146 if(Iteration%8==7)
sakthipriya 3:07e15677a75c 147 SelectLinea3=!(SelectLinea3);
lakshya 19:79e69017c855 148
lakshya 19:79e69017c855 149 */
sakthipriya 3:07e15677a75c 150 int s0,s1,s2,s3;
sakthipriya 3:07e15677a75c 151 s0=SelectLineb0=SelectLinea0;
lakshya 17:fc782f7548c6 152 s1=SelectLineb1=SelectLinea1;// changed to
sakthipriya 3:07e15677a75c 153 s2=SelectLineb2=SelectLinea2;
sakthipriya 3:07e15677a75c 154 s3=SelectLineb3=SelectLinea3;
sakthipriya 3:07e15677a75c 155 printf("\n\r %d %d %d %d", s0,s1,s2,s3);
sakthipriya 3:07e15677a75c 156
sakthipriya 3:07e15677a75c 157 }
lakshya 17:fc782f7548c6 158
lakshya 17:fc782f7548c6 159
lakshya 17:fc782f7548c6 160 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 161
lakshya 19:79e69017c855 162 for(Iteration=0; Iteration<16; Iteration++)
lakshya 17:fc782f7548c6 163 {
lakshya 19:79e69017c855 164 printf("\n\rRaw data is for voltage %f",actual_data.voltage_actual[Iteration]);
lakshya 17:fc782f7548c6 165 }
lakshya 17:fc782f7548c6 166 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 167
sakthipriya 3:07e15677a75c 168 for(Iteration=0; Iteration<16; Iteration++){
sakthipriya 3:07e15677a75c 169
sakthipriya 3:07e15677a75c 170 if(Iteration==14)
sakthipriya 3:07e15677a75c 171 actual_data.voltage_actual[Iteration]= (-90.7*3.3*actual_data.voltage_actual[Iteration])+190.1543;
sakthipriya 3:07e15677a75c 172 else
sakthipriya 3:07e15677a75c 173 actual_data.voltage_actual[Iteration]= actual_data.voltage_actual[Iteration]*3.3*5.63;
sakthipriya 3:07e15677a75c 174 }
lakshya 17:fc782f7548c6 175
lakshya 17:fc782f7548c6 176 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 177
lakshya 19:79e69017c855 178 for(Iteration=0; Iteration<16; Iteration++)
lakshya 17:fc782f7548c6 179 {
lakshya 19:79e69017c855 180 printf("\n\ractual data is for voltage %f",actual_data.voltage_actual[Iteration]);
lakshya 17:fc782f7548c6 181 }
lakshya 17:fc782f7548c6 182 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 183
lakshya 17:fc782f7548c6 184
lakshya 17:fc782f7548c6 185
lakshya 17:fc782f7548c6 186 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 187
lakshya 19:79e69017c855 188 for(Iteration=0; Iteration<16; Iteration++)
lakshya 17:fc782f7548c6 189 {
lakshya 19:79e69017c855 190 printf("\n\rRAW data is for current %f",actual_data.current_actual[Iteration]);
lakshya 17:fc782f7548c6 191 }
lakshya 17:fc782f7548c6 192 //_____________________________________________________________________________________________
sakthipriya 3:07e15677a75c 193
sakthipriya 3:07e15677a75c 194 for(Iteration=0;Iteration<12;Iteration++){
sakthipriya 3:07e15677a75c 195 if(Iteration<8)
sakthipriya 3:07e15677a75c 196 actual_data.current_actual[Iteration]= actual_data.current_actual[Iteration]*3.3/(50*rsens);
sakthipriya 3:07e15677a75c 197 else
sakthipriya 3:07e15677a75c 198 actual_data.current_actual[Iteration]=actual_data.current_actual[Iteration]*3.3;
sakthipriya 3:07e15677a75c 199 int resistance;
sakthipriya 3:07e15677a75c 200
sakthipriya 3:07e15677a75c 201 resistance=24000*actual_data.current_actual[Iteration]/(3.3-actual_data.current_actual[Iteration]);
sakthipriya 3:07e15677a75c 202 if(actual_data.current_actual[Iteration]>1.47)
sakthipriya 3:07e15677a75c 203 {
sakthipriya 3:07e15677a75c 204 actual_data.current_actual[Iteration]=3694/log(24.032242*resistance);
sakthipriya 3:07e15677a75c 205 }
sakthipriya 3:07e15677a75c 206 else{
sakthipriya 3:07e15677a75c 207
sakthipriya 3:07e15677a75c 208 actual_data.current_actual[Iteration]=3365.4/log(7.60573*resistance);
sakthipriya 3:07e15677a75c 209 }
sakthipriya 3:07e15677a75c 210 }
lakshya 17:fc782f7548c6 211
lakshya 17:fc782f7548c6 212
lakshya 17:fc782f7548c6 213 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 214
lakshya 19:79e69017c855 215 for(Iteration=0; Iteration<16; Iteration++)
lakshya 17:fc782f7548c6 216 {
lakshya 19:79e69017c855 217 printf("\n\ractual data is for current %f",actual_data.current_actual[Iteration]);
lakshya 17:fc782f7548c6 218 }
lakshya 17:fc782f7548c6 219 //_____________________________________________________________________________________________
lakshya 17:fc782f7548c6 220
lakshya 17:fc782f7548c6 221
sakthipriya 3:07e15677a75c 222 actual_data.BAE_temp_actual=(-90.7*3.3*actual_data.BAE_temp_actual)+190.1543;
sakthipriya 3:07e15677a75c 223
sakthipriya 3:07e15677a75c 224 actual_data.Batt_voltage_actual=Batt_voltage.read()*3.3*5.63;
sakthipriya 3:07e15677a75c 225
sakthipriya 3:07e15677a75c 226 //quantizing data
sakthipriya 3:07e15677a75c 227 for(Iteration=0; Iteration<16; Iteration++){
sakthipriya 3:07e15677a75c 228
sakthipriya 3:07e15677a75c 229 if(Iteration==14)
sakthipriya 3:07e15677a75c 230 quant_data.voltage_quant[Iteration]=quantiz(tstart,tstep,actual_data.voltage_actual[Iteration]);
sakthipriya 3:07e15677a75c 231 else
sakthipriya 3:07e15677a75c 232 quant_data.voltage_quant[Iteration]=quantiz(vstart,vstep,actual_data.voltage_actual[Iteration]);
sakthipriya 3:07e15677a75c 233
sakthipriya 3:07e15677a75c 234 }
sakthipriya 3:07e15677a75c 235 for(Iteration=0;Iteration<12;Iteration++){
sakthipriya 3:07e15677a75c 236 if(Iteration<8)
sakthipriya 3:07e15677a75c 237 quant_data.current_quant[Iteration]=quantiz(cstart,cstep,actual_data.current_actual[Iteration]);
sakthipriya 3:07e15677a75c 238 else
sakthipriya 3:07e15677a75c 239 quant_data.current_quant[Iteration]=quantiz(tstart_thermistor,tstep_thermistor,actual_data.current_actual[Iteration]);
sakthipriya 3:07e15677a75c 240 }
sakthipriya 3:07e15677a75c 241 for(Iteration=0;Iteration<2;Iteration++){
sakthipriya 3:07e15677a75c 242
sakthipriya 3:07e15677a75c 243 quant_data.Batt_temp_quant[Iteration]=quantiz(tstart,tstep,actual_data.Batt_temp_actual[Iteration]);
sakthipriya 3:07e15677a75c 244 }
sakthipriya 3:07e15677a75c 245
sakthipriya 3:07e15677a75c 246 quant_data.Batt_gauge_quant[0]=quantiz(vcell_start,vcell_step,actual_data.Batt_gauge_actual[0]);
sakthipriya 3:07e15677a75c 247 quant_data.Batt_gauge_quant[1]=quantiz(soc_start,soc_step,actual_data.Batt_gauge_actual[1]);
sakthipriya 3:07e15677a75c 248 quant_data.Batt_gauge_quant[2]=quantiz(crate_start,crate_step,actual_data.Batt_gauge_actual[2]);
sakthipriya 3:07e15677a75c 249 quant_data.Batt_gauge_alerts=actual_data.Batt_gauge_actual[3];
sakthipriya 3:07e15677a75c 250
sakthipriya 3:07e15677a75c 251 quant_data.BAE_temp_quant=quantiz(tstart,tstep,actual_data.BAE_temp_actual);
sakthipriya 3:07e15677a75c 252
sakthipriya 3:07e15677a75c 253 for(Iteration=0;Iteration<3;Iteration++){
sakthipriya 5:bb592f3185cc 254 quant_data.AngularSpeed_quant[Iteration]=actual_data.AngularSpeed_actual[Iteration];
sakthipriya 6:036d08b62785 255 printf("\n\r w value %f",quant_data.AngularSpeed_quant[Iteration]);
sakthipriya 3:07e15677a75c 256 }
sakthipriya 3:07e15677a75c 257
sakthipriya 3:07e15677a75c 258 for(Iteration=0;Iteration<3;Iteration++){
sakthipriya 3:07e15677a75c 259 quant_data.Bvalue_quant[Iteration]=actual_data.Bvalue_actual[Iteration];
sakthipriya 6:036d08b62785 260 printf("\n\r b value %f",quant_data.Bvalue_quant[Iteration]);
sakthipriya 3:07e15677a75c 261 }
sakthipriya 3:07e15677a75c 262
sakthipriya 3:07e15677a75c 263 quant_data.Batt_voltage_quant=quantiz(vstart,vstep,actual_data.Batt_voltage_actual);
sakthipriya 3:07e15677a75c 264
sakthipriya 3:07e15677a75c 265
sakthipriya 3:07e15677a75c 266 arch_data.Batt_1_temp=quant_data.Batt_temp_quant[0];
sakthipriya 3:07e15677a75c 267 arch_data.Batt_2_temp=quant_data.Batt_temp_quant[1];
sakthipriya 3:07e15677a75c 268 arch_data.EPS_PCB_temp=quant_data.voltage_quant[14];
sakthipriya 3:07e15677a75c 269 arch_data.Batt_SOC=quant_data.Batt_gauge_quant[1];
sakthipriya 3:07e15677a75c 270 arch_data.power_mode=actual_data.power_mode;
sakthipriya 5:bb592f3185cc 271 arch_data.faultPoll_status=actual_data.faultPoll_status;
sakthipriya 5:bb592f3185cc 272 arch_data.faultIr_status=actual_data.faultIr_status;
sakthipriya 3:07e15677a75c 273 arch_data.Batt_voltage=quant_data.Batt_voltage_quant;
sakthipriya 6:036d08b62785 274 printf("\n\r in hk");
sakthipriya 3:07e15677a75c 275
sakthipriya 3:07e15677a75c 276 }
sakthipriya 3:07e15677a75c 277
sakthipriya 5:bb592f3185cc 278 void FCTN_APPEND_HKDATA()
sakthipriya 5:bb592f3185cc 279 {
sakthipriya 5:bb592f3185cc 280 // quantized data
sakthipriya 5:bb592f3185cc 281 for (int i=0;i<16;i++)
sakthipriya 5:bb592f3185cc 282 BAE_data[i] = quant_data.voltage_quant[i];
sakthipriya 5:bb592f3185cc 283 for (int i=16;i<28;i++)
sakthipriya 5:bb592f3185cc 284 BAE_data[i] = quant_data.current_quant[i-16];
sakthipriya 5:bb592f3185cc 285 BAE_data[28] = quant_data.Batt_temp_quant[0];
sakthipriya 5:bb592f3185cc 286 BAE_data[29] = quant_data.Batt_temp_quant[1];
sakthipriya 5:bb592f3185cc 287 BAE_data[30] = quant_data.Batt_gauge_quant[1];
sakthipriya 5:bb592f3185cc 288 BAE_data[31] = quant_data.Batt_gauge_quant[1];
sakthipriya 5:bb592f3185cc 289 BAE_data[32] = quant_data.Batt_gauge_quant[1];
sakthipriya 5:bb592f3185cc 290 FCTN_CONVERT_FLOAT(quant_data.Batt_gauge_alerts,&BAE_data[33]);
sakthipriya 5:bb592f3185cc 291 BAE_data[37] = quant_data.BAE_temp_quant;
sakthipriya 5:bb592f3185cc 292 FCTN_CONVERT_FLOAT(quant_data.AngularSpeed_quant[0],&BAE_data[38]);
sakthipriya 6:036d08b62785 293 //printf("\n\r outside %d %d %d %d", BAE_data[38],BAE_data[39],BAE_data[40],BAE_data[41]);
sakthipriya 6:036d08b62785 294 //std:: cout << "\n\r uint8 outside " << BAE_data[38] << '\t' << BAE_data[39] << '\t' << BAE_data[40] << '\t' << BAE_data[41] <<std::endl;
sakthipriya 5:bb592f3185cc 295 FCTN_CONVERT_FLOAT(quant_data.AngularSpeed_quant[1],&BAE_data[42]);
sakthipriya 6:036d08b62785 296 //std:: cout << "\n\r uint8 outside " << BAE_data[42] << '\t' << BAE_data[43] << '\t' << BAE_data[44] << '\t' << BAE_data[45] <<std::endl;
sakthipriya 6:036d08b62785 297 // printf("\n\r outside %d %d %d %d", BAE_data[42],BAE_data[43],BAE_data[44],BAE_data[45]);
sakthipriya 5:bb592f3185cc 298 FCTN_CONVERT_FLOAT(quant_data.AngularSpeed_quant[2],&BAE_data[46]);
sakthipriya 6:036d08b62785 299 //printf("\n\r outside %d %d %d %d", BAE_data[46],BAE_data[47],BAE_data[48],BAE_data[49]);
sakthipriya 6:036d08b62785 300 //std:: cout << "\n\r uint8 outside " << BAE_data[46] << '\t' << BAE_data[47] << '\t' << BAE_data[48] << '\t' << BAE_data[49] <<std::endl;
sakthipriya 5:bb592f3185cc 301 FCTN_CONVERT_FLOAT(quant_data.Bvalue_quant[0],&BAE_data[50]);
sakthipriya 5:bb592f3185cc 302 FCTN_CONVERT_FLOAT(quant_data.Bvalue_quant[1],&BAE_data[54]);
sakthipriya 5:bb592f3185cc 303 FCTN_CONVERT_FLOAT(quant_data.Bvalue_quant[2],&BAE_data[58]);
sakthipriya 5:bb592f3185cc 304 BAE_data[62] = quant_data.Batt_voltage_quant;
sakthipriya 5:bb592f3185cc 305 BAE_data[63] = (uint8_t)actual_data.power_mode;
sakthipriya 5:bb592f3185cc 306 BAE_data[64] = actual_data.faultPoll_status;
sakthipriya 5:bb592f3185cc 307 BAE_data[65] = actual_data.faultIr_status;
sakthipriya 5:bb592f3185cc 308 // archived data
sakthipriya 5:bb592f3185cc 309 BAE_data[66] = arch_data.Batt_1_temp; //verify if uint8_t is right
sakthipriya 5:bb592f3185cc 310 BAE_data[67] = arch_data.Batt_2_temp;
sakthipriya 5:bb592f3185cc 311 BAE_data[68] = arch_data.EPS_PCB_temp;
sakthipriya 5:bb592f3185cc 312 BAE_data[69] = arch_data.Batt_SOC;
sakthipriya 5:bb592f3185cc 313 BAE_data[70] = (uint8_t)arch_data.power_mode;
sakthipriya 5:bb592f3185cc 314 BAE_data[71] = arch_data.faultPoll_status;
sakthipriya 5:bb592f3185cc 315 BAE_data[72] = arch_data.faultIr_status;
sakthipriya 5:bb592f3185cc 316 BAE_data[73] = arch_data.Batt_voltage;
sakthipriya 6:036d08b62785 317 for(int i=0; i<73;i++)
sakthipriya 6:036d08b62785 318 BAE_chardata[i] = (char)BAE_data[i];
sakthipriya 6:036d08b62785 319 BAE_chardata[73] = '\0';
sakthipriya 7:a46a1dee4497 320 printf("\n\r bae ats data %c %c %c", BAE_chardata[38],BAE_chardata[39],BAE_chardata[40]);
sakthipriya 6:036d08b62785 321 printf("\n\r BAE data is %s", BAE_chardata);
sakthipriya 5:bb592f3185cc 322
sakthipriya 5:bb592f3185cc 323 }
sakthipriya 5:bb592f3185cc 324
sakthipriya 5:bb592f3185cc 325 uint8_t quantiz(float start,float step,float x)
sakthipriya 0:7b4c00e3912f 326 {
sakthipriya 0:7b4c00e3912f 327 int y=(x-start)/step;
sakthipriya 0:7b4c00e3912f 328 if(y<=0)y=0;
sakthipriya 0:7b4c00e3912f 329 if(y>=255)y=255;
sakthipriya 0:7b4c00e3912f 330 return y;
sakthipriya 0:7b4c00e3912f 331 }
sakthipriya 0:7b4c00e3912f 332
sakthipriya 3:07e15677a75c 333 bool firstCount=true; // goes to EPS init
sakthipriya 3:07e15677a75c 334
sakthipriya 3:07e15677a75c 335
sakthipriya 3:07e15677a75c 336 void saveMin(char x,char y){
sakthipriya 3:07e15677a75c 337 if(y<x){
sakthipriya 3:07e15677a75c 338 x=y;
sakthipriya 3:07e15677a75c 339 }
sakthipriya 3:07e15677a75c 340
sakthipriya 3:07e15677a75c 341 }
sakthipriya 3:07e15677a75c 342 void saveMax(char x,char y){
sakthipriya 3:07e15677a75c 343 if (y>x)
sakthipriya 3:07e15677a75c 344 {
sakthipriya 3:07e15677a75c 345 x=y;
sakthipriya 3:07e15677a75c 346 }
sakthipriya 0:7b4c00e3912f 347 }
sakthipriya 0:7b4c00e3912f 348
sakthipriya 3:07e15677a75c 349
sakthipriya 3:07e15677a75c 350 void minMaxHkData(){
sakthipriya 3:07e15677a75c 351 if(firstCount==true){
sakthipriya 3:07e15677a75c 352 for (int i = 0; i < 16; ++i){
sakthipriya 3:07e15677a75c 353 bae_HK_minmax.voltage_min[i] = quant_data.voltage_quant[i];
sakthipriya 3:07e15677a75c 354 bae_HK_minmax.voltage_max[i] = quant_data.voltage_quant[i];
sakthipriya 3:07e15677a75c 355 }
sakthipriya 3:07e15677a75c 356 for (int i = 0; i < 12; ++i){
sakthipriya 3:07e15677a75c 357 bae_HK_minmax.current_min[i] = quant_data.current_quant[i];
sakthipriya 3:07e15677a75c 358 bae_HK_minmax.current_max[i] = quant_data.current_quant[i];
sakthipriya 3:07e15677a75c 359 }
sakthipriya 3:07e15677a75c 360
sakthipriya 3:07e15677a75c 361 for (int i = 0; i < 2; ++i){
sakthipriya 3:07e15677a75c 362 bae_HK_minmax.Batt_temp_min[i] = quant_data.Batt_temp_quant[i];
sakthipriya 3:07e15677a75c 363 bae_HK_minmax.Batt_temp_max[i] = quant_data.Batt_temp_quant[i];
sakthipriya 3:07e15677a75c 364 }
sakthipriya 3:07e15677a75c 365 for (int i = 0; i < 3; ++i){
sakthipriya 3:07e15677a75c 366 bae_HK_minmax.Batt_gauge_min[i] = quant_data.Batt_gauge_quant[i];
sakthipriya 3:07e15677a75c 367 bae_HK_minmax.Batt_gauge_max[i] = quant_data.Batt_gauge_quant[i];
sakthipriya 3:07e15677a75c 368 }
sakthipriya 3:07e15677a75c 369 for (int i = 0; i < 3; ++i){
sakthipriya 3:07e15677a75c 370 bae_HK_minmax.AngularSpeed_min[i] = quant_data.AngularSpeed_quant[i];
sakthipriya 3:07e15677a75c 371 bae_HK_minmax.AngularSpeed_max[i] = quant_data.AngularSpeed_quant[i];
sakthipriya 3:07e15677a75c 372 }
sakthipriya 3:07e15677a75c 373 for (int i = 0; i < 3; ++i){
sakthipriya 3:07e15677a75c 374 bae_HK_minmax.Bvalue_min[i] = quant_data.Bvalue_quant[i];
sakthipriya 3:07e15677a75c 375 bae_HK_minmax.Bvalue_max[i] = quant_data.Bvalue_quant[i];
sakthipriya 3:07e15677a75c 376 }
sakthipriya 3:07e15677a75c 377 bae_HK_minmax.BAE_temp_min=quant_data.BAE_temp_quant;
sakthipriya 3:07e15677a75c 378 bae_HK_minmax.BAE_temp_max=quant_data.BAE_temp_quant;
sakthipriya 3:07e15677a75c 379 bae_HK_minmax.Batt_voltage_min=quant_data.Batt_voltage_quant;
sakthipriya 3:07e15677a75c 380 bae_HK_minmax.Batt_voltage_max=quant_data.Batt_voltage_quant;
sakthipriya 3:07e15677a75c 381
sakthipriya 3:07e15677a75c 382 }
sakthipriya 3:07e15677a75c 383 else {
sakthipriya 3:07e15677a75c 384 for (int i = 0; i < 16; ++i)
sakthipriya 3:07e15677a75c 385 {
sakthipriya 3:07e15677a75c 386 saveMin(bae_HK_minmax.voltage_min[i],quant_data.voltage_quant[i]);
sakthipriya 3:07e15677a75c 387 saveMax(bae_HK_minmax.voltage_max[i],quant_data.voltage_quant[i]);
sakthipriya 3:07e15677a75c 388 }
sakthipriya 3:07e15677a75c 389 for (int i = 0; i < 12; ++i)
sakthipriya 3:07e15677a75c 390 {
sakthipriya 3:07e15677a75c 391 saveMin(bae_HK_minmax.current_min[i],quant_data.current_quant[i]);
sakthipriya 3:07e15677a75c 392 saveMax(bae_HK_minmax.current_max[i],quant_data.current_quant[i]);
sakthipriya 3:07e15677a75c 393 }
sakthipriya 3:07e15677a75c 394
sakthipriya 3:07e15677a75c 395 for (int i = 0; i < 2; ++i)
sakthipriya 3:07e15677a75c 396 {
sakthipriya 3:07e15677a75c 397 saveMin(bae_HK_minmax.Batt_temp_min[i],quant_data.Batt_temp_quant[i]);
sakthipriya 3:07e15677a75c 398 saveMax(bae_HK_minmax.Batt_temp_max[i],quant_data.Batt_temp_quant[i]);
sakthipriya 3:07e15677a75c 399 }
sakthipriya 3:07e15677a75c 400 for (int i = 0; i < 3; ++i)
sakthipriya 3:07e15677a75c 401 {
sakthipriya 3:07e15677a75c 402 saveMin(bae_HK_minmax.Batt_gauge_min[i], quant_data.Batt_gauge_quant[i]);
sakthipriya 3:07e15677a75c 403 saveMax(bae_HK_minmax.Batt_gauge_max[i], quant_data.Batt_gauge_quant[i]);
sakthipriya 3:07e15677a75c 404 }
sakthipriya 3:07e15677a75c 405 for (int i = 0; i < 3; ++i)
sakthipriya 3:07e15677a75c 406 {
sakthipriya 3:07e15677a75c 407 saveMin(bae_HK_minmax.AngularSpeed_min[i], quant_data.AngularSpeed_quant[i]);
sakthipriya 3:07e15677a75c 408 saveMax(bae_HK_minmax.AngularSpeed_max[i], quant_data.AngularSpeed_quant[i]);
sakthipriya 3:07e15677a75c 409 }
sakthipriya 3:07e15677a75c 410 for (int i = 0; i < 3; ++i)
sakthipriya 3:07e15677a75c 411 {
sakthipriya 3:07e15677a75c 412 saveMin(bae_HK_minmax.Bvalue_min[i], quant_data.Bvalue_quant[i]);
sakthipriya 3:07e15677a75c 413 saveMax(bae_HK_minmax.Bvalue_max[i], quant_data.Bvalue_quant[i]);
sakthipriya 3:07e15677a75c 414 }
sakthipriya 3:07e15677a75c 415 saveMin(bae_HK_minmax.BAE_temp_min,quant_data.BAE_temp_quant);
sakthipriya 3:07e15677a75c 416 saveMax(bae_HK_minmax.BAE_temp_max,quant_data.BAE_temp_quant);
sakthipriya 3:07e15677a75c 417 saveMin(bae_HK_minmax.Batt_voltage_min,quant_data.Batt_voltage_quant);
sakthipriya 3:07e15677a75c 418 saveMin(bae_HK_minmax.Batt_voltage_max,quant_data.Batt_voltage_quant);
sakthipriya 3:07e15677a75c 419
sakthipriya 3:07e15677a75c 420
sakthipriya 3:07e15677a75c 421 }
sakthipriya 3:07e15677a75c 422 firstCount=false;
sakthipriya 3:07e15677a75c 423 }
sakthipriya 3:07e15677a75c 424
sakthipriya 3:07e15677a75c 425
sakthipriya 0:7b4c00e3912f 426 //............................................BATTERY GAUGE......................................//
sakthipriya 0:7b4c00e3912f 427 void FCTN_BATTERYGAUGE_INIT()
sakthipriya 0:7b4c00e3912f 428 {
sakthipriya 0:7b4c00e3912f 429 disable_sleep();
sakthipriya 0:7b4c00e3912f 430 disable_hibernate();
sakthipriya 0:7b4c00e3912f 431 socChangeAlertEnabled(true); //enabling alert on soc changing by 1%
sakthipriya 0:7b4c00e3912f 432 emptyAlertThreshold(32);//setting empty alert threshold to 32% soc
sakthipriya 0:7b4c00e3912f 433 vAlertMinMaxThreshold();//set min, max value of Valrt register
sakthipriya 0:7b4c00e3912f 434 vResetThresholdSet();//set threshold voltage for reset
sakthipriya 0:7b4c00e3912f 435 vResetAlertEnabled(true);//enable alert on reset for V < Vreset
sakthipriya 0:7b4c00e3912f 436 }
sakthipriya 0:7b4c00e3912f 437
sakthipriya 0:7b4c00e3912f 438 void FCTN_BATTERYGAUGE_MAIN(float Battery_parameters[4])
sakthipriya 0:7b4c00e3912f 439 {
lakshya 19:79e69017c855 440 /// printf("\n\r battery gauge \n");
sakthipriya 0:7b4c00e3912f 441
sakthipriya 3:07e15677a75c 442 float temp=30; //=Battery_temp (from temp sensor on battery board) //value of battery temperature in C currently given a dummy value. Should be updated everytime.
sakthipriya 0:7b4c00e3912f 443 tempCompensation(temp);
sakthipriya 0:7b4c00e3912f 444
sakthipriya 0:7b4c00e3912f 445
sakthipriya 0:7b4c00e3912f 446 Battery_parameters[0]=vcell();
sakthipriya 0:7b4c00e3912f 447 Battery_parameters[1]=soc();
sakthipriya 0:7b4c00e3912f 448 Battery_parameters[2]=crate();
sakthipriya 0:7b4c00e3912f 449
sakthipriya 0:7b4c00e3912f 450 printf("\nVcell=%f",vcell()); //remove this for final code
sakthipriya 0:7b4c00e3912f 451 printf("\nSOC=%f",soc()); //remove this for final code
sakthipriya 0:7b4c00e3912f 452 printf("\nC_rate=%f",crate()); //remove this for final code
sakthipriya 0:7b4c00e3912f 453
sakthipriya 0:7b4c00e3912f 454
sakthipriya 0:7b4c00e3912f 455 if (alerting()== true) //alert is on
sakthipriya 0:7b4c00e3912f 456 {
sakthipriya 0:7b4c00e3912f 457 Battery_parameters[3]=alertFlags();
sakthipriya 0:7b4c00e3912f 458 clearAlert();//clear alert
sakthipriya 0:7b4c00e3912f 459 clearAlertFlags();//clear all alert flags
sakthipriya 0:7b4c00e3912f 460 }
sakthipriya 0:7b4c00e3912f 461
sakthipriya 0:7b4c00e3912f 462 }
sakthipriya 0:7b4c00e3912f 463
sakthipriya 0:7b4c00e3912f 464 unsigned short read(char reg)
sakthipriya 0:7b4c00e3912f 465 {
sakthipriya 0:7b4c00e3912f 466
sakthipriya 0:7b4c00e3912f 467 //Create a temporary buffer
sakthipriya 0:7b4c00e3912f 468 char buff[2];
sakthipriya 0:7b4c00e3912f 469
sakthipriya 0:7b4c00e3912f 470 //Select the register
sakthipriya 0:7b4c00e3912f 471 m_I2C.write(m_ADDR, &reg, 1, true);
sakthipriya 0:7b4c00e3912f 472
sakthipriya 0:7b4c00e3912f 473 //Read the 16-bit register
sakthipriya 0:7b4c00e3912f 474 m_I2C.read(m_ADDR, buff, 2);
sakthipriya 0:7b4c00e3912f 475
sakthipriya 0:7b4c00e3912f 476 //Return the combined 16-bit value
sakthipriya 0:7b4c00e3912f 477 return (buff[0] << 8) | buff[1];
sakthipriya 0:7b4c00e3912f 478 }
sakthipriya 0:7b4c00e3912f 479
sakthipriya 3:07e15677a75c 480
sakthipriya 1:446a959e36ce 481
sakthipriya 3:07e15677a75c 482
sakthipriya 0:7b4c00e3912f 483
sakthipriya 0:7b4c00e3912f 484 void write(char reg, unsigned short data)
sakthipriya 0:7b4c00e3912f 485 {
sakthipriya 0:7b4c00e3912f 486 //Create a temporary buffer
sakthipriya 0:7b4c00e3912f 487 char buff[3];
sakthipriya 0:7b4c00e3912f 488
sakthipriya 0:7b4c00e3912f 489 //Load the register address and 16-bit data
sakthipriya 0:7b4c00e3912f 490 buff[0] = reg;
sakthipriya 0:7b4c00e3912f 491 buff[1] = data >> 8;
sakthipriya 0:7b4c00e3912f 492 buff[2] = data;
sakthipriya 0:7b4c00e3912f 493
sakthipriya 0:7b4c00e3912f 494 //Write the data
sakthipriya 0:7b4c00e3912f 495 m_I2C.write(m_ADDR, buff, 3);
sakthipriya 0:7b4c00e3912f 496 }
sakthipriya 0:7b4c00e3912f 497
sakthipriya 0:7b4c00e3912f 498
sakthipriya 0:7b4c00e3912f 499
sakthipriya 0:7b4c00e3912f 500 // Command the MAX17049 to perform a power-on reset
sakthipriya 0:7b4c00e3912f 501 void reset()
sakthipriya 0:7b4c00e3912f 502 {
sakthipriya 0:7b4c00e3912f 503 //Write the POR command
sakthipriya 0:7b4c00e3912f 504 write(REG_CMD, 0x5400);
sakthipriya 0:7b4c00e3912f 505 }
sakthipriya 0:7b4c00e3912f 506
sakthipriya 0:7b4c00e3912f 507 // Command the MAX17049 to perform a QuickStart
sakthipriya 0:7b4c00e3912f 508 void quickStart()
sakthipriya 0:7b4c00e3912f 509 {
sakthipriya 0:7b4c00e3912f 510 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 511 unsigned short value = read(REG_MODE);
lakshya 15:e09aaaccf134 512
sakthipriya 0:7b4c00e3912f 513 //Set the QuickStart bit
sakthipriya 0:7b4c00e3912f 514 value |= (1 << 14);
sakthipriya 0:7b4c00e3912f 515
sakthipriya 0:7b4c00e3912f 516 //Write the value back out
sakthipriya 0:7b4c00e3912f 517 write(REG_MODE, value);
sakthipriya 0:7b4c00e3912f 518 }
sakthipriya 0:7b4c00e3912f 519
sakthipriya 0:7b4c00e3912f 520
sakthipriya 0:7b4c00e3912f 521 //disable sleep
sakthipriya 0:7b4c00e3912f 522 void disable_sleep()
sakthipriya 0:7b4c00e3912f 523 {
sakthipriya 0:7b4c00e3912f 524 unsigned short value = read(REG_MODE);
sakthipriya 0:7b4c00e3912f 525 value &= ~(1 << 13);
sakthipriya 0:7b4c00e3912f 526 write(REG_MODE, value);
sakthipriya 0:7b4c00e3912f 527 }
sakthipriya 0:7b4c00e3912f 528
sakthipriya 0:7b4c00e3912f 529 //disable the hibernate of the MAX17049
sakthipriya 0:7b4c00e3912f 530 void disable_hibernate()
sakthipriya 0:7b4c00e3912f 531 {
sakthipriya 0:7b4c00e3912f 532 write(REG_HIBRT, 0x0000);
sakthipriya 0:7b4c00e3912f 533 }
sakthipriya 0:7b4c00e3912f 534
sakthipriya 0:7b4c00e3912f 535
sakthipriya 0:7b4c00e3912f 536 // Enable or disable the SOC 1% change alert on the MAX17049
sakthipriya 0:7b4c00e3912f 537 void socChangeAlertEnabled(bool enabled)
sakthipriya 0:7b4c00e3912f 538 {
sakthipriya 0:7b4c00e3912f 539 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 540 unsigned short value = read(REG_CONFIG);
sakthipriya 0:7b4c00e3912f 541
sakthipriya 0:7b4c00e3912f 542 //Set or clear the ALSC bit
sakthipriya 0:7b4c00e3912f 543 if (enabled)
sakthipriya 0:7b4c00e3912f 544 value |= (1 << 6);
sakthipriya 0:7b4c00e3912f 545 else
sakthipriya 0:7b4c00e3912f 546 value &= ~(1 << 6);
sakthipriya 0:7b4c00e3912f 547
sakthipriya 0:7b4c00e3912f 548 //Write the value back out
sakthipriya 0:7b4c00e3912f 549 write(REG_CONFIG, value);
sakthipriya 0:7b4c00e3912f 550 }
sakthipriya 0:7b4c00e3912f 551
sakthipriya 0:7b4c00e3912f 552
sakthipriya 0:7b4c00e3912f 553 void compensation(char rcomp)
sakthipriya 0:7b4c00e3912f 554 {
sakthipriya 0:7b4c00e3912f 555 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 556 unsigned short value = read(REG_CONFIG);
sakthipriya 0:7b4c00e3912f 557
sakthipriya 0:7b4c00e3912f 558 //Update the register value
sakthipriya 0:7b4c00e3912f 559 value &= 0x00FF;
sakthipriya 0:7b4c00e3912f 560 value |= rcomp << 8;
sakthipriya 0:7b4c00e3912f 561
sakthipriya 0:7b4c00e3912f 562 //Write the value back out
sakthipriya 0:7b4c00e3912f 563 write(REG_CONFIG, value);
sakthipriya 0:7b4c00e3912f 564 }
sakthipriya 0:7b4c00e3912f 565
sakthipriya 0:7b4c00e3912f 566
sakthipriya 0:7b4c00e3912f 567 void tempCompensation(float temp)
sakthipriya 0:7b4c00e3912f 568 {
sakthipriya 0:7b4c00e3912f 569 //Calculate the new RCOMP value
sakthipriya 0:7b4c00e3912f 570 char rcomp;
sakthipriya 0:7b4c00e3912f 571 if (temp > 20.0) {
sakthipriya 0:7b4c00e3912f 572 rcomp = RCOMP0 + (temp - 20.0) * -0.5;
sakthipriya 0:7b4c00e3912f 573 } else {
sakthipriya 0:7b4c00e3912f 574 rcomp = RCOMP0 + (temp - 20.0) * -5.0;
sakthipriya 0:7b4c00e3912f 575 }
sakthipriya 0:7b4c00e3912f 576
sakthipriya 0:7b4c00e3912f 577 //Update the RCOMP value
sakthipriya 0:7b4c00e3912f 578 compensation(rcomp);
sakthipriya 0:7b4c00e3912f 579 }
sakthipriya 0:7b4c00e3912f 580
sakthipriya 0:7b4c00e3912f 581 // Command the MAX17049 to de-assert the ALRT pin
sakthipriya 0:7b4c00e3912f 582 void clearAlert()
sakthipriya 0:7b4c00e3912f 583 {
sakthipriya 0:7b4c00e3912f 584 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 585 unsigned short value = read(REG_CONFIG);
sakthipriya 0:7b4c00e3912f 586
sakthipriya 0:7b4c00e3912f 587 //Clear the ALRT bit
sakthipriya 0:7b4c00e3912f 588 value &= ~(1 << 5);
sakthipriya 0:7b4c00e3912f 589
sakthipriya 0:7b4c00e3912f 590 //Write the value back out
sakthipriya 0:7b4c00e3912f 591 write(REG_CONFIG, value);
sakthipriya 0:7b4c00e3912f 592 }
sakthipriya 0:7b4c00e3912f 593
sakthipriya 0:7b4c00e3912f 594
sakthipriya 0:7b4c00e3912f 595 //Set the SOC empty alert threshold of the MAX17049
sakthipriya 0:7b4c00e3912f 596 void emptyAlertThreshold(char threshold)
sakthipriya 0:7b4c00e3912f 597 {
sakthipriya 0:7b4c00e3912f 598 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 599 unsigned short value = read(REG_CONFIG);
sakthipriya 0:7b4c00e3912f 600
sakthipriya 0:7b4c00e3912f 601 //Update the register value
sakthipriya 0:7b4c00e3912f 602 value &= 0xFFE0;
sakthipriya 0:7b4c00e3912f 603 value |= 32 - threshold;
sakthipriya 0:7b4c00e3912f 604
sakthipriya 0:7b4c00e3912f 605 //Write the 16-bit register
sakthipriya 0:7b4c00e3912f 606 write(REG_CONFIG, value);
sakthipriya 0:7b4c00e3912f 607 }
sakthipriya 0:7b4c00e3912f 608
sakthipriya 0:7b4c00e3912f 609 // Set the low and high voltage alert threshold of the MAX17049
sakthipriya 0:7b4c00e3912f 610 void vAlertMinMaxThreshold()
sakthipriya 0:7b4c00e3912f 611 {
sakthipriya 0:7b4c00e3912f 612 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 613 unsigned short value = read(REG_VALRT);
sakthipriya 0:7b4c00e3912f 614
sakthipriya 0:7b4c00e3912f 615 //Mask off the old value
sakthipriya 0:7b4c00e3912f 616
sakthipriya 0:7b4c00e3912f 617 value = 0x96D2;
sakthipriya 0:7b4c00e3912f 618
sakthipriya 0:7b4c00e3912f 619 //Write the 16-bit register
sakthipriya 0:7b4c00e3912f 620 write(REG_VALRT, value);
sakthipriya 0:7b4c00e3912f 621 }
sakthipriya 0:7b4c00e3912f 622
sakthipriya 0:7b4c00e3912f 623
sakthipriya 0:7b4c00e3912f 624 // Set the reset voltage threshold of the MAX17049
sakthipriya 0:7b4c00e3912f 625 void vResetThresholdSet()
sakthipriya 0:7b4c00e3912f 626 {
sakthipriya 0:7b4c00e3912f 627 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 628 unsigned short value = read(REG_VRESET_ID);
sakthipriya 0:7b4c00e3912f 629
sakthipriya 0:7b4c00e3912f 630 //Mask off the old //value
sakthipriya 0:7b4c00e3912f 631 value &= 0x00FF;//Dis=0
sakthipriya 0:7b4c00e3912f 632
sakthipriya 0:7b4c00e3912f 633 value |= 0x9400;//corresponding to 2.5 V
sakthipriya 0:7b4c00e3912f 634
sakthipriya 0:7b4c00e3912f 635
sakthipriya 0:7b4c00e3912f 636 //Write the 16-bit register
sakthipriya 0:7b4c00e3912f 637 write(REG_VRESET_ID, value);
sakthipriya 0:7b4c00e3912f 638 }
sakthipriya 0:7b4c00e3912f 639
sakthipriya 0:7b4c00e3912f 640
sakthipriya 0:7b4c00e3912f 641 // Enable or disable the voltage reset alert on the MAX17049
sakthipriya 0:7b4c00e3912f 642 void vResetAlertEnabled(bool enabled)
sakthipriya 0:7b4c00e3912f 643 {
sakthipriya 0:7b4c00e3912f 644 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 645 unsigned short value = read(REG_STATUS);
sakthipriya 0:7b4c00e3912f 646
sakthipriya 0:7b4c00e3912f 647 //Set or clear the EnVR bit
sakthipriya 0:7b4c00e3912f 648 if (enabled)
sakthipriya 0:7b4c00e3912f 649 value |= (1 << 14);
sakthipriya 0:7b4c00e3912f 650 else
sakthipriya 0:7b4c00e3912f 651 value &= ~(1 << 14);
sakthipriya 0:7b4c00e3912f 652
sakthipriya 0:7b4c00e3912f 653 //Write the value back out
sakthipriya 0:7b4c00e3912f 654 write(REG_STATUS, value);
sakthipriya 0:7b4c00e3912f 655 }
sakthipriya 0:7b4c00e3912f 656
sakthipriya 0:7b4c00e3912f 657 //Get the current alert flags on the MAX17049
sakthipriya 0:7b4c00e3912f 658 //refer datasheet-status registers section to decode it.
sakthipriya 0:7b4c00e3912f 659 char alertFlags()
sakthipriya 0:7b4c00e3912f 660 {
sakthipriya 0:7b4c00e3912f 661 //Read the 16-bit register value
sakthipriya 0:7b4c00e3912f 662 unsigned short value = read(REG_STATUS);
sakthipriya 0:7b4c00e3912f 663
sakthipriya 0:7b4c00e3912f 664 //Return only the flag bits
sakthipriya 0:7b4c00e3912f 665 return (value >> 8) & 0x3F;
sakthipriya 0:7b4c00e3912f 666 }
sakthipriya 0:7b4c00e3912f 667
sakthipriya 0:7b4c00e3912f 668 // Clear all the alert flags on the MAX17049
sakthipriya 0:7b4c00e3912f 669 void clearAlertFlags()
sakthipriya 0:7b4c00e3912f 670 {
sakthipriya 0:7b4c00e3912f 671 //Read the current 16-bit register value
sakthipriya 0:7b4c00e3912f 672 unsigned short value = read(REG_STATUS);
sakthipriya 0:7b4c00e3912f 673
sakthipriya 0:7b4c00e3912f 674 //Clear the specified flag bits
sakthipriya 0:7b4c00e3912f 675 value &= ~( 0x3F<< 8);
sakthipriya 0:7b4c00e3912f 676
sakthipriya 0:7b4c00e3912f 677 //Write the value back out
sakthipriya 0:7b4c00e3912f 678 write(REG_STATUS, value);
sakthipriya 0:7b4c00e3912f 679 }
sakthipriya 0:7b4c00e3912f 680
sakthipriya 0:7b4c00e3912f 681 // Get the current cell voltage measurement of the MAX17049
sakthipriya 0:7b4c00e3912f 682 float vcell()
sakthipriya 0:7b4c00e3912f 683 {
sakthipriya 1:446a959e36ce 684
sakthipriya 0:7b4c00e3912f 685 //Read the 16-bit raw Vcell value
sakthipriya 0:7b4c00e3912f 686 unsigned short value = read(REG_VCELL);
sakthipriya 0:7b4c00e3912f 687
sakthipriya 0:7b4c00e3912f 688 //Return Vcell in volts
sakthipriya 0:7b4c00e3912f 689 return value * 0.000078125*2;
sakthipriya 0:7b4c00e3912f 690 }
sakthipriya 0:7b4c00e3912f 691
sakthipriya 0:7b4c00e3912f 692 // Get the current state of charge measurement of the MAX17049 as a float
sakthipriya 0:7b4c00e3912f 693 float soc()
sakthipriya 0:7b4c00e3912f 694 {
sakthipriya 3:07e15677a75c 695
sakthipriya 3:07e15677a75c 696 //Create a temporary buffer
sakthipriya 0:7b4c00e3912f 697 char buff[2];
sakthipriya 3:07e15677a75c 698 int ack = 1;
sakthipriya 3:07e15677a75c 699 //Select the register
sakthipriya 3:07e15677a75c 700 char reg = REG_SOC; // cannot pass the hash defined values directly
sakthipriya 3:07e15677a75c 701 m_I2C.write(m_ADDR, &reg, 1, true);
sakthipriya 3:07e15677a75c 702
sakthipriya 3:07e15677a75c 703
sakthipriya 3:07e15677a75c 704 //Read the 16-bit register
sakthipriya 3:07e15677a75c 705
sakthipriya 3:07e15677a75c 706 ack = m_I2C.read(m_ADDR, buff, 2);
sakthipriya 3:07e15677a75c 707
sakthipriya 3:07e15677a75c 708 printf("\n\r acknow %d", ack);
sakthipriya 0:7b4c00e3912f 709
sakthipriya 0:7b4c00e3912f 710 //Return SOC in percent
sakthipriya 2:c823d84b4cb0 711 if(ack == 0)
sakthipriya 3:07e15677a75c 712 return ((buff[0] << 8) | buff[1]) * 0.00390625;
sakthipriya 2:c823d84b4cb0 713 else
sakthipriya 2:c823d84b4cb0 714 return 200;
sakthipriya 0:7b4c00e3912f 715 }
sakthipriya 0:7b4c00e3912f 716
sakthipriya 0:7b4c00e3912f 717
sakthipriya 0:7b4c00e3912f 718
sakthipriya 0:7b4c00e3912f 719 // Get the current C rate measurement of the MAX17049
sakthipriya 0:7b4c00e3912f 720 float crate()
sakthipriya 0:7b4c00e3912f 721 {
sakthipriya 0:7b4c00e3912f 722 //Read the 16-bit raw C/Rate value
sakthipriya 0:7b4c00e3912f 723 short value = read(REG_CRATE);
sakthipriya 0:7b4c00e3912f 724
sakthipriya 0:7b4c00e3912f 725 //Return C/Rate in %/hr
sakthipriya 0:7b4c00e3912f 726 return value * 0.208;
sakthipriya 0:7b4c00e3912f 727 }
sakthipriya 0:7b4c00e3912f 728
sakthipriya 0:7b4c00e3912f 729 // Determine whether or not the MAX17049 is asserting the ALRT pin
sakthipriya 0:7b4c00e3912f 730 bool alerting()
sakthipriya 0:7b4c00e3912f 731 {
sakthipriya 0:7b4c00e3912f 732 //Read the 16-bit register value
sakthipriya 0:7b4c00e3912f 733 unsigned short value = read(REG_CONFIG);
sakthipriya 0:7b4c00e3912f 734
sakthipriya 0:7b4c00e3912f 735 //Return the status of the ALRT bit
sakthipriya 0:7b4c00e3912f 736 if (value & (1 << 5))
sakthipriya 0:7b4c00e3912f 737 return true;
sakthipriya 0:7b4c00e3912f 738 else
sakthipriya 0:7b4c00e3912f 739 return false;
sakthipriya 2:c823d84b4cb0 740 }
sakthipriya 2:c823d84b4cb0 741
sakthipriya 2:c823d84b4cb0 742 //.............................Battery board Temp sensor........................//
sakthipriya 2:c823d84b4cb0 743 void FCTN_BATTTEMP_INIT()
sakthipriya 2:c823d84b4cb0 744 {
sakthipriya 2:c823d84b4cb0 745 ssn1=1;ssn2=1;
sakthipriya 2:c823d84b4cb0 746 //PS=0;
sakthipriya 2:c823d84b4cb0 747 //HS=0;
sakthipriya 2:c823d84b4cb0 748 spi_bt.format(8,3);
sakthipriya 2:c823d84b4cb0 749 spi_bt.frequency(1000000);
sakthipriya 2:c823d84b4cb0 750 }
sakthipriya 2:c823d84b4cb0 751
sakthipriya 2:c823d84b4cb0 752 void FCTN_BATT_TEMP_SENSOR_MAIN(float temp[2])
sakthipriya 2:c823d84b4cb0 753 {
sakthipriya 2:c823d84b4cb0 754 uint8_t MSB, LSB;
sakthipriya 2:c823d84b4cb0 755 int16_t bit_data;
sakthipriya 2:c823d84b4cb0 756 float sensitivity=0.0078125; //1 LSB = sensitivity degree celcius
sakthipriya 2:c823d84b4cb0 757 wait_ms(320);
sakthipriya 2:c823d84b4cb0 758 ssn1=0;
sakthipriya 2:c823d84b4cb0 759
sakthipriya 2:c823d84b4cb0 760 spi_bt.write(0x80);//Reading digital data from Sensor 1
sakthipriya 2:c823d84b4cb0 761 LSB = spi_bt.write(0x00);//LSB first
sakthipriya 2:c823d84b4cb0 762 wait_ms(0);
sakthipriya 2:c823d84b4cb0 763 MSB = spi_bt.write(0x00);
sakthipriya 2:c823d84b4cb0 764 wait_ms(10);
sakthipriya 2:c823d84b4cb0 765 pc_eps.printf("%d %d\n",MSB,LSB);
sakthipriya 2:c823d84b4cb0 766 bit_data= ((uint16_t)MSB<<8)|LSB;
sakthipriya 2:c823d84b4cb0 767 wait_ms(10);
sakthipriya 2:c823d84b4cb0 768 temp[0]=(float)bit_data*sensitivity;//Converting into decimal value
sakthipriya 2:c823d84b4cb0 769 ssn1=1;
sakthipriya 2:c823d84b4cb0 770 wait_ms(10);
sakthipriya 2:c823d84b4cb0 771 ssn2=0;//Reading data from sensor 2
sakthipriya 2:c823d84b4cb0 772 spi_bt.write(0x80);
sakthipriya 2:c823d84b4cb0 773 LSB = spi_bt.write(0x00);
sakthipriya 2:c823d84b4cb0 774 wait_ms(10);
sakthipriya 2:c823d84b4cb0 775 MSB = spi_bt.write(0x00);
sakthipriya 2:c823d84b4cb0 776 wait_ms(10);
sakthipriya 2:c823d84b4cb0 777 bit_data= ((int16_t)MSB<<8)|LSB;
sakthipriya 2:c823d84b4cb0 778 wait_ms(10);
sakthipriya 2:c823d84b4cb0 779 temp[1]=(float)bit_data*sensitivity;
sakthipriya 2:c823d84b4cb0 780 ssn2=1;
sakthipriya 2:c823d84b4cb0 781
sakthipriya 2:c823d84b4cb0 782 }