在做 BMS 算法开发时,二阶RC等效电路模型是最常用的电池模型之一。它由欧姆内阻、快极化环节和慢极化环节组成。
通常的参数辨识做法是:拿一堆数据丢给 MATLAB 或 Python 的优化器,让算法自己算出一组参数。但是最近我在使用此方法得出参数后,应用到实际项目中,EKF反而失真了。
那么,有没有一种方法,不靠优化器,也能把 5 个参数全部手工推导出来?
答案是:有!而且过程非常清晰、可复现。
本文将完整分享我最近一次针对280Ah 磷酸铁锂电芯的恒流放电测试数据,在 Excel 里一步步推导出二阶模型的全部 5 个参数的过程。
1. 原始数据长什么样?
电芯:280Ah 磷酸铁锂(LFP)
电流模式:恒流放电(约 65.94A)
采样频率:0.5 秒(2Hz)
数据时长:放电约 1.5 小时 + 静置约 58 分钟
数据行数:17765 行
关键时间点(行号):
放电开始行:第 58 行
放电结束行:第 10809 行
静置结束行:第 17765 行
这里有个坑:我的数据里的 Timestamp其实是行号,不是秒数。实际物理时间 = 行号 × 0.5 秒。
2. 核心思路:用时间尺度分离参数
二阶 RC 模型的电压方程为:
其中:
关键洞察:不同物理过程的时间尺度不同,因此我们可以分开计算:
| 参数 | 利用的数据段 | 方法 |
|---|
| R0 | 电流跳变瞬间(0.5 秒内) | ΔV/ΔI |
| R1,C1 | 静置恢复的后半段(>50秒) | 对数线性拟合 |
| R2,C2 | 静置恢复的前 5 秒 + 0.5 秒跳变反推 | 减法 + 单点反算 |
3. 实操第一步:在 Excel 里准备数据
在原数据右侧新增两列:
E列:真实时间 (秒)
text= A2 * 0.5
F列:SOC (%)
先算累计容量 = SUM($C$2:C2) * 0.5 / 3600
再算 SOC = 1 - 累计容量 / 280
定位关键行(你也要核对你的数据):
放电开始:A列=57 → 第 58 行
放电结束:A列=10808 → 第 10809 行
跳变前电压:第 57 行 = 3.319V
跳变后瞬间电压:第 58 行 = 3.305V
跳变电流:62.82A
4. 第一步:计算纯欧姆内阻 R0
电流跳变瞬间,极化还没来得及建立,电压突变完全由 R0引起:
R0=(3.319−3.30562.82)/62.82=0.2228 mΩ
取多个点的平均后,最终标定值为0.2388 mΩ。
注意:0.5 秒采样下,快极化已经建立了约 20%,所以这个值比真实纯欧姆值略大,但对于工程 EKF 来说完全可接受。
5. 第二步:计算总极化电阻 Rp=R1+R2
取放电末端(最后 50 行)的平均电压:
负载电压:Vload_end≈3.2507 V
静置最终稳定电压(取最后 200 行平均):Vocv_end≈3.2970VRp=(Vocv_end−Vload_end)/Iavg−R0
Rp=(3.2970−3.250765.94)/65.94−0.0002388≈0.4737 mΩ
所以:R1+R2=0.4737mΩ
6. 第三步:分离慢极化 R1,C1
这是最关键的一步。静置段电流为零,电压恢复公式为:
当 t>50秒时,快极化已基本消退,只剩慢极化:
移项取对数:
在 Excel 中:
筛选出静置后>50 秒的数据
新增列:Y=ln(3.2970−Vrest)
以时间 t为 X 轴,Y为 Y 轴做散点图
添加线性趋势线,显示公式
我得到的趋势线方程为:
y=−0.0043x+2.8675
斜率->0.0043→ τ1=1/0.0043≈232.5秒截距->2.8675→ V1(0)=e2.8675≈17.6 mV
于是:
R1=V1(0)/Iavg=0.0176/65.94≈0.2668mΩC1=τ1/R1=232.5/0.0002668≈871,668F
7. 第四步:分离快极化 R2,C2
先算 R2
因为 R1+R2=0.4737:R2=0.4737−0.2668=0.2069mΩ
再算 τ2
放电结束瞬间(0.5 秒内):
放电最后一行电压:3.2507 V
静置后第 1 行(0.5 秒)电压:3.2670 V
总跳变:16.3 mV
其中:
欧姆恢复:65.94×0.2388=15.22 mV
快极化恢复:16.3−15.22=1.08 mV
快极化的总电压为:
V2(0)=I×R2=65.94×0.2069=13.45 mV
代入快极化恢复公式:
取 t=0.5秒:
反推得到:
τ2≈5.18 秒
于是:
C2=τ2/R2=5.18/0.0002069≈25,051 F
8. 最终推导的参数
| 参数 | 值 | 推导方法 |
|---|
| R0 | 0.2388 mΩ | 电流跳变瞬间 ΔV/ΔI |
| R1 | 0.2668 mΩ | 慢极化 ln 趋势线截距 eb/I |
| C1 | 871,668 F | τ1/R1(τ1=232.5s) |
| R2 | 0.2069 mΩ | Rp−R1=0.4737mΩ) |
| C2 | 25,051 F | τ2/R2(τ2=5.18s) |
9. 验证:在 MATLAB 中重构电压
用这组参数在 MATLAB 中重构电压,计算放电段 RMSE:
RMSE = 18.806 mV
对于 280Ah 大电芯,在 0.5 秒采样率下,已经足够满足绝大多数 BMS 工程需求(通常要求 <20mV)。
作为对比:
优化器调出的物理失真的参数可以达到 9.7mV
但工程上,我们更信任物理真实、可外推的 18.8mV
写在最后
这次在 Excel 里推导二阶 RC 参数的完整过程,让我对电池模型的理解更加深入。
我强烈建议每一位做 BMS 算法或电池建模的工程师,至少亲自做一次这样的推导,无论你后续用不用优化器。因为只有当你亲手“拆解”过每一个参数时,你才真正理解了模型的物理含义,而不仅仅是在调参。
如果你也在做类似的工作,欢迎在评论区留言交流。如果对文中的某个步骤有疑问,也欢迎随时提问!