SLUUCJ0 November 2023 BQ76907
The BQ76907 device monitors pack current using a low-side sense resistor that connects to the SRP and SRN pins through an external RC filter, which must be connected such that a charging current creates a positive voltage on SRP relative to SRN. The device supports a wide range of sense resistor values, such as 1 mΩ or below. The differential voltage between SRP and SRN is digitized by a dedicated integrated coulomb counter ADC, which can digitize voltages over a ±200 mV range. The pins can also support higher positive voltages relative to VSS, such as which can occur during overcurrent or short circuit in discharge conditions, without damage to the device, although the current is not accurately digitized in this case.
The coulomb counter provides two digital outputs, one of which uses the CC2 digital filter, which generates a 24-bit raw output. The timing and resolution of the CC2 output is programmable, with the output rate also affecting the resolution of the conversion. The effective resolution (defined as the resolution such that the data exhibits 1-sigma variation with +/-1-LSB) of the coulomb counter conversions increases with longer conversion time. The conversion time options when the coulomb counter is in full power mode are 366 μs (which results in 13-bit effective resolution), 732 μs (14-bit effective resolution), 1.46 ms (15-bit effective resolution), or 2.93 ms (16-bit effective resolution). This conversion time is set using the Settings:Configuration:DA Config[IADCSPEED1:0] configuration bits. In addition, the coulomb counter supports a low power mode, which operates at a 16 times slower rate than the settings listed above, with similar resolution performance at each setting, but with supply current reduced by approximately 55 μA.
This 24-bit CC2 value is reported in the 0x36 Raw Current() command. This command provides 24 bits of data in the LSBs, which is sign-extended to generate the upper 8 bits of the 32-bit field. While this data provides additional resolution for current measurement if desired, there can be considerable noise in the lower bits, so the data can need further filtering by the host before use. The 32-bit current data has an LSB value of approximately VREF2 / (5 × 223) ≅ 1.227 V / (5 × 223) ≅ 29 nV. Note that the data provided by the 0x36 Raw Current() command is not processed for offset or gain correction.
The 24-bit raw coulomb counter output is further processed, with the result reported in 16-bit format by the 0x3A Current() command in units of 16-bit userA. The processing consists of first subtracting an offset value (Calibration:Current:Curr Offset) from the 24-bit raw ADC result, then multiplying that result by a gain factor (Calibration:Current:Curr Gain), dividing the result by 8192, and rounding to 16-bits. The default values of Calibration:Current:Curr Offset and Calibration:Current:Curr Gain are trimmed and stored in OTP by TI during manufacturing to provide the final value of 0x3A Current() in units of mA, assuming a 1 mΩ sense resistor is used. The device loads the trim values to use during operation; the values in use can also be modified by the host in CONFIG_UPDATE mode if desired.
If a different sense resistor value is used, the host can modify the value of Calibration:Current:Curr Gain to adjust the units of the 0x3A Current() command, depending on the range of currents expected in the system. Thus the units of each LSB are termed "userA" based on the gain setting. Because the 0x3A Current() command reports signed 16-bit data, units of mA would only allow reporting of currents between -32768 mA and +32767 mA. If larger currents are expected, then the gain can be adjusted to set the LSB userA to a different value, such as 10 mA or 100 mA, which then allows reporting of currents between -327.68 A and +327.67 A (if userA = 10 mA) or between -3276.8 A and +3276.7 A (if userA = 100 mA).
The device also reports a 16-bit current which is measured primarily for charge integration purposes in 0x3C CC1 Current(), with units adjustable in similar fashion as the 0x3A Current(). In this case, the raw data is 16-bit, so the processing consists of first subtracting an offset value (Calibration:Current:CC1 Offset / 256) from the 16-bit raw ADC result, then multiplying that result by a gain factor (Calibration:Current:CC1 Gain), dividing the result by 32, and rounding to 16-bits. The default values of Calibration:Current:CC1 Offset and Calibration:Current:CC1 Gain are trimmed and stored in OTP by TI during manufacturing to provide the final value of 0x3C CC1 Current() in units of mA, assuming a 1 mΩ sense resistor is used. The device loads the trim values to use during operation; the values in use can also be modified by the host in CONFIG_UPDATE mode if desired.
The 0x3C CC1 Current() only operates in NORMAL mode, and generates a sample every 250 ms when the coulomb counter is in full power mode, or every 4 seconds in low power mode (as determined by the Settings:Configuration:DA Config[CCMODE1:0] setting). The 0x3C CC1 Current() is used to decide when the device enters SLEEP mode and for accumulated charge integration.
The BQ76907 supports both series and parallel FET configurations. When the CHG and DSG FETs are in series, current can flow through the body diode of a disabled FET when the other FET is enabled. In this configuration, body diode protection is used to turn the disabled FET on when current above a threshold is detected to be flowing through that FET. When the system has separate DSG and CHG paths and parallel FETs, body diode protection is not needed and can be disabled by clearing the Settings:Configuration:FET Options[SFET] configuration bit.
The body diode protection is implemented in most cases using the digitized current data from the coulomb counter. Except for special cases, the device compares the absolute value of 0x3A Current() to the body diode protection threshold given by Settings:Protection:Body Diode Threshold. If one FET is disabled and one is enabled, and the absolute value of 0x3A Current() exceeds the threshold, and [SFET] = 0x1, then the disabled FET is enabled.
If Settings:Configuration:DA Config[CCMODE1:0] = 0x3, then the body diode protection instead uses the wake detector signal to decide whether or not to enable the disabled FET. This means the device uses the wake detector threshold for the body diode protection in these cases, so Settings:Protection:Body Diode Threshold is not used.
To avoid rapid cycling of a FET driver when the current is near the threshold, the FET enabled by body diode protection is not disabled again due to unneeded body diode protection until after a hysteresis time of approximately 240 ms has passed since the FET was initially enabled. This hysteresis does not apply if a protection fault occurs and the device is configured to disable the FET, or if a command to manually disable the FET is sent. In these cases the FET turns off immediately without observing the hysteresis.
The schedule for current measurements depends on programmable settings as well as the operating mode of the device (such as whether the device is in SLEEP mode versus NORMAL mode). This programmability, which uses the Settings:Configuration:DA Config[CCMODE1:0], allows the power dissipation of the device to be reduced if fast current measurements are not required in the system.
CCMODE[1] | CCMODE[0] | Description |
---|---|---|
0 | 0 | NORMAL mode: Coulomb counter runs continuously, independent of the LOOP_SLOW or CB_LOOP_SLOW setting. SLEEP mode: Coulomb counter runs continuously while the voltage ADC is running in SLEEP mode during a burst measurement. It stops at the conclusion of the CC2 measurement underway when the burst measurement completes. Startup mode (at initial powerup from SHUTDOWN or exit of DEEPSLEEP or CONFIG_UPDATE mode): Coulomb counter runs continuously while the voltage ADC is running during the Startup Sequence. It stops at the conclusion of the CC2 measurement underway when the Startup Sequence completes. 0x3C CC1 Current() and accumulated charge and time integration are updated in NORMAL mode but not in SLEEP mode. Body diode protection uses the coulomb counter digitized current data. |
0 | 1 | NORMAL mode: Coulomb counter runs continuously if LOOP_SLOW or CB_LOOP_SLOW is set to the fastest setting. When these parameters are modified to slower settings, the device inserts 1, 3, or 7 idle slots between each current measurement slot, thereby reducing the average output rate of the current measurements. SLEEP mode: Coulomb counter runs continuously while the voltage ADC is running in SLEEP mode during a burst measurement. It stops at the conclusion of the CC2 measurement underway when the burst measurement completes. Startup mode (at initial powerup from SHUTDOWN or exit of DEEPSLEEP or CONFIG_UPDATE mode): Coulomb counter runs continuously while the voltage ADC is running during the Startup Sequence. It stops at the conclusion of the CC2 measurement underway when the Startup Sequence completes. 0x3C CC1 Current() and accumulated charge and time integration are only updated when in NORMAL and not using a mode that inserts idle slots into the voltage measurement schedule. These are not updated in SLEEP mode. Body diode protection uses the CC2 digitized current data. |
1 | 0 | NORMAL mode: Coulomb counter runs continuously in low power mode (CC1 and CC2 measurements take 16x longer versus in regular full power mode) SLEEP mode: Coulomb counter takes one CC2 measurement at the beginning of each burst measurement using low power mode. Startup mode (at initial powerup from SHUTDOWN or exit of DEEPSLEEP): Coulomb counter takes one CC2 measurement using low power mode at the beginning of the Startup Sequence. 0x3C CC1 Current() and accumulated charge and time integration are only updated with this setting while in NORMAL mode, they are not updated in SLEEP mode. The 0x3C CC1 Current() and charge integration is updated every approximately 4 seconds in NORMAL mode using this setting, due to the slower clock rate. The charge integration scales the CC1 Current appropriately when accumulating, to maintain the same units of userA-seconds. Body diode protection uses the coulomb counter CC2 digitized current data. |
1 | 1 | Coulomb counter is powered down and does not operate at all. This provides a low power mode if current measurement is not needed. 0x3C CC1 Current() and accumulated charge and time integration are not available in this mode. In this mode, body diode protection is based on the wake comparator detection threshold, which also serves as the detector to enter/exit SLEEP mode. |
When the 0x3C CC1 Current() is operating, it is integrated to calculate the accumulated passed charge, with the integrated charge available as a signed 48-bit value from the 0x0004 PASSQ() subcommand. The first 32-bits contains the 32 LSBs of the accumulated charge in units of userA-seconds, and the next 32-bits contain the upper 16 bits of the 48-bit result sign-extended to fill the 32-bit field. In addition, a timer value with units of 250 ms is available in a 32-bit value from the subcommand, which counts the time the device is in NORMAL mode since the integrator was reset. Neither the time nor the charge integration operate in SLEEP, DEEPSLEEP, or SHUTDOWN modes, only in NORMAL mode and based on the setting of Settings:Configuration:DA Config[CCMODE1:0]. The integrator and timer is reset by sending the 0x0005 RESET_PASSQ() subcommand. These are also reset upon entering CONFIG_UPDATE mode. When the coulomb counter is in low power mode, it only generates a CC1 current output every 4 seconds, so the charge and time integration is also updated at these intervals. The integration of 0x3C CC1 Current() is scaled accordingly when in low power mode, to provide accumulated charge using the same units of userA-seconds as in full power mode.
Subcommand Address | Bytes within Block | Name | Units |
---|---|---|---|
0x0004 | 0 - 3 | Accumulated charge lower 32-bits (little-endian) | Lower 32 bits of signed 48-bit result, with the full 48-bit field having units of userA-seconds |
4 - 7 | Accumulated charge upper 16-bits sign-extended to a 32-bit field (little-endian) | Upper bits of signed 48-bit result, with the full 48-bit field having units of userA-seconds | |
8 - 11 | Accumulated Time (little-endian) | 32-bit unsigned integer in units of 250 ms |