简介:电动汽车BMS(电池管理系统)核心技术资料,围绕SOH(健康状态)与SOP(功率状态)两大关键指标,系统梳理现有估算策略。内容涵盖基于耐久性模型的开环方法、基于电池模型的闭环方法(RLS、KF)、基于OCV的SOH估算,以及基于模型和内阻的SOP估算,并进一步介绍卡尔曼滤波双时间尺度与多时间尺度联合估算法,对比不同方法的适用条件与优缺点。资源为1个docx文档,压缩包大小787KB,结构清晰,适合从事BMS算法开发、动力电池管理的工程师,以及车辆工程、电化学相关专业学生作为入门与方案选型参考。目前已有3661人学习下载,实用价值较高。
1. 从一份 BMS 估算策略总结开始:先搞懂 SOH 和 SOP 到底卡在哪
做 BMS 的同行应该都有这种感觉:SOC 的算法讨论最多,但真正让整车性能和电池寿命落地的其实是 SOH 和 SOP。SOH 告诉你有多少容量还能用,SOP 告诉你此刻还能灌进去或者抽出来多大功率。两者一旦估不准,SOC 跟着偏,整车功率限制也跟着乱,结果就是该限功率的时候没限、能跑的时候又跑不动。这份关于“电动汽车BMS中SOH和SOP估算策略总结”的文档把两类估算方法按开环、闭环、模型、数据驱动做了拆解,还附了 HPPC 测试的具体步骤和 SOH 内阻线性模型。对刚接手 BMS 算法开发的工程师来说,它能帮你快速建立方法坐标系;对已经在调参的人,里面的特征参数提取和多时间尺度联合估计思路,也能提供不少可落地的参考。
2. SOH 估算策略:从耐久性模型到闭环辨识,三类方法怎么选
2.1 先定标准:SOH 的数学定义与更换阈值
SOH 的定义本身并不复杂。IEEE 标准 1188-1996 里规定,动力电池容量下降到初始容量的 80% 时就应该考虑更换。纯电动汽车场景下,通常只关注容量衰减,SOH 表达式写为:
SOH = (C_standard - C_fade) / C_standard × 100%
其中 C_fade 是已损失容量,C_standard 是标称容量。这个式子看着简单,但在工程实现里有一个容易被忽略的地方:C_fade 不是一个可以直接测到的量,它必须通过某种方式从电流电压数据里反推。你拿一个满充容量测试去做离线标定是准的,但车规级 BMS 不可能经常做完整充放电,所以 SOH 估计的核心问题不是公式怎么选,而是 C_fade 怎么在日常运行中持续获得更新。
实际项目中,我看到很多团队在 SOH 校准上过度依赖满充点。一旦用户长期不充满,SOH 的估计值就会慢慢漂移,直到下一次完整充电才被拉回来。这种“阶梯式校正”在运营车场景下问题不大,但在私家车上会直接影响剩余的显示里程和用户对电池健康的判断。
2.2 开环耐久性模型:从电化学机理出发推算容量损失
基于耐久性模型的开环方法,是通过对电池内部物理化学反应的特性分析来直接预测容量衰减和内阻变化。这类模型通常会描述固体电解质膜电阻的增长、电池端子电压的增加,以及活性锂离子的损失过程。它把电池衰退当作一个与时间、温度、充放电倍率相关的累积过程来处理,典型的形式包括以 Arrhenius 公式描述温度加速效应,再配合循环次数或者安时吞吐量来推算容量损失。
这类方法的优势在于计算开销极小,不需要在线辨识,适合嵌入在 BMS 的低算力 MCU 上做参考值。但它的短板也非常明显:开环意味着没有反馈校正,如果实际使用工况偏离了建模时的假设(比如长期快充、频繁低温充电),模型误差会单向累积,而且无法从端电压的实测值中吸收修正信息。所以我一般建议把它用作 SOH 的粗估计上限或者下限参考,而不是唯一的估计结果。真正要让 SOH 在整车生命周期内保持可靠,还是要靠闭环方法。
2.3 闭环估计:OCV 法、内阻法与卡尔曼滤波多时间尺度融合
闭环方法的核心思路是引入实测反馈来修正模型预测,常见的手段包括递推最小二乘(RLS)和卡尔曼滤波(KF)族算法。文档里重点讨论了基于 OCV 的 SOH 估计方法,这一类又可以分成固定 OCV 与变化 OCV 两个派别。
固定 OCV 派的理论基础是:电池在不同老化程度下的 OCV-SOC 曲线形状变化并不明显,也就是说在相当长的寿命周期内,OCV 与 SOC 的对应关系基本保持稳定。基于这个假设,可以通过计算相同 OCV 区间内电池电量的变化来估计当前容量,进而推算 SOH。这个方法的工程实现相对简单:在电池静置足够长时间后取得稳定的端电压值,再结合 OCV-SOC 查表换算出当前 SOC 的变化量,配合安时积分得出容量变化。
但理论研究也指出了这条路的边界:OCV 曲线并非完全一成不变,只有在 SOC 较高、曲线斜率较大且 SOC 与 OCV 呈明显线性关系的区间,才能忽略老化对 OCV 曲线的影响。换句话说,SOC 高端部分的估算可信度更高。此外,OCV-SOC 关系受温度影响非常明显,在低温环境下直接套用常温标定的 OCV 表,SOH 误差可以拉到 5% 以上。
基于电池内阻的 SOH 估计方法则是利用容量衰减伴随内阻增长的规律,通过在线辨识内阻来间接推断 SOH。文档给出的实现路径是:考虑车用阶段的容量损失过程,结合电池工作温度与内阻机理模型,配合内阻在线辨识技术,实现宽温度范围下的 SOH 估计。这个方法在低温场景下尤其有用,因为内阻随温度的变化规律相对可建模,不像容量那样需要依赖满充校准。
SOH 和 SOC 的多时间尺度联合估计也值得一提。文档描述了两种途径:一种是在一阶或二阶 RC 模型基础上,用 RLS 识别出标称参数对 SOC 的依赖性,然后一个时间尺度的观测器实时估算 SOC,另一个离线估算 SOH;另一种则是建立 SOC 与 SOH 联合估算的集总参数模型,用宏观尺度估计 SOH、微观尺度估计 SOC,通过两个估算器和多尺度融合理论整合不同时间尺度的测量信息。
从工程实现角度看,多时间尺度的价值在于:SOC 是秒级变化的快变量,SOH 是月度甚至季度级的慢变量,用同一个滤波器去同时跟踪这两个量,会导致滤波带宽无法同时满足响应速度和稳定性。把两者拆到不同时间尺度上,宏观估算器可以做得更平滑,微观估算器则保持快速响应,这在 NEDC 工况下的测试结果中体现出更高的估算精度和收敛速度。
2.4 SOH 估算方法的横向对比
| 方法类别 | 实现复杂度 | 在线能力 | 典型误差 | 适用场景 |
|---|---|---|---|---|
| 耐久性开环模型 | 低 | 可在线但无反馈 | 长期累积漂移 | 参考值 / 下限判断 |
| OCV-SOC 法 | 低-中 | 需静置条件 | 受温度与区间影响 | 充电结束后的校正 |
| 内阻法 | 中 | 可在线辨识 | 需温度补偿 | 宽温度范围工况 |
| 多时间尺度联合估计 | 高 | 完整在线 | 收敛快精度高 | 整车全生命周期 |
3. SOP 估计策略:HPPC 测试与多参数约束的工程落地
3.1 SOP 的定义与估算难点
SOP(State of Power)描述的是电池的功率状态,通常以短时峰值功率来表示。车辆起步、加速、能量回收这些场景下,电池需要瞬时输出或吸收大功率,而 BMS 必须提前知道电池能承受的峰值功率上限。估算得过保守,整车动力性受限,加速无力;估算得过激进,可能导致电池端电压跌破截止值或者析锂,直接危及安全和寿命。
SOP 的难点在于它是一个隐性状态量,没有直接传感器,只能通过模型和约束条件推算。文档把 SOP 估算方法分成三大类:复合脉冲法(最广泛应用)、非参数模型(黑箱/机器学习)、多参数联合约束法。三者的定位差异非常大,我在实际项目里的使用经验是:HPPC 法用来做标定基准,多参数约束法做在线实时估计,黑箱模型更适合离线优化和策略制定。
3.2 HPPC 测试流程与峰值功率计算
HPPC(混合脉冲功率特性)测试法是目前业内最普及的 SOP 标定方法,原理并不复杂:在电池某个 SOC 点施加 t 秒的脉冲电流,记录电压响应,用电压变化与电流的关系算出内阻,再结合下限电压反算峰值功率。
文档给出的测试步骤非常完整,值得直接抄作业:
- 用 CCCV 方法将电池充电至满电状态
- 用 CC 法放电至某一 SOC 点
- 静置 1 小时
- 脉冲电流放电 10s,静置 40s,脉冲电流充电 10s
- 从 SOC 90% 到 10%,每间隔 10% SOC 重复步骤 2-4,共九次
为什么选 t=10s?文档引用了统计数据:城市工况下急加速持续约 10s,高速工况约 25s;紧急制动在城市和高速工况下分别约 5-10s 和 33s。考虑到实际应用的覆盖面,取 10s 作为 SOP 的脉冲窗口是比较平衡的选择。
计算过程方面,放电内阻的公式为:
R_dis = (OCV_dis - V_min) / I_dis
其中 OCV_dis 是放电脉冲开始前的开路电压,V_min 是电池下限电压,I_dis 是放电脉冲电流。峰值功率则按下式计算:
P = V_min × I_dis = V_min × (OCV_dis - V_min) / R_dis
把这个过程写成可复用的 Python 脚本,方便处理实验数据:
import numpy as np def calc_hppc_power(ocv, v_min, i_dis, soc, r_adj=None, temp=25): """ 计算 HPPC 10s 峰值放电功率 :param ocv: 放电脉冲前的开路电压, V :param v_min: 电池下限电压, V :param i_dis: 放电脉冲电流, A (正值) :param soc: 当前 SOC, % :param r_adj: 温度修正后的内阻, 欧姆; None 则用电压差直接算 :param temp: 电池温度, ℃ :return: 峰值功率 P, W """ if r_adj is None: r_dis = (ocv - v_min) / i_dis else: r_dis = r_adj p_peak = v_min * (ocv - v_min) / r_dis print(f"SOC={soc}%, OCV={ocv:.3f}V, Vmin={v_min:.3f}V, R_dis={r_dis:.4f}Ω, P_peak={p_peak:.2f}W") return p_peak # 示例:SOC=50%, OCV=3.85V, 下限电压2.7V, 放电电流100A calc_hppc_power(ocv=3.85, v_min=2.7, i_dis=100, soc=50)这段代码里,r_dis 的计算有两种路径:如果不传 r_adj,就直接用电压差除以电流来算内阻,这样的好处是每个 SOC 点上的内阻是实测值,不依赖模型假设;如果传入了 r_adj,则是把温度修正或老化的修正内阻引进来,模拟在线 BMS 中实时更新的内阻值。参数 i_dis 需要根据电池规格书的倍率能力来定,我见过不少项目直接用 1C 来做 HPPC 脉冲,这在功率型电池上会偏保守,在能量型电池上则可能超出真实能力边界。
3.3 温度修正与多维约束下的功率推算
HPPC 法在单一温度点上做标定是不够的,整车上的电池工作温度跨度可能从 -20℃ 到 50℃。文档给出的温度修正公式体现了 SOP 参数模型的核心思想:
P_adj = f(SOC, R_adj, T)
公式里,3.0 是电池下限电压,SOC、内阻 Radj 和温度 T 为模型输入,峰值功率 P_adj 为模型输出。这个形式意味着:SOP 估计本质上是把 HPPC 标定结果扩展为一个以 SOC、内阻、温度为自变量的三维查表模型。在实际部署中,我一般会在不同温度点(-20℃、-10℃、0℃、10℃、25℃、40℃)分别做 HPPC 标定,然后对 Radj 做温度插值。
但 HPPC 法有一个显著的盲区:它只用电压和内阻两个约束来确定峰值功率,没有显式考虑 SOC 边界和电流阈值。文档明确指出,这样估计出来的峰值功率会偏大。原因很直观:在 SOC 很低的时候,即使电压约束允许更大的放电电流,SOC 本身可能在 10s 内就耗尽;在 SOC 很高的时候,回馈功率受限的也是 SOC 上限而非电压。
3.4 多参数联合约束的 SOP 估计思路与边界
针对 HPPC 法的不足,文档介绍了多参数联合约束法。它的核心思想是在估算 10s 持续峰值功率时,同时考虑电压约束、电流约束和 SOC 约束,取三者中的最严限制。
实现步骤大致是:先基于 SOC 约束估计最大充放电电流,再基于电池电压约束估计最大充放电电流,然后用二分查找算法寻找同时满足所有约束的最大功率值。二分查找在这里的作用是解决功率与电流、电压之间的非线性耦合关系——功率本身是电流乘以电压,而电压又随电流动态变化,直接求解困难,二分法可以稳定收敛。
这个方法在理论上确实比 HPPC 更完备,但文档作者也表达了自己的疑虑:实用性和可靠性尚值得商榷。我的理解是,多参数联合约束法的主要挑战在于约束条件本身也需要准确建模。SOC 约束依赖于 SOC 估计的准确性,而 SOC 在高动态工况下的误差本身就很难控制在 2% 以内;电压约束依赖于等效电路模型参数的实时精度,这又回到参数辨识的老问题。所以这套方法在仿真环境里跑得很好看,到了实车上反而会由于约束条件互相对抗而出现功率跳变。相比之下,HPPC 标定加温度插值的方案虽然粗糙,至少输出是稳定的,整车控制不会因为 SOP 的抖动而出现功率震荡。
4. SOH 与 SOC 联合估计:双时间尺度滤波器的工程落地
4.1 为什么要把 SOC 和 SOH 放到同一个框架里
SOH 和 SOC 的联合估计在工程上的必要性来自一个耦合关系:SOC 的准确估计依赖电池模型的当前容量值,而容量恰恰是 SOH 的核心定义量。如果 SOH 不准,模型里的总容量就偏了,安时积分法得到的 SOC 也跟着偏;反过来,SOC 不准,OCV 查表和内阻辨识的可信度都会下降,SOH 的估计又失去了输入。这种互为条件的耦合关系是分开估计很难收敛的根源。
文档里给出了两种多时间尺度联合估计的技术路径,它们的共同策略是把快变量和慢变量拆到不同的时间尺度上处理。
4.2 双时间尺度实现的两种途径对比
第一种途径基于一阶或二阶 RC 等效电路模型。它的做法是:先确定标称模型参数对 SOC 的依赖性,也就是建立不同 SOC 点上的 RC 参数表;然后用递推最小二乘法在运行中辨识当前参数;再在电池 SOH 的基础上对标称模型的性能退化进行量化;最后部署两个观测器——一个实时估算 SOC,另一个离线估算 SOH。离线估算 SOH 的观测器会持续评估模型精度退化程度,并据此决定 SOH 观测器应该以多长的时间尺度来更新。
第二种途径更进一步,把等效电路模型与可用容量的变化联系起来,建立一个 SOC 与 SOH 联合估算的集总参数模型。在这个框架下,宏观尺度负责 SOH 的更新,微观尺度负责 SOC 的实时估算,两个估算器通过多尺度估算理论整合不同时间尺度的测量信息。NEDC 工况下的验证结果表明,这种方案在估算精度和收敛速度上都有明显优势。
4.3 卡尔曼滤波参数配置实例
以一个带有双扩展卡尔曼滤波(DEKF)的实际 BMS 项目为例,我在参数配置上的一般做法如下。微观时间尺度(SOC 更新)运行在 10ms 到 100ms 的控制循环内,过程噪声 Q 取 1e-4,测量噪声 R 取 1e-2,这个组合在电流突变时能保持较好的跟随速度。宏观时间尺度(SOH 更新)运行在 60s 到 300s 的周期上,Q 取 1e-6,R 取 1e-3,对应容量变化的缓慢特性。
import numpy as np class DualTimeScaleEKF: """ 双时间尺度扩展卡尔曼滤波示例 micro_scale: SOC 实时估计 macro_scale: SOH 缓慢更新 """ def __init__(self): # 微观尺度: SOC 估计 self.soc = 0.5 # 初始 SOC self.Q_micro = 1e-4 # SOC 过程噪声 self.R_micro = 1e-2 # 电压测量噪声 # 宏观尺度: SOH 估计 self.soh = 1.0 # 初始 SOH = 100% self.Q_macro = 1e-6 # SOH 过程噪声 self.R_macro = 1e-3 # SOH 测量噪声 def update_soc(self, current, voltage, dt=0.1): """微观时间尺度 SOC 更新,电流积分+电压修正""" capacity = self.soh * 60.0 # 假设标称容量 60Ah soc_pred = self.soc + current * dt / capacity # 简化实现:以端电压误差作为修正量 v_pred = self._voltage_model(soc_pred, current) gain = self.Q_micro / (self.Q_micro + self.R_micro) self.soc = soc_pred + gain * (voltage - v_pred) return self.soc def update_soh(self, capacity_measured): """宏观时间尺度 SOH 更新""" if capacity_measured > 0: self.soh = capacity_measured / 60.0 return self.soh def _voltage_model(self, soc, current): """简化的 OCV + 内阻模型""" return 3.2 + 0.4 * soc + current * 0.02这段代码里,关键参数有两个:Q_micro 和 R_micro 的比值决定了卡尔曼增益,也就是 SOC 修正的步长。Q 远小于 R 时,滤波器更信任模型,响应慢但平滑;Q 和 R 接近时,滤波器会更激进地跟随电压测量值,响应快但容易受噪声干扰。实际调试中,我会先拿 HPPC 数据做离线仿真,调整 Q/R 比值使 SOC 误差收敛到 2% 以内,再上到实车验证。另外注意 update_soh 里用的容量值,在实车上通常来自一次完整充电的安时积分结果,或者长期数据累计后的容量拟合值。
代码里的 update_soc 过程近似:先做电流积分预测,再用端电压误差修正。比较关键的参数是 capacity,它直接依赖 soh,这就体现了联合估计的核心逻辑——SOC 和 SOH 共用一个容量参数,任何一方的更新都会影响另一方的计算。
5. 避坑与常见问题:BMS SOH/SOP 估算中的五个典型翻车点
5.1 OCV 查表法在低温和 SOC 中段严重失真
现象:低温环境下(0℃ 以下)用 OCV 查表估算 SOH,结果偏差达到 5% 以上,个别电芯甚至超过 8%。
原因:OCV-SOC 关系曲线的温度敏感性在中低 SOC 区间特别明显。文档指出,OCV 曲线在老化过程中并非完全不变,只有在 SOC 较高且曲线斜率较大的区间才能忽略老化影响。低温让电解液离子电导率下降,极化电压增大,静置后的端电压并不能真实反映平衡电位。
解决:在标定时增加温度维度的 OCV 表,至少覆盖 -10℃、0℃、10℃、25℃、40℃ 五个温度点。在线使用时根据实测温度做插值。此外,尽量只在 SOC 60% 以上区间使用 OCV 校正,中低 SOC 区间用安时积分加内阻修正来兜底。我从那以后每次做 SOH 估计都强制检查当前 SOC 是否落在可信区间,否则直接跳过 OCV 修正。
5.2 HPPC 内阻测量结果不稳定,相邻循环波动大
现象:同一只电芯在相同 SOC 和温度下重复 HPPC 测试,每次算出来的内阻值波动超过 0.5 毫欧,导致 SOH 拟合结果来回跳。
原因:脉冲前静置时间不足,电池极化状态没有完全恢复。文档中的标准步骤要求静置 1 小时,实际项目中为了赶进度经常压缩到 15-30 分钟。另一个原因是电流传感器或数据采集系统的采样不同步,导致电压电流的时间对齐错位,计算出的瞬时内阻值偏差变大。
解决:严格执行文档的标准流程,静置时间不压缩。采样端需要注意电压和电流通道的同步时钟,至少保证 1ms 级别的对齐精度。处理数据时,不取脉冲开始瞬间的电压电流值,而是取脉冲中间段的平均值。如果两次测试差异仍然偏大,检查测试工装的接触电阻,夹具松动是经常被忽略的干扰源。
5.3 内阻-SOH 线性模型在电池中后期发散
现象:内阻与 SOH 的一次线性关系在 SOH 90% 以上时拟合得很好,但 SOH 低于 85% 以后,内阻增长速率急剧上升,同样的内阻值可能对应多种 SOH 状态。
原因:电池衰退的后期阶段,正极材料结构退化和电解液分解的速度加快,内阻对容量的敏感性不再是线性关系。文档中的实验是在加速老化条件下进行的,循环次数有限,数据点集中在 SOH 90% 以上的区间。在整车全生命周期内,SOH 会跌到 80% 甚至更低,直接把线性模型外推就会发散。
解决:对模型做分段拟合,SOH 高于 90% 用一次线性段,80%-90% 区间用二次多项式或者查表法。保存电池出厂时的内阻初始值,用相对内阻增量(R/初始内阻)来映射 SOH,这样可以消除电芯批次差异。更稳妥的做法是同时引入容量衰减模型做交叉验证,内阻法报告的数据如果与容量法相差超过 3%,就需要触发标定校准流程。
5.4 SOP 估算结果在 SOC 边界处出现功率跳变
现象:SOC 降到 15% 左右时,SOP 的放电功率限制从 100kW 突然掉到 60kW,整车动力瞬间下降,驾驶体验非常突兀。
原因:多参数联合约束法在边界条件切换时,SOC 约束和电压约束的组合约束曲面不平滑。尤其是在 HPPC 标定的 SOC 间隔为 10% 时,线性插值在相邻标定点之间的过渡带会产生台阶效应。电压约束本身也是非线性函数,与 SOC 约束相交时没有做平滑处理。
解决:在标定表基础上做 2% SOC 间隔的细化标定,或者对相邻的功率值做滑动平均滤波。更推荐的做法是引入功率变化率限制,即 SOP 的单步变化不允许超过预设斜率,这样即使约束切换也不会产生瞬时的功率跳变。这个思路类似于整车 VCU 里的扭矩斜坡限制,虽然牺牲了一点瞬时响应能力,但在安全性和舒适性上收益明显。
5.5 实验室 SOH 与实际车载 SOH 系统性偏差
现象:同一批电芯,实验室里测出来的 SOH 是 93%,装车跑了一个月后 BMS 报告 SOH 88%,整车厂和电池厂互相不认账。
原因:实验室 SOH 是基于标准容量测试(文档中的 Step1-9 流程)得到的,它假设了固定的温度、倍率和完整的充放电循环。但车载工况下的 SOH 识别依赖的是日常运行数据,充电习惯、工作温度分布、充电倍率完全不同。两者对“容量”的定义本质上就是不一致的,实验室测的是最大可用容量,车载算的更像当前工况等效容量。
解决:在 BMS 中明确定义 SOH 的估计区间和触发条件,比如只有在充电桩充满电且静置足够长后才能更新 SOH 参考值。同时引入工况修正因子,对非完全充放电条件下的容量观测值做偏差补偿。从项目管理的角度,需要与电池厂提前对齐 SOH 的定义和测量条件,我在参与的一个项目中就靠这一条避免了一个月的扯皮——从那以后我每次拿到新项目都会先确认 SOH 的基准测试条件,省下的时间足够划算。
6. HPPC 测试中的 SOC 锚点设置:一个提升 SOH 拟合精度的实用技巧
HPPC 测试过程的 Step7 和 Step8 是容易出彩也容易翻车的地方。Step7 要求以 0.2C 电流充电 10 分钟,每 1 秒记录一次充电电压;Step8 要求以 0.2C 电流放电 10 分钟,每 1 秒记录一次放电电压;Step9 再用 1C 恒流放电 0.1 小时把 SOC 调整到 80%。
这三个步骤的精密配合决定了内阻计算的可靠性。Step7 和 Step8 所测的充放电电压差对应了同一 SOC 点上的充放电内阻,而这个 SOC 点是由 Step6 静置和 Step9 的放电精确锚定的。如果 Step9 的 1C 放电时间控制不准,SOC 锚点就偏移了,同一个内阻值会在 SOH 曲线上滑动,导致拟合的线性度下降。
我之前在实验室里踩过这个坑:Step9 用 1C 放电 6 分钟(0.1 小时)来移动 10% SOC,但放电电流的实际精度只有 2%,时间控制用的是计时器。表面看误差不大,但乘以 10% SOC 的跨度后,实际锚点漂移了差不多 2% SOC 左右。对于 SOH 斜率较大区域的点来说,这个漂移量足以让内阻-SOH 拟合的 R² 从 0.98 掉到 0.95 以下,最终 SOH 估计的精度损失非常可观。
改进的做法是改用容量积分器来计算锚点。在 Step9 放电之前记录当前电量 Q_start,放电过程中实时对电流做积分,当积分容量达到目标值的 10% 时立即停止放电。不过需要注意,停止时会有继电器延迟(通常几十毫秒),这段时间的电流累积会造成 0.1%-0.3% 的 SOC 偏差。我的习惯是把目标放电容量稍微多算 0.5%,这样即使有继电器延迟也能到达期望的 SOC 点,而不是偏在它前面。
内阻值 R 与 SOH 的对应关系建立时,也需要注意温度漂移的问题。Step1-9 的完整循环在 25℃ 恒温环境下做比较稳妥,但实际的循环次数越多,电池自发热就越明显,温度漂移个两三度是常事。33 毫欧级别的内阻变化乘上温度系数,往往会掩盖掉真实的 SOH 趋势。下面的示例代码展示了我一般如何处理这类数据,用温度修正来提升拟合质量:
import numpy as np def fit_soh_resistance(soc_points, r_measured, temp_measured, temp_ref=25.0, temp_coeff=0.005): """ 内阻-SOH 线性拟合入口,先做温度修正 :param soc_points: 各 SOC 点 :param r_measured: 实测内阻列表,单位毫欧 :param temp_measured: 各 SOC 点对应的实际温度 :param temp_coeff: 内阻温度系数,默认每°C变化0.5% :return: (slope, intercept, r_squared) """ # 温度修正: 把所有内阻值归一到 25℃ 基准 r_adj = [] for r, temp in zip(r_measured, temp_measured): correction = 1.0 + temp_coeff * (temp_ref - temp) r_adj.append(r * correction) # 用 SOH 与修正后内阻做线性拟合 # SOH 由每个 SOC 点的容量积分得到, 此处用占位数据演示 soh_values = np.array([1.0, 0.98, 0.95, 0.93, 0.90])[:len(soc_points)] slope, intercept = np.polyfit(soh_values, r_adj, 1) residuals = np.array(r_adj) - (slope * soh_values + intercept) r_squared = 1.0 - np.sum(residuals**2) / np.sum((np.array(r_adj) - np.mean(r_adj))**2) print(f"拟合结果: SOH = (R - {intercept:.2f} mΩ) / {slope:.2f} mΩ") print(f"R² = {r_squared:.4f}") return slope, intercept, r_squared这段代码里的关键逻辑是温度修正先行。temp_coeff=0.005 表示内阻随温度每变化 1℃ 约有 0.5% 的变化,这是磷酸铁锂电池在常温附近比较典型的值,三元锂电池可以取到 0.3%-0.4%。实际项目中,温度系数最好从电芯厂提供的热特性参数里获取,或者通过恒温箱扫温标定获得,不要直接照搬经验值。对于档案进 BMS 在线运行的情况,温度和 SOC 锚点都会随时间漂移,这时我会把每个 SOC 点的内阻更新看作一个带遗忘因子的递推过程,而不是每次都从头拟合整条曲线。
内阻-SOH 线性函数一旦建立起来,SOH 的在线估计就变成一个查表加插值的过程。在整车 BMS 中,先把识别到的内阻值做温度归一化,再代入线性函数查 SOH。这个模型简单、直观、标定成本低,非常适合作为量产项目的基线算法。从那以后我每次做 HPPC 实验都强制检查一遍 SOC 锚点计算逻辑,确认没有继电器延迟的遗漏才继续跑循环,希望这份拆解也能帮到你。
本文还有配套的精品资源,点击获取