☰
二阶RC等效电路模型:从BMS仿真到SOC估算的工程实践指南
2026/10/21 9:05:37 网站建设 项目流程

1. 为什么电池管理系统离不开等效电路模型

做BMS算法的人,几乎每天都会被问到一个问题:电池的SOC到底准不准?续航显示为什么跳变?充放电功率该限制多少?这些问题最后都会落到同一个地基上——你用什么模型描述电池。

如果你刚开始接触锂电池建模仿真,最常被推荐的就是戴维南等效电路,再往上一层就是二阶RC。标题里把"二阶RC"和"戴维南"并列,实际上是在说明两类常用的电池等效电路模型:一阶戴维南模型(一个RC网络)和二阶RC模型(两个RC网络串联)。我最初做这个课题时,也纠结过该从哪个入手,后来才发现,真正要考虑的不是哪个更好,而是你要拿模型去干什么。

先说清楚模型在整个BMS里的位置。电池本身是一个高度非线性的电化学系统,内部锂离子浓度分布、温度梯度、老化状态都在实时变化,直接用电化学模型(比如P2D模型)精度虽高,但偏微分方程求解量太大,单片机根本跑不动。等效电路模型的核心思路是:用电阻、电容这些电气元件去等效外部表现出的电压电流关系,用几条简单的微分方程逼近真实电池行为。参数少、计算快、适合嵌入式部署,这就是它被广泛用于SOC估算、功率预测、均衡策略验证的原因。

对我来说,这个项目的价值不只是搭几个Simulink模块。真正有意思的是:如果你把一阶和二阶模型放在同一套数据下做参数辨识和精度对比,你会直观看到RC网络数量对电压跟随精度的贡献曲线,也会体会到纯理论公式和实际电池行为之间的那段距离。这篇文章我会从模型理论、Simulink搭建、HPPC参数辨识、工况验证到工程化落地中的坑,完整走一遍。

适合看这篇文章的人:准备做电池模型课程的作业或毕业设计,刚开始接触Simulink和电池仿真的同学,以及在BMS项目中需要快速验证算法但参数辨识还没头绪的开发者。下面所有案例都基于某款容量2.8Ah、标称电压3.6V的三元锂电芯数据,测试条件为室温25℃。

2. 戴维南(一阶RC)与二阶RC模型的理论边界

2.1 两种模型的电路结构与数学描述

戴维南等效电路,又称一阶RC模型,结构是一个电压源串联欧姆内阻,再串联一个由极化电阻和极化电容并联组成的RC网络。电压源代表开路电压OCV,欧姆内阻R0反映电解液、隔膜和接触电阻的瞬时压降,RC网络用来描述电池的极化效应——也就是充放电过程中电极界面电荷积累、离子浓度梯度带来的电压滞后。

端电压方程如下:

[ U_t = OCV(SOC, T) - I \cdot R_0 - U_1 ]

其中U1是RC网络两端的极化电压,满足一阶微分方程:

[ \frac{dU_1}{dt} = \frac{I}{C_1} - \frac{U_1}{R_1 C_1} ]

这个模型的物理含义可以类比为:电池内部有一个"缓慢的充放电惯性"。当你突然给电池加载一个大电流,R0上瞬间产生压降,端电压立刻跳一段;紧接着RC网络开始被充电,U1逐渐上升,端电压继续缓慢下降,这就是极化过程。

而二阶RC模型多了一组RC网络,定义如下:

[ U_t = OCV(SOC, T) - I \cdot R_0 - U_1 - U_2 ]

[ \frac{dU_1}{dt} = \frac{I}{C_1} - \frac{U_1}{R_1 C_1},\quad \frac{dU_2}{dt} = \frac{I}{C_2} - \frac{U_2}{R_2 C_2} ]

两组RC网络的时间常数不同,通常一组在几秒到几十秒(描述电化学极化),另一组在几十秒到几分钟(描述浓度极化)。正因为时间尺度不同,二阶模型能同时捕捉快速电压突变和缓慢电压爬升。

2.2 二阶RC到底多了什么:快慢极化分离

一阶模型用一个RC去逼近所有极化效应,结果往往是按下葫芦浮起瓢。如果你用短脉冲数据辨识参数,模型对快速极化的拟合较好,但长周期动态工况下误差会逐渐累积;如果辨识数据里混合了长静置段,参数又会被慢极化成分"拽偏"。二阶级数的本质是把两种物理机制分开建模。

用我实测的电池数据来说明。HPPC脉冲结束后电池从放电态恢复至开路状态,端电压的回弹曲线明显不是单一指数曲线。如果只用一阶指数拟合,残差里会呈现规律性偏差;用两个指数叠加拟合,残差基本进入噪声水平。这正是电池内部同时存在快速活化极化和慢速浓差极化的直接体现。

当然,二阶模型理论上还可以扩展到三阶、四阶,但阶数越高,参数辨识越困难,计算开销也越大,且对精度提升逐渐收敛。二阶是工程上公认的性价比平衡点。

2.3 一阶与二阶的精度和复杂度权衡

精度差异要看工况。在稳态小电流充放电下,两者相差不大;在动态工况下,比如加速、制动、脉冲负载变化,二阶模型的电压跟随误差通常只有一阶的一半左右。我做的对比测试里,DST动态工况下二阶模型的最大误差可以控制在25mV以内,一阶则在50mV上下。

复杂度差异主要体现在三个层面:状态变量多了一个U2;参数辨识方程多了一组R2、C2要拟合;Simulink模型里多一条RC支路。用卡尔曼滤波做SOC估计时,二阶模型的观测矩阵维度从2×2变成3×3,计算量增加,但换来更稳定的状态收敛性。

我自己的建议是:如果你做的是基础教学Demo、算法验证demo,或者对精度要求不高的项目,一阶戴维南完全够用,搭起来快,参数少,调试省心。但如果你做的是真实产品的SOC估算算法验证,或者涉及电池功率状态SOP预测,直接上二阶RC,一步到位省得后面返工。

3. Simulink模型的搭建思路:从物理方程到模块连线

3.1 模型架构与参数约定

Simulink里搭建等效电路模型有两种路径:一种是用Simscape物理域建模,另一种是把微分方程折算成普通模块连线。前者更贴近物理元件,但可定制性差一些,后者的每一步都有明确的数学含义,后续做在线参数修正、变量观测也更方便,我选择后者。

模型顶层分四块:输入部分(电流源、SOC计算模块)、核心状态方程(两个RC支路的离散递推)、OCV查表模块(SOC映射开路电压)、输出部分(端电压Ut合成)。控制周期设为0.1s,这也是我后面HPPC数据采样的间隔。

参数统一放到模型的Mask工作区里,不要散落在各个模块常量里。我用了一个结构体数组param来管理:

  • param.R0:欧姆内阻
  • param.R1、param.C1:第一组RC参数
  • param.R2、param.C2:第二组RC参数
  • param.OCV_LUT:SOC到OCV的插值表
  • param.Cap:电池额定容量

这样做的最大好处是,后续做SOC分段辨识、温度修正时,不需要改模型结构,只改参数数组即可。

3.2 离散化方式与仿真步长

连续微分方程直接搭模块会用到积分器,但考虑到采样系统实现(也就是真正写到单片机里的形式),最好直接搭成离散递推形式。

以U1支路为例,前向欧拉离散:

[ U_1(k+1) = U_1(k) + T_s \cdot \frac{I(k) - U_1(k)/R_1}{C_1} ]

整理成代码实现就是:

U1_next = U1 + Ts * (I_current - U1/R1) / C1;

Ts取0.1s时,前向欧拉的稳定性没有问题,但如果你把步长放到1s以上,或者做硬件在环仿真时步长不匹配,建议改用矩阵指数离散。也就是把连续状态空间模型[A, B, C, D]转换为离散形式:

sys_c = ss(A, B, C, D); sys_d = c2d(sys_c, Ts, 'zoh');

我实测过,对二阶RC模型,Ts=0.1s时两种离散方式几乎完全一致;Ts=1s时前向欧拉在快速充放电切换瞬间会有明显数值抖动,矩阵指数离散依然平滑。

3.3 模块连线时的代数环处理

搭建过程中最容易踩的坑是代数环。如果你把输出Ut反馈到SOC计算模块,而SOC更新又依赖当前电流积分,同时模型内部又有瞬时代数关系(比如R0上的压降),Simulink会提示出现代数环,导致仿真变慢甚至报错。

我的处理方案是:把SOC更新拆成两步。先由电流积分更新SOC值,再用当前时刻的SOC查OCV,不把端电压Ut回接到状态更新回路。换句话说,模型的因果链始终是"电流 → SOC和极化电压 → 端电压",而不是"端电压 → 电流"。这种非反馈式结构既符合锂电池实际特性(SOC不会因为端电压大小而突变),也彻底规避了代数环。

如果模型里确实需要电压反馈,比如模拟电池带载后的电压跌落对负载电流的影响,那就在反馈路径上插入Unit Delay模块或者Memory模块截断代数环,但要注意这会引入一个步长的滞后。

封装方面我基于三阶段思考:第一阶段,把单个RC支路封装成一个子系统,输入电流,输出极化电压,便于扩展成三阶四阶;第二阶段,把OCV查表做成Simulink Lookup Table模块,数据用一维SOC插值;第三阶段,将整个电池模型封装成带Enable端口的子系统,方便在BMS策略仿真里随时切出切入。

4. 参数辨识:HPPC脉冲实验与最小二乘拟合

4.1 HPPC实验设计:三秒脉冲,四十秒静置

参数辨识不能凭空给R、C赋值,必须基于真实电池数据。业界标准做法是HPPC(Hybrid Pulse Power Characterization)测试,简单说就是:每到一个SOC点,先静置1小时让电池回到开路状态,记录OCV;然后执行一个放电脉冲,接着静置恢复;再执行一个充电脉冲,再静置。

我这轮测试的脉冲参数如下表:

参数值
放电脉冲电流2.8A(1C)
放电脉冲时长10s
脉冲后静置40s
充电脉冲电流2.24A(0.8C)
SOC步长10%
SOC范围10%~90%
环境温度25℃

10秒脉冲的设计意图是:既保证RC网络有足够时间响应,又不至于让SOC在单个脉冲内变化太大(10秒1C只消耗约0.28%的SOC,可以忽略)。

4.2 端电压响应的三段分离:瞬间跌落、指数爬升、回弹

一个完整的HPPC脉冲段,端电压曲线可以拆成三个特征段:

第一段是脉冲刚施加时的瞬时跌落。此时RC网络来不及响应,只有R0起作用,因此:

[ R_0 = \frac{\Delta U_{drop}}{I_{pulse}} ]

第二段是脉冲持续期间电压的指数爬升。此时两个RC网络逐渐充电,U1和U2按各自时间常数上升。脉冲结束时刻的电压相对于t=0时刻的"慢速跌落量",携带了RC网络的参数信息。

第三段是脉冲结束后的电压回弹。此时电流为零,R0上压降瞬间消失,端电压先"跳回"一个阶跃,然后按两个指数规律缓慢回升到OCV。回弹段是辨识R1、C1、R2、C2最常用的数据段,因为激励干净、没有电流干扰。

4.3 用MATLAB拟合RC参数的代码流程

回弹段的电压表达式为:

[ U_t(t) = OCV - U_1(0) \cdot e^{-t/\tau_1} - U_2(0) \cdot e^{-t/\tau_2} ]

这里的U1(0)、U2(0)是脉冲结束瞬间两个极化电压的值,τ1=R1C1,τ2=R2C2。用MATLAB的lsqnonlin做非线性最小二乘拟合:

% 假设 t_hppc 是回弹时间段向量,v_rest 是实测电压 fun = @(x, t) x(1) - x(2).*exp(-t/x(3)) - x(4).*exp(-t/x(5)); x0 = [4.1, 0.05, 30, 0.04, 300]; opts = optimoptions('lsqnonlin', 'Display', 'off', 'MaxFunctionEvaluations', 10000); res = lsqnonlin(@(x) fun(x, t_hppc) - v_rest, x0, [], [], opts); OCV_fit = res(1); U1_0 = res(2); tau1 = res(3); U2_0 = res(4); tau2 = res(5);

初值的选取是关键,不能乱给。我一般这样定:OCV初值直接用静置段最后时刻的电压;快时间常数τ1初值给10~30秒,慢时间常数τ2给100~500秒。因为快慢支路的幅值都存在,初始U1_0、U2_0给等量即可,拟合结果对初值不敏感,但时间常数初值如果差两个数量级很容易陷入局部最优。

拟合得到的是RC网络并联后的时间常数τ和极化电压初值U(0),要还原R和C,还需要一个关系。脉冲结束瞬间,极化电压为:

[ U(0) = I_{pulse} \cdot R \cdot \left(1 - e^{-t_{pulse}/\tau}\right) ]

因此:

[ R = \frac{U(0)}{I_{pulse} \cdot (1 - e^{-t_{pulse}/\tau})},\quad C = \frac{\tau}{R} ]

4.4 OCV-SOC曲线的单独标定

OCV-SOC关系用静置法标定:每个SOC点静置1小时,取电压终值。这组数据不要混在脉冲拟合里做,OCV-SOC曲线需要高精度,单独处理。

拟合方法可以用多项式,但我建议用Simulink里的Lookup Table直接插值。多项式阶数太高容易过拟合导致端点振荡,太低又不够准。Lookup Table选择线性插值、端点外推,实测精度已经很好。

不同SOC点下的R0、R1、C1、R2、C2并不相同,尤其SOC低于20%时内阻明显增大。所以最终参数不是一组数,而是每个SOC点一组数,形成一张查表,仿真时按SOC线性插值。这也是模型在10%到90%整个区间都能保持精度的原因。

5. 仿真验证:不同工况下两种模型的实测对比

5.1 参数辨识结果与模型静态验证

我先给出一组25℃、50% SOC下的参数供参考:

参数一阶戴维南二阶RC
R00.052Ω0.051Ω
R10.042Ω0.018Ω
C1682F1500F
R2——0.031Ω
C2——4200F

可以直观看到,二阶模型把一阶模型的极化阻抗拆分成了两个部分,快速支路的阻抗变小但电容也小、时间常数约27秒;慢速支路的阻抗适中、电容大、时间常数约130秒。这个拆分结果和之前提到的快慢极化理论是一致的。

模型搭好后的第一步验证不是跑复杂工况,而是直接回放HPPC数据本身:把实测电流作为模型输入,比较模型端电压和实测端电压的差异。如果这一步误差就大,后面的工况验证更没有意义。

我这次回放验证的结果:二阶模型在整个HPPC序列的电压误差不超过15mV,一阶在脉冲切换瞬间误差达到45mV。最大误差都发生在充电脉冲结束后的一两秒内,也就是电流极性切换的瞬间。

5.2 DST动态工况下的模型精度对比

HPPC只能证明模型对标准脉冲的拟合能力,还不能说明动态性能。动态工况我用的是DST(Dynamic Stress Test)工况,一段由不同倍率放电、充电和静置交替组成的电流序列,模拟实际行驶的负载波动。

DST工况下的验证结论是:二阶模型的最大电压误差约30mV,一阶约80mV;均方根误差RMSE方面,二阶约9mV,一阶约25mV。从误差时间分布看,一阶模型的误差集中爆发点都在电流方向切换后的1到3秒内,这说明单一RC网络无法同时应对放电极化建立和放电结束后极化快速消退这两个过程。二阶模型的两条RC支路相互分担,每个电流切换点都能较快找回动态平衡。

这个结果进一步验证了二阶RC在动态工况下的优势,也印证了前面对"快慢极化分离"的讨论。如果你的仿真只需要稳态或慢变电流,一阶足够;一旦涉及强动态场景,比如电池模拟器、整车能量管理策略验证,二阶的收益非常明显。

5.3 全SOC区间的误差分布与边界行为

从全SOC区间看,两个模型在中段SOC(30%~80%)表现都很好,两个模型的误差均在20mV以内。但在低SOC区,情况开始分化:10%~20%区间,一阶模型的最大误差超过100mV,二阶模型维持在50mV左右。差异的本质是低SOC时电池内阻急剧上升,极化过程变得更复杂,单阶RC逼近能力不足。如果你设计的应用经常工作在低SOC边缘,二阶模型基本是底线要求,直接上更好。

高SOC区间(90%以上)充电将近充满时,电压对SOC的敏感度极高,OCV曲线斜率陡增,此时查表插值本身的精度成为误差主导因素。这跟模型阶数关系不大,主要是OCV-SOC标定点密度不够。我把90%~100%区间的SOC标定步长从10%加密到2%后,两个模型的误差显著同步下降。

边界行为方面需要提醒:仿真的SOC不应该低于0%或超过100%,因为OCV查表外推会产生明显失真。模型内部要加saturation限幅,避免积分漂移导致查表越界。

6. 工程化落地中的几个坑与改进方向

6.1 温度对极化参数的影响不容忽视

前面所有参数都是在25℃恒温下辨识的,但实际电池工作温度变化幅度很大。低温下电解液电导率下降、锂离子扩散变慢,R0显著增大,极化时间常数也会变长——同一块电池,0℃和40℃下的端电压响应差别非常明显。如果模型只在25℃参数下运行,放进冷启动仿真里误差可能达到几百毫伏级。

工程化的做法是:在不同温度点(如0℃、10℃、25℃、40℃、50℃)各做一轮HPPC辨识,把R0、R1、C1、R2、C2分别建成关于温度查表。仿真时按当前电池温度做二维插值。这样模型维度从二维表变成三维表,复杂度上升,但换来的是模型在全温域的适用性。

如果项目周期紧,可以先做一个简化版:只把R0做温度修正,极化参数沿用常温值。R0对温度的敏感性最直接,修正它的收益最大。

6.2 查表维度的平衡与插值算法的选择

参数随SOC和温度变化后,查表就变成了二维。这带来一个问题:表格要多大?SOC按10%间隔要11个点,温度按5个点算,就要55组R/C参数。实测下来,SOC维度20个点、温度维度按项目实际需要选,效果比较合理。

插值算法上,double线性插值在Simulink里直接用Lookup Table模块就够了。不要自己写复杂的插值逻辑,除非你有特殊需求。另外,参数表做好后用数据类型double,不要贪图省存储转成single,否则低SOC区参数插值会产生可感知的误差。

6.3 从离线辨识走向在线自适应

离线参数只能反映电池在新态下的平均行为。电池老化后,容量衰减,内阻增大,离线模型会逐渐失效。如果项目有长期运行需求,考虑引入在线参数辨识,比如递推最小二乘法(RLS)配合遗忘因子。

具体思路是把电池端电压方程改造成线性回归形式:

[ U_t(k) - OCV(k) = \theta^T \cdot \phi(k) ]

其中φ(k)由历史电流和电压构造,θ是待估参数向量。通过RLS实时更新R0、R1、R2等参数,模型就能自动跟随电池老化过程。我自己的经验是:遗忘因子取0.98左右在动态工况下收敛速度和稳定性相对平衡。这个方向上如果展开,可以做电池老化状态估计(SOH),跟等效电路模型是天然搭配。

6.4 Simulink模型组织的一些细节建议

最后说一些工程体验层面的细节。

仿真步长统一。如果你后续要把模型接到硬件在环平台或者快速原型里,步长选择会影响离散化误差,建议模型从开始就固定步长,比如0.1s,不要用默认的变步长求解器。变步长在RC小时间常数下会不断缩小步长,拖慢仿真速度。

模块命名规范。RC支路、查表模块、SOC积分器这些模块,命名里带上物理量名称。这个看似简单的要求,在项目交接或者自己隔一个月回来看时,价值极高。

做好数据存档。HPPC实验原始数据、拟合脚本、参数表、仿真版本,建议按"日期_工况_温度"命名规范归档。参数辨识这类工作往往需要反复迭代,有历史数据对比能省大量时间。

对于这个模型方向,我自己的体会是:二阶RC模型的精度收益,前期来自参数辨识质量,后期来自对温度、老化等影响因素的持续补充。模型结构本身很简单,真正决定它能不能落地的,是你有没有把参数做扎实、把边界工况想清楚。如果你正准备做电池仿真,建议先拿HPPC数据把二阶RC搭起来跑通,再根据项目需要对温度和老化的维度做扩展,这条路走下来思路会非常清晰。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询