Simulink中储能电池双向DC-DC建模与SOC充放电切换仿真

📅 发布时间:2026/9/9 23:33:29
Simulink中储能电池双向DC-DC建模与SOC充放电切换仿真
做储能仿真这几年我最大的感受是很多人在Simulink里把电池模型和变换器模型分别搭得挺像样但一旦要同时跑“充电”和“放电”两个方向问题就全冒出来了——电流方向怎么处理、SOC怎么进控制环、模式切换瞬间波形会不会冲上天。前两天有个做储能PCS的朋友找我聊他卡在一个看似基础的问题上电池既要能充电又要能放电可网上能搜到的DC-DC仿真实例大多是单向的要么只做Boost放电要么只做Buck充电。他问我“双向DC-DC到底怎么在Simulink里建模SOC要怎么参与控制充电和放电之间切换波形才不会飙”这个问题基本问到了储能电池仿真最核心的坎儿上。这篇文章就围绕“双向DC-DC变换器 储能电池SOC 充电/放电双模式”这个组合把我在Simulink里从零搭模型的全过程写下来。内容包括拓扑选型的底层逻辑、电池模型和主电路建模的取舍、SOC估算怎么落地、模式切换怎么才能不炸波形以及我实际踩过的几个坑。无论你是刚接触储能仿真还是已经在搭模型但总被收敛问题折磨这篇都值得花十分钟看完。1. 为什么电池侧必须放一个双向DC-DC而不是直接挂母线1.1 母线电压和电池电压天生不匹配先搞清楚一个最基本的问题储能电池为什么不能直接和直流母线并在一起举个我常用的例子。假设你有一块额定电压200V的磷酸铁锂电池系统直流母线电压是400V。电池电压会随着SOC变化在比如180V到220V之间波动但母线电压往往需要稳定在400V左右。如果把电池直接挂到400V母线上电池端电压和母线电压不一致功率根本没法按你想的方向流动严重时直接烧毁设备或电池保护动作。这就是DC-DC变换器存在的原因它负责在电池和母线之间建立“电压适配”和“功率可控传输”的桥梁。单向DC-DC只能让能量从一端流向另一端而储能电池既要吸收能量充电又要释放能量放电所以必须用双向DC-DC。双向DC-DC本质上就是两套方向相反的单向变换器共用一套主电路通过控制开关管的通断时序让功率可以双向流动。发电侧和用电侧谁需要能量、谁提供能量全由控制策略决定。1.2 半桥双向Buck-Boost是最合适的起点双向DC-DC的拓扑很多非隔离的双向半桥Two-Quadrant Buck-Boost是入门首选也是很多工业产品实际在用的拓扑。它的主电路就是一个电感、两个开关管或者MOSFET带反并联二极管、两个电容。两个开关管互补导通一个作为Buck管一个作为Boost管。充电时能量从母线侧流向电池侧变换器工作在Buck模式把高的母线电压降压到电池端放电时能量从电池流向母线工作在Boost模式把电池端电压升到母线电压。为什么强调这是最合适的起点因为它的控制逻辑最简单占空比和电流方向的关系非常直观而且可以平滑过渡在临界点附近通过调整占空比就能实现从Buck到Boost的自然连续切换不需要额外切换主电路结构。如果目标是高压大功率场合比如几百千瓦的储能电站那就要用隔离型拓扑比如双有源全桥DAB或LLC。但仿真学习阶段先把半桥双向Buck-Boost吃透后续再看DAB会容易得多。1.3 先按能量流把仿真架构画出来我平时搭模型有个习惯先不急着拖模块用笔在纸上把能量流和控制流画清楚。能量流是这样的直流母线比如400V—— 母线电容 —— 双向DC-DC主电路 —— 滤波电感 —— 电池。充电时能量从母线流向电池放电时反向。控制流则是测量电池端电压、电池电流、母线电压计算SOC然后根据控制目标恒流充电、恒压充电、恒功率放电、母线稳压等生成占空比最后通过PWM发生器去驱动两个开关管。把这张图画完Simulink建模的逻辑就清晰了主电路用物理模型搭控制器用信号模型搭SOC估算放在控制器和电池模型之间模式切换逻辑单独做一个子系统。下面几个章节就按这个逻辑展开。2. 建模型前先定电池模型和DC-DC主电路2.1 电池模型Simscape电池模块与自建模型怎么选Simulink里做电池仿真主流有两种方案。第一种是用Simscape Electrical库里的Battery模块。这个模块内置了多种电池模型比如锂离子、铅酸、镍氢等你可以直接设置额定电压、额定容量Ah、初始SOC、内阻还能输出SOC、电压、电流、温度等物理量。好处是简单、可靠SOC由模块内部自动计算适合把精力放在主电路和控制上。第二种是自己搭电池模型。最常用的是Shepherd模型就是用一个受控电压源串联一个内阻其中开路电压表示为[ E E_0 - K\frac{Q}{Q-it} A e^{-B \cdot it} ]其中 (E_0) 是恒定电压(K) 是极化常数(Q) 是电池容量(it) 是已放出的电量(A) 和 (B) 是指数区参数。这个模型在Simulink里用受控电压源加变量表达式也可以实现但需要额外写SOC积分逻辑工作量更大。我的建议是如果你是做系统级仿真想重点看充放电双模式和SOC控制逻辑直接用Simscape的Battery模块别在电池电化学模型上浪费时间。如果你要研究电池本身特性或者需要特定电池的实测参数标定再考虑自建模型。下面是一组常用的仿真参数后面所有波形分析都基于这套参数参数数值电池额定电压200V电池容量20Ah初始SOC60%母线额定电压400V开关频率20kHz滤波电感1mH母线电容1000μF额定充放电电流10A2.2 主电路实现两条路线主电路建模也有两条常见路线。路线一是Simscape物理建模。从Simscape Electrical库拖Mosfet或IGBT、Inductor、Capacitor、DC Voltage Source代表母线、Current Sensor、Voltage Sensor把它们用物理连接线连起来。物理建模的好处是直观元件行为更接近真实开关管有导通电阻、二极管有导通压降能仿真出开关纹波。缺点是仿真速度慢而且对solver设置很敏感容易报不收敛。路线二是平均模型。用受控电压源和受控电流源来等效开关管平均行为比如Buck模式下用占空比控制的理想开关。这种模型不关心开关频率细节主要看能量传输和控制响应仿真速度快适合做控制策略验证和长时间SOC变化仿真。我的做法是先搭平均模型快速验证控制逻辑和SOC双模式切换逻辑确认没问题后再换成Simscape物理模型看开关纹波和效率细节。这样既不会一上来就被收敛问题折磨又能拿到更有说服力的波形。如果你要显示真实的PWM开关波形那必须用物理模型如果你只关心SOC在充放电过程中怎么走平均模型完全够用。2.3 Solver Configuration和仿真步长的初设定用Simscape物理建模时有个模块很多人第一次会漏掉Solver Configuration。它是Simscape物理网络的求解配置模块必须放在模型里否则直接报错提示“simscape 网络没有求解器”。Solver Configuration主要设置仿真类型的细节一般用默认参数即可但要注意它和整个模型的Discrete solver、连续求解器的配合。在Simulink里控制部分如果用离散模块比如Discrete PID Controller主电路用连续物理模型仿真类型要选择“Variable-step”或者“Fixed-step”。我个人更推荐用Fixed-step做双模式切换验证因为它能保证采样时刻一致特别是后面要加C代码生成或者硬件在环时固定步长是必要条件。步长建议设为开关周期的1/20到1/50比如开关频率20kHz就是50μs周期步长可以设1μs到2μs。这个步长在纯Simulink模型里能跑得动在Simscape模型里也能基本稳定。如果电脑性能一般步长可以放宽到5μs但开关纹波会明显变粗波形看起来会“毛”。3. 控制器设计从占空比到SOC的双闭环3.1 为什么要电流内环加电压外环双向DC-DC的控制策略业界标配是双闭环内环是电流环外环是电压环或者功率环。电流内环的作用是快速跟踪电流指令它直接控制电感电流让电池的充放电电流按设定值走。在Buck充电模式下电流指令是正的充电电流在Boost放电模式下电流指令是负的放电电流。电流环的带宽要足够高才能把电流限制在安全范围内防止过流。电压外环的作用是维持母线电压稳定。比如在放电模式下负载从母线上取能量母线电压会下跌电压外环检测到偏差后输出一个电流指令给内环让电池多输出一些电流从而把母线电压拉回来。在充电模式下外环可以改为恒流/恒压逻辑或者直接由SOC判断给出电流指令。在SOC参与控制的方案里最直接的做法是SOC经过一个模式判断逻辑产生充电电流指令或放电电流指令送给电流内环。也就是SOC在双闭环的外面作为更高一层的能量管理层。3.2 PI参数怎么定PI参数整定如果纯拍脑袋项目后期必定返工。这里给一个基于小信号模型的整定思路。电流内环的被控对象是电感电感的传递函数近似为 (1/(sL))加上PWM逆变器的等效增益 (K_{PWM})。用PI控制器把零点放在电感极点附近即 (K_i / K_p R_L / L)。然后根据期望的电流环带宽 (f_{ci}) 确定比例系数[ K_p \frac{2\pi f_{ci} L}{K_{PWM}} ][ K_i K_p \cdot \frac{R_L}{L} ]举个例子电感 (L 1mH)电感内阻 (R_L 0.05\Omega)PWM增益 (K_{PWM} 1/400)因为母线电压400V三角载波幅值按400V折算期望电流环带宽5kHz开关频率的1/4则[ K_p \frac{2\pi \times 5000 \times 0.001}{1/400} \approx 12566 ]这个值看起来很大但因为是物理平均模型比例系数大是正常的。放到离散控制器里注意采样时间要和PWM周期同步。电压外环的带宽一般取电流环的1/5到1/10即500Hz到1kHz。整定方式类似但被控对象变成电容和电流环闭环的等效对象公式会复杂一些。工程上常用试探法先把电流环整好然后从小到大加电压环比例系数观察母线电压波形调出合适的动态响应。3.3 从控制器到PWM发波的衔接在Simulink里控制器输出的是占空比信号需要连接PWM发生器才能驱动开关管。如果你用的是Simscape的Mosfet模块可以用PWM Generator模块也可以自己用Repeating Sequence三角波加比较器生成PWM。比较器的规则很简单占空比信号大于三角波输出高电平控制上管反向后控制下管。注意死区时间两个开关管不能同时导通否则直通短路。死区时间一般取开关周期的1%到5%比如20kHz对应50μs周期死区取0.5μs到2μs。如果是平均模型其实不需要PWM发生器直接把占空比信号经过增益连接到受控源上。但这样的话控制器设计时需要考虑占空比的限幅一般限在0.1到0.9留出一定裕量防止饱和深度影响反向切换。4. SOC估算与充放电模式切换的实现4.1 SOC计算的三种思路仿真里用哪一种SOC是储能系统的核心状态量。仿真实战中有三种思路第一种是安时积分法Ah Counting。原理是 SOC(t) SOC(0) - (1/Q_capacity)∫I dt。放到Simulink里用一个积分器输入是电池电流注意方向定义初始值设为初始SOC积分后除以容量再取负。这种方法的缺陷是电流采样误差会累积但在仿真里没有传感器偏差所以误差可以忽略是双模式仿真最实用的方法。第二种是开路电压法。通过查表把OCV映射到SOC。这种思路在仿真里适合做初始SOC的标定或者在稳态时修正安时积分的漂移。第三种是扩展卡尔曼滤波EKF。这是电池管理系统里比较高级的算法把电池等效电路模型的状态空间方程和SOC观测结合起来。在Simulink里用S-Function实现EKF比较考验建模功底但效果很稳。我建议初学者先用安时积分法跑通整个双模式流程后续再升级成EKF。如果你用的是Simscape Battery模块它本身会输出SOC量可以直接用这个输出做控制省去自己搭积分器。但如果你想更深地理解SOC计算过程或者用的是自己搭的电池模型那安时积分法的Integrator模块一定要会搭。4.2 用Enable子系统和Stateflow做切换逻辑充放电双模式的核心是切换逻辑。有很多方式实现我这里讲两种我觉得最顺手的。第一种是用Enable Subsystem条件执行子系统。把充电控制和放电控制放在两个子系统中分别用Enable端口判断当前模式。比如当SOC低于30%时启用充电子系统当SOC高于80%时启用放电子系统。这个方法的好处是结构直观控制策略一目了然调试的时候可以根据enable信号波形快速定位是哪一路在起作用。第二种是用Stateflow状态机。这是一个更工程化的方案。在Stateflow里定义两个状态Charge和Discharge外加Transition条件比如从Discharge进入ChargeSOC 30% 或 需要充电的指令触发从Charge进入DischargeSOC 80% 或 需要放电的指令触发Stateflow的好处是以后扩展状态非常方便比如加一个Rest待机状态、加一个保护Fault状态逻辑更清晰。如果你未来要做C代码生成Stateflow状态机是首选因为在代码生成时它能够生成非常整洁的switch-case逻辑。我个人习惯是先用Enable子系统快速验证逻辑稳定后再改成Stateflow。这样可以把“算法逻辑”和“工程实现”分成两步减少同时调试的负担。4.3 模式切换瞬间的软启动处理双模式仿真最容易出事的地方就是模式切换瞬间。设想一下电池一直以10A电流放电SOC降到30%控制器决定切到充电模式。如果占空比突然从Boost模式的某个值跳到Buck模式的另一个值电感电流方向瞬间反转母线电压会冲高电流波形会出现很大的尖峰严重时仿真直接发散。解决办法是加软启动。核心思想是模式切换后电流指令不是从负的10A直接跳变到正的10A而是从一个斜坡慢慢过渡。在Simulink里可以用Rate Limiter模块限制电流指令的变化率比如每秒最多变化20A那么从-10A到10A需要1秒时间。这样电感电流慢慢反向不会产生过大的电压尖峰。还有一个细节切换瞬间电流内环的PI输出可能处于饱和状态。如果积分项停留在很高的值切换后需要很长时间才能退饱和造成明显的电流超调。处理办法是切换时对PI积分器进行清零或限幅。在Simulink的PID Controller模块里有reset端口可以在模式切换信号触发时拉一下reset。我实测这个操作对波形品质的提升非常明显。5. 跑起来之后的波形解读与参数调优5.1 正常的充电/放电波形长什么样模型搭完、参数设好点Run之前先想想你期望看到什么。放电模式下电池电流是负值假设正方向定义为充电为正SOC随时间缓慢下降母线电压维持在400V附近由于PWM开关作用电感电流会有开关频率的纹波。充电模式下电池电流变为正值SOC上升母线电压依然稳定。如果一切正常你会看到SOC曲线是一条缓慢变化的斜坡方向在切换点发生反向。母线电压在模式切换瞬间会有小的波动但1秒内应该恢复到400V附近。我一般会在模型里加几个Scope电池电流、母线电压、SOC、占空比、模式标志。这样切换瞬间发生了什么一目了然。5.2 母线电压纹波、开关纹波的排查如果你看到母线电压纹波很大不要急着加大电容。先从原理上拆解。母线电压纹波主要来自两部分。一部分是开关频率纹波也就是开关管高频动作导致的电压脉动幅度一般较小如果太大要么是电容太小要么是ESR参数设得过大。另一部分是系统动态纹波通常出现在负载突变或模式切换瞬间幅度大、持续几个毫秒到几十毫秒这主要由双闭环带宽和软启动斜率决定。排查思路很简单把示波器时间横轴放到最小比如1ms/div看是不是高频周期性纹波再放大到500ms/div看是不是低频包络。高频纹波大优先查电容和开关频率低频纹波大优先查电压环PI参数和电流指令变化率。5.3 从仿真波形反推参数问题看波形不能只看“对不对”要看“哪里不对”。举几个典型例子。如果充电启动时电流超调非常大大概率是电流环PI积分初值没处理好或者Rate Limiter限得太松。如果母线电压在放电时跌得很深、恢复很慢说明电压外环的PI太弱或者电流内环带宽不够。如果SOC变化速率和你期望的不一致先检查电流方向定义安时积分公式里的电流符号和电池端电流传感器方向是否一致。这个小问题能让你白调一整天。有个实用的技巧把SOC变化曲线和电池电流曲线放到同一个图里对比。电流恒正时SOC应该线性上升如果哪一段SOC反向基本就是符号问题。6. 这段时间踩过的坑按坑号给你列出来6.1 代数环真的会让人崩溃我第一次把电流传感器信号直接送进PI控制器时Simulink就在状态栏提示存在代数环仿真速度奇慢波形还来回震荡。原因是电流传感器的输出经过一系列增益和PI计算后又反过来控制电流而电流又决定传感器输出如果中间没有存储或延迟单元就形成了瞬时反馈的代数约束。解决办法是在反馈回路上加一个Memory模块或者Unit Delay打破这个瞬时环路。在离散控制系统中本来就会有一个采样周期的滞后加Unit Delay是符合实际系统逻辑的。6.2 开关管模型不收敛仿真直接报错Simscape物理模型在步长设置不当或者开关管参数不合理时经常报“Solver encountered an error”或者“Singularity”。我遇到过一次原因是把Mosfet的导通电阻Rds设成了0。理想开关的电阻为0Simscape求解器在处理时会产生无穷大的电流变化率导致无法收敛。解决办法是给Rds设一个很小的值比如1mΩ同时把电感电容的ESR也设成非零值比如电感串0.05Ω电阻、电容串0.01Ω电阻。这样既符合实际元件特性又让数值求解稳定很多。另一个高发问题是死区时间设得为0导致上下两个开关管直通电流直接爆表。牢记两级互补PWM必须加死区。6.3 SOC方向搞反储能变成发电听起来像段子但我真的犯过。安时积分公式里如果把正方向定义成充电为正那么SOC应随积分负电流而下降。但有一次我把电池电流传感器的方向接反了结果SOC一直往上涨而变换器实际工作在放电模式。仿真里看起来是“充着电SOC却上升”整个逻辑全乱了。排查这个问题可以设置一个非常简单的工况不给负载只给一个固定占空比看电池电流是流入还是流出再对照SOC变化方向。先把电流方向标定清楚再谈双模式切换否则后面的所有波形都没有意义。6.4 仿真步长与运行时间的平衡如果你要观察SOC从60%变化到30%按20Ah容量、10A放电电流算需要整整1小时仿真时间。Simulink如果用固定步长1μs那要仿真3600秒步数36亿步电脑基本跑不动。所以双模式SOC分析一般不会用真实容量。常见做法是把容量调小比如把20Ah改成1Ah或者把电流放大让SOC在几十秒内就有明显变化。这个“仿真缩比”操作在学术论文里也常用只要说明是等效验证即可。另外如果仿真时间拉得较长建议先用平均模型跑SOC模式切换用物理模型只做短时段的波形分析。这个习惯能让你的仿真效率提高好几倍。最后再分享一个个人习惯每次仿真前我会把“初始SOC”“模式切换阈值”“电流指令变化率”这三个参数单独写在模型注释里方便下次打开模型时快速回忆。双模式仿真调试本质就是对这三个参数反复权衡的过程。你把它们的逻辑关系理顺了这个项目基本就成了。