4、电池内阻建模:欧姆内阻与极化内阻、电阻模块(Resistor)、可变电阻实现

电池内阻,说白了就是电池自己“吃掉的电压”。你想想看,一个理想电池输出电压应该是恒定的,但实际上一带负载,电压就往下掉。掉的那部分,就是内阻在作怪。

我在做BMS项目时,遇到过一件挺头疼的事:同一个电池,不同工况下测出来的内阻值居然差了好几倍。后来才搞明白,原来内阻不是单一值,它分成了欧姆内阻极化内阻两兄弟。今天我们就来聊聊怎么在Simulink里把它们建模出来。

4.1 欧姆内阻 vs 极化内阻

先说说这两个家伙的区别。

  • 欧姆内阻(R₀):这是电池材料本身带来的电阻,包括电极、电解液、隔膜、集流体等。它的特点是响应极快,电流一变化,电压立刻跟着跳。我习惯叫它“瞬时内阻”。
  • 极化内阻(R₁):这是电化学反应过程中产生的“阻力”。电流流过时,离子迁移、电荷转移都需要时间,所以电压变化是慢慢悠悠的。说白了,它像个“惯性环节”。

在实际电池中,这两个内阻是串联关系。一个简单的二阶RC模型就能描述:

V_bat = V_oc - I * R₀ - V₁

其中V₁是极化电容C₁两端的电压,它满足:

dV₁/dt = I/C₁ - V₁/(R₁ * C₁)

嗯,这里要注意:R₀和R₁都不是常数。它们会随温度、SOC、电流方向变化。我见过不少新手直接把内阻设成固定值,结果仿真出来的电压曲线跟实测差了十万八千里。

核心要点:欧姆内阻决定电压的“跳变”,极化内阻决定电压的“渐变”。建模时一定要把这两个时间尺度分开处理。

4.2 Simulink中的电阻模块(Resistor)

Simulink的Simscape Electrical库里有个现成的Resistor模块。位置在:

Simscape > Electrical > Passive > Resistor

这个模块很简单,就一个参数:电阻值R(单位Ω)。但要注意,它是物理建模模块,需要配合Solver Configuration和Electrical Reference使用。

我个人习惯把Resistor模块用在欧姆内阻的建模上。因为欧姆内阻响应快,用物理模块直接模拟电压降,效果很直观。

举个例子,一个简单的电池内阻模型:

1. 拖入一个Controlled Voltage Source(模拟开路电压V_oc)
2. 串联一个Resistor模块(设置R = R₀)
3. 再串联一个RC并联支路(模拟极化效应)
4. 最后接上负载

但这里有个坑:Resistor模块的电阻值是固定参数,不能在线修改。如果你需要模拟内阻随SOC变化,就得另想办法。

避坑指南:我曾经在项目里直接用Resistor模块做可变内阻,结果仿真到一半报错“参数无法在仿真中修改”。后来才明白,Resistor模块只支持编译时参数,不支持运行时参数。

4.3 可变电阻的实现方法

既然Resistor模块不能在线调参,那怎么实现可变内阻呢?我总结了三种常用方法:

方法一:用受控电压源模拟可变电阻

这是最灵活的方法。原理很简单:

V_drop = I * R(SOC, T)

用Controlled Voltage Source输出V_drop,串联在回路中。R(SOC, T)可以用Lookup Table或MATLAB Function实现。

代码示例(MATLAB Function):

function R = get_R0(SOC, T)
    % 基于SOC和温度查表得到欧姆内阻
    % 数据来自实测
    R_table = [0.005, 0.004, 0.003, 0.0035;  % T=0°C
               0.004, 0.003, 0.002, 0.0025;  % T=25°C
               0.003, 0.0025, 0.002, 0.002]; % T=45°C
    SOC_break = [0, 0.2, 0.5, 1];
    T_break = [0, 25, 45];
    R = interp2(SOC_break, T_break, R_table, SOC, T, 'linear');
end

这个方法的好处是:你想怎么变就怎么变,完全可控。缺点是需要额外测量电流I,而且要注意代数环问题。

方法二:用Simscape可变电阻模块

Simscape Electrical里其实有个Variable Resistor模块(在Simscape > Electrical > Passive > Variable Resistor)。它有一个物理信号输入端口,可以实时输入电阻值。

用法:

1. 用PS Constant或PS Lookup Table生成电阻值信号
2. 连接到Variable Resistor的R端口
3. 模块自动根据输入值调整电阻

我个人比较推荐这个方法,因为它既保留了物理建模的精度,又支持在线调参。不过要注意,输入信号必须是物理信号(PS),不是Simulink普通信号。需要用PS-Simulink Converter转换。

小技巧:如果你用Variable Resistor模块,建议在R输入端加一个Rate Limiter,防止电阻值突变导致仿真发散。我一般设成1000 Ω/s的速率限制。

方法三:用受控电流源+电压测量

这个方法比较绕,但有时候很好用。原理是:

R = V / I

用Voltage Sensor测电压,Current Sensor测电流,然后通过除法得到电阻值。但注意,这只能用于后处理分析,不能直接用于模型内部反馈。

三种方法的对比:

方法 优点 缺点 适用场景
受控电压源 灵活、无模块限制 需测电流、有代数环风险 复杂变阻模型
Variable Resistor 物理建模、支持在线调参 需PS信号、速率限制 标准电池模型
受控电流源+测量 简单直观 不能用于反馈 后处理分析

4.4 知识体系结构图

下面这张图帮你理清本章的核心逻辑:

电池内阻建模知识体系 电池内阻 欧姆内阻 R₀ 极化内阻 R₁ 响应快,瞬时电压跳变 响应慢,电压渐变 Resistor模块(固定值) 可变电阻实现 受控电压源法 Variable Resistor模块 注:实际建模中常将R₀用Resistor模块,R₁用RC支路实现

4.5 实战建议

最后,给几个我在项目中总结的实用建议:

  • 欧姆内阻用Resistor模块:如果R₀是固定值,直接用Resistor模块最省事。如果R₀随SOC变化,用Variable Resistor模块。
  • 极化内阻用RC支路:用Resistor和Capacitor模块搭一个并联RC,时间常数τ = R₁ * C₁。一般τ在几秒到几十秒之间。
  • 别忘了温度影响:内阻对温度极其敏感。我见过一个项目,25°C下内阻3mΩ,到-10°C直接飙到8mΩ。不做温度补偿,模型基本废了。
  • 仿真步长要合适:欧姆内阻响应快,仿真步长建议小于1ms。极化内阻时间常数大,步长可以放宽到10ms。如果两者混用,用变步长求解器。
总结一句话:欧姆内阻用电阻模块,极化内阻用RC支路,可变内阻用受控源或Variable Resistor。记住这三个对应关系,电池内阻建模就稳了。

嗯,今天就聊到这儿。内阻建模是电池模型的基础,搞懂了它,后面SOC估算、功率预测才能做得准。希望这些经验对你有帮助。


专注资料整理