This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ76952:定制 PCB、FET 在任何情况下都保持闭合状态

Guru**** 2418730 points
Other Parts Discussed in Thread: BQ76952, BQSTUDIO

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1497097/bq76952-custom-pcb-fets-stay-closed-no-matter-what

器件型号:BQ76952
主题: BQSTUDIO 中讨论的其他器件

工具/软件:

您好、  

我对电气工程和 TI 平台非常不熟悉、请原谅我在格式化、文档编写等方面犯的任何错误

我设计了定制 PCB 作为 BMS、并使用了  BQ76952芯片、下面您可以看到原理图、也包括电池布线、以及源代码 I 在具有 I2C 通信的 Arduino IDE 中测试 esp32。 我搜索网络,与聊天机器人交谈,但仍然可以得到一个软件解决方案,我的问题,充电和放电闸门关闭。 您认为我的示意图或电池接线可能有问题吗? 是否有比使用代码更好的测试方法? 不确定 BQSTUDIO 是否起作用? 非常感谢您的帮助。 我很感激每一个答案。  

这是控制台中代码的输出

Cell 1 voltage: 3.686 V
Cell 2 voltage: 4.102 V
Cell 3 voltage: 3.686 V
Cell 4 voltage: 3.666 V
Cell 5 voltage: 0.000 V
Cell 6 voltage: 0.000 V
Cell 7 voltage: 0.000 V
Cell 8 voltage: 0.000 V
Cell 9 voltage: 0.000 V
Cell 10 voltage: 0.000 V
Cell 11 voltage: 0.000 V
Cell 12 voltage: 0.000 V
Cell 13 voltage: 0.000 V
Cell 14 voltage: 0.000 V
Cell 15 voltage: 0.000 V
Cell 16 voltage: 3.839 V
FET Status: 1110000

e2e.ti.com/.../SCH_5F00_Schematic1_5F00_2025_2D00_04_2D00_03.pdf

#include <Wire.h>

// BQ76952 I2C address (7-bit)
#define BQ76952_I2C_ADDR 0x08

// Command addresses
#define CONTROL_STATUS 0x00
#define BATTERY_STATUS 0x12
#define CELL1_VOLTAGE_L 0x14
#define CELL1_VOLTAGE_H 0x15
#define FET_STATUS 0x7F

// Variables to track communication status
bool commEstablished = false;
int retryCount = 0;
const int maxRetries = 5;

void setup() {
  Serial.begin(115200);
  Wire.begin(21, 22, 400000);  // Initialize I2C with default pins (SDA=21, SCL=22)
  
  // Try to establish communication
  while (!commEstablished && retryCount < maxRetries) {
    if (checkCommunication()) {
      commEstablished = true;
      Serial.println("Communication with BQ76952 established successfully!");
    } else {
      retryCount++;
      Serial.print("Communication failed, retry ");
      Serial.print(retryCount);
      Serial.println("/5");
      delay(1000);
    }
  }
  
  if (!commEstablished) {
    Serial.println("Failed to establish communication with BQ76952");
    while(1); // Halt if communication fails
  }
}

void loop() {
  // Read and print cell voltages (example for cells 1-4)
  for (int cell = 1; cell <= 16; cell++) {
    float voltage = readCellVoltage(cell);
    Serial.print("Cell ");
    Serial.print(cell);
    Serial.print(" voltage: ");
    Serial.print(voltage, 3);
    Serial.println(" V");
  }
  
  // Read and print FET status
  uint8_t fetStatus = readRegister(FET_STATUS);
  Serial.print("FET Status: ");
  Serial.println(fetStatus, BIN);
  
  // Check if FETs are enabled
  bool chgEnabled = (fetStatus & 0x01) != 0;
  bool dsgEnabled = (fetStatus & 0x02) != 0;
  
  Serial.print("CHG FET: ");
  Serial.println(chgEnabled ? "ENABLED" : "DISABLED");
  Serial.print("DSG FET: ");
  Serial.println(dsgEnabled ? "ENABLED" : "DISABLED");
  
  Serial.println("---------------------");
  delay(1000); // Delay between readings
}

bool checkCommunication() {
  // Try to read the Battery Status register
  Wire.beginTransmission(BQ76952_I2C_ADDR);
  Wire.write(BATTERY_STATUS);
  if (Wire.endTransmission(false) != 0) { // Send repeated start
    return false;
  }
  
  // Request 2 bytes (Battery Status is 16-bit)
  if (Wire.requestFrom(BQ76952_I2C_ADDR, 2) != 2) {
    return false;
  }
  
  // If we got data, communication is working
  uint16_t batteryStatus = Wire.read() | (Wire.read() << 8);
  return true;
}

float readCellVoltage(int cellNumber) {
  // Calculate register addresses for the cell
  uint8_t regLow = CELL1_VOLTAGE_L + (2 * (cellNumber - 1));
  uint8_t regHigh = regLow + 1;
  
  // Read low and high bytes
  uint8_t lowByte = readRegister(regLow);
  uint8_t highByte = readRegister(regHigh);
  
  // Combine bytes and convert to voltage (mV to V)
  int16_t voltage_mV = (highByte << 8) | lowByte;
  return voltage_mV / 1000.0;
}

uint8_t readRegister(uint8_t reg) {
  Wire.beginTransmission(BQ76952_I2C_ADDR);
  Wire.write(reg);
  Wire.endTransmission(false); // Send repeated start
  
  Wire.requestFrom(BQ76952_I2C_ADDR, 1);
  while (Wire.available() < 1); // Wait for data
  return Wire.read();
}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Adam、

      在测试 FET 时、您是否使用0x0022 FET_ENABLE ()子命令来切换[FET_EN]位?


    此致、
    Alexis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Alexis:  

    感谢您的回复!

    我尝试过它,但我认为芯片不是处于测试模式。 我不知道该如何更改它。 如果我尝试运行该命令、它将不会执行任何操作。

    此致、  

    Adam  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    另一个更新

    我设法缩小范围、看起来器件处于睡眠模式且尚未初始化。 有人知道发生了什么事吗?  

    读取 0x12 Battery Status ()命令会返回此11000010010000100  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Adam、

    表6-2.  0x12 Battery Status () 位定义   技术参考手册 (TRM)的一部分 应该有助于确定这些位的含义。  

    发送子命令 FET_ENABLE 的原因是、该器件默认具有 FET_EN = 0、如所示  表13-34. Mfg Status Init 寄存器字段说明  部分。  

         在尝试与我们的器件通信时、您是否参考了我们拥有的示例代码和/或软件开发指南?  

    如果未在中设置 SLEEPCHG 位 Settings:FET:FET Options:SLEEPCHG 、这将在睡眠模式下禁用 CHG FET。 中提到了这一点 第5.2.2节"高侧 NFET 驱动器" 概述到此结束 手动控制。

    此致、
    Alexis

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    嘿、Alexis、  

    所以,我尝试了示例代码,我用它创建了一个非常相似的代码,将运行在 ESP32。 监控  0x12 Battery Status (电池状态)  进入配置模式之前和之后的配置。 最后一位应指示器件是否处于配置模式始终保持为0。  

    我称之为  FET_ENABLE、但两个 FET 仍处于闭合状态。 警报状态寄存器返回  11011000000000。表示在 Safety Status B()或 Safety Status C()和 Safety Status A()中设置了位。 而这三个都返回0

    此致、  

    Adam  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是否也可能是硬件问题? 查看数据表和原理图、 我不确定第一个电芯的负极是否应该按照我在设计中的方式连接。 这可能会导致所有这些问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Adam、

    感谢您的耐心。  

    我不确定第一个单元的负极是否应该按照我设计中的方式连接

    你的 VC1连接看起来不错,我.  

    报警状态寄存器返回 11011000000

    由此、还表明 CHG/DSG FET 作为位5[XDSG]开启、并在 CHG/DSG FET 关断时设置6[XCHG]位。  

    您能否使用万用表检查 CHG 和 DSG 引脚电压、或者在为器件上电时获取它们的波形、然后写入 FET_EN?


    此致、
    Alexis  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 Alexis

    DSG 电压为0V、CHG 比 VC16电压低0.2V。 在编写命令后,使用下面的代码将它从 esp32 i2c 推送到芯片,它不会改变什么。 电压保持不变。 不过、我注意到 DSG 电压有时会增加到2V、但随后又会下降到0V。

    Wire.beginTransmission(0x08);               // I2C address (0x08)
    Wire.write(0x3E);                           // Subcommand register (0x00)
    Wire.write((byte)command & 0x00FF);         // LSB
    Wire.write((byte)(command >> 8) & 0x00FF);  // MSB
    Wire.endTransmission();
    delay(10);  // Short delay after sending

    此致、  

    Adam  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Adam:

    您可能需要将器件配置为禁用所有保护和永久失效、使 FET_EN=0且 PF_EN=0。  然后、在这种状态下、请确保通信正常工作、读取电芯电压、电流和温度、从而确保获得合理的数据。  您可以清除 AlarmStatus、然后确保您仍然没有收到任何安全警报、状态或 PF 警报或状态。  然后尝试使用 DSGTEST 和 CHGTEST 命令、查看是否可以强制打开 FET 驱动器。   

    谢谢、

    Terry