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: FreescaleIAP mbed-rtos mbed
Fork of RAJANGAM_REVIEW_BAE_CODE by
Diff: EPS.cpp
- Revision:
- 49:61c9f28332ba
- Parent:
- 48:9fd15e3e0b53
- Child:
- 50:6001287f3045
--- a/EPS.cpp Fri Jul 08 08:25:39 2016 +0000
+++ b/EPS.cpp Thu Jul 14 23:04:26 2016 +0000
@@ -2,6 +2,12 @@
#include "pin_config.h"
#include "iostream"
+Serial eps_pc(USBTX,USBRX);
+
+Timer timer_alertFlags;
+Timer timer_soc;
+Timer timer_FCTN_BATTERYGAUGE_INIT;
+
//FOR APPEDING HK DATA===================================
extern uint16_t crc_hk_data();
@@ -51,10 +57,13 @@
extern uint8_t BCN_TX_MAIN_STATUS;
//bae
+extern Timer BAE_uptime;
+extern Timer I2C_last;
extern uint8_t BAE_RESET_COUNTER;
extern uint8_t BAE_INIT_STATUS;
extern uint8_t BAE_STANDBY;
extern uint16_t BAE_I2C_COUNTER;
+extern void RETURN_UPTIME(float time, uint8_t *day,uint8_t *hour,uint8_t *min);
//eps
extern uint8_t ACS_INIT_STATUS;
@@ -86,11 +95,14 @@
uint8_t EPS_BAT_TEMP_LOW;
uint8_t EPS_BAT_TEMP_HIGH;
uint8_t EPS_BAT_TEMP_DEFAULT;
-DigitalInOut EPS_CHARGER_FAULT(PIN42);
-DigitalInOut EPS_CHARGER_STATUS(PIN31);
-DigitalInOut EPS_BATTERY_GAUGE_ALERT(PIN73);
+DigitalIn EPS_CHARGER_FAULT(PIN42);
+DigitalIn EPS_CHARGER_STATUS(PIN31);
+DigitalIn EPS_BATTERY_GAUGE_ALERT(PIN73);
//m_I2C.frequency(10000)
+extern int eps_btg_read_flag; // flag to check I2C ack on reading from BTG
+extern int eps_btg_writ_flag; // flag to check I2C ack on writing from BTG
+
const char RCOMP0= 0x97;// don't know what it is now
BAE_HK_actual actual_data;
BAE_HK_quant quant_data;
@@ -104,9 +116,14 @@
Serial pc_eps(USBTX,USBRX);
I2C m_I2C(PIN85,PIN84);
-DigitalInOut TRXY(TRXY_DR_EN); //active high
-DigitalInOut TRZ(TRZ_DR_EN); //active high
-DigitalInOut EN3V3A(ENBL3V3A);
+
+//any default values or states
+//====================================
+//DigitalInOut TRXY(TRXY_DR_EN); //active high
+//DigitalInOut TRZ(TRZ_DR_EN); //active high
+DigitalOut EN3V3A(ENBL3V3A);
+//====================================
+
DigitalOut BTRY_HTR_ENABLE(BATT_HEAT);// earlier BTRY_HTR_ENABLE
//DigitalIn BTRY_HT_OUTPUT(BATT_HEAT_OUTPUT);
//AnalogIn Vbatt_ang(VBATT);
@@ -144,7 +161,7 @@
//eps cdms fault
extern uint8_t CDMS_SW_STATUS;
-extern DigitalInOut CDMS_OC_FAULT;
+extern DigitalIn CDMS_OC_FAULT;
extern bool CDMS_SW_ENABLE;
extern int CDMS_FAULT_COUNTER;
extern uint8_t EPS_BTRY_HTR_AUTO;
@@ -154,32 +171,32 @@
/********* EXTERN ACS VAR ********************/
extern uint8_t ACS_ATS_STATUS;
extern uint8_t ACS_TR_Z_SW_STATUS;
-extern DigitalInOut ACS_TR_Z_ENABLE;
-extern DigitalInOut ACS_TR_Z_OC_FAULT;
-extern DigitalInOut ACS_TR_Z_FAULT; //Driver IC fault
+extern DigitalOut ACS_TR_Z_ENABLE;
+extern DigitalIn ACS_TR_Z_OC_FAULT;
+extern DigitalIn ACS_TR_Z_FAULT; //Driver IC fault
extern int ACS_TR_Z_FAULT_COUNTER;
extern uint8_t ACS_TR_XY_SW_STATUS;
-extern DigitalInOut ACS_TR_XY_ENABLE;
-extern DigitalInOut ACS_TR_XY_OC_FAULT;
-extern DigitalInOut ACS_TR_XY_FAULT; //Driver IC fault
+extern DigitalOut ACS_TR_XY_ENABLE;
+extern DigitalIn ACS_TR_XY_OC_FAULT;
+extern DigitalIn ACS_TR_XY_FAULT; //Driver IC fault
extern int ACS_TR_XY_FAULT_COUNTER;
//extern uint8_t ACS_ATS1_SW_STATUS;
-extern DigitalInOut ATS1_SW_ENABLE;
-extern DigitalInOut ACS_ATS1_OC_FAULT;
+extern DigitalOut ATS1_SW_ENABLE;
+extern DigitalIn ACS_ATS1_OC_FAULT;
extern int ACS_ATS1_FAULT_COUNTER;
//extern uint8_t ACS_ATS2_SW_STATUS;
-extern DigitalInOut ATS2_SW_ENABLE;
-extern DigitalInOut ACS_ATS2_OC_FAULT;
+extern DigitalOut ATS2_SW_ENABLE;
+extern DigitalIn ACS_ATS2_OC_FAULT;
extern int ACS_ATS2_FAULT_COUNTER;
/********* EXTERN BCN VAR ********************/
extern uint8_t BCN_TX_SW_STATUS;
extern bool BCN_TX_ENABLE;
-extern DigitalInOut BCN_TX_OC_FAULT;
+extern DigitalIn BCN_TX_OC_FAULT;
extern int BCN_TX_FAULT_COUNTER;
extern uint8_t BCN_TMP;
@@ -187,34 +204,44 @@
void FCTN_EPS_INIT()
{
-//// printf("\n\r eps init \n");
+//// eps_pc.printf("\n\r eps init \n");
EPS_INIT_STATUS = 1 ; //set EPS_INIT_STATUS flag
// FLAG();
FCTN_BATTERYGAUGE_INIT();
EN3V3A = 1; //enable dc dc converter A
+
+ timer_alertFlags.reset();
+ timer_alertFlags.start();
char value=alertFlags(); // initialization part of battery gauge
+ timer_alertFlags.stop();
+
unsigned short value_u= (short int )value;
//value_u &=0x0001;
if(value_u & 0x0001 == 0x0001) // battery gauge not initialised
{
- actual_data.power_mode = 1;
+ //actual_data.power_mode = 1;
+ actual_data.power_mode = 0;
EPS_BATTERY_GAUGE_STATUS = 0; //clear EPS_BATTERY_GAUGE_STATUS
- printf(" init BTG fail - %d\n\r", value_u);
+ eps_pc.printf(" init BTG fail - %d\n\r", value_u);
}
else
{
+ timer_soc.reset();
+ timer_soc.start();
actual_data.Batt_gauge_actual[1] = soc();
+ timer_soc.stop();
+
actual_data.Batt_voltage_actual = Batt_voltage.read()*3.3; //1 corresponds to 3.3 scaling factor
FCTN_EPS_POWERMODE(actual_data.Batt_gauge_actual[1]);
EPS_BATTERY_GAUGE_STATUS = 1; //set EPS_BATTERY_GAUGE_STATUS
- printf("init BTG success - %d\n\r", value_u);
+ eps_pc.printf("init BTG success - %d\n\r", value_u);
}
//if( read(REG_VERSION) ==
- printf("REG_VERSION = %d\r\n",read(REG_VERSION));
+ eps_pc.printf("REG_VERSION = %d\r\n",read(REG_VERSION));
FCTN_BATTTEMP_INIT();
- EPS_BATTERY_GAUGE_STATUS = 1;
+ //EPS_BATTERY_GAUGE_STATUS = 1;
EPS_INIT_STATUS = 0 ; //clear EPS_INIT_STATUS flag
@@ -395,14 +422,11 @@
void FCTN_EPS_POWERMODE(float soc) //dummy algo
{
- if(soc >= 80)
- actual_data.power_mode = 4;
- else if(soc >= 70 & soc < 80)
+ if(soc >= EPS_SOC_LEVEL_23*100 )
actual_data.power_mode = 3;
- else if(soc >= 60 & soc < 70)
- actual_data.power_mode = 2;
- else if(soc < 60)
- actual_data.power_mode = 1;
+ else if(soc >= EPS_SOC_LEVEL_12*100 )
+ actual_data.power_mode = 2;
+ else actual_data.power_mode = 1;
}
//...................................................HK...........................................//
@@ -469,7 +493,8 @@
actual_data.current_actual[Iteration]=3365.4/log(7.60573*resistance);
}
}
- actual_data.BAE_temp_actual=(-90.7*3.3*actual_data.BAE_temp_actual)+190.1543;
+ //actual_data.BAE_temp_actual=(-90.7*3.3*actual_data.BAE_temp_actual)+190.1543;
+ actual_data.BAE_temp_actual=(-90.7*3.3*BAE_temp_sensor.read())+190.1543;
actual_data.Batt_voltage_actual=Batt_voltage.read()*3.3*5.63;
@@ -596,6 +621,7 @@
LONG_HK_data[1][32] = EPS_BTRY_HTR;// to be disscussed
//spare 4
LONG_HK_data[1][32] = (LONG_HK_data[1][32]<<7) | BAE_STANDBY;
+
// 6 next telemetries value to be given by registers
LONG_HK_data[1][33] = ATS1_EVENT_STATUS_RGTR;
LONG_HK_data[1][34] = ATS1_SENTRAL_STATUS_RGTR;
@@ -616,60 +642,69 @@
LONG_HK_data[1][47] = BCN_TX_MAIN_COUNTER>>8;
LONG_HK_data[1][48] = EPS_MAIN_COUNTER;
LONG_HK_data[1][49] = EPS_MAIN_COUNTER>>8;
- LONG_HK_data[1][50] = actual_data.bit_data_acs_mm[0];
- LONG_HK_data[1][51] = actual_data.bit_data_acs_mm[0]>>8;
- LONG_HK_data[1][52] = actual_data.bit_data_acs_mm[1];
- LONG_HK_data[1][53] = actual_data.bit_data_acs_mm[1]>>8;
- LONG_HK_data[1][54] = actual_data.bit_data_acs_mm[2];
- LONG_HK_data[1][55] = actual_data.bit_data_acs_mm[2]>>8;
-
- LONG_HK_data[1][56] = actual_data.bit_data_acs_mg[0];
- LONG_HK_data[1][57] = actual_data.bit_data_acs_mg[0]>>8;
- LONG_HK_data[1][58] = actual_data.bit_data_acs_mg[1];
- LONG_HK_data[1][59] = actual_data.bit_data_acs_mg[1]>>8;
- LONG_HK_data[1][60] = actual_data.bit_data_acs_mg[2];
- LONG_HK_data[1][61] = actual_data.bit_data_acs_mg[2]>>8;
+
+ uint8_t days,hours,mins;
+ RETURN_UPTIME(BAE_uptime.read(),&days,&hours,&mins);
+ LONG_HK_data[1][50] = days;
+ RETURN_UPTIME(I2C_last.read(),&days,&hours,&mins);
+ LONG_HK_data[1][50] = (LONG_HK_data[1][50]) | (hours>>2);
+ LONG_HK_data[1][51] = hours;
+ LONG_HK_data[1][51] = (LONG_HK_data[1][51]<<6) | mins;
+
+
+ LONG_HK_data[1][52] = actual_data.bit_data_acs_mm[0];
+ LONG_HK_data[1][53] = actual_data.bit_data_acs_mm[0]>>8;
+ LONG_HK_data[1][54] = actual_data.bit_data_acs_mm[1];
+ LONG_HK_data[1][55] = actual_data.bit_data_acs_mm[1]>>8;
+ LONG_HK_data[1][56] = actual_data.bit_data_acs_mm[2];
+ LONG_HK_data[1][57] = actual_data.bit_data_acs_mm[2]>>8;
- LONG_HK_data[1][62] = BCN_TX_OC_FAULT;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | ACS_TR_XY_ENABLE;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | ACS_TR_Z_ENABLE;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | ACS_TR_XY_OC_FAULT;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | ACS_TR_Z_OC_FAULT;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | ACS_TR_XY_FAULT;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | EPS_CHARGER_FAULT;
- LONG_HK_data[1][62] = (LONG_HK_data[1][62]<<1) | EPS_CHARGER_STATUS;
+ LONG_HK_data[1][58] = actual_data.bit_data_acs_mg[0];
+ LONG_HK_data[1][59] = actual_data.bit_data_acs_mg[0]>>8;
+ LONG_HK_data[1][60] = actual_data.bit_data_acs_mg[1];
+ LONG_HK_data[1][61] = actual_data.bit_data_acs_mg[1]>>8;
+ LONG_HK_data[1][62] = actual_data.bit_data_acs_mg[2];
+ LONG_HK_data[1][63] = actual_data.bit_data_acs_mg[2]>>8;
- LONG_HK_data[1][63] = EPS_BATTERY_GAUGE_ALERT;
- LONG_HK_data[1][63] = (LONG_HK_data[1][63]<<1) | CDMS_OC_FAULT;
- LONG_HK_data[1][63] = (LONG_HK_data[1][63]<<1) | ACS_ATS1_OC_FAULT;
- LONG_HK_data[1][63] = (LONG_HK_data[1][63]<<1) | ACS_ATS2_OC_FAULT;
- LONG_HK_data[1][63] = (LONG_HK_data[1][63]<<1) | ACS_TR_Z_FAULT;
- LONG_HK_data[1][63] = (LONG_HK_data[1][63]<<3);
+ LONG_HK_data[1][64] = BCN_TX_OC_FAULT;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | ACS_TR_XY_ENABLE;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | ACS_TR_Z_ENABLE;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | ACS_TR_XY_OC_FAULT;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | ACS_TR_Z_OC_FAULT;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | ACS_TR_XY_FAULT;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | EPS_CHARGER_FAULT;
+ LONG_HK_data[1][64] = (LONG_HK_data[1][64]<<1) | EPS_CHARGER_STATUS;
+
+ LONG_HK_data[1][65] = EPS_BATTERY_GAUGE_ALERT;
+ LONG_HK_data[1][65] = (LONG_HK_data[1][65]<<1) | CDMS_OC_FAULT;
+ LONG_HK_data[1][65] = (LONG_HK_data[1][65]<<1) | ACS_ATS1_OC_FAULT;
+ LONG_HK_data[1][65] = (LONG_HK_data[1][65]<<1) | ACS_ATS2_OC_FAULT;
+ LONG_HK_data[1][65] = (LONG_HK_data[1][65]<<1) | ACS_TR_Z_FAULT;
+ LONG_HK_data[1][65] = (LONG_HK_data[1][65]<<3);
//3 spare
- LONG_HK_data[1][64] = ACS_TR_X_PWM;
- LONG_HK_data[1][65] = ACS_TR_Y_PWM;
- LONG_HK_data[1][66] = ACS_TR_Z_PWM;
+ LONG_HK_data[1][66] = ACS_TR_X_PWM;
+ LONG_HK_data[1][67] = ACS_TR_Y_PWM;
+ LONG_HK_data[1][68] = ACS_TR_Z_PWM;
//spare byte
//assigned it to counter HTR_CYCLE_COUNTER
//assign it b_scz_angle
- LONG_HK_data[1][67] = B_SCZ_ANGLE>>4; ;
- LONG_HK_data[1][67] = (LONG_HK_data[1][67]<<1) | alarmmode;
- LONG_HK_data[1][67] = (LONG_HK_data[1][67]<<1) | controlmode_mms;
- LONG_HK_data[1][67] = (LONG_HK_data[1][67]<<2);
- //2 bit spare
+ LONG_HK_data[1][69] = B_SCZ_ANGLE>>4; ;
+ LONG_HK_data[1][69] = (LONG_HK_data[1][69]<<1) | alarmmode;
+ LONG_HK_data[1][69] = (LONG_HK_data[1][69]<<1) | controlmode_mms;
+ LONG_HK_data[1][69] = (LONG_HK_data[1][69]<<1) | singularity_flag_mms;
+ LONG_HK_data[1][69] = (LONG_HK_data[1][69]<<1);
+ //1 bit spare
for(int i=0;i<9;i++)
{
- LONG_HK_data[1][68+i] = invjm_mms[i];
+ LONG_HK_data[1][70+i] = invjm_mms[i];
LONG_HK_data[1][81+i] = jm_mms[i];
}
- for(int i=0;i<3;i++)
- LONG_HK_data[1][77+i] = bb_mms[i];
-
- LONG_HK_data[1][80] = singularity_flag_mms;
+ for(int i=0;i<2;i++)
+ LONG_HK_data[1][79+i] = bb_mms[i];
for(int i=0;i<16;i++)
{
@@ -823,40 +858,51 @@
vResetThresholdSet();//set threshold voltage for reset
vResetAlertEnabled(true);//enable alert on reset for V < Vreset
int ack = write(REG_STATUS, read(REG_STATUS) & 0xFEFF); //Clearing Reset Indicator bit
- if( ack == 0 ) printf("BTG init success\n\r");
- else printf("BTG init fail ack = %d\n\r", ack);
+ if( ack == 0 ) eps_pc.printf("BTG init success\n\r");
+ else eps_pc.printf("BTG init fail ack = %d\n\r", ack);
write(REG_STATUS, read(REG_STATUS) & 0xFEFF); //Clearing Reset Indicator bit
}
int FCTN_BATTERYGAUGE_MAIN(float Battery_parameters[4], float temp)
{
-//// printf("\n\r battery gauge \n");
+//// eps_pc.printf("\n\r battery gauge \n");
//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.
- tempCompensation(temp);
-
+ int flag = tempCompensation(temp);
+ //tempCompensation(temp);
- Battery_parameters[0]=vcell();
- Battery_parameters[1]=soc();
- Battery_parameters[2]=crate();
+ if( flag == 0 )
+ {
+ Battery_parameters[0]=vcell();
+
+ timer_soc.reset();
+ timer_soc.start();
+ Battery_parameters[1]=soc();
+ timer_soc.stop();
+
+ Battery_parameters[2]=crate();
+
+ //// eps_pc.printf("\nVcell=%f",vcell()); //remove this for final code
+ //// eps_pc.printf("\nSOC=%f",soc()); //remove this for final code
+ //// eps_pc.printf("\nC_rate=%f",crate()); //remove this for final code
+
+
+ if (alerting()== true) //alert is on
+ { timer_alertFlags.reset();
+ timer_alertFlags.start();
+ Battery_parameters[3]=alertFlags();
+ timer_alertFlags.stop();
+
+ clearAlert();//clear alert
+ clearAlertFlags();//clear all alert flags
+ }
+ }
-//// printf("\nVcell=%f",vcell()); //remove this for final code
-//// printf("\nSOC=%f",soc()); //remove this for final code
-//// printf("\nC_rate=%f",crate()); //remove this for final code
-
-
- if (alerting()== true) //alert is on
- {
- Battery_parameters[3]=alertFlags();
- clearAlert();//clear alert
- clearAlertFlags();//clear all alert flags
- }
- if( soc() == 200) return 0;
- else return 1;
+ if( soc() == 200 || flag != 0) return 1;
+ else return 0;
}
-
-void tempCompensation(float temp)
+int tempCompensation(float temp)
{
//Calculate the new RCOMP value
char rcomp;
@@ -867,10 +913,10 @@
}
//Update the RCOMP value
- compensation(rcomp);
+ return compensation(rcomp);
}
-void compensation(char rcomp)
+int compensation(char rcomp)
{
//Read the current 16-bit register value
unsigned short value = read(REG_CONFIG);
@@ -880,11 +926,12 @@
value |= rcomp << 8;
//Write the value back out
- write(REG_CONFIG, value);
+ return (write(REG_CONFIG, value));
}
int write(char reg, unsigned short data)
{
+ eps_btg_writ_flag = -1;
//Create a temporary buffer
char buff[3];
@@ -898,8 +945,12 @@
if( flag != 0 )
{
flag = m_I2C.write(m_ADDR, buff, 3); //Write the data and return ack
- if( data != read(reg) ) //Verify written data
- EPS_BATTERY_GAUGE_STATUS = 0; //clear EPS_BATTERY_GAUGE_STATUS
+ if( data != read(reg) )
+ eps_btg_writ_flag = 1;
+ //EPS_BATTERY_GAUGE_STATUS = 0; //clear EPS_BATTERY_GAUGE_STATUS
+ else eps_btg_writ_flag = 0;
+ //Verify written data
+ //EPS_BATTERY_GAUGE_STATUS = 0; //clear EPS_BATTERY_GAUGE_STATUS
}
return flag;
@@ -907,6 +958,7 @@
unsigned short read(char reg)
{
+ eps_btg_read_flag = -1;
int flag = 1;
char buff[2]; //Create a temporary buffer
@@ -919,10 +971,11 @@
{
m_I2C.write(m_ADDR, ®, 1, true);
flag = m_I2C.read(m_ADDR, buff, 2);
- if( flag )
- EPS_BATTERY_GAUGE_STATUS = 0; //clear EPS_BATTERY_GAUGE_STATUS
+ //if( flag )
+ // EPS_BATTERY_GAUGE_STATUS = 0; //clear EPS_BATTERY_GAUGE_STATUS
}
+ eps_btg_read_flag = flag;
//Return the combined 16-bit value
return (buff[0] << 8) | buff[1];
}
@@ -970,7 +1023,11 @@
//Write the POR command
write(REG_CMD, 0x5400);
//Re-initialise gauge
+
+ timer_FCTN_BATTERYGAUGE_INIT.reset();
+ timer_FCTN_BATTERYGAUGE_INIT.start();
FCTN_BATTERYGAUGE_INIT();
+ timer_FCTN_BATTERYGAUGE_INIT.stop();
}
// Command the MAX17049 to perform a QuickStart
@@ -1175,7 +1232,7 @@
ack = m_I2C.read(m_ADDR, buff, 2);
-//// printf("\n\r acknow %d", ack);
+//// eps_pc.printf("\n\r acknow %d", ack);
//Return SOC in percent
if(ack == 0)
@@ -1234,7 +1291,7 @@
wait_ms(10);
MSB = spi_bt.write(0x00);
wait_ms(10);
-//// pc_eps.printf("%d %d\n",MSB,LSB);
+//// pc_eps.eps_pc.printf("%d %d\n",MSB,LSB);
bit_data= ((uint16_t)MSB<<8)|LSB;
wait_ms(10);
temp[0]=(float)bit_data*sensitivity;//Converting into decimal value
