ARTICLE · INTELLIGENCE

战地情报 · 详情页

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

基于Simulink的电池与超级电容充放电仿真及混合储能建模实践

基于Simulink的电池与超级电容充放电仿真及混合储能建模实践 搞电池和超级电容的充放电仿真最趁手的工具确实是Matlab/Simulink。我最早接触这套东西是给一个微型电动车项目做预研当时手头连一块像样的电池测试柜都没有全靠Simulink里的模型先把控制逻辑跑通后来实测数据回来发现仿真和真实台架的趋势几乎一致——从那以后我再也不敢小瞧先仿后做这套流程。这篇文章不是教科书式的模型推导汇总而是一份从实际项目角度出发的实操记录。我会把电池建模、超级电容建模、充放电控制策略以及两者混合储能联合仿真的要点拆开揉碎把我踩过的坑、验证过的有效做法一并放进去。无论你是在校学生做课设还是工程师做预研甚至只是对储能仿真感兴趣想入门这篇文章都能让你在搭建模型时少走弯路。1. 电池与超级电容建模仿真的整体思路1.1 为什么非要在Simulink里搭这两个模型不少刚接触仿真的朋友会问电池和超级电容直接买现成的Simscape Electrical元件库里的模块拖出来用不就行了吗我的回答是分场景。如果你只是在做纯电气侧的电路分析比如看看DC/DC变换器的电流纹波那直接用Simscape的电池模块完全够用。但如果你的目标是和整车控制策略、能量管理算法比如SOC估算、功率分配做联合验证那你必须自己搭建可编程的模型——因为控制策略往往需要你能够随时改变模型内部的某个参数例如电池内阻随SOC的变化或者需要在模型中间插入自定义的数学逻辑而这些在封装好的元件库里做起来非常别扭。我自己常用的做法是一套双层配合用基础Simulink搭建电池和超级电容的等效电路模型用于控制策略的开发和验证同时保留一套Simscape Electrical的高精度模型用于后期做详细的电气应力分析。前者算得快、逻辑透明后者算得准、元件丰富两者互相补充项目节奏会很舒服。1.2 模型复杂度要和仿真目相匹配建电池和超级电容模型最忌讳的就是一上来就追求高精度、高复杂度。我记得有一次一个朋友非要搭一个电化学-热耦合的P2D模型来研究简单的恒流放电模型跑了整整一个下午还没出来结果最后发现他的研究目的只是看端电压的变化趋势——一个一阶RC等效电路模型十几分钟就能搞定。我通常的建议是这样的先根据仿真目的确定模型复杂度再选择模型类型。仿真目的推荐模型复杂度适用场景系统级控制策略验证Rint模型一阶内阻模型低能量管理策略快速迭代充放电动态响应分析一阶RC等效电路模型Thevenin中CC-CV充电、脉冲放电、动态工况模拟高精度电压特性模拟二阶RC等效电路模型中高复杂工况下的电压行为复现热特性耦合分析电热耦合模型高温升趋势预估、热管理策略验证电池老化与寿命预测经验老化模型中长周期循环寿命分析做控制策略预研最推荐起点是一阶RC等效电路模型。这个模型在计算量和精度之间取得了非常好的平衡——既能反映电池的动态滞后特性就是那个极化电压又不会因为状态变量太多导致仿真速度变得不可接受。超级电容那边同理经典的一阶RC模型捕获充放电动态是完全足够的除非你要去做多孔电极的微观研究那才需要进阶到传输线模型。2. Simulink环境下电池充放电仿真模型搭建2.1 电池一阶RC等效电路模型的设计原理一阶RC等效电路模型的核心思想很直白把电池看成一个理想电压源 一个欧姆内阻 一个RC并联网络。理想电压源代表电池的开路电压OCV它随SOC变化而变化欧姆内阻R0代表电解质和电极材料的瞬时电阻RC并联网络代表电池内部的极化效应也就是电荷传递过程和扩散过程的动态滞后。这里的数学表达就是端电压方程U OCV(SOC) - I*R0 - Up极化电压动态dUp/dt I/Cp - Up/(Rp*Cp)千万要记住这个OCV可不是一个常数它是SOC的函数。温度对OCV也有影响但在常温场景下可以先忽略后面需要精度再引入温度修正。这是整个模型里最容易被忽视但影响最大的一步——用常数开路电压那你仿出来的充放电曲线基本不能用。2.2 在Simulink里一步步搭出电池模型我来完整走一遍搭建流程这套方法我用了很多年步骤清晰可复用第一步建立SOC计算模块SOC是电池仿真的核心状态量最简单的做法是安时积分法也叫库仑计数法。公式是SOC SOC_initial - ∫(I/3600/Capacity)dt。这里电流单位为安培容量单位为安时除以3600是为了把秒转换为小时。在Simulink里用Integrator模块积分电流再除以电池容量用常数模块设定初始SOC值裁剪模块把SOC限制在0到1之间。第二步创建OCV-SOC查表模块这是一步非常有工程味道的操作。你需要拿到电池厂家提供的OCV-SOC数据或者标准放电实验自己测然后把数据填入Lookup Table模块。我在做查表时有一个习惯在数据点之间尽量用线性插值除非你的数据点非常密集否则不要用高阶拟合因为高阶拟合很容易产生过冲在一些SOC区间出现不合理的翘尾现象。第三步搭建RC网络动态方程这一步需要用到积分模块和增益模块。极化电压Up由电流、极化内阻Rp、极化电容Cp决定用公式推导出来的就是上面那个微分方程。考虑到初值问题我给极化电容设置一个初始电压为零——这符合一个完全静置电池的物理状态。第四步计算端电压并输出端电压等于OCV减去欧姆内阻压降再减去极化电压。如果放电电流为正放电方向定义要统一那这两个压降都是正的。用Add模块把这几个量组合在一起就得到端电压输出。这套基础模型搭建完成后再加上负载电流输入可以是恒流信号源、工况时间表或者后续的闭环控制信号你就有了一个能用的电池仿真模型。实测下来一阶RC模型对电池脉冲充放电的电压响应模拟已经到了工程可用的程度。2.3 CC-CV充电策略的Simulink实现充电策略是电池仿真里的必考项目其中恒流恒压CC-CV是最经典也最实用的方式。核心逻辑是先以大电流恒流充电电池电压上升到截止电压后转为恒压充电电流逐渐减小直到电流小于某个终止电流判断为充满。在Simulink里实现这个逻辑我有两种常用方案。第一种是用Stateflow状态机这是最直观的方式两个状态CC、CV加转移条件代码逻辑清晰适合交付给项目组其他成员看。第二种是纯Simulink逻辑实现用比较器加Switch模块也完全可行好处是省去了Stateflow的授权依赖有些版本的Matlab不带Stateflow工具箱。我自己的项目里用的是Stateflow方案逻辑是这样的初始状态是CC以设定的恒流值充电当端电压达到截止电压时触发状态切换到CVCV状态中以截止电压为参考电压用PI控制器控制充电电流让端电压稳定在截止电压当充电电流小于终止电流时切换到停止状态。这里有一个重要的经验CV阶段的PI控制器参数不能套用CC阶段调好的那一套。因为CV阶段被控对象特性发生了很大变化如果沿用原来的PI参数很容易出现电流震荡。我在实测中发现把PI控制器的比例增益调低到原来的一半左右、积分时间调大一些CV阶段的稳定性会有明显提升。2.4 SOC估算与初始值设置的工程技巧SOC初始值设置是新手最容易翻车的地方。很多人在仿真时喜欢把SOC初始值设成1满电然后在短短几十秒的仿真里就发现电压掉得吓人就怀疑模型有问题。这其实不是模型的错而是电池本身开路电压在SOC高位区间变化平缓而大电流下欧姆压降和极化压降会非常明显。我建议做仿真验证时按这个思路来先给电池一个静置时间仿真时间内的零电流段让极化电压稳定到初始状态再开始加载电流。这样得到的电压初始跳变才是真实的欧姆压降后面电压的缓慢下降才是极化过程。如果没有这段静置时间初始值不好设定不说仿真曲线还会有一段数值过渡过程看起来就会很假。关于SOC初始值我还有一个建议在模型里把初始SOC单独提出作为一个变量便于做批量仿真。做控制策略开发时经常需要对比同样的工况在不同初始SOC下的表现把这个参数变量化能省去大量重复改模型的功夫。3. 超级电容建模与充放电动态仿真3.1 超级电容模型特性和选型逻辑超级电容和电池在物理原理上有本质不同——超级电容是静电储能机制双电层电池是电化学反应机制。这就决定了它的模型特性和电池有显著差异超级电容的OCV和SOC呈线性关系近似理想电容特性内阻极小能够提供极大的瞬态功率但能量密度远低于电池。建模方面我推荐用经典的等效电路模型简化为一个理想电容C与一个等效串联电阻ESR串联。如果再考虑自放电现象可以并联一个大阻值的自放电电阻如果要更精细地考虑电荷再分布现象可以使用多支路RC网络模型。但对于绝大多数系统的仿真目标单支路RC模型已经能够很好地捕捉超级电容在充放电过程中的核心行为。3.2 超级电容经典RC模型的Simulink实现搭建超级电容模型的过程会比电池模型更快一些。核心参数就三个额定电容值C法拉、等效串联电阻R_esr毫欧级、初始电压U0伏特。模型结构非常直接超级电容电压 理想电容端口电压 - I * R_esr。这里有个关键点理想电容的端口电压对电流积分也就是 U_c U0 ∫(I/C)dt。然后考虑ESR压降就得到外部端电压。在Simulink里同样用Integrator模块、Gain模块和Add模块就能完成整个模型搭建时间不超过十分钟。这里我要特别提一个单位换算的坑仿真模型里的时间单位是秒电容单位用法拉电流单位用安培那么积分出来的电压才是伏特。但如果你从一些论文里直接抄公式容易遇到单位不统一的情况比如时间用小时、容量用安时一定要先在草稿纸上把单位捋清楚再往Simulink里填参数。3.3 超级电容与电池仿真特性的关键差异我在项目里把电池模型和超级电容模型放在一起对比时发现两者有几个非常有意思的区别理解了这几个区别你就知道为什么超级电容适合做功率型储能而电池适合做能量型储能。第一个区别是端电压随充放电深度的变化趋势。电池的OCV-SOC曲线有一段很长的平台区在这个区间内即使SOC变化很多OCV变化也很少而超级电容的电压与SOC基本是完全线性对应的。这意味着超级电容没法深度放电——如果放电到额定电压的一半那它存储的能量只剩四分之一了能量和电压的平方成正比而电池可以在很宽的SOC范围内保持一个相对稳定的电压输出。第二个区别是内阻量级完全不是一个数量级。我实测过的动力电池模组欧姆内阻通常在一毫欧到几十毫欧之间而单体超级电容的ESR往往只有零点几毫欧。超级电容因此能扛得住几十甚至上百安培的瞬时电流而电池在这种电流下电压会迅速掉到截止线以下。第三个区别是充放电效率。超级电容因为内阻极小充放电效率可以高达95%以上电池在大倍率充放电时内阻损耗占比会显著上升。在做系统效率分析时这个差异会直接影响到你是用电池还是超级电容来响应瞬态功率需求。4. 电池与超级电容混合储能的联合仿真4.1 混合储能系统架构与功率分配策略把电池和超级电容组合成混合储能系统本质上是在做能量密度和功率密度的取长补短。电池负责提供持续、稳定的能量输出超级电容负责承担瞬时大功率冲击。在电动车领域典型的场景就是加速爬坡瞬间的高功率需求和刹车回馈时的大电流吸收——那种工况下让电池单独硬扛对电池寿命的伤害非常大。在Simulink里做混合储能仿真核心不是把两个模型放在一起而是设计好功率分配策略。我实际工程中用过并且验证有效的是低通滤波分配法和规则逻辑分配法。低通滤波分配法的思路是负载总功率需求经过一个低通滤波器滤波后的低频分量分给电池高频瞬态分量分给超级电容。这种方法实现简单效果稳定。用一个Transfer Fcn模块一阶低通就能实现时间常数的选取决定了多少频率以上算高频—一般根据超级电容的容量大小来定容量大的超级电容能承担更低的频率分量可以把时间常数调大一些。规则逻辑分配法则更直观设置一个功率阈值当负载功率需求小于阈值时由电池单独供能超过阈值时超级电容介入补足超出部分。这种方法在中大功率项目中更加保险因为你可以精确控制电池和超级电容的工作区间。4.2 在Simulink中搭建混合储能联合仿真模型这一节我直接展示我在工程中反复使用的一个模型架构直流母线 两个支路 负载端。电池支路由电池模型和一阶低通滤波器生成的功率指令控制超级电容支路由超级电容模型和功率分配器生成的功率指令控制。两支路通过受控电流源接入直流母线负载端用一个可变功率负载模块来模拟实际工况曲线。搭建时需要注意的是电池和超级电容的端口电压可能不同所以在仿真中要设计好电气耦合方式。我常用的做法是首先假设直流母线电压是稳定支撑的由电池组的电压决定超级电容通过一个双向DC/DC变换器与母线相连这样在模型层面超级电容支路可以用受控电流源来表示避免为了求解任意时刻两支路并联的电压一致性而引入过大的计算负担。在Simulink里实现时我更倾向于使用Simscape Electrical中的双向DC/DC变换器模块来做精细的电气级验证但如果只是做策略级仿真用受控电流源代替变换器是完全可行的而且能大幅提升仿真速度。4.3 典型工况仿真结果与参数调优记录我拿一个典型工况来演示模拟车辆在30秒内先后经历恒功率启动、急加速、匀速、急减速回馈四个阶段总功率需求在正负之间大幅波动。第一次运行混合储能模型时我发现了两个问题。第一个问题是电池的低频功率指令在急加速阶段还是过高导致电池电压跌到了截止线以下。原因是低通滤波器的截止频率设置偏高高频分量没有完全划分给超级电容。我把低通时间常数从0.5秒调整到2.0秒这个问题就解决了。第二个问题出现在回馈制动阶段。能量回收瞬间直流母线电压会抬升超级电容电压也随之快速上升如果不加以控制可能会超过超级电容的额定电压上限。我在超级电容支路增加了一个过压保护逻辑当超级电容电压达到额定电压的95%时回馈电流自动限制多余能量由电池吸收。加了这个保护逻辑之后整个系统的鲁棒性明显提高了。这个调试过程非常典型——真实项目中很少有一次建模就能跑出理想结果的大部分时间都在和参数、边界条件做拉锯战。我的经验是遇到问题先理清楚是策略问题还是模型问题用模块化的模型结构可以快速定位千万不要在一个屎山模型里来回试参数那样只会越调越乱。5. 仿真中高频踩坑点与排查技巧5.1 代数环问题与控制系统的死循环在Simulink中搭建闭环充放电控制模型时最容易遇到的一个报错就是代数环Algebraic Loop。它的本质是Simulink检测到信号在同一个采样步长内存在前向依赖也就是输出信号又直接参与了同一时刻的输入计算形成了数学上的自洽循环。计算端电压需要知道电流而电流控制器又需要端电压作为反馈输入这就形成了代数环。解决代数环的思路有三个第一是在反馈回路中引入存储模块memory模块人为把一个步长的延迟加进去打破这个循环第二是使用更大的仿真步长让求解器有充足的迭代空间第三个是重新设计控制结构例如把电流、电压的测量改用上一时刻的采样值参与控制计算。我刚入门时吃了很多次代数环的亏后来养成一个习惯——看到报错先不急着加模块而是先在草图上画一遍信号流向看环路到底在哪。5.2 求解器类型与步长导致的仿真失真Simulink默认的是变步长求解器ode45在大多数情况下很好用。但电池/超级电容模型有自身的特殊性——RC网络的响应时间常数可能远小于工况变化的特征时间这在仿真中会导致一个问题如果你用定步长求解器且步长过大RC网络的动态过程会被数值抹平表现出来就是充放电曲线过于平滑电压响应完全失真。对这类电气动态模型我的经验是优先用变步长求解器并设置允许的最小步长低于模型中最小时间常数的五分之一。实测验算中一阶RC电池模型的极化时间常数通常在十秒量级如果仿真步长大于零点五秒那极化电压的动态特性就很难被准确捕捉。另外在状态机切换比如CC转CV的时间点附近我建议打开Simulink的零交叉检测功能这能极大缓解状态切换瞬间的数值震荡问题。5.3 同一套仿真结果差异大的元凶参数初始化经常有人拿着同一个Simulink文件来找我说为什么他的同事跑出来的结果跟他不一样。排查到最后十有八九是模型里某几个模块的初始值设置不同——特别是积分模块的初始条件SOC初值、极化电压初值、超级电容电压初值和Lookup Table的断点数据范围。这里我分享一个仿真卫生习惯我把所有需要在每次仿真前检查的关键参数初始SOC、初始温度、初始超级电容电压、负载工况编号集中放在模型最上层的几个Constant模块里并且命名规则统一为InitXXX。这样每次跑仿真前只需要扫一眼这几个常量就不会出现因为深埋在多层子系统里某一个参数忘记改导致仿真结果和上一次对不上号的情况。5.4 常见异常现象速查表异常现象可能原因排查优先级电池电压瞬间掉零欧姆内阻过大 / 仿真步长过大高充电电流振荡发散CV阶段PI参数不当 / 代数环未解决高SOC仿真结果异常容量单位错误 / 初始值设置不当中超级电容电压超过额定值回馈功率未限制 / 过压保护逻辑缺失高充放电效率超过100%功率方向定义混乱中仿真速度极慢模型复杂度过高 / 步长设置过小低这个速查表我贴在自己工位旁边很久了每一条都是真金白银换来的教训。特别是功率方向定义混乱这一点很多仿真工程师在初期都不在意结果后期分析数据时发现效率曲线完全不对回头改模型的工作量比一开始就定义清楚要大得多。6. 从仿真到工程应用的一些延伸建议6.1 用好Matlab脚本实现批量仿真手动在Simulink里改参数跑仿真一次两次还好多了效率就很低。我建议把参数和仿真流程用Matlab脚本管理起来通过脚本调用sim()函数批量执行不同工况、不同参数组合的仿真最后把结果统一保存下来做对比分析。这个方法在参数敏感性分析、控制策略寻优时是神器级别的好用。就拿我之前做的一个案例来说我需要对比电池在不同温度0度、10度、25度、40度下的恒流放电性能用脚本跑了四组仿真自动化输出端电压曲线和SOC曲线整个流程不到两分钟。如果用人工改参数的方式至少得小半天。6.2 模型验证环节不要省略仿真模型建得再精致最终还是要和实测数据对标才有意义。我的建议是有条件的话至少做一组最简单的验证实验——对电池做一次标准恒流放电记录端电压和电流数据然后把这些数据导入Matlab里和你的仿真曲线叠加对比。如果端电压误差能在可接受范围内不同场景标准不同一般3%以内算不错那这个模型的控制逻辑开发可信度就大大提升了。我印象很深的一次是帮一个做便携设备的朋友排查问题他的Simulink电池模型仿真显示设备能正常工作但样机实测却频繁低电量关机。后来发现他的模型里的电池内阻参数用了常温下的数据而实际设备运行时机身内部温度比较高锂离子电池在高温下内阻下降但可用容量其实也下降了——这一层耦合关系没有建模进去仿真的乐观结论就误导了整机设计。从那以后我在项目交付时一定会强调仿真给的是相对趋势绝对数值一定要用实测数据标定。6.3 后续可以扩展的方向如果你把上面这套模型都跑熟了下一步可以尝试的方向有很多把温度作为一个动态变量引入电池模型观察温度对充放电性能的反哺影响把老化模型循环次数导致的容量衰减和内阻增加加到电池模型里做长周期寿命仿真把模型代码生成部署到实际控制器里做硬件在环HIL测试。每一个方向都能在现有基础上平滑扩展这也是当初我坚持用模块化思路搭建整个仿真体系的核心原因——每个功能模块保持相对独立以后要加新功能不需要推翻重来。我个人在实际操作中的一个很深的体会是仿真模型的真正价值不在于它看起来十分精确而在于它能帮你快速、低成本地验证控制逻辑和设计思路。电池和超级电容这类物理系统本身就有很多不确定性温度、老化、制造差异模型永远不可能做到100%真实——但一个好的工程仿真模型能让你在做设计决策前就对各种可能性有清晰的预判这就已经值回建模的时间成本了。最后再分享一个我常用的技巧仿真模型的每个关键参数旁边都加一个注释写清楚它的来源数据手册、实验测量、经验估算半年后你回来维护模型的时候就会感谢当年认真写注释的自己。
RELATED READING

延伸阅读

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