BQ76920---BMS电源管理芯片的数据采集
BMS电池系统应用于智能化管理维护各个电池单元,可以监控电池的状态,防止电池过充电或过放电,从而延长电池的使用寿命,在电动汽车、储能系统、无人机、电动工具等领域使用广泛。BMS电池系统可以通过各种通信接口与外部设备连接,如监控系统、充电桩等,实现数据的传输和管理,以支持对电池组的远程监控和管理。因此,我们可以将其接入工业智能网关,从而实现BMS储能系统的数据采集和远程监控,更好的监测管理电池状态。
简介
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) // 自动均衡控制
工作流程
- 初始化:配置BQ76920寄存器,设置保护参数
- 数据采集:循环采集电压、温度、电流数据
- 状态监测:检查各种保护条件
- 保护动作:根据异常状态开启/关闭充放电MOSFET
- 均衡控制:根据电压差异自动进行电池均衡
注意事项
- 硬件连接:需要正确连接GPIOE10引脚用于唤醒控制
- 电池配置:代码针对4串电池设计,但可采集5节电压
- I2C通信:使用CRC校验确保通信可靠性
- 热敏电阻:使用10kΩ NTC热敏电阻(B值3380)
- 采样电阻:电流检测电阻为4mΩ
潜在改进点
- SOC估算算法较为简单,可改用库仑计数法
- 可增加故障记录功能
- 可添加通信接口(如UART/CAN)与主机通信
- 均衡算法可进一步优化,避免相邻电池同时均衡
这套代码提供了一个完整的BMS基础框架,可根据具体应用需求进行修改和扩展。
为什么电池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. 验证计算公式和校准值
虽然可能性较小,但请再次确认您的电压计算公式和GAIN
、ADC_offset
值是否正确。
// 您的计算公式
batteryval1 = ((batteryval1 * GAIN) / 1000) + ADC_offset;
// 确认GAIN和ADC_offset的值在初始化时被正确计算和获取
void Get_offset(void) {
// ... 这个函数必须被正确调用
}
// 确保BQ76920_config()中调用了Get_offset()
总结与建议的行动步骤
- 首选方案:增加ADC采样延迟。修改
ADCGAIN1
寄存器的DELAY
位,将其设置为500µs或1000µs。这是最有效的方法。 - 辅助方案:调整软件采样顺序,在读取Bat1和Bat5前后插入短暂的延时(
delayus(500)
)。 - 硬件检查:确认Bat1和Bat5的滤波电容已正确焊接,且PCB布局没有受到干扰。
- 验证:用万用表实际测量Bat1和Bat5的真实电压,与代码读取的值进行对比,确认是哪个值不准(是偏高、偏低还是波动很大),这有助于判断问题方向。
绝大多数情况下,第一步【增加ADC延迟】就能解决问题。 请您先尝试修改初始化代码中的ADCGAIN1
配置。

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