Hi Team.
"BQ76952 Battery Monitor IC Issue: Discharge FET Activation Without Controller Input"
**Problem Description:**
I'm currently working with the BQ76952 Battery Monitor and Protector IC, and I'm facing an issue where the Discharge FET is activating automatically, even though I've instructed my controller to keep only the Charge FET on and the Discharge FET off. This unexpected activation of the Discharge FET happens sporadically and can lead to a short circuit fault.
1. **Application:** I'm using the BQ76952 to monitor and protect a multi-cell battery pack in a portable device.
2. **Issue:** While my controller is in idle mode, I configure it to have only the Charge FET on and the Discharge FET off. However, at irregular intervals, the AFE (Analog Front End) seems to turn on the Discharge FET by itself without activating the pre_discharge function.
3. **Configuration:** I've verified that my controller is correctly setting the FETs' control signals, and the logic appears sound.
**Oscilloscope Data:** I've captured some oscilloscope data that may shed light on the issue, and I'm looking for help in analyzing it. Here's the link to the oscilloscope data: [Insert Link].
**Questions:**
- What might be causing the BQ76952 to automatically activate the Discharge FET without following the controller's instructions?
- Are there specific registers or settings that could cause such behavior?
- Could external factors like noise or transient voltage spikes be influencing this issue?
- How can I investigate or debug the AFE's behavior to understand why it activates the Discharge FET unpredictably?
**Additional Information:**
- I'm using an external microcontroller to interface with the BQ76952 and configure its settings.
- The device operates correctly most of the time, but this sporadic issue is causing concern.
**Note:** I've reviewed the datasheet and reference manual for the BQ76952, but I'm still experiencing this issue. Your insights and expertise in analyzing the oscilloscope data would be greatly appreciated. Thank you for your help!
With this revision, the forum question now specifies that the issue relates to the automatic activation of the Discharge FET, providing clarity for forum members who may be able to assist.
///---------------------------- FET control command. -----------------------------------------------------------//
Subcommands(FET_CONTROL, 0x0B, W); // Turn on only chg [1011]
delay_us(8000);
///////////-----------------------------AFE Init function and -----------------------------------------------------//////
CommandSubcommands(SET_CFGUPDATE);
BQ769x2_SetRegister(CommType, 0x08, 1);
BQ769x2_SetRegister(PowerConfig, 0x2D80, 2);
BQ769x2_SetRegister(REG0Config, 0x01, 1);
BQ769x2_SetRegister(REG12Config, 0xDD, 1); // Enable REG1 and REG2 with 3.3V output
BQ769x2_SetRegister(DFETOFFPinConfig, 0x42, 1); // 0x42 is turning BOTH FET OFF.
BQ769x2_SetRegister(ALERTPinConfig, 0x2A, 1);
BQ769x2_SetRegister(TS1Config, 0x07, 1);
BQ769x2_SetRegister(TS2Config, 0x07, 1);
BQ769x2_SetRegister(CFETOFFPinConfig, 0x07, 1); // Set CFETOFF to measure Cell Temperature - 0x92FA = 0x07
BQ769x2_SetRegister(DCHGPinConfig, 0x07, 1); // Set DCHG to measure Cell Temperature - 0x9301 = 0x07
BQ769x2_SetRegister(DDSGPinConfig, 0x0F, 1); // Set DDSG to measure FET Temperature and FET protection is ON - 0x9302 = 0x0F
// pre-discharge FET control
BQ769x2_SetRegister(ChgPumpControl, 0x01, 1); // charge pump Enabled 11V
BQ769x2_SetRegister(FETOptions, 0x1D, 1); // pre-dischatrge enable
BQ769x2_SetRegister(PredischargeTimeout, 0xFF, 1); // pre-dischatrge enable set for 250ms
BQ769x2_SetRegister(PredischargeStopDelta, 0x00, 1); // disabling LD- TOS voltage check, IMPLEMENT it later
BQ769x2_SetRegister(CCGain, 0x41e9a666,4);// current gain for ARK ie 7.4768/0.256 == 0x41e9a666==29.20625
BQ769x2_SetRegister(CapacityGain, 0x4b04ebbf,4 );// current gain for ARK ie 8711103.37487125, 0x4b04ebbf=8711103
BQ769x2_SetRegister(DAConfiguration,0x06,1);// Set current readout conversion to 10mA
// 'VCell Mode' - Enable 16 cells - 0x9304 = 0x0000; Writing 0x0000 sets the default of 16 cells
// FOR 4S ITS 0x8007
BQ769x2_SetRegister(VCellMode, 0x8007, 2);
// BQ769x2_SetRegister(VCellMode, 0x0000, 2);
BQ769x2_SetRegister(CC3Samples, 0x64,1);
BQ769x2_SetRegister(EnabledProtectionsA, 0xFC, 1);
BQ769x2_SetRegister(EnabledProtectionsB, 0xF7, 1); // was C8, now all protections enabled
BQ769x2_SetRegister(DefaultAlarmMask, 0xF882, 2);
// Set up CUV (under-voltage) Threshold - 0x9275 = 0x31 (2479 mV)
// CUV Threshold is this value multiplied by 50.6mV
BQ769x2_SetRegister(CUVThreshold, 0x37, 1); // 0x37 equals 2783mV
BQ769x2_SetRegister(CUVRecoveryHysteresis,0x02,1);
BQ769x2_SetRegister(COVThreshold, 0x49, 1); // 0x49 equals 3693.8 mV just for testing, set back to 0x55
BQ769x2_SetRegister(COVRecoveryHysteresis, 0x02,1);
BQ769x2_SetRegister(OCCThreshold, 0x08, 1); // ie 8x2mV 16mV/0.25mR = 64A
BQ769x2_SetRegister(OCCDelay, 0x01, 1);
BQ769x2_SetRegister(OCCRecoveryThreshold, 0x1770, 2);
// Set up OCD1 Threshold - 0x9282 = 0x0A (20 mV = 20A across 1mOhm sense resistor) units of 2mV
BQ769x2_SetRegister(OCD1Threshold, 0x25, 1); // 37x2mV = 74mV/0.25mR = 296A
BQ769x2_SetRegister(OCD2Threshold, 0x26, 1); // 38x2mV = 76mV/0.25mR = 304A
BQ769x2_SetRegister(OCDRecoveryThreshold, 0x0000, 2);
// Set up SCD Threshold - 0x9286 = 0x05 (100 mV = 100A across 1mOhm sense resistor) 0x05=100mV
BQ769x2_SetRegister(SCDThreshold, 0x04, 1); // 4 is 80mV/0.25mR is 320A for 15us
// Set up SCD Delay - 0x9287 = 0x03 (30 us) Enabled with a delay of (value - 1) * 15 ?s; min value of 1
BQ769x2_SetRegister(SCDDelay, 0x02, 1);// 15uS
BQ769x2_SetRegister(SCDRecoveryTime, 0x0A, 1);// 10S SCD recovey
//
// BQ769x2_SetRegister(OTCThreshold, 0x37, 1); // OTC is 55 deg C
// BQ769x2_SetRegister(OTCRecovery, 0x32, 1); // OTC recovery is 50 deg C
// updated for testing
BQ769x2_SetRegister(OTCThreshold, 0x41, 1); // OTC is 65 deg C
BQ769x2_SetRegister(OTCRecovery, 0x3C, 1); // OTC recovery is 60 deg C
BQ769x2_SetRegister(OTFThreshold,0x5F, 1); //OTF is set to 95 deg C
// BQ769x2_SetRegister(OTDThreshold, 0x3C, 1); // OTD is 60 deg C
// BQ769x2_SetRegister(OTDRecovery, 0x37, 1); // OTD recovery is 55 deg C
// updated for testing
BQ769x2_SetRegister(OTDThreshold, 0x41, 1); // OTD is 65 deg C
BQ769x2_SetRegister(OTDRecovery, 0x3C, 1); // OTD recovery is 60 deg C
// Set up SCDL Latch Limit to 1 to set SCD recovery only with load removal 0x9295 = 0x01
// If this is not set, then SCD will recover based on time (SCD Recovery Time parameter).
CommandSubcommands(EXIT_CFGUPDATE);
Oscilloscope image
.