Library DS2782 Stand-Alone Fuel Gauge IC

Committer:
igbt6
Date:
Wed Dec 17 21:14:59 2014 +0000
Revision:
1:7cd80eb4df4c
Parent:
0:e6d413e57654
Library for DS2782 Stand-Alone Fuel Gauge IC

Who changed what in which revision?

UserRevisionLine numberNew contents of line
igbt6 0:e6d413e57654 1 /*
igbt6 0:e6d413e57654 2 @file ds2782.h
igbt6 0:e6d413e57654 3
igbt6 0:e6d413e57654 4 @brief DS2782 Stand-Alone Fuel Gauge IC
igbt6 0:e6d413e57654 5 Breakout I2C Library
igbt6 0:e6d413e57654 6
igbt6 0:e6d413e57654 7 @Author lukasz uszko(luszko@op.pl)
igbt6 0:e6d413e57654 8
igbt6 0:e6d413e57654 9 Tested on FRDM-KL46Z and FRDM-KL25Z
igbt6 0:e6d413e57654 10
igbt6 0:e6d413e57654 11 Copyright (c) 2014 lukasz uszko
igbt6 0:e6d413e57654 12 Released under the MIT License (see http://mbed.org/license/mit)
igbt6 0:e6d413e57654 13
igbt6 0:e6d413e57654 14 Documentation regarding the MAX9611 might be found here:
igbt6 0:e6d413e57654 15 http://www.maximintegrated.com/en/products/power/battery-management/DS2782.html
igbt6 1:7cd80eb4df4c 16
igbt6 1:7cd80eb4df4c 17 and some very useful tutorials:
igbt6 1:7cd80eb4df4c 18 http://www.maximintegrated.com/en/products/power/battery-management/DS2782.html/tb_tab2
igbt6 1:7cd80eb4df4c 19 http://www.maximintegrated.com/en/app-notes/index.mvp/id/3584
igbt6 1:7cd80eb4df4c 20 http://www.maximintegrated.com/en/app-notes/index.mvp/id/3463
igbt6 1:7cd80eb4df4c 21
igbt6 0:e6d413e57654 22 */
igbt6 0:e6d413e57654 23
igbt6 0:e6d413e57654 24
igbt6 0:e6d413e57654 25 #ifndef DS2782_H
igbt6 0:e6d413e57654 26 #define DS2782_H
igbt6 0:e6d413e57654 27
igbt6 0:e6d413e57654 28 #include "mbed.h"
igbt6 0:e6d413e57654 29
igbt6 0:e6d413e57654 30 #define DS2782_I2C_ADDRESS 0x34<<1
igbt6 0:e6d413e57654 31
igbt6 0:e6d413e57654 32
igbt6 0:e6d413e57654 33
igbt6 0:e6d413e57654 34
igbt6 0:e6d413e57654 35
igbt6 0:e6d413e57654 36
igbt6 0:e6d413e57654 37 class DS2782{
igbt6 0:e6d413e57654 38
igbt6 0:e6d413e57654 39
igbt6 0:e6d413e57654 40 /**********private members and methods********************************/
igbt6 0:e6d413e57654 41 private:
igbt6 0:e6d413e57654 42
igbt6 0:e6d413e57654 43 typedef enum {
igbt6 0:e6d413e57654 44 STATUS=0x01, /*STATUS - Status Register*/
igbt6 0:e6d413e57654 45 RAAC_MSB_REG, /*RAAC - Remaining Active Absolute Capacity MSB*/
igbt6 0:e6d413e57654 46 RAAC_LSB_REG,
igbt6 0:e6d413e57654 47 RSAC_MSB_REG, /*RSAC - Remaining Standby Absolute Capacity MSB*/
igbt6 0:e6d413e57654 48 RSAC_LSB_REG,
igbt6 0:e6d413e57654 49 RARC_REG, /*RARC - Remaining Active Relative Capacity*/
igbt6 0:e6d413e57654 50 RSRC_REG, /*RSRC - Remaining Standby Relative Capacity*/
igbt6 0:e6d413e57654 51 IAVG_MSB_REG, /*IAVG - Average Current Register MSB*/
igbt6 0:e6d413e57654 52 IAVG_LSB_REG,
igbt6 0:e6d413e57654 53 TEMP_MSB_REG, /*TEMP - Temperature Register MSB*/
igbt6 0:e6d413e57654 54 TEMP_LSB_REG,
igbt6 0:e6d413e57654 55 VOLT_MSB_REG, /*VOLT - Voltage Register MSB*/
igbt6 0:e6d413e57654 56 VOLT_LSB_REG,
igbt6 0:e6d413e57654 57 CURRENT_MSB_REG, /*CURRENT - Current Register MSB*/
igbt6 0:e6d413e57654 58 CURRENT_LSB_REG,
igbt6 0:e6d413e57654 59 ACR_MSB_REG, /*ACR - Accumulated Current Register MSB*/
igbt6 0:e6d413e57654 60 ACR_LSB_REG,
igbt6 0:e6d413e57654 61 ACRL_MSB_REG, /*Low Accumulated Current Register MSB*/
igbt6 0:e6d413e57654 62 ACRL_LSB_REG,
igbt6 0:e6d413e57654 63 AS_REG, /*AS - Age Scalar*/
igbt6 0:e6d413e57654 64 SFR_REG, /*SFR - Special Feature Register*/
igbt6 0:e6d413e57654 65 FULL_MSB_REG, /*FULL - Full Capacity MSB*/
igbt6 0:e6d413e57654 66 FULL_LSB_REG,
igbt6 0:e6d413e57654 67 AE_MSB_REG, /*AE - Active Empty MSB*/
igbt6 0:e6d413e57654 68 AE_LSB_REG,
igbt6 0:e6d413e57654 69 SE_MSB_REG, /*SE - Standby Empty MSB*/
igbt6 0:e6d413e57654 70 SE_LSB_REG,
igbt6 0:e6d413e57654 71 EEPROM_REG= 0x1F, /*EEPROM - EEPROM Register */
igbt6 0:e6d413e57654 72 USR_EEPROM_REG= 0x20, /*User EEPROM, Lockable, Block 0 [20 to 2F]*/
igbt6 0:e6d413e57654 73 ADD_USR_EEPROM_REG=0x30, /*Additional User EEPROM, Lockable, Block 0 [30 to 37]*/
igbt6 0:e6d413e57654 74 PARAM_EEPROM_REG=0x60, /*Parameter EEPROM, Lockable, Block 1 [60 to 7F]*/
igbt6 0:e6d413e57654 75 UNIQUE_ID_REG =0xF0, /*Unique ID [F0 to F7]*/
igbt6 0:e6d413e57654 76 FUNC_COMMAND_REG= 0xFE /*Function Command Register */
igbt6 0:e6d413e57654 77
igbt6 0:e6d413e57654 78 }RegAddr;
igbt6 0:e6d413e57654 79
igbt6 1:7cd80eb4df4c 80 typedef enum {
igbt6 1:7cd80eb4df4c 81
igbt6 1:7cd80eb4df4c 82 CONTROL = 0x60, //Control Register
igbt6 1:7cd80eb4df4c 83 AB =0x61, //Accumulation Bias
igbt6 1:7cd80eb4df4c 84 AC_MSB = 0x62, //Aging Capacity MSB
igbt6 1:7cd80eb4df4c 85 AC_LSB = 0x63, //Aging Capacity LSB
igbt6 1:7cd80eb4df4c 86 VCHG = 0x64, //Charge Voltage
igbt6 1:7cd80eb4df4c 87 IMIN =0x65, //Minimum Charge Current
igbt6 1:7cd80eb4df4c 88 VAE = 0x66, //Active Empty Voltage
igbt6 1:7cd80eb4df4c 89 IAE = 0x67, //Active Empty Current
igbt6 1:7cd80eb4df4c 90 ACTIVE_EMPTY_40,
igbt6 1:7cd80eb4df4c 91 RSNSP, //Sense Resistor Prime
igbt6 1:7cd80eb4df4c 92 FULL_40_MSB,
igbt6 1:7cd80eb4df4c 93 FULL_40_LSB,
igbt6 1:7cd80eb4df4c 94 FULL_3040_SLOPE,
igbt6 1:7cd80eb4df4c 95 FULL_2030_SLOPE,
igbt6 1:7cd80eb4df4c 96 FULL_1020_SLOPE,
igbt6 1:7cd80eb4df4c 97 FULL_0010_SLOPE,
igbt6 1:7cd80eb4df4c 98 AE_3040_SLOPE,
igbt6 1:7cd80eb4df4c 99 AE_2030_SLOPE,
igbt6 1:7cd80eb4df4c 100 AE_1020_SLOPE,
igbt6 1:7cd80eb4df4c 101 AE_0010_SLOPE,
igbt6 1:7cd80eb4df4c 102 SE_3040_SLOPE,
igbt6 1:7cd80eb4df4c 103 SE_2030_SLOPE,
igbt6 1:7cd80eb4df4c 104 SE_1020_SLOPE,
igbt6 1:7cd80eb4df4c 105 SE_0010_SLOPE,
igbt6 1:7cd80eb4df4c 106 RSGAIN_MSB, //Sense Resistor Gain MSB
igbt6 1:7cd80eb4df4c 107 RSGAIN_LSB, //Sense Resistor Gain LSB
igbt6 1:7cd80eb4df4c 108 RSTC, //Sense Resistor Temp. Coeff.
igbt6 1:7cd80eb4df4c 109 FRSGAIN_MSB, //Factory Gain MSB
igbt6 1:7cd80eb4df4c 110 FRSGAIN_LSB, //Factory Gain LSB
igbt6 1:7cd80eb4df4c 111 I2C_SLAVE_ADDR= 0x7E //2-Wire Slave Address
igbt6 1:7cd80eb4df4c 112 }ParamEepromReg;
igbt6 1:7cd80eb4df4c 113
igbt6 1:7cd80eb4df4c 114
igbt6 1:7cd80eb4df4c 115
igbt6 1:7cd80eb4df4c 116
igbt6 1:7cd80eb4df4c 117
igbt6 1:7cd80eb4df4c 118
igbt6 1:7cd80eb4df4c 119
igbt6 0:e6d413e57654 120 /** Write data to the given register
igbt6 0:e6d413e57654 121 *
igbt6 0:e6d413e57654 122 * @returns
igbt6 0:e6d413e57654 123 * 1 on success,
igbt6 0:e6d413e57654 124 * 0 on error
igbt6 0:e6d413e57654 125 */
igbt6 0:e6d413e57654 126 bool write(uint8_t regAddress, uint8_t* data,int dataLength);
igbt6 0:e6d413e57654 127
igbt6 0:e6d413e57654 128 /** Write data to the given register
igbt6 0:e6d413e57654 129 * @param register Address
igbt6 0:e6d413e57654 130 * @param data to read
igbt6 0:e6d413e57654 131 * @param length of data to read
igbt6 0:e6d413e57654 132 * @returns
igbt6 0:e6d413e57654 133 * 1 on success,
igbt6 0:e6d413e57654 134 * 0 on error
igbt6 0:e6d413e57654 135 */
igbt6 0:e6d413e57654 136 bool read(uint8_t regAddress, uint8_t* data,int length);
igbt6 0:e6d413e57654 137
igbt6 0:e6d413e57654 138 /** merge two bytes in one word
igbt6 0:e6d413e57654 139 * @param 1st byte
igbt6 0:e6d413e57654 140 * @param 2nd byte
igbt6 0:e6d413e57654 141 * @returns 16 bit word
igbt6 0:e6d413e57654 142 */
igbt6 0:e6d413e57654 143 inline uint16_t get16BitData(uint8_t msbByte,uint8_t lsbByte){
igbt6 0:e6d413e57654 144 uint16_t data16Bit= (msbByte<<8)|(lsbByte);
igbt6 0:e6d413e57654 145 return data16Bit;
igbt6 0:e6d413e57654 146 }
igbt6 1:7cd80eb4df4c 147
igbt6 1:7cd80eb4df4c 148 /** divide 16 bit word to 2 8bit bytes
igbt6 1:7cd80eb4df4c 149 * @param 1st byte
igbt6 1:7cd80eb4df4c 150 * @param buf
igbt6 1:7cd80eb4df4c 151 */
igbt6 1:7cd80eb4df4c 152 inline void fillBuf(uint16_t varVal, uint8_t* buf){
igbt6 1:7cd80eb4df4c 153 buf[0]= ((varVal>>8)&0xFF);
igbt6 1:7cd80eb4df4c 154 buf[1]= ((varVal)&0xFF);
igbt6 1:7cd80eb4df4c 155 }
igbt6 0:e6d413e57654 156
igbt6 0:e6d413e57654 157 I2C mI2c;
igbt6 0:e6d413e57654 158 uint8_t mI2cAddr;
igbt6 0:e6d413e57654 159
igbt6 0:e6d413e57654 160
igbt6 0:e6d413e57654 161 /**********protected members and methods********************************/
igbt6 0:e6d413e57654 162 protected:
igbt6 0:e6d413e57654 163 float mTemperature;
igbt6 0:e6d413e57654 164 float mCurrent;
igbt6 0:e6d413e57654 165 float mVoltage;
igbt6 0:e6d413e57654 166
igbt6 0:e6d413e57654 167 /**********public methods********************************/
igbt6 0:e6d413e57654 168 public:
igbt6 1:7cd80eb4df4c 169
igbt6 1:7cd80eb4df4c 170 typedef enum {
igbt6 1:7cd80eb4df4c 171 PORF = 0x02, //Power-On Reset Flag – Useful for reset detection, see text below.
igbt6 1:7cd80eb4df4c 172 UVF =0x04, //Under-Voltage Flag
igbt6 1:7cd80eb4df4c 173 LEARNF = 0x10, //Learn Flag – When set to 1, a charge cycle can be used to learn battery capacity.
igbt6 1:7cd80eb4df4c 174 SEF = 0x20, //Standby Empty Flag
igbt6 1:7cd80eb4df4c 175 AEF = 0x40, //Active Empty Flag
igbt6 1:7cd80eb4df4c 176 CHGTF =0x80, //Charge Termination Flag
igbt6 1:7cd80eb4df4c 177 }StatusReg ;
igbt6 0:e6d413e57654 178
igbt6 0:e6d413e57654 179 /** Create an SI7020 instance
igbt6 0:e6d413e57654 180 * @param sda pin
igbt6 0:e6d413e57654 181 * @param scl pin
igbt6 0:e6d413e57654 182 * @param address: I2C slave address
igbt6 0:e6d413e57654 183 */
igbt6 0:e6d413e57654 184 DS2782(PinName sda, PinName scl,int i2cFrequencyHz=100000,uint8_t address = DS2782_I2C_ADDRESS);
igbt6 0:e6d413e57654 185
igbt6 0:e6d413e57654 186
igbt6 0:e6d413e57654 187 /** Initialization: set member values and configuration registers, ought to be invoked in the body of constructor
igbt6 0:e6d413e57654 188 * @returns
igbt6 0:e6d413e57654 189 * true on success,
igbt6 0:e6d413e57654 190 * false on error
igbt6 0:e6d413e57654 191 */
igbt6 0:e6d413e57654 192 bool initDS2782(void);
igbt6 0:e6d413e57654 193
igbt6 0:e6d413e57654 194 /** Read temperature from the sensor.
igbt6 0:e6d413e57654 195 * @param none
igbt6 0:e6d413e57654 196 * @returns
igbt6 0:e6d413e57654 197 * 1 on success,
igbt6 0:e6d413e57654 198 * 0 on error
igbt6 0:e6d413e57654 199 */
igbt6 0:e6d413e57654 200 bool readTemperature(void);
igbt6 0:e6d413e57654 201 bool readCurrent(void);
igbt6 0:e6d413e57654 202 bool readVoltage(void);
igbt6 1:7cd80eb4df4c 203 bool setACRRegister(uint16_t reg); // set to 0 clears LEARNF and other flags
igbt6 1:7cd80eb4df4c 204 bool setEepromBlockRegister(ParamEepromReg reg, uint8_t * value, uint8_t length);
igbt6 1:7cd80eb4df4c 205 uint8_t readStatusReg(void);
igbt6 1:7cd80eb4df4c 206 float readAcrReg(void);
igbt6 1:7cd80eb4df4c 207 uint8_t readRarcReg(void);
igbt6 1:7cd80eb4df4c 208
igbt6 0:e6d413e57654 209
igbt6 0:e6d413e57654 210 // setters-getters
igbt6 0:e6d413e57654 211 float getTemperature(void);
igbt6 0:e6d413e57654 212 float getCurrent(void);
igbt6 0:e6d413e57654 213 float getVoltage(void);
igbt6 1:7cd80eb4df4c 214
igbt6 0:e6d413e57654 215 };
igbt6 0:e6d413e57654 216
igbt6 0:e6d413e57654 217 #endif