Simulink中储能电池双向DC-DC建模与SOC充放电切换仿真
2026/9/9 23:33:13 网站建设 项目流程

做储能仿真这几年,我最大的感受是:很多人在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
额定充放电电流10A

2.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进入Charge:SOC < 30% 或 需要充电的指令触发
  • 从Charge进入Discharge:SOC > 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。理想开关的电阻为0,Simscape求解器在处理时会产生无穷大的电流变化率,导致无法收敛。解决办法是给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”“模式切换阈值”“电流指令变化率”这三个参数单独写在模型注释里,方便下次打开模型时快速回忆。双模式仿真调试,本质就是对这三个参数反复权衡的过程。你把它们的逻辑关系理顺了,这个项目基本就成了。

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

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

立即咨询