ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

BMS如何“猜”出电池剩余电量?从原理到工程实践全解析

BMS如何“猜”出电池剩余电量?从原理到工程实践全解析 电量百分比不是测出来的BMS 如何“猜”还剩多少电我接触过不少做电池相关项目的朋友几乎每个人第一次听到这话时都会愣一下电量百分比不是测出来的那手机上那个数字、电动车上那个百分比是哪来的其实答案是——算出来的更准确地说是“猜”出来的。电压、电流、温度这些物理量可以被传感器直接测量唯独“还剩多少电”这个概念本身在电池内部没有对应的物理传感器只能靠BMS也就是电池管理系统根据可测的物理量建立模型、做估算。这篇文章我就把BMS“猜电”这个过程拆开讲透从底层原理到工程实现再到我自己实际项目中踩过的坑一次性说清楚。先说清楚这篇文章适合谁看。如果你是做BMS软硬件开发、储能系统集成、电动工具或两轮车电池方案选型的工程师那里面大部分内容可以直接落地。如果你只是好奇手机电量为什么时准时不灵也能看懂个大概因为估算电量的思路在所有电池应用领域是完全相通的差的只是精度和成本取舍。1. 先把结论摆在前面BMS 的“电量计”到底在干什么很多人有个误解觉得BMS里有一个专门测电量的传感器就像温度传感器测温度、压力传感器测压力那样直接读出一个数值。但这个类比从根上就是错的。电量不是电池内部的一种物理状态量而是描述电池在一段时间内充入或放出电荷总量的积分结果。电池内部存在的是化学势能、离子浓度分布、电极电位这些东西没有哪个端子能输出一个和“剩余电量”成正比的电平信号。1.1 能测的和不能测的界限在哪里BMS能直接测到的信号就四类单体电压、总电压、回路电流、温度。有些高端方案里还会加上压力、热失控气体浓度等安全监测量但那也属于辅助范畴不会直接参与电量估算。而SOC也就是荷电状态即State of Charge英文缩写也是大家日常说的“电量百分比”它定义的是当前剩余容量占电池满充容量的比例这个值本身没有任何传感器可以物理测量。打个比方你就能理解。你面前有一杯水想知道杯子里还有多少水最快的办法是拿个秤称一下总重量再减去空杯重量这是“直接测量”。但电池不行电池不是水的杯子它是化学反应容器化学反应进行到什么程度没有一个直观的物理指标。哪怕你把电压测到小数点后四位它和剩余电量的关系也不是一对一的这就是整个BMS估算问题最底层的困难所在。1.2 SOC和剩余容量的本质区别还有一个必须掰清楚的概念SOC和剩余容量。SOC是百分比是相对值它依赖两个参数——当前剩余容量和当前满充容量。同样剩10Ah的电量对一颗标称20Ah的电池来说SOC是50%对一颗因为老化已经衰减到15Ah的电池来说SOC就变成了66.7%。这就是为什么很多老设备换新电池之后电量百分比显示忽然变准了因为满充容量被重置了。BMS所谓的“猜电”一半是在估存量当前剩余容量另一半其实是在估变量满充容量。后者甚至比前者更容易被忽视也更影响长期使用体验。我把这个逻辑关系总结成一张表概念能否直接测量获取方式受什么因素影响单体电压能硬件采样内阻、电流、温度、SOC回路电流能分流器/霍尔传感器负载状态温度能NTC/热电偶环境、发热SOC不能软件估算上述所有量的历史积分满充容量(SOH相关)不能充放电过程辨识老化、温度、充放电倍率所以BMS的“电量计”本质上是一个软件算法模块它把一堆可测物理量输进去通过数学模型输出一个看起来像是直接测量出来的百分比。搞清楚了这层关系我们再往下聊“猜”的算法才不容易被绕晕。2. 三种主流“猜法”OCV查表、安时积分、卡尔曼滤波业界折腾了几十年主流的SOC估算方法归根结底就是三大门派开路电压法、库仑计数法安时积分法、卡尔曼滤波/状态观测器。再加上现在比较热门的机器学习方法本质上也是在这几种思路基础上做优化我放在后面单独讲。2.1 开路电压法——电池静置时的“秤”先说最简单也最物理直观的一种开路电压法。锂离子电池的正极和负极材料在一定SOC范围内化学势能变化和开路电压有明确的对应关系。把电池充满然后以很小的电流逐级放电每放掉5%或10%就停下来静置足够长时间记录下开路电压值就能得到一条OCV-SOC曲线。实际使用中BMS检测到电流接近零并持续一段时间后比如静置30分钟以上就认为电池已经达到电化学平衡状态此时直接拿电压值去查这条标定好的曲线反查得到SOC。这个方法的优点是简单、无累积误差缺点也很明显只能静置的时候用。只要回路里有电流极化效应会让端电压偏离开路电压而且偏离方向和大小与电流方向、大小、时间都有关这时候查表就完全失真了。2.2 库仑计数法——实时估算的主力军既然静置才能测那开车、打电话、跑负载的绝大多数时间怎么办靠库仑计数法也就是安时积分法。原理一句话就能讲完SOC的导数等于电流除以满充容量往里头做积分。电流为正即放电SOC下降电流为负即充电SOC上升。公式写出来就是SOC(t) SOC(t₀) - (∫I dt) / Q_full × 100%这个方法的本质是把电流传感器当成“流量计”统计通过电池的总电荷量。想起来是不是特别靠谱理论上电流测量够精准初始SOC够准积分就永远准。但现实有三个麻烦初始SOC需要其他手段给定电流传感器有零漂和增益误差积分本身会累积误差。传感器误差是最大的敌人。假设你用的分流器在常温下标定精度0.5%看着挺不错但温度漂移、老化、噪声、ADC量化误差叠加起来积分一天下来漂掉2%到3%的SOC是很正常的。这也是为什么纯安时积分方案在消费电子里还能凑合用在电动汽车BMS里绝对不敢单独用的原因。2.3 卡尔曼滤波与融合估算——从“猜”到“预测”卡尔曼滤波的思路和前面两种完全不一样。它不再纠结于某一个测量量而是建立一个电池等效电路模型比如常见的一阶或二阶RC模型把电池当成一个有“电压源内阻RC网络”的电路系统SOC是系统内部的一个状态变量。卡尔曼滤波每一轮做两步先根据上一时刻的状态和电流输入通过模型预测出当前的电压和SOC再拿预测电压和实际测量的端电压做比较误差值通过增益矩阵反过来修正SOC的预测值。用大白话说模型说“根据我的计算你现在应该剩70%”但量出来的端电压和模型预测的不一样那模型就承认自己偏了自动往电压告诉它的方向修一点。修多少取决于你对模型和传感器的信任程度这就是卡尔曼增益的本质。这个方法最大的价值是把OCV法“静置才准”和安时积分“动态才稳”的优点融合了起来动态过程中靠积分保持连续性和响应速度一旦电压信号里携带了和SOC相关的信息比如充放电末期电压快速变化模型就会自动利用这个信息来抑制积分误差的扩散。我把三种主流算法做了个对比方便实际选型对比维度开路电压法库仑计数法卡尔曼滤波实时性仅静置实时实时累积误差无严重可通过量测修正标定工作量大小中等算力要求极低极低中等模型依赖OCV曲线电流精度等效电路模型精度典型场景储能待机、BMS上电初始值两轮车、电动工具电动汽车、储能PCS实话说当前量产的电动汽车BMS基本不会只用其中一种都是“以安时积分为主OCV和电压模型做在线修正”的组合方案。算法架构没有门派之争能解决问题才是真的。3. 同一个电池为什么昨天准今天就不准了就算你把算法选得再好实际装车之后还是会出现“昨天还是30%今天开机变成5%”这种怪事。这不是算法不行是电池本身充满了“变量”。我把自己踩过的坑归拢了一下最影响估算精度的外部因素就这几类。3.1 温度对“猜测”的干扰充电量随温度漂移先说最让人头疼的温度。锂电池的活性随温度变化非常剧烈同一个电流在零下10℃和35℃时能够实际充入电池的电荷量完全不一样。低温下正负极材料的锂离子扩散系数下降电池能“吞”下的有效电荷变少表现出来就是按安时积分计算的SOC在上升但一旦温度升回来端电压掉得很快用户感觉“虚电”严重。有一个必须特别注意的点低温充电时BMS计算出的充电电量并不等于电池真正储存下来的化学能。一部分电荷用于驱动负极析锂等副反应并没有参与可逆的储能过程。如果BMS无视这一点简单把充入电流积分全部算作SOC增加那低温充满后放出来的电量一定对不上。合理做法是引入温度修正系数。根据电芯在不同温度下的可用容量标定表对积分容量或OCV曲线做平移修正。有些保守的BMS策略还会在低温充电时主动降低目标SOC上限宁可少充一点也不让估算失真太严重。3.2 老化带来的双重困境容量衰减和内阻升高电池老了之后会出现两个变化满充容量变小内阻变大。内阻变大意味着同样电流下极化电压更大端电压更容易“虚高”或“虚低”这直接影响OCV查表和电压修正的准确性。举一个实际遇到的例子。一台用了两年多的电动自行车电池在满电静置一夜后显示100%开车出门几百米电量就猛地跳到85%。拆下来做完整放电测试发现电池实际满充容量已经衰减到标称的70%了。问题出在BMS里的满充容量一直是出厂初始值没有更新。它按20Ah算SOC但电池实际只有14Ah每次骑行放掉同样的Ah数换算出来的SOC偏移越来越大。这就引出一个行业内的共识SOC估算必须与SOH健康状态估算联动。满充容量不能一直写成出厂标称值要通过完整充放电过程、充电容量积分、甚至云端数据回传等方式在线更新。满充容量准了SOC才具备长期谈得准的基础。3.3 自放电、滞回特性与动态负载这些“隐形变量”还有一个特别容易被低估的是自放电。锂电池自放电率通常在每月2%到5%之间听起来不高但对一个长期存储在仓库里的设备来说半年下来自放电累计可能超过15%。如果BMS只靠安时积分从出厂到用户手上这段时间完全无记录那开机时的SOC就是纯猜可能偏差巨大。这也是正规厂商在出厂前会做一次完整充放电并写入初始SOC的原因。再说滞回特性这个更微妙。磷酸铁锂电池充电时的OCV曲线和放电时的OCV曲线并不重合中间存在一个电压滞回环。在OCV平台区铁锂电池的电压变化极小从20%到80%可能电压只差几十毫伏任何采样噪声都会让电压法彻底失效。这就是为什么磷酸铁锂系统的BMS在静置时不准、得靠安时积分和定期校准的原因。动态负载的影响也很直接。你高速踩电门的时候电流上百安电池内阻上的压降IR drop直接把端电压拉低几百毫伏这时候如果BMS用当前电压去查OCV曲线会得出一个明显偏低的SOC。性能好的BMS会做动态补偿用电流和已辨识的内阻反推静置等效电压但简单方案通常不会处理这个问题表现为“一加速电量掉好几格”。4. 真实项目里我是怎么设计一套“能落地”的电量估算策略的前面聊了这么多理论这一节我把我在一个实际储能BMS项目中做的SOC估算策略完整拆出来给大家一条可以直接参考的技术路线。这套方案不算行业最顶级的但胜在工程上可落地、好调试、成本可控适合大多数需要自研BMS的团队。4.1 第一步先标定OCV-SOC曲线别急着写代码很多团队一上来就调卡尔曼库结果模型参数拍脑袋定最后估算精度差得离谱还找不着原因。我的经验是算法框架可以后选但OCV曲线必须先用实验做扎实。具体做法分三步。第一步把电芯在25℃恒温箱里用0.33C即大约3小时充放完的标准电流完整充放三次让电芯容量激活稳定。第二步以0.05C的小电流把电芯从0%充电到100%整个充电过程视为准静态过程因为电流极小、极化极小此时记录电压-容量变化曲线基本可以当作电芯的平衡OCV-SOC关系。第三步再以0.05C放电一遍获得两条曲线取平均作为最终的标定曲线。这里有一个经验值可以分享OCV曲线的采样点不能平均分布在SOC低段0%-10%和高段90%-100%需要加密采样因为这两段电压随SOC变化最陡峭插值误差在这两个区间会被放大。中段平台区可以稀疏一些反正电压也几乎不变。4.2 第二步把安时积分做成“闭环”而非“开环”光有安时积分还不够必须给它加反馈修正。我在这套设计里做了三重修正机制。首先是静置修正。BMS一旦检测到电流绝对值小于某个阈值比如0.5A并持续超过30分钟就把当前的端电压当作近似OCV去查标准曲线得到一个参考SOC。如果这个参考值和当前积分的SOC偏差超过一定范围比如3%就触发修正。修正不是立刻跳变而是设定一个渐变时间窗口在30秒内把积分值向参考值平滑拉拢避免用户看到电量忽然跳变。其次是满充修正。每次充电过程中一旦检测到充电电流下降到接近截止电流比如0.05C同时电压达到充电截止电压就判定电池充满强制把SOC置为100%并顺便把这个周期内累计充入的Ah数记下来。连续记录几次之后可以用来更新估算的满充容量这相当于在后台不停校准SOH。第三是电压范围修正。上电的时候如果电池组静置时间不够不满足静置阈值就不允许用OCV查表直接用上次下电时存储的SOC作为初始值再叠加本次积分。这里涉及掉电存储策略我后文单独讲。4.3 第三步确定校准时机避免“为了校准反而引入误差”“什么时候校准”这个决策往往比“用什么算法”更能决定最终精度。我自己踩过一个坑为了追求实时修正把静置判定阈值设成了10分钟结果电池在负载切换的短暂间歇被误判为静置把正在放电过程中偏低的极化电压当成OCV去查表直接把SOC从40%修正到了35%。这个跳变不但让用户困惑还让上层的均衡策略误以为某个电芯落后触发了无效均衡。从那以后我把静置判定逻辑改成了双重条件电流持续低于阈值超过30分钟且单体电压变化率在最后10分钟内低于每分钟0.5mV。只有两个条件同时满足才允许进入OCV修正。宁可少修正几次也不要引入错误修正。充电末端的修正窗口也需要注意。恒压充电阶段电压保持不变但电流呈指数规律下降等到电流衰减到截止电流附近再触发满充修正这个判断基本是可靠的。但如果是脉冲充电或者没有恒压阶段的充电策略就不能用这个条件需要换成固定容量积分法即记录从某个电压点到截止的累计充入容量再对比标定表来修正SOC。4.4 第四步掉电存储与异常状态兜底BMS的应用场景很多都有长时间休眠需求比如电池包放在仓库、电动工具闲置几个月。休眠期间BMS不工作SOC保存在Flash或EEPROM里。问题在于电池自放电依然在进行哪怕电流为零实际SOC也在缓慢下降。我的做法是休眠期间定时唤醒比如每24小时唤醒一次快速测量一次单体电压并记录到存储区。等到真正上电时先读取存储的SOC再根据休眠期间的电压变化趋势做修正补偿。如果检测到的电压和存储的SOC严重不匹配则放弃存储值重新进入完整估算流程。异常状态兜底也很重要。如果单体电压采样异常、电流传感器故障、温度超限这时候计算SOC没有意义因为所有输入都不可信。正确做法是显示“电量未知”或按照预设的安全策略限制功率而不是硬给一个大概率错误的百分比。反正我看过不少项目故障时还在傻傻地显示电量用户带着错信息开车风险太大了。5. 进阶玩法单体级建模、云端协同与大数据回传如果你的项目对电量精度有更高要求比如乘用车长续航估算、储能电站收益预测那前面说的这套离线标定在线修正的方案还不够。近几年行业里开始大规模应用更细粒度的建模和云边协同架构简单介绍一下我的理解。5.1 从单体到系统电池包级估算的难点我一直强调一个容易被忽略的点我们平时说的“电池电量”在实际工程中其实是整个电池包的SOC。但是传感器感知的是每一颗串联电芯的电压电流是流经所有电芯的同一回路电流。不同电芯因为温度不均、自放电率差异、内阻不一致在同一时刻的SOC并不完全一致。电池包SOC怎么定义很多方案直接取所有单体SOC的平均值。这是最简单的做法但不合理。更合理的做法是先做单体间均衡让所有电芯尽量保持一致然后以最弱单体为约束基准来定义系统SOC。换句话说系统显示的电量 当前最低SOC单体的可用容量 / 系统总容量。这样用户在低电量时获得的提示更保守不会出现“显示还有10%结果某些单体已经过放”的情况。我见过不少实际故障电池包总电压看起来还有剩余容量但由于个别电芯自放电偏大其SOC远低于平均值持续放电过程中该电芯最先触底保护板强制切断输出。用户看到的结果就是“电量还剩30%突然断电”。要从根本上缓解这个问题就要把系统SOC定义为最低单体SOC的函数而不是简单平均。5.2 云端SoH估算与模型在线更新传统BMS受限于MCU算力和存储SOC估算用的电池模型参数终身固定。但电池不是一成不变的老化路径、日历衰减、工况分布都会让模型逐渐失准。近几年的趋势是引入云端电池管理BMS实时上传工况数据电流、电压、温度、SOC轨迹云端对每一个电芯建立数字孪生模型定期把更新后的模型参数如内阻、容量衰减系数、OCV曲线修正量回传到BMS。这个思路的应用场景很大。比如换电模式下的共享电池每一块电池的充电习惯、放电深度、使用环境完全不同如果都用同一套预设参数估算误差一定会被不断放大。云端可以根据每块电池的历史数据单独建模下一次电池归还充电时自动下发最新模型参数从而让SOC估算始终贴合每块电池的真实状态。我这个项目虽然没有做这么重的云平台但也尝试了一个轻量的做法BMS本地保存近200次完整充放电的容量记录用线性回归估算容量衰减趋势作为满充容量的辅助更新依据。实测下来这个做法对老化的跟踪效果比单纯依靠满充修正更平滑不会因为某一次异常充电记录造成容量值抖动。如果你不想引入云端架构也可以参考这个思路。5.3 机器学习算法什么时候有用什么时候是噱头最后说说机器学习。这几年有不少论文和方案用神经网络、支持向量回归来做SOC估算。我的观点是机器学习在数据丰富、计算资源充足的场景下确实有优势比如云端对大规模电池包做健康度排序它可以捕捉到传统模型难以表达的复杂非线性关系。但本地BMS上跑神经网络的性价比仍然很低。一方面MCU算力和Flash有限一个像样的SOC估算网络动辄需要几MB模型存储和大量浮点运算成本上划不来另一方面绝大多数工况下一个精心调参的等效电路模型卡尔曼滤波已经能达到95%以上的估算精度尺寸、成本和可靠性都远优于神经网络。如果非要尝试机器学习我建议把它用在离线标定或云端优化上而不是塞进每台设备本地跑。比如用大量历史数据训练一个SOC误差补偿模型输入是当前工况的统计特征平均电流、温度、SOC区间输出是一个修正量然后把这个修正量固化为一张查表轻量回传本地。这样既享受了机器学习的建模能力又避开了算力和成本问题。关于BMS怎么“猜”电量的内容差不多就讲到这里。如果你正在设计一套BMS方案我的建议是第一优先级永远是做好基础的数据采集质量包括电流零漂校准、电压采样同步、温度探头的位置布局这些环节出一点差错再牛的算法也救不回来。算法只是锦上添花数据采集才是BMS估算电量真正的底线。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进