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 QM_BAE_review_1 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