储能BMS量产踩坑实录:从电压采样漂移到SOC算法修正

本人所在团队(郑州金橙智能)长期从事新能源BMS产品研发,本文基于一个真实量产的16串铁锂储能BMS项目,整理了开发过程中遇到的几个典型技术问题及其解决方案。希望能给正在做BMS的朋友一些参考。

一、项目基本规格

先简单交代项目背景。这是一个家用储能BMS,电池包采用16串磷酸铁锂电芯(单节3.2V,总压51.2V),主要技术指标:

  • 单节电压采样精度:±3mV(常温),±5mV(全温 -20℃~60℃)
  • 电流采样精度:±1% FS(量程±100A)
  • SOC估算精度:≤5%(常温循环),≤8%(全温范围)
  • 被动均衡电流:100mA/节
  • 绝缘电阻检测范围:100kΩ~10MΩ,精度±10%
  • 通信接口:CAN(与PCS联动)、RS485(与EMS通信)、蓝牙(手机APP)

主控方案:AFE选用TI BQ79616,MCU采用STM32F103RET6,电流采样使用霍尔传感器(ACS724)。

以下按开发时序,分享三个最棘手的坑。

二、坑一:电压采样低温漂移超限

问题现象

常温下(25℃)所有单节电压精度均在±2mV以内,表现良好。但进入高低温测试后,-20℃环境下第3串和第12串的采样值出现明显的正偏移,最大漂移达到+12mV,远超±5mV的规格要求。更诡异的是,其他串的偏移量都在±3mV以内。

排查过程

第一步,排除AFE芯片本身。 TI BQ79616的手册给出增益误差温漂典型值±5ppm/℃,偏移误差温漂±1.5μV/℃。计算-20℃相对于25℃的偏移:45℃温差下,增益误差约0.0225%(可忽略),偏移误差约67.5μV(约0.0675mV)。理论值与实测12mV相差两个数量级,说明不是AFE本身的温漂问题。

第二步,检查外部电路。 电压采样链路:电芯正负极 -> 采样线(FPC) -> 共模滤波电路(100Ω+10nF) -> AFE内部ADC。示波器测量AFE输入引脚,在常温下看到约5mVpp的高频纹波,-20℃下纹波暴增到35mVpp,且频率与板载DC-DC(12V转3.3V)的开关频率(400kHz)完全一致。

第三步,定位干扰源。 逐一排查发现,第3串和第12串的采样线刚好从DC-DC功率电感的正下方穿过。常温下电感漏磁较小,低温下电感磁芯(铁氧体)的磁导率发生变化,漏感增加,辐射磁场增强,导致邻近的采样线耦合进共模噪声。由于差分走线在那一小段区域内因布线限制变成了非严格差分,共模噪声转化为差模干扰,直接被ADC采到。

解决方案

  1. 硬件改版(根本解决):调整PCB布局,将所有电压采样线彻底避开功率电感区域,并且全程采用紧耦合的差分对走线(间距≤0.5mm),在源端和AFE输入端各增加一级共模扼流圈(CMF2012系列)。
  2. 软件补偿(临时方案+冗余设计):在已生产的旧版PCB上,增加动态校准逻辑。利用AFE内部的开路检测通道(open wire detect)测量内部基准电压(2.5V),反推当前温度下的ADC偏移量,对异常串进行软件修正。修正后-20℃下精度恢复到±4mV以内。
  3. 均衡策略配合:被动均衡开启时,均衡电流会在采样电阻上产生压降(约10mV/100mA)。修改采样时序:所有均衡关闭后等待50ms(RC稳定时间),再启动电压采集。

最终新版PCB全温范围内电压精度稳定在±3.5mV,满足规格。

三、坑二:绝缘电阻检测的“负值”乌龙

问题现象

绝缘电阻检测采用经典的“不平衡电桥法”。在BMS上电后的第一次检测中,偶尔会出现绝缘电阻计算值为负数的异常情况(例如-500kΩ)。物理上绝缘电阻不可能为负,这明显是算法bug。

原理回顾

不平衡电桥法的基本原理:分别在电池包正极对地、负极对地注入两个不同阻值的采样电阻(通过光MOS开关切换),测量两个状态下正负极对地的分压,联立方程求解Rp(正极对地绝缘电阻)和Rn(负极对地绝缘电阻)。

简化公式:

  • 设状态1下测得正极对地电压Vp1、负极对地电压Vn1
  • 状态2下测得Vp2、Vn2
  • 已知采样电阻R1、R2(通常R1 != R2)
    则Rp和Rn可通过解方程组得到。

问题分析

负值出现的原因:在状态2切换后,由于Y电容(电池包正负极对地的EMC滤波电容,总容值可达数百nF)的存在,电压需要数十毫秒才能稳定到真实值。代码在切换后仅等待5ms就进行ADC采集,此时Vp2和Vn2处于过渡过程中,导致方程组无实数解(或解出负值)。

示波器观察:切换光MOS的瞬间,正极对地电压有一个指数充电过程,时间常数τ = (R_p||R_sample) * C_Y,C_Y约220nF,R_sample约100kΩ,τ≈22ms,稳定到1%需要约5τ=110ms。而代码只等了5ms,显然不够。

解决方案

  1. 调整采集时序:每次切换采样电阻后,等待150ms(覆盖5τ)再进行ADC采集。测试验证,绝缘电阻计算稳定且不再出现负值。
  2. 增加滤波算法:对连续三次的检测结果做中值滤波,剔除因继电器动作等瞬态干扰导致的异常值。
  3. 边界处理:当计算结果为负或大于10MΩ时,直接上报“绝缘正常”(>1MΩ视为正常),避免上报无意义数值。

附加收获

通过这个bug,我们重新审视了整个绝缘检测的功耗。长等待时间(150ms * 2次切换 = 300ms)加上每次检测前的放电过程,导致单次检测功耗较高(约50mA持续300ms)。后续在低功耗版本中改为“定时检测+事件触发”策略:正常休眠时每60分钟检测一次,当检测到绝缘电阻下降至500kΩ以下时,切换为连续监测模式。

四、坑三:SOC估算在磷酸铁锂平台上的“跳变”

问题现象

磷酸铁锂电池的电压平台非常平坦(3.2V~3.3V占整个容量的80%以上),单纯用电压法(查OCV表)估算SOC误差极大。我们采用的是“安时积分+电压修正”的经典方案。

问题出现在大电流放电后静置阶段。例如:电池以50A放电30分钟(放出25Ah),然后负载断开。安时积分显示的SOC为50%,静置1小时后,电池电压回升到3.28V,查OCV表对应的SOC为65%。按照修正逻辑,SOC会从50%瞬间跳变到65%,用户APP上看到一个陡峭的上升曲线,非常不专业。

原因分析

磷酸铁锂的OCV曲线在平台区非常平缓(斜率<0.1mV/%SOC),意味着电压回升15mV就会引起SOC估算15%的变化。但实际上,大电流放电后电压回升是极化电压消除的正常现象,并不代表电池真的充进了15%的电量。

解决方案

引入“极化电压模型”和“慢速修正”机制。

第一步,建立极化等效电路模型。 最简单的模型是一阶RC并联电路,串联在电池内阻之后。通过放电静置实验标定极化电容(C_p)和极化电阻(R_p)。实测该电芯参数:R_p≈5mΩ,C_p≈3kF(是的,法拉级,因为电化学极化时间常数很长)。

第二步,实时估算极化电压。 在放电过程中,根据电流和RC模型实时计算当前的极化电压V_p。真实开路电压OCV = 端电压V_t + 电流I * R_internal + V_p(放电时极化电压与电流同向)。

第三步,慢速修正SOC。 在静置阶段,不直接使用OCV查表得到的SOC覆盖安时积分值,而是采用PI调节器缓慢修正。修正速度设置为:最大每10分钟修正1%。这样,即使OCV查表显示65%,实际SOC也会从50%经过150分钟(约2.5小时)逐渐过渡到65%,既符合物理过程,也不会出现突变。

修正后的算法经过500次循环测试,稳态SOC误差控制在4%以内,且无明显跳变。

进一步优化

对于支持蓝牙或4G远程上报的应用,我们在云端增加了SOC校正服务:每次充电至满(充电电流<0.05C且电压达到3.65V)时,云端强制校准SOC为100%;放电至截止电压(2.5V)时校准为0%。这种“两端校准”大幅提升了长期使用的精度。

五、总结

BMS开发是一个典型的“软硬结合、理论+实验”的领域。上述三个问题,如果只看芯片手册或者理论公式,永远发现不了;但如果缺乏系统的工程思维,可能花几周也找不到根因。

几个小建议给正在做BMS的朋友:

  • 电压采样布线请像对待高速信号一样对待,差分+屏蔽+远离干扰源是铁律。
  • 绝缘检测务必考虑Y电容的影响,给足稳定时间。
  • 磷酸铁锂的SOC不要迷信OCV曲线,极化模型+慢速修正是成熟产品的标配。

最后,我们团队(郑州金橙智能)在BMS领域积累了从电动工具(110串)到储能(16128串)再到商用电动车(带4G Cat.1)的完整产品矩阵。每一个产品都经历了上述类似的踩坑、分析、解决的循环。如果你也对BMS底层技术感兴趣,欢迎交流。

本文所有数据均来自真实量产项目,已做脱敏处理。转载请注明出处。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐