How to Use The MAX17201/MAX17211 and MAX17205/MAX17215 to Fuel-Gauge Primary Cell Batteries
Introduction
Primary cells pose a special challenge to fuel gauges. They are used in applications very sensitive to current consumption. Typical applications include smart sensors, smart meters, fire alarms, and other IoT devices that must operate for multiple months, or even years, without charging or changing batteries. Fuel gauges in these applications must not become a dominant source of power consumption. The nonrechargeable nature of the cells means the fuel gauge never has a chance to learn the capacity of the battery, and must achieve the accuracy through techniques such as accurate coulomb counting instead. For some chemistries, a flat voltage curve also means a direct voltage lookup method is not usable.
The MAX17201 and MAX17211 (MAX172x1) are low-power fuel gauges with excellent coulomb counting and temperature and voltage measurement accuracy. The analog capabilities of these ICs and their core voltage fuel gauge can be used to provide critical information in primary-cell applications. The single-cell ICs (supporting up to 5V) have a current consumption of only 9μA. This application note describes how to use the MAX172x1 fuel gauges in lithium-based primary cells. For applications with higher voltage requirements, use the MAX17205 and MAX17215. The BATT pin can measure up to 20V, and a voltage-divider can be used with the CELLX pin for higher voltage. This application note discusses the MAX17201/MAX17211, but the MAX17205/MAX17215 can be substituted for the higher voltage applications. Table 1 lists some supported cell types.
Type | Chemistry | Notes |
CR123(A) | LiMnO2 | 1S, requires 3V startup solution due to low voltage |
Energizer Litdium AA/AAA | LiFeS2 | ≥ 3S, or ≥ 2S witd 3V startup solution |
Tadiran/Saft | LiSOCl2 | Flat discharge curve |
Alkaline | Alkaline | ≥ 3S |
Schematic
The schematic for primary cells deviates from the typical implementation by connecting the chip ground (CSN) to the battery, making the fuel gauge ignore its own current consumption. This method increases the accuracy of the coulomb counter. The host requirement for this method is to either treat the positive coulomb count as discharge, or to set the current gain with a negative gain, making the coulomb counter behave normal again. To change the CGAIN to negative, the nCGain Register should be set to 0xC000, and the nNVCfg0.enCG bit (0x0040) should be set to 1 to enable restore CGAIN and COff from the nCGain Register. The schematic in Figure 1 shows the EP/GND to CSN connection highlighted to illustrate the deviation from the standard TDFN schematic.
Sense Resistor Selection
The sense resistor in Figure 1 has been set to 100mΩ. The 100mΩ vs. the 10mΩ typically used increases the resolution of the current measurement from 0.15625mA to 0.015625mA. Having a finer resolution decreases the drift of the coulomb counter and allows for better measurement in applications with lower currents. If the application uses more than 500mA discharge current, the sense resistor value should be decreased to allow the full current to be measured. Table 2 shows the current range and measured offset for various sense resistor values.
Sense Resistor (mΩ) |
Current range | Current LSB (μA) | Measured offset (μA) | Recommended COFF value |
10 | ±5.12A | 156.25 | 200 | 0 |
250 | ±204.8mA | 6.25 | 4.3 | 1 |
1000 | ±51.2mA | 15625 | 1.1 | 6 |
5000 | ±10.24mA | 78125 | 0.2 | 29 |
Minimizing Fuel Gauge Current
The quiescent current for the fuel gauge is minimized to 9μA by keeping the fuel gauge in an always-hibernate mode. To enable always hibernate, set the HibThreshold value to 0 to maximize the current allowed for hibernate mode, and set the HibExitTime to the maximum value to keep the fuel gauge in hibernate mode. The recommended value for the nHibCfg value that achieves this is 0x801B. The nNVCfg0.enHCfg bit (0x0002) should be enabled to allow copying nHibCfg to HibCfg. The COff Register can be set as described in Table 2 to make the fuel gauge count its own consumption current.
In addition, the I2C communication should be minimized to reduce the offset. Because the pulldown current for communication lines is routed through the chip ground (CSN), the communication current is all passed through the sense resistor. Excessive communication causes more current to cross RSENSE, creating virtual charge current.
End-of-Life Detection
The MAX17201/MAX17211 can also provide end-of-life detection by monitoring the voltage and reporting the open-circuit voltage processed through an internal model. Monitor the VFOCV Register (0xFB) for the open-circuit voltage to decide when the voltage is approaching the end of life, without getting false readings caused by load pulses on the battery. A special model for the battery should be used to enable the end-of-life voltage reporting.
Evaluating Coulomb Counter Performance
The raw coulomb counter in the MAX17201/MAX17211 is accessible by reading the QH and QL Registers (0x4D and 0x4E). QH represents the high word and QL represents the low word of the 32-bit coulomb counter. The LSB for the QH Register is 5.0 . For a 10Ω sense resistor, this translates to a LSB of 0.5mAh for QH. QL has an LSB of 2-16 of the LSB of QH.
The accuracy of the coulomb counter listed in Table 2 is calculated by recording the chip coulomb counter and timer data and the start and end of the data, calculating the drift as , where t2 and Q2 are the timer and coulomb counter value (QH + QL) at the end of the test, and t1 and Q1 are the timer and coulomb counter at the start of the test. Note, the Timer Register from the fuel gauge can also be used for this test by combining the Timer (0x3E) and TimerH (0xBE) Registers, or the system time can be used. These tests should be done with a fixed load and with no load to measure the offset and gain errors. The error from the coulomb counter contributes to how accurate a fuel gauge can be for an application.
Example of MAX17201/MAX17211 for a CR123 application with a one-year runtime:
Cell capacity: 1500mAh
Runtime: 1 year (8760 hours)
Average load (1500mAh/8670h) = 0.173mA 5000Ω sense resistor can be used, with an offset of 0.2μA
The error contributed to the coulomb counter by the offset in this example is 0.2μA vs. the average load of 173μA, an error of 0.115%. This offset error contributes to 1.725mAh added or subtracted from the total coulomb count over the one-year period.
Additional Circuit Requirements
Although the MAX17201/MAX17211 operate down to 2.3V, they have a 2.9V startup voltage. If an application requires a lower startup voltage, the application circuit should be modified as shown in Figure 2. This schematic requires the BATT and REG3 pin to be supplied by an external voltage > 3V. This can be from a charge pump, regulator, or any other system rail. The maximum current requirement of this IC is 10mA for approximately 400ms during factory nonvolatile memory programming.
If the application needs to monitor the cell voltage below 2V, the digital block on low voltage can be bypassed by using only the CELLx pin to do the measurements, and typing the CELL1 and CELL2 pins to the > 3V supply as illustrated in Figure 3.
CELLx is a high-impedance (400Ω typ) pin with a 0 to 2V voltage input range. The 2Ω and 3Ω are used to keep the LSB of the CellX Register the same as normal voltage Registers, while minimizing the current consumption added by this circuit. This mode requires using nPackCfg = 0x0D01, instead of the 0x0C01 listed in the standard configuration. The host software must read the CellX Register, located at address 0x0D9, instead of the VCell Register, which only reports the supply voltage. In this configuration, end-of-life detection with VFOCV is not supported.
Conclusion
The MAX17201/MAX17211 can be used for primary-cell applications with special considerations for the schematic and memory configurations. The minimum changes required are to set the nCGain and nHibCfg Registers and the corresponding nNVCfg0 bits. The sample INI sets up the appropriate Registers and can be tested on the MAX17201 or the MAX17211 IC.
Sample INI
0x180 = 0x0000 | //nXTable0 Register |
0x180 = 0x0000 | //nXTable0 Register |
0x181 = 0x0000 | //nXTable1 Register |
0x182 = 0x0000 | //nXTable2 Register |
0x183 = 0x0000 | //nXTable3 Register |
0x184 = 0x0000 | //nXTable4 Register |
0x185 = 0x0000 | //nXTable5 Register |
0x186 = 0x0000 | //nXTable6 Register |
0x187 = 0x0000 | //nXTable7 Register |
0x188 = 0x0000 | //nXTable8 Register |
0x189 = 0x0000 | //nXTable9 Register |
0x18A = 0x0000 | //nXTable10 Register |
0x18B = 0x0000 | //nXTable11 Register |
0x18C = 0x0000 | //nUser18C Register |
0x18D = 0x0000 | //nUser18D Register |
0x18E = 0x0000 | //nODSCTh Register |
0x18F = 0x0000 | //nODSCCfg Register |
0x190 = 0x0000 | //nOCVTable0 Register |
0x191 = 0x0000 | //nOCVTable1 Register |
0x192 = 0x0000 | //nOCVTable2 Register |
0x193 = 0x0000 | //nOCVTable3 Register |
0x194 = 0x0000 | //nOCVTable4 Register |
0x195 = 0x0000 | //nOCVTable5 Register |
0x196 = 0x0000 | //nOCVTable6 Register |
0x197 = 0x0000 | //nOCVTable7 Register |
0x198 = 0x0000 | //nOCVTable8 Register |
0x199 = 0x0000 | //nOCVTable9 Register |
0x19A = 0x0000 | //nOCVTable10 Register |
0x19B = 0x0000 | //nOCVTable11 Register |
0x19C = 0x0000 | //nIChgTerm Register |
0x19D = 0x0000 | //nFilterCfg Register |
0x19E = 0x0000 | //nVEmpty Register |
0x19F = 0x2602 | //nLearnCfg Register |
0x1A0 = 0x3C00 | //nQRTable00 Register |
0x1A1 = 0x1B80 | //nQRTable10 Register |
0x1A2 = 0x0B04 | //nQRTable20 Register |
0x1A3 = 0x0885 | //nQRTable30 Register |
0x1A4 = 0x0000 | //nCycles Register |
0x1A5 = 0x0910 | //nFullCapNom Register |
0x1A6 = 0x1070 | //nRComp0 Register |
0x1A7 = 0x263D | //nTempCo Register |
0x1A8 = 0xF830 | //nIAvgEmpty Register |
0x1A9 = 0x07D0 | //nFullCapRep Register |
0x1AA = 0x0000 | //nVoltTemp Register |
0x1AB = 0x807F | //nMaxMinCurr Register |
0x1AC = 0x00FF | //nMaxMinVolt Register |
0x1AD = 0x807F | //nMaxMinTemp Register |
0x1AE = 0x0000 | //nSOC Register |
0x1AF = 0x0000 | //nTimerH Register |
0x1B0 = 0x0000 | //nConfig Register |
0x1B1 = 0x0204 | //nRippleCfg Register |
0x1B2 = 0x0000 | //nMiscCfg Register |
0x1B3 = 0x07D0 | //nDesignCap Register |
0x1B4 = 0x801C | //nHibCfg Register |
0x1B5 = 0x0C01 | //nPackCfg Register |
0x1B6 = 0x0000 | //nRelaxCfg Register |
0x1B7 = 0x2241 | //nConvgCfg Register |
0x1B8 = 0x0142 | //nNVCfg0 Register |
0x1B9 = 0x0006 | //nNVCfg1 Register |
0x1BA = 0xFC0A | //nNVCfg2 Register |
0x1BB = 0x0002 | //nSBSCfg Register |
0x1BC = 0x0000 | //nROMID0 Register |
0x1BD = 0x0000 | //nROMID1 Register |
0x1BE = 0x0000 | //nROMID2 Register |
0x1BF = 0x0000 | //nROMID3 Register |
0x1C0 = 0x0000 | //nVAlrtTh Register |
0x1C1 = 0x0000 | //nTAlrtTh Register |
0x1C2 = 0x0000 | //nSAlrtTh Register |
0x1C3 = 0x0000 | //nIAlrtTh Register |
0x1C4 = 0x0000 | //nUser1C4 Register |
0x1C5 = 0x0000 | //nUser1C5 Register |
0x1C6 = 0x0000 | //nFullSOCThr Register |
0x1C7 = 0x0000 | //nTTFCfg Register |
0x1C8 = 0xC000 | //nCGain Register |
0x1C9 = 0x0025 | //nTCurve Register |
0x1CA = 0x0000 | //nTGain Register |
0x1CB = 0x0000 | //nTOff Register |
0x1CC = 0x0000 | //nManfctrName0 Register |
0x1CD = 0x0000 | //nManfctrName1 Register |
0x1CE = 0x0000 | //nManfctrName2 Register |
0x1CF = 0x03E8 | //nRSense Register |
0x1D0 = 0x0000 | //nUser1D0 Register |
0x1D1 = 0x0000 | //nUser1D1 Register |
0x1D2 = 0xD5E3 | //nAgeFcCfg Register |
0x1D3 = 0x0000 | //nDesignVoltage Register |
0x1D4 = 0x0000 | //nUser1D4 Register |
0x1D5 = 0x0000 | //nRFastVShdn Register |
0x1D6 = 0x0000 | //nManfctrDate Register |
0x1D7 = 0x0000 | //nFirstUsed Register |
0x1D8 = 0x0000 | //nSerialNumber0 Register |
0x1D9 = 0x0000 | //nSerialNumber1 Register |
0x1DA = 0x0000 | //nSerialNumber2 Register |
0x1DB = 0x0000 | //nDeviceName0 Register |
0x1DC = 0x0000 | //nDeviceName1 Register |
0x1DD = 0x0000 | //nDeviceName2 Register |
0x1DE = 0x0000 | //nDeviceName3 Register |
0x1DF = 0x0000 | //nDeviceName4 Register |