Library DS2782 Stand-Alone Fuel Gauge IC
ds2782.h@1:7cd80eb4df4c, 2014-12-17 (annotated)
- 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?
User | Revision | Line number | New 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 |