简介

BMS电池系统应用于智能化管理维护各个电池单元,可以监控电池的状态,防止电池过充电或过放电,从而延长电池的使用寿命,在电动汽车、储能系统、无人机、电动工具等领域使用广泛。
通过工业智能网关实现BMS电池系统的数据采集远程监控
BMS电池系统可以通过各种通信接口与外部设备连接,如监控系统、充电桩等,实现数据的传输和管理,以支持对电池组的远程监控和管理。因此,我们可以将其接入工业智能网关,从而实现BMS储能系统的数据采集和远程监控,更好的监测管理电池状态。
BMS综述
在这里插入图片描述

这是一套基于BQ76920/BQ76930电池监控芯片的电池管理系统(BMS)代码,用于管理一个4串锂离子电池组。以下是详细的中文分析:

代码概述

这套代码实现了一个完整的BMS解决方案,主要功能包括:

核心功能

  • 电压监测:监控最多5节电池的单体电压
  • 温度传感:通过热敏电阻监测电池温度
  • 电流监测:测量充电/放电电流
  • 保护功能:过压(OV)、欠压(UV)、过流(OC)、过温(OT)保护
  • 均衡功能:支持电池单体间的主动均衡
  • SOC估算:基于总电压的简单电量估算

关键数据结构

unsigned short Batteryval[50]; // 存储各种电池参数
unsigned short bat_1_val, bat_2_val, bat_3_val, bat_5_val; // 各单体电压值
float Tempval_1, Tempval_2; // 温度值
unsigned short charge_current; // 充电电流
int SOC; // 电量状态(0-100%)

保护机制

// 保护标志位
u8 OV_flag, UV_flag, OT_flag, OC_flag;

// 保护阈值
#define OVPThreshold  // 过压保护阈值
#define UVPThreshold  // 欠压保护阈值
// 过压: 4.15V, 欠压: 2.8V, 过流: 20-30A, 过温: 35°C

初始化配置

// BQ76920初始化寄存器配置
unsigned char BQ769_INITAdd[11] = {SYS_STAT, CELLBAL1, ...};
unsigned char BQ769_INITdata[11] = {0xFF, 0x00, 0x00, 0x18, 0x41, 0xff, 0xff, 0x00, 0x00, 0x00, 0x19};

主要功能模块

1. 电压采集

void Get_Battery1(void) // 采集第1节电池电压
void Get_Battery2(void) // 采集第2节电池电压
void Get_Battery3(void) // 采集第3节电池电压
void Get_Battery5(void) // 采集第5节电池电压

2. 温度采集

void Get_BQ1_1_Temp(void) // 采集温度传感器1
void Get_BQ1_2_Temp(void) // 采集温度传感器2

3. 电流采集

void Get_BQ_Current(void) // 采集充放电电流

4. 保护控制

void OV_UV_1_PROTECT(void)  // 过压欠压保护
void OCD_SCD_PROTECT(void)  // 过流/短路保护
void Only_Open_CHG(void)    // 仅开启充电
void Only_Close_CHG(void)   // 仅关闭充电
void Only_Open_DSG(void)    // 仅开启放电
void Only_Close_DSG(void)   // 仅关闭放电

5. 均衡控制

void Battery1_Balance(void) // 第1节电池均衡
// ... 其他电池均衡函数
void Cell_Balance(int Difference) // 自动均衡控制

工作流程

  1. 初始化:配置BQ76920寄存器,设置保护参数
  2. 数据采集:循环采集电压、温度、电流数据
  3. 状态监测:检查各种保护条件
  4. 保护动作:根据异常状态开启/关闭充放电MOSFET
  5. 均衡控制:根据电压差异自动进行电池均衡

注意事项

  1. 硬件连接:需要正确连接GPIOE10引脚用于唤醒控制
  2. 电池配置:代码针对4串电池设计,但可采集5节电压
  3. I2C通信:使用CRC校验确保通信可靠性
  4. 热敏电阻:使用10kΩ NTC热敏电阻(B值3380)
  5. 采样电阻:电流检测电阻为4mΩ

潜在改进点

  1. SOC估算算法较为简单,可改用库仑计数法
  2. 可增加故障记录功能
  3. 可添加通信接口(如UART/CAN)与主机通信
  4. 均衡算法可进一步优化,避免相邻电池同时均衡

这套代码提供了一个完整的BMS基础框架,可根据具体应用需求进行修改和扩展。



BQ769x0芯片的通信问题

为什么电池1和电池5的电压不对?

您好,电池1和电池5的电压读数不对,这是一个在BQ769x0应用中非常经典和常见的问题。根本原因在于芯片的测量架构和采样顺序

核心原因:芯片采样架构与"奇偶校验"

BQ76920/30使用一个多路复用器(MUX) 依次测量各个电芯电压。这个MUX在切换通道时,需要短暂的时间来稳定,否则就会测量到上一个通道的残留电压,导致串扰(Crosstalk)。

最关键的一点是:VC0(电池1)和 VC4(电池5)在采样序列中相邻。当MUX从VC0切换到VC1,或从VC4切换到VC3/VC5时,如果稳定时间不足,就会发生VC0和VC4的测量值相互干扰或干扰相邻通道的情况。

您代码中的采样顺序是:
VC0 (Bat1) -> VC1 (Bat2) -> VC2 (Bat3) -> ... -> VC4 (Bat5)
这个顺序恰恰让Bat1和Bat5处于最容易受到串扰的位置。


具体排查和解决方案

请按照以下步骤排查,大概率能解决问题:

1. 检查并增加ADC采样延迟(最可能的原因)

这是最常见的解决方法。BQ76920有一个配置寄存器(ADCGAIN1)可以设置通道切换后的延迟时间。

  • 根本原因:默认的延迟时间可能太短,MUX电压尚未稳定ADC就开始转换了。
  • 解决方案:在初始化配置中,增加MUX的稳定延迟。查看数据手册中关于ADCGAIN1寄存器的 DELAY 位( bit 1-0)。
    • 00 = 0 µs (默认)
    • 01 = 500 µs
    • 10 = 1000 µs
    • 11 = 2000 µs

修改您的初始化代码:

// 在BQ76920_config()函数中,找到配置ADCGAIN1的地方
// 将DELAY设置为至少500us或1ms。例如,设置為10 (1000µs):
// 假设原始配置是0x19,我们需要修改低2位
// 0x19的二进制是 0001 1001,修改低2位为10(1000µs): 0001 1010 -> 0x1A

unsigned char BQ769_INITdata[11] = {0xFF, 0x00, 0x00, 0x18, 0x41, 0xff, 0xff, 0x00, 0x00, 0x00, 0x1A}; // 最后一位由0x19改为0x1A

请务必查阅您使用的芯片数据手册,确认ADCGAIN1寄存器的地址和位定义。

2. 优化软件采样顺序(软件策略)

修改您的Get_Update_Data()函数中的采样顺序,避免连续读取容易串扰的通道。

修改前(有问题):

Get_Battery1(); // 读VC0
Get_Battery2(); // 紧接着读VC1 -> 容易对VC0造成干扰
Get_Battery3();
//Get_Battery4(); // 注释掉了
Get_Battery5(); // 读VC4 -> 如果之前是VC3,也可能有干扰

修改后(建议):

// 先读所有偶数或奇数通道,再读另一边,中间插入延迟
Get_Battery2(); // 先读VC1
Get_Battery3(); // 再读VC2
delayus(500);   // 插入一个小的延迟,让MUX稳定
Get_Battery1(); // 然后读VC0
delayus(500);
Get_Battery5(); // 最后读VC4

// 或者先读中间的电芯,再读两端的
Get_Battery3();
Get_Battery2();
delayus(500);
Get_Battery1();
delayus(500);
Get_Battery5();
3. 检查硬件(排除物理连接问题)
  • 平衡电路漏电:检查与Bat1和Bat5相连的平衡MOSFET(在BQ76920内部)或外围平衡电阻是否有轻微漏电或短路。
  • PCB布局:检查电池采样线(VC0, VC4)的PCB走线是否离噪声源(如开关电源、MCU的时钟线)太近,被耦合了噪声。
  • 滤波电容:确认在VC0-VSS和VC4-VC3之间是否按照数据手册推荐,连接了高质量的滤波电容(通常为100nF)。这个电容对稳定采样电压至关重要。
4. 验证计算公式和校准值

虽然可能性较小,但请再次确认您的电压计算公式和GAINADC_offset值是否正确。

// 您的计算公式
batteryval1 = ((batteryval1 * GAIN) / 1000) + ADC_offset;

// 确认GAIN和ADC_offset的值在初始化时被正确计算和获取
void Get_offset(void) {
    // ... 这个函数必须被正确调用
}
// 确保BQ76920_config()中调用了Get_offset()

总结与建议的行动步骤

  1. 首选方案增加ADC采样延迟。修改ADCGAIN1寄存器的DELAY位,将其设置为500µs或1000µs。这是最有效的方法。
  2. 辅助方案调整软件采样顺序,在读取Bat1和Bat5前后插入短暂的延时(delayus(500))。
  3. 硬件检查:确认Bat1和Bat5的滤波电容已正确焊接,且PCB布局没有受到干扰。
  4. 验证:用万用表实际测量Bat1和Bat5的真实电压,与代码读取的值进行对比,确认是哪个值不准(是偏高、偏低还是波动很大),这有助于判断问题方向。

绝大多数情况下,第一步【增加ADC延迟】就能解决问题。 请您先尝试修改初始化代码中的ADCGAIN1配置。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐