sakthi priya amirtharaj
/
BAE_vr2_1_3
i2c working with old hk
Fork of BAE_vr2_1_1 by
Diff: HK.h
- Revision:
- 13:1b37d98840d3
- Parent:
- 12:ba2556c6b990
- Child:
- 14:ef6be8ac6569
diff -r ba2556c6b990 -r 1b37d98840d3 HK.h --- a/HK.h Tue Dec 16 11:07:33 2014 +0000 +++ b/HK.h Wed Dec 17 05:25:04 2014 +0000 @@ -1,37 +1,469 @@ +//to be saved as HK.h + #include "mbed.h" #define tstart -40 #define tstep 8 +#define tstep_thermistor 8//verify!! +#define tstart_thermistor -40 #define vstart 3.3 #define vstep 0.84667 #define cstart 0.0691 #define cstep 0.09133 #define rsens 0.095 +#define Vcell_start 0 +#define Vcell_step 0.56//assuming vcell ranges from 0-8.4 +#define soc_start 0 //======== +#define soc_step 6.6667//assuming soc ranges from 0-100 +#define crate_start 0//------------ +#define crate_step 6.6667//assuming crate ranges from 0-100 +#define Bnewvalue_start -100//in microTesla...max possible field is .0001 T +#define Bnewvalue_step 13.333 +#define AngularSpeed_start -10//max possible ang. velocity in space is 10 deg/sec +#define AngularSpeed_step 1.3333 - +typedef struct SensorData +{ + float Voltage[16]; + float Current[8]; + float Temperature[1]; + float PanelTemperature[4]; + float Vcell; + float soc; + char alerts; + //(alerts[0]=1)-> reset indicator=>dont care + //(alerts[1]=1)-> Vcell>ValrtMax(5.1V)->will always be on->dont care + //(alerts[2]=1)-> Vcell<ValrtMin(5.1V)->indicates deep discharge + //(alerts[3]=1)-> Vcell<Vreset(2.5V) + //(alerts[5]=1)-> Soc CROSSES the threshold value + //(alerts[6]=1)-> alert on (alerts[3]) enabled when Vcell<Vreset(here we set it to be 2.5V) + float crate; + float BatteryTemperature; //to be populated + char faultpoll; //polled faults + char faultir; //interrupted faults + char power_mode; //power modes + + float AngularSpeed[3]; //in order x,y,z + float Bnewvalue[3]; //in order Bx,By,Bz + + +} SensorData; -struct SensorData { - char Voltage[10]; - char Current[10]; - char Temperature[10]; - char faultpoll; - char faultir; - char power_mode; - //float Battery[2]; -}; - +typedef struct SensorDataQuantised { + char Voltage[8]; + char Current[4]; + char Temperature[1]; + char PanelTemperature[2];//read by the 4 thermistors on solar panels + char Vcell_soc;//MSBs correspond to Vcell, LSBs to Soc + char alerts;//UNQUANTISED + //(alerts[0]=1)-> reset indicator=>dont care + //(alerts[1]=1)-> Vcell>ValrtMax(5.1V)->will always be high->dont care + //(alerts[2]=1)-> Vcell<ValrtMin(5.1V)->indicates deep discharge + //(alerts[3]=1)-> Vcell<Vreset(2.5V) + //(alerts[5]=1)-> Soc CROSSES the threshold value + //(alerts[6]=1)-> alert on (alerts[3]) enabled when Vcell<Vreset(here we set it to be 2.5V) + char crate; + char BatteryTemperature; //to be populated + char faultpoll; //polled faults + char faultir; //interrupted faults + char power_mode; //power modes + char AngularSpeed[2]; + char Bnewvalue[2]; + + //float magnetometer,gyro=>to be addes +} SensorDataQuantised; -typedef struct ShortBeacon { - char Voltage[1]; - char AngularSpeed[2]; - char SubsystemStatus[1]; - char Temp[3]; - char ErrorFlag[1]; -}ShortBeacy; - + +typedef struct ShortBeacon +{ + char Voltage[1]; //battery voltage from gauge, needs to be quantised + char AngularSpeed[2]; //all the 3 data + char SubsystemStatus[1]; //power modes + char Temp[2]; //temp of solar panel + //Temp[0]'s LSB=> PanelTemperature[0], Temp[0]'s MSB=> PanelTemperature[1], Temp[1]'s LSB=> PanelTemperature[2], Temp[1]'s MSB=> PanelTemperature[3] + char ErrorFlag[1]; //fault +}ShortBeacy; + + void FUNC_HK_MAIN(); int quantiz(float start,float step,float x); - +void init_beacon(ShortBeacy* x,SensorDataQuantised y); + + +//--------------------------------following is header details for battery gauge------------------------------------------- + + + +#define MAX17048_H + +class MAX17048 +{ +public: + /** The default compensation value for the MAX17048 + */ + static const char RCOMP0= 0x97; + + /** Represents the different alert flags for the MAX17048 + */ + enum AlertFlags { + ALERT_RI = (1 << 0), /**< Reset indicator */ + ALERT_VH = (1 << 1), /**< Voltage high alert */ + ALERT_VL = (1 << 2), /**< Voltage low alert */ + ALERT_VR = (1 << 3), /**< Voltage reset alert */ + ALERT_HD = (1 << 4), /**< SOC low alert */ + ALERT_SC = (1 << 5) /**< SOC change alert */ + }; + + //parametrised constructor + MAX17048(PinName sda, PinName scl, int hz = 400000): m_I2C(sda, scl)//should it be same as the uC clock freq + { + //Set the I2C bus frequency + m_I2C.frequency(hz); + } + + // Probe for the MAX17048 and indicate if it's present on the bus + bool open() + { + //Probe for the MAX17048 using a Zero Length Transfer + if (!m_I2C.write(m_ADDR, NULL, 0)) { + //Return success + return true; + } else { + //Return failure + return false; + } + } + + + // Command the MAX17048 to perform a power-on reset + void reset() + { + //Write the POR command + write(REG_CMD, 0x5400); + } + + // Command the MAX17048 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 MAX17048 + void disable_hibernate() + { + write(REG_HIBRT, 0x0000); + } + + // Determine whether or not the SOC 1% change alert is enabled on the MAX17048 + bool socChangeAlertEnabled() + { + //Read the 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Return the status of the ALSC bit + if (value & (1 << 6)) + return true; + else + return false; + } + + // Enable or disable the SOC 1% change alert on the MAX17048 + 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); +} + // Determine whether or not the MAX17048 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; + } + + // Command the MAX17048 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); + } + // return The current SOC empty alert threshold in %. + char emptyAlertThreshold() + { + //Read the 16-bit register value + unsigned short value = read(REG_CONFIG); + + //Extract the threshold + return 32 - (value & 0x001F); + } + + //Set the SOC empty alert threshold of the MAX17048 + 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); + } + //return The current low voltage alert threshold in volts. + float vAlertMinThreshold() + { + //Read the 16-bit register value + unsigned short value = read(REG_VALRT); + + //Extract the alert threshold + return (value >> 8) * 0.02;//least count is 20mV + } + // Set the low and high voltage alert threshold of the MAX17048 + void vAlertMinMaxThreshold() + { + //Read the current 16-bit register value + unsigned short value = read(REG_VALRT); + + //Mask off the old value + + value = 0xFFFF; + + //Write the 16-bit register + write(REG_VALRT, value); + } + + //return The current high voltage alert threshold in volts. + float vAlertMaxThreshold() + { + //Read the 16-bit register value + unsigned short value = read(REG_VALRT); + + //Extract the active threshold + return (value & 0x00FF) * 0.02; + } + + //return The current reset voltage threshold in volts. + float vResetThreshold() + { + //Read the 16-bit register value + unsigned short value = read(REG_VRESET_ID); + + //Extract the threshold + return (value >> 9) * 0.04; + } + + // Set the reset voltage threshold of the MAX17048 + 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 |= 0x7C00;//corresponding to 2.5 V + + + //Write the 16-bit register + write(REG_VRESET_ID, value); + } + + // Get the factory programmed 8-bit ID of the MAX17048 + char id() + { + //Read the 16-bit register value + unsigned short value = read(REG_VRESET_ID); + + //Return only the ID bits + return value; + } + + // Determine whether or not the voltage reset alert is enabled on the MAX17048 + bool vResetAlertEnabled() + { + //Read the 16-bit register value + unsigned short value = read(REG_STATUS); + + //Return the status of the EnVR bit + if (value & (1 << 14)) + return true; + else + return false; + } + + // Enable or disable the voltage reset alert on the MAX17048 + 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 MAX17048 + //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 MAX17048 + 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 MAX17048 + float vcell() + { + //Read the 16-bit raw Vcell value + unsigned short value = read(REG_VCELL); + + //Return Vcell in volts + return value * 0.000078125; + } + + // Get the current state of charge measurement of the MAX17048 as a float + float soc() + { + //Read the 16-bit raw SOC value + unsigned short value = read(REG_SOC); + + //Return SOC in percent + return value * 0.00390625; + } + + // Get the current state of charge measurement of the MAX17048 as an int + int soc_int() + { + //Read the 16-bit raw SOC value + unsigned short value = read(REG_SOC); + + //Return only the top byte + return value >> 8; + } + + // Get the current C rate measurement of the MAX17048 + float crate() + { + //Read the 16-bit raw C/Rate value + short value = read(REG_CRATE); + + //Return C/Rate in %/hr + return value * 0.208; + } + + + //I2C register addresses + enum Register { + REG_VCELL = 0x02, + REG_SOC = 0x04, + REG_MODE = 0x06, + REG_VERSION = 0x08, + REG_HIBRT = 0x0A, + REG_CONFIG = 0x0C, + REG_VALRT = 0x14, + REG_CRATE = 0x16, + REG_VRESET_ID = 0x18, + REG_STATUS = 0x1A, + REG_TABLE = 0x40, + REG_CMD = 0xFE + }; + + //Member constants + static const int m_ADDR=(0x36 << 1); + + //Member variables + I2C m_I2C; + + //Internal functions + 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); + } +}; + + + void FUNC_BATTERYGAUGE_MAIN(float[]);