![](/media/cache/group/nine_tails_kurama_by_zubair43-d4zyf5s.jpg.50x50_q85.jpg)
ACS completed fully. All cases to be tested
Dependencies: FreescaleIAP mbed-rtos mbed
Fork of ACS_Flowchart_BAE by
Diff: EPS.cpp
- Revision:
- 0:7b4c00e3912f
- Child:
- 1:446a959e36ce
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/EPS.cpp Thu Dec 24 19:15:43 2015 +0000 @@ -0,0 +1,403 @@ +#include "EPS.h" +#include "pin_config.h" +/***********************************************global variable declaration***************************************************************/ +extern uint32_t BAE_STATUS; +extern uint32_t BAE_ENABLE; + + +//m_I2C.frequency(10000) +const char RCOMP0= 0x97; +BAE_HK_actual actual_data; +BAE_HK_quant quant_data; +BAE_HK_min_max bae_HK_minmax; +BAE_HK_arch arch_data; + +//......................................Peripheral declarations.........................................................// +Serial pc_eps(USBTX,USBRX); +I2C m_I2C(PIN85,PIN84); +DigitalOut TRXY(TRXY_DR_EN); //active high +DigitalOut TRZ(TRZ_DR_EN); //active high +DigitalOut EN3V3A(ENBL3V3A); +DigitalOut EN_BTRY_HT(BATT_HEAT); +//DigitalIn BTRY_HT_OUTPUT(BATT_HEAT_OUTPUT); +AnalogIn Vbatt_ang(VBATT); + +//*********************************************************flags********************************************************// +extern char EPS_INIT_STATUS ; +extern char EPS_BATTERY_GAUGE_STATUS ; +extern char EPS_MAIN_STATUS; +extern char EPS_BATTERY_TEMP_STATUS ; +extern char EPS_STATUS ; + +extern char EPS_BATTERY_HEAT_ENABLE ; + +//........................................... FUCTIONS.................................................// + +void FCTN_EPS_INIT() +{ + printf("\n\r eps init \n"); + EPS_INIT_STATUS = 's' ; //set EPS_INIT_STATUS flag + // FLAG(); + FCTN_BATTERYGAUGE_INIT(); + //FCTN_EPS_BTEMP_INIT(); + EN3V3A = 1; //enable dc dc converter A + char value=alertFlags(); + unsigned short value_u= (short int )value; + value_u &=0x0001; + if(value_u ==0x0001) // battery gauge not initialised + { + actual_data.power_mode = 1; + EPS_BATTERY_GAUGE_STATUS = 'c'; //clear EPS_BATTERY_GAUGE_STATUS + } + else + { + actual_data.Batt_gauge_actual[1] = soc(); + actual_data.Batt_voltage_actual = Vbatt_ang.read()*3.3; + FCTN_EPS_POWERMODE(actual_data.Batt_gauge_actual[1]); + EPS_BATTERY_GAUGE_STATUS = 's'; //set EPS_BATTERY_GAUGE_STATUS + } + + EPS_INIT_STATUS = 'c' ; //clear EPS_INIT_STATUS flag + +} + +//----------------------------------------------------Power algo code--------------------------------------------------------------------// +void FCTN_EPS_POWERMODE(float soc) //dummy algo +{ + if(soc >= 80) + actual_data.power_mode = 4; + else if(soc >= 70 & soc < 80) + 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; +} + +//...................................................HK...........................................// + +int quantiz(float start,float step,float x) +{ + int y=(x-start)/step; + if(y<=0)y=0; + if(y>=255)y=255; + return y; +} + +void HK_main() +{ + +} + +//............................................BATTERY GAUGE......................................// +void FCTN_BATTERYGAUGE_INIT() +{ + disable_sleep(); + disable_hibernate(); + socChangeAlertEnabled(true); //enabling alert on soc changing by 1% + emptyAlertThreshold(32);//setting empty alert threshold to 32% soc + vAlertMinMaxThreshold();//set min, max value of Valrt register + vResetThresholdSet();//set threshold voltage for reset + vResetAlertEnabled(true);//enable alert on reset for V < Vreset +} + +void FCTN_BATTERYGAUGE_MAIN(float Battery_parameters[4]) +{ + + + float temp=25; //=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); + + + Battery_parameters[0]=vcell(); + Battery_parameters[1]=soc(); + Battery_parameters[2]=crate(); + + 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 + } + +} + +unsigned short read(char reg) + { + + //Create a temporary buffer + char buff[2]; + + //Select the register + m_I2C.write(m_ADDR, ®, 1, true); + + //Read the 16-bit register + m_I2C.read(m_ADDR, buff, 2); + + //Return the combined 16-bit value + return (buff[0] << 8) | buff[1]; + } + + + void write(char reg, unsigned short data) + { + //Create a temporary buffer + char buff[3]; + + //Load the register address and 16-bit data + buff[0] = reg; + buff[1] = data >> 8; + buff[2] = data; + + //Write the data + m_I2C.write(m_ADDR, buff, 3); + } + + + + // Command the MAX17049 to perform a power-on reset + void reset() + { + //Write the POR command + write(REG_CMD, 0x5400); + } + + // Command the MAX17049 to perform a QuickStart + void quickStart() + { + //Read the current 16-bit register value + unsigned short value = read(REG_MODE); + + //Set the QuickStart bit + value |= (1 << 14); + + //Write the value back out + write(REG_MODE, value); + } + + + //disable sleep + void disable_sleep() + { + unsigned short value = read(REG_MODE); + value &= ~(1 << 13); + write(REG_MODE, value); + } + + //disable the hibernate of the MAX17049 + void disable_hibernate() + { + write(REG_HIBRT, 0x0000); + } + + + // Enable or disable the SOC 1% change alert on the MAX17049 + void socChangeAlertEnabled(bool enabled) + { + //Read the current 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Set or clear the ALSC bit + if (enabled) + value |= (1 << 6); + else + value &= ~(1 << 6); + + //Write the value back out + write(REG_CONFIG, value); +} + + +void compensation(char rcomp) +{ + //Read the current 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Update the register value + value &= 0x00FF; + value |= rcomp << 8; + + //Write the value back out + write(REG_CONFIG, value); +} + + +void tempCompensation(float temp) +{ + //Calculate the new RCOMP value + char rcomp; + if (temp > 20.0) { + rcomp = RCOMP0 + (temp - 20.0) * -0.5; + } else { + rcomp = RCOMP0 + (temp - 20.0) * -5.0; + } + + //Update the RCOMP value + compensation(rcomp); +} + + // Command the MAX17049 to de-assert the ALRT pin + void clearAlert() + { + //Read the current 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Clear the ALRT bit + value &= ~(1 << 5); + + //Write the value back out + write(REG_CONFIG, value); + } + + + //Set the SOC empty alert threshold of the MAX17049 + void emptyAlertThreshold(char threshold) + { + //Read the current 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Update the register value + value &= 0xFFE0; + value |= 32 - threshold; + + //Write the 16-bit register + write(REG_CONFIG, value); + } + + // Set the low and high voltage alert threshold of the MAX17049 + void vAlertMinMaxThreshold() + { + //Read the current 16-bit register value + unsigned short value = read(REG_VALRT); + + //Mask off the old value + + value = 0x96D2; + + //Write the 16-bit register + write(REG_VALRT, value); + } + + + // Set the reset voltage threshold of the MAX17049 + void vResetThresholdSet() + { + //Read the current 16-bit register value + unsigned short value = read(REG_VRESET_ID); + + //Mask off the old //value + value &= 0x00FF;//Dis=0 + + value |= 0x9400;//corresponding to 2.5 V + + + //Write the 16-bit register + write(REG_VRESET_ID, value); + } + + + // Enable or disable the voltage reset alert on the MAX17049 + void vResetAlertEnabled(bool enabled) + { + //Read the current 16-bit register value + unsigned short value = read(REG_STATUS); + + //Set or clear the EnVR bit + if (enabled) + value |= (1 << 14); + else + value &= ~(1 << 14); + + //Write the value back out + write(REG_STATUS, value); + } + + //Get the current alert flags on the MAX17049 + //refer datasheet-status registers section to decode it. + char alertFlags() + { + //Read the 16-bit register value + unsigned short value = read(REG_STATUS); + + //Return only the flag bits + return (value >> 8) & 0x3F; + } + + // Clear all the alert flags on the MAX17049 + void clearAlertFlags() + { + //Read the current 16-bit register value + unsigned short value = read(REG_STATUS); + + //Clear the specified flag bits + value &= ~( 0x3F<< 8); + + //Write the value back out + write(REG_STATUS, value); + } + + // Get the current cell voltage measurement of the MAX17049 + float vcell() + { + //Read the 16-bit raw Vcell value + unsigned short value = read(REG_VCELL); + + //Return Vcell in volts + return value * 0.000078125*2; + } + + // Get the current state of charge measurement of the MAX17049 as a float + float soc() + { + unsigned short value; + char buff[2]; + + //Select the register + m_I2C.write(m_ADDR, ®_SOC, 1, true); + + //Read the 16-bit register + bool ack = true; + ack = m_I2C.read(m_ADDR, buff, 2); + + //Return the combined 16-bit value + value = (buff[0] << 8) | buff[1]; + /* + //Read the 16-bit raw SOC value + unsigned short value = read(REG_SOC);*/ + + //Return SOC in percent + if(ack == 0) + return value * 0.00390625; + else + return 200; + } + + + + // Get the current C rate measurement of the MAX17049 + float crate() + { + //Read the 16-bit raw C/Rate value + short value = read(REG_CRATE); + + //Return C/Rate in %/hr + return value * 0.208; + } + + // Determine whether or not the MAX17049 is asserting the ALRT pin + bool alerting() + { + //Read the 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Return the status of the ALRT bit + if (value & (1 << 5)) + return true; + else + return false; + } \ No newline at end of file