[电池电源管理] 两轮车换电 BMS 的模拟前端中颖 SH367306 AFE 调试实录:两个关键问题与解决方案

[复制链接]
128|10
Haizangwang 发表于 2026-8-1 09:48 | 显示全部楼层 |阅读模式
SH367306 AFE 调试实录:两个关键问题与解决方案
本文基于量产 60V 20 串 BMS 代码,还原两个真实工程问题,每个都附代码级解决路径。

问题一:电流零点温漂 —— 产线标定一次不够吗?
现象
BMS 在常温(25°C)下校准完毕后电流精度很好(±50mA)。但样品放在高低温箱里测试时:

-20°C 时:0A 静止状态,电流读数约 -1.2A
60°C 时:0A 静止状态,电流读数约 +0.8A
这意味着低温下电池实际在休息,BMS 却判定"有 1.2A 放电电流",触发模式切换 和 SOC 累积误差。更糟的是,这个误差在不同板子上还不一样。

根因
SH367306 的 CADC 链路中有三个温漂源,其中 PGA 输入失调电压(Vos)的温漂是主因:



Vos 的温漂之所以严重,是因为它在信号进入 ADC 之前就被 PGA 放大了 200 倍。更隐蔽的是:零点会随芯片老化漂移(5-8 年寿命内可达 ±200mA),而且每次上电的零电流 ADC 值也不完全一样(±20mA 的随机差异)。产线标定一次、终身使用——三个维度的漂移都覆盖不了。

为什么不在产线标定零点
产线环境温度不可控——深圳夏天 35°C、冬天 15°C,标定的零点含不同量的温漂分量
产线上工装可能已连接负载,标定前提"零电流"不成立
占用产线节拍——AFE 上电后等振荡器稳定 + 首次采样 + 多次取均值,至少多 2 秒
而 BMS 每次上电天然满足零电流条件——固件 先强制关断 MOS,确保无电流通过了才学零点。

解决方案:每次上电自学习 + 温度补偿表
初始化(上电,T = T_init):
  自学习: Offset_raw = CADC 零电流输出 = O₂₅ + Δ(T_init)
  归一化: Offset₂₅ = Offset_raw + GetTheTempOffset(T_init)
         = O₂₅ + Δ(T_init) - Δ(T_init) = O₂₅  ← 温漂分量被消掉

运行时(T = T_cur):
  Corrected = CADC_raw - Offset₂₅ + GetTheTempOffset(T_cur)
            = CADC_raw - O₂₅ - Δ(T_cur)
  当零电流时 CADC_raw = O₂₅ + Δ(T_cur)
  → Corrected = 0 ✓


GetTheTempOffset(T) 是研发阶段高低温箱标定 10 块板子、取中位数得到的 13 点补偿表(-40°C 到 75°C)。片间温漂残差 < 50mA,所有板子共用同一张表。

为啥增益不每次标定、零点要每次学



两者的物理本质决定了对策:零点的漂移源是失调电压——受温度、老化、上电瞬态一切因素影响的模拟量,必须动态跟踪;增益的漂移源是电阻比值——受工艺和几何约束、几乎不受外部影响的数字量,产线一次标定即可。

问题二:Cell1 电压系统性偏低 —— B- 线上的"隐形电阻"
现象
同一电池包,用高精度万用表(Fluke 289,四线法)直接测量 Cell1 正负极,读数是 3.521V。但 BMS 显示的 Cell1 只有 3.498V,偏差 23mV。

而 Cell2~Cell20 的读数与万用表一致(偏差 < 5mV)。只有 Cell1 偏低,换了板子也一样。

根因
Cell1 是电池组的最负端电芯。它的负极直接连到 BMS 板的 B- 端子,中间经过了一段较长的导线(约 15-20cm)。

电池 Cell1 负极 ──── 长导线(≈20cm, ≈3mΩ) ──── BMS B- 端子 ──── 采样电阻(0.5mΩ) ──── GND
                                                    │
                                               AFE Cell1 采样点



B- 线是所有 20 串电芯电流的必经之路。30A 放电时,B- 线上 3mΩ 的阻抗产生 3mΩ × 30A = 90mV 的压降。AFE 采到的 Cell1 电压 = 真实电压 - B-线压降。Cell2 不受影响,因为 Cell2 的采样线不过大电流。

解决方案:固定系数补偿
B- 线压降与电流成正比,用"电流 × 等效阻抗"直接补偿(AfeIf_Calculate.c:219-226):

#ifdef BMP6020S20
CellVoltage[0] -= Current_mA × 50 / 100000;  // 0.50mV/A
#endif

#ifdef BMP6030S20
CellVoltage[0] -= Current_mA × 33 / 100000;  // 0.33mV/A
#endif



6020 电池包的 B- 线更细/更长,等效阻抗更大(0.50mV/A);6030 线更粗,只有 0.33mV/A。系数通过实验室不同电流下对比万用表实测值与 BMS 读数、线性拟合得到。

总结



两个问题的共同点:都不是芯片本身的 bug,而是物理世界的约束在数字域的投影——温漂是物理的,B- 线的铜阻抗是物理的。量产代码和开发板  demo 的区别就在于是否处理好了这些物理约束。

本文基于 STM32F072 + SH367306 × 2 两轮车换电 BMS 量产代码分析。
————————————————
版权声明:本文为CSDN博主「kebidaixu」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/kebidaixu/article/details/162612105

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
水星限定 发表于 2026-8-14 13:36 | 显示全部楼层
1. 电芯采样压差偏大:AFE 外围滤波电容阻值过高造成响应滞后,减小 RC 参数,补齐均衡驱动上拉电阻,修正采样偏差。
2. 过流保护误触发:采样电阻走线过长引入杂散压降,功率回路就近布线,调整 AFE 保护阈值寄存器,避免启停冲击电流误锁保护。
febgxu 发表于 2026-8-6 22:37 | 显示全部楼层
大功率放电时主回路大电流在PCB走线产生的地弹噪声,耦合进AFE的温度采样通道,导致NTC采样值虚高,误触发过温保护,换电站无法正常取电。
houjiakai 发表于 2026-8-7 22:29 | 显示全部楼层
将AFE的模拟地与功率地单点连接,温度采样回路的走线远离主功率大电流路径,软件加入温度变化率校验,1秒内温度跳变超过10℃直接判定为干扰,屏蔽误报,保留真实过温保护逻辑。
youtome 发表于 2026-8-8 19:41 | 显示全部楼层
SH367306 I2C通信故障如何排查?
10299823 发表于 2026-8-12 15:16 | 显示全部楼层
SH367306电流采集精度校准方法?
班杰明 发表于 2026-8-12 22:01 | 显示全部楼层
你这个问题我之前也遇到过,解决方法是采用温度补偿表,效果不错。记得校准表要在研发阶段就做好,片间差异要考虑进去。
uytyu 发表于 2026-8-14 13:55 | 显示全部楼层
BMS启动均衡后,部分电池单体均衡指示灯不亮,或均衡电流波动大,导致电池一致性差。
maqianqu 发表于 2026-8-14 16:46 | 显示全部楼层
在每串电芯采样引脚串联1kΩ限流电阻,搭配100nF滤波电容组成RC低通网络,同时开启AFE内置的硬件采样平均功能,软件对采样数据做3次滑动滤波,采样精度稳定在±5mV以内,插拔瞬间无异常跳变。
遗忘领域 发表于 2026-8-15 09:46 | 显示全部楼层
电流零点漂移问题,可以考虑加入软件算法进行温度补偿,提高精度。
cemaj 发表于 2026-8-20 08:52 | 显示全部楼层
换电BMS中AFE温度采集优化技巧?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

230

主题

613

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部
0