做储能系统仿真的同行应该都有过这种体验:单做一个Buck或Boost变换器倒不难,难的是把电池充放电两条能量路径收在一个拓扑里,还得让控制系统根据电池状态自己决定往哪边跑。这个"基于双向DC-DC变换器的储能电池SOC充电+放电双模式Simulink仿真"项目,做的就是这件事。我用一套双向半桥拓扑,配合SOC估算、双闭环控制和模式切换逻辑,在Simulink里搭出了完整的充放电双模式仿真模型。它解决的核心问题是:储能系统里电池什么时候该充电、什么时候该放电,以及这两个方向上的功率控制怎么平滑衔接。适合刚接触电力电子仿真、或者做储能课题需要快速搭一个能跑的验证平台的同行参考。
项目本身并不复杂,但里面有几个容易踩的坑,比如模式切换瞬间的电流冲击、SOC估算漂移、电感参数怎么选。下面按我的实际搭建过程,把方案选型、参数计算、控制逻辑和调试记录完整过一遍。
1. 整体方案设计:为什么是双向DC-DC加SOC闭环
1.1 拓扑选型对比与最终决策
双向DC-DC变换器不是一个新东西,但选型上还是有讲究。储能系统常用的双向拓扑主要有三类:非隔离双向Buck-Boost(半桥)、隔离型双有源桥(DAB)、以及隔离型反激/正激双向变换器。我做仿真的时候直接排除了后面两种,原因很实际:DAB控制复杂度高,移相角、匝比、电感三组参数调起来很费时间;反激双向则适合小功率场合,1kW以上就吃力了。
非隔离双向Buck-Boost的优势是器件少、损耗低、控制直观。两个开关管、一个电感、一个母线电容,结构上就是Buck和Boost共用同一个电感,充电时走Buck路径,放电时走Boost路径。这在Simulink里搭起来非常顺手,而且控制环路的物理意义清晰,出了问题好排查。对验证SOC充电放电双模式控制逻辑来说,它是性价比最高的选择。
选型时还要考虑电压等级。我的系统参数设定是电池侧48V、直流母线400V,功率1kW。这个电压跨度下,非隔离拓扑完全能胜任,占空比工作范围也不算极端。如果电池电压和母线电压靠得太近,Buck和Boost的边界会比较模糊;如果跨度太大,占空比极限和电感电流纹波又会恶化。48V/400V算是储能仿真里很常见的组合。
1.2 控制目标拆解:SOC是决策的起点
整个控制系统的核心不是电压也不是电流,而是SOC。SOC全称State of Charge,也就是电池剩余电量百分比。仿真里我用安时积分法来计算:
SOC = SOC₀ - (1 / Qₙ) ∫ i_bat dt
这里规定电池电流为正表示放电,为负表示充电。Qₙ是电池额定容量,单位Ah。放电时电流为正,积分项为正,SOC下降;充电时电流为负,SOC上升。安时积分法简单直观,但存在漂移问题,后面我会专门讲怎么在仿真里控制它。
SOC的价值在于它是储能系统的"油表"。充电到上限就不能再充,放电到下限就不能再放,否则电池寿命受影响。因此我设定了模式决策逻辑:
- SOC低于20%时,系统进入充电模式,电流参考值给定为负方向;
- SOC高于90%时,系统进入放电模式,电流参考值给定为正方向;
- 在20%~90%之间,系统保持待机,电流参考为零。
这里需要说明,为了仿真能快速看到一轮完整切换,我把电池容量设定为1Ah来跑验证,而不是直接用20Ah的大容量。如果按20Ah跑,从45%充到90%要四十多分钟仿真时间,等不起。用小容量模型验证逻辑正确性,再换回真实容量做终版,是我常用的做法。
2. 核心模块搭建与参数计算
2.1 电池等效模型:一阶RC网络就够了
电池模型我选了一阶RC等效电路,它比纯内阻模型更接近真实特性,又没有二阶RC模型那么多参数要标定。模型由三部分组成:受控电压源(OCV随SOC变化)、欧姆内阻R₀、以及极化环节R_p和C_p的并联网络。
在Simulink里搭建时,OCV可以用一个一维查表模块实现,横坐标是SOC,纵坐标是开路电压。我用的特性是SOC=100%时OCV约54V,SOC=0%时约42V,中间近似线性,但实际磷酸铁锂和三元锂电池的OCV曲线形态有差异,你自己用的时候替换成目标电池的实测曲线就行。欧姆内阻R₀取0.05Ω,极化电阻R_p取0.01Ω,极化电容C_p取1000F。极化电容值很大,这是电化学特性的体现,仿真步长足够小的情况下没有问题。
电池模块的输出是端电压V_bat,计算公式是:
V_bat = OCV(SOC) - V_p - i_bat × R₀
其中V_p是极化电容两端的电压,满足微分方程:
dV_p/dt = i_bat / C_p - V_p / (R_p × C_p)
这里要特别注意电流方向的符号一致性。很多初学者仿真结果对不上,查到最后发现是放电时电池端电压反而升高了,就是符号定义搞反了。我习惯在模型里用一条明确标注的规则:正电流为放电电流,端电压等于OCV减去内阻压降。
2.2 主电路电感与电容的定量计算
双向Buck-Boost主电路最关键的元件就是电感和母线电容。电感决定电流纹波,电容决定母线电压纹波,这两个参数要在仿真一开始就定下来,否则后面调控制参数会非常折腾。
系统参数如下:
- 电池额定电压 V_bat = 48V;
- 母线电压 V_bus = 400V;
- 开关频率 f_sw = 20kHz;
- 额定功率 P = 1kW。
充电模式工作为Buck,占空比理论稳态值 D = V_bat / V_bus = 48 / 400 = 0.12。电感电流纹波计算公式是:
ΔI_L = V_bat × (1 - D) / (f_sw × L)
如果要求纹波控制在额定电流的10%以内,额定电流是1000 / 48 ≈ 20.8A,所以ΔI_L取得2A。反推电感:
L = V_bat × (1 - D) / (f_sw × ΔI_L) = 48 × 0.88 / (20000 × 2) ≈ 1.06mH
取整选择L = 1mH。放电模式工作为Boost,占空比稳态值 D_boost = 1 - V_bat / V_bus = 0.88,同样的电感下纹波电流大约2.1A,仍在可接受范围。母线电容则按电压纹波要求算,允许ΔV_bus = 2V,负载阶跃情况下经验取值1000μF足够。
这些计算千万别偷懒直接拍脑袋。电感取小了纹波大,PI控制器调得再好也压不住毛刺;取大了动态响应慢,模式切换时会感觉"拖泥带水"。1mH这个值在20kHz开关频率下是合理的折中。
2.3 双闭环控制器参数整定
控制结构是经典的电流内环加电压外环。电流内环控制电感电流,响应快,保证变换器的动态性能;电压外环在放电模式下维持母线电压稳定,充电模式下可以直接用功率或恒流指令。
这个项目里我简化了外环,直接由SOC状态机给出电流参考值I_ref,内环电流环负责跟随。这样做的好处是逻辑清晰,SOC控制策略一目了然,缺点是母线电压没有闭环稳到400V,放电时母线电压随功率会有波动。如果你需要严格的母线稳压,可以再加一个电压外环,但仿真验证SOC逻辑用电流指令就足够了。
电流内环的被控对象是电感,传递函数可以近似为:
G(s) = V_bat / (sL + R_L)
其中R_L是电感寄生电阻,取0.1Ω。采用PI控制器,为了抵消极点,把PI的零点放在电感极点的位置。功率级的控制周期是20kHz,电流环带宽取2kHz左右。经过反复试凑,一组能工作的参数是Kp = 5,Ki = 100。这组参数的物理含义是:电流误差1A时,比例项输出5V的占空比调节量;积分项每秒累加100,用来消除静差。
占空比输出必须限幅在0到1之间,防止模式切换暂态过程中PI饱和后积分卷绕(integrator windup)。我在PI模块后面接了一个饱和限幅器,并且让积分器在限幅时停止积分,这个细节对模式切换的稳定性影响很大。
3. 双模式切换控制与Simulink实现
3.1 SOC状态机与滞环逻辑
模式切换逻辑我用了滞环控制,而不是简单的阈值比较。原因是简单阈值在临界点附近会来回跳动。比如SOC在20%附近波动1%时,系统会反复在充电和待机之间切换,每次切换都伴随电流冲击,仿真波形很难看。
滞环逻辑如下:
| SOC状态 | 动作 |
|---|---|
| SOC < 18% | 强制进入充电模式,I_ref = -20A |
| SOC > 20% | 允许退出充电模式,切为待机 |
| SOC > 92% | 强制进入放电模式,I_ref = +20A |
| SOC < 90% | 允许退出放电模式,切为待机 |
上下阈值之间留了2%的滞环区间,这样切换次数大幅减少。在Simulink里可以用两个Relay模块级联实现,也可以用MATLAB Function模块写。我用的是后者,逻辑更直观,代码很短:
function mode = fcn(SOC) persistent currentMode if isempty(currentMode) currentMode = 0; % 0: standby, 1: charge, 2: discharge end if currentMode == 0 if SOC < 0.20 currentMode = 1; % enter charge elseif SOC > 0.90 currentMode = 2; % enter discharge end elseif currentMode == 1 if SOC > 0.20 currentMode = 0; % exit charge end elseif currentMode == 2 if SOC < 0.90 currentMode = 0; % exit discharge end end mode = currentMode;返回值mode经过一个选择器,生成对应的I_ref。充电时为-20A,放电时为+20A,待机时为0。
3.2 互补PWM与双向能量流动的原理
这是整个项目里我觉得最值得讲清楚的部分。双向Buck-Boost的驱动看起来很玄,实际上用一对互补PWM就能同时覆盖充放电两个方向。两个开关管的驱动信号互补,上管占空比为D,下管占空比为1-D,两个信号之间设置死区防止直通。
充电时,系统工作在Buck模式,上管高频斩波,占空比D约0.12,下管在关断期间承担续流作用;放电时,系统工作在Boost模式,下管占空比1-D的倒换,实际上控制的是下管的导通时间,但如果你维持互补PWM结构不变,占空比依然会由电流环自动调整到合适的位置。
让我说得更直白一点:稳态工作点附近,无论是充电还是放电,上管占空比都大约在0.12附近。区别只在于电感电流的方向。充电时电感电流从母线流向电池,放电时从电池流向母线。电流环本质上是在调节占空比来维持电流参考方向,而能量方向由电流方向自动决定。这就是双向变换器的巧妙之处,也是很多教程没有点破的地方。
在Simulink里实现互补PWM很简单,用PWM发生器模块比较三角载波和占空比信号,然后给两路输出加上一个死区时间模块。20kHz的载波周期50μs,死区取2μs足够防止上下管直通。
3.3 模型搭建顺序与关键模块清单
我搭模型时遵循一个原则:先开环跑通主电路,再加闭环控制,最后接SOC逻辑。顺序反过来会出问题都不知道往哪里查。
搭建分三个层次:
- 主电路层:电池模型、双向Buck-Boost电路、母线电容和负载电阻,用Simscape Electrical元件搭建;
- 控制层:SOC计算模块、状态机模块、电流PI控制器、PWM发生器;
- 监测层:SOC示波器、电感电流示波器、母线电压示波器、模式指示灯。
主电路层有一个容易踩的坑:Simscape器件和Simulink普通模块之间需要通过Simulink-PS Converter和PS-Simulink Converter做信号转换。电池模型的电压电流输出要转成普通信号送到控制层,PI控制器输出的占空比要通过Simulink-PS Converter再送到PWM发生器。转换模块量纲设置不对,结果会差出几个数量级,排查起来非常恼火。
涉及的主要模块清单我在下面列出来:
| 模块 | 参数设置要点 |
|---|---|
| 电池 | 1Ah,初始SOC=45%,一阶RC模型 |
| MOSFET(×2) | 导通电阻0.01Ω,缓冲电阻1e5Ω |
| 电感 | 1mH,寄生电阻0.1Ω |
| 母线电容 | 1000μF,等效串联电阻0.01Ω |
| 负载 | 电阻可切换,放电时模拟负载 |
| PI控制器 | Kp=5,Ki=100,限幅0~1带积分停止 |
| PWM发生器 | 20kHz,死区2μs |
电源和负载侧要注意,母线侧如果直接接电压源,电容和电压源直接并联会形成低阻抗回路,仿真求解时容易出代数环或者过流。我的做法是充电时母线侧接一个受控电流源或者可调电阻来吸收能量,放电时电池给母线电容和负载供电,这样更接近真实的系统结构。
3.4 仿真运行与结果判读
模型搭好后,仿真参数设置如下:求解器选择变步长的ode23t,最大步长限制在2.5μs,这样载波周期50μs内至少有20个采样点,PWM波形和开关纹波才能真实呈现。仿真时间设为400s,足够看到从初始45%充电到90%、再放电到20%的一个完整循环。
启动后的观察重点有三个波形:SOC曲线、电感电流波形和模式标志。理想情况下能看到:
- SOC从45%逐步上升,在达到90%后转向下降;
- 电感电流在充电阶段保持约-20A,放电阶段保持+20A,待机阶段回零;
- 模式标志按状态机顺序切换,无高频反复。
切换瞬间是最值得盯的画面。模式标志跳变时,电感电流应当在一个很短的时间内过渡到新参考值,不能出现大幅过冲或震荡。如果切换时电流冲击超过参考值50%以上,那大概率是PI参数没调好或者电流环带宽不够,优先去检查限幅和积分器停止条件。
4. 调试遇到的典型问题与排查记录
这一部分我按实际踩坑顺序整理,每个问题都给出排查思路和最终解决方式。
4.1 启动瞬间的过流:母线电容充电电流太大
第一次仿真跑到0时刻直接报错,原因是母线电容初始电压为0,上电瞬间相当于短路,冲击电流达到几十千安。解决方法分两层:一是母线电容设置初始电压400V,与稳态工作点一致;二是控制层在仿真开始头0.5s内让电流参考值从零斜坡爬升到目标值,而不是直接阶跃。斜坡时间常数取0.1s即可,过长的斜坡会让SOC曲线观测变得拖沓。
母线电容预充电问题在物理系统中同样存在,工程上会用预充电阻旁路,仿真中直接设置初始电压是最干净的办法。
4.2 模式切换冲击电流:参考突变是元凶
从待机切换到充电、或从充电切换到放电时,电流参考是阶跃变化,PI控制器输出占空比也会阶跃变化,电感电流需要时间建立。第一次调试时,我在20%SOC处看到切换瞬间电流冲击到了-50A左右,接近额定值的2.5倍。
排查后确认不是PI参数问题,而是电流参考值没有过渡。解决方法是给I_ref做一个斜坡生成模块,变化速率限制在20A/s,这样切换过程大约0.3s完成,冲击电流基本被抑制。用斜坡过渡的代价是模式切换响应变慢,但对储能系统来说,平滑性远比快速性重要,因为电池本身就不喜欢剧烈的电流变化。
4.3 SOC估算漂移:采样步长和积分初值
安时积分法在仿真中最大的坑是漂移。原因是Simulink数值求解会引入微小误差,长时间仿真时这些误差逐渐累积,导致SOC缓慢偏移真实值。更严重的是如果电池模型内部SOC和外部SOC计算模块各算各的,两者可能会发生轻微不一致,影响逻辑判断。
解决方法是把SOC计算模块的输出加一个饱和度限制,范围0~1,同时外部计算用的初始值和电池模型的初始SOC必须保持严格一致。我在模型里用了一个Constant模块统一提供初始SOC值,避免手工输入不一致。
如果目标是做长时间仿真,还需要加OCV修正机制,定期用开路电压校正SOC,但那是BMS层面的内容,仿真验证阶段用饱和限制就足够了。
4.4 仿真速度慢或者不收敛:求解器设置问题
Simscape电力电子模型带开关器件,解算器很容易因为局部不收敛而冻结。最早我用ode45,模型偶尔提示"连续时间状态不收敛",查下来是开关切换瞬间的电压突变导致的。换成ode23t之后问题基本消失,电力电子仿真社区里这个求解器算是默认选择。
最大步长设得太松也会导致PWM边沿丢失,波形出现奇怪的毛刺。记得把最大步长限制在2.5μs以内。如果仿真时间太长跑不动,可以把开关频率降到10kHz,同时调低带宽要求,仿真速度会快不少,但要注意电感纹波会变大。
另外,待机模式下电感电流为零,电流环输出占空比会漂移,PWM波形不稳定。我在电流参考为零时直接旁路PI控制器,让占空比固定在初始值0.12,这样待机时电路真正进入静止状态,也避免了零电流附近的数值振荡。
4.5 一个容易被忽略的细节:电池内阻和母线电容的阻抗匹配
电池内阻只有0.05Ω,母线电容1000μF,两者在充电回路里构成一个低阻抗振荡环节,响应频率大约在2.2kHz附近。这个频率如果和电流环带宽重叠,会产生谐振,表现是电流波形出现缓慢的包络振荡。我遇到过一次,电流纹波幅度正常但包络在3Hz左右起伏,调PI参数没用。
最终发现是电池模型输出端需要串联一个小电感来模拟线缆寄生电感,取10μH就能把谐振频率拖到20kHz以上。这个寄生参数在真实系统里天然存在,仿真默认忽略,但忽略的代价就是多花半天调参数。所以我的建议是,即使搭建理想模型,也务必在电池和变换器之间留一个小的寄生电感接口,方便后期扩展。
调试到后期,我养成一个习惯:每次改完参数,先去跑一个20s的短仿真观察模式切换质量,确认无误再跑400s的完整工况。短仿真能快速暴露大部分问题,又不浪费等待时间。这个项目从零到跑通完整充放电循环,前后花了两个整天,大部分时间其实花在排查上面说的第二和第三个问题上,原理本身反而没那么费事。
最终版本模型在400s仿真窗口里,SOC从45%平滑上升到90%,然后切换为放电,下降到18%触发强制充电,整个过程电感电流超调始终控制在额定值的10%以内,母线电压纹波约1.5V。这个结果对于SOC双模式控制逻辑验证来说,完全够用。如果你需要在此基础上做模型预测控制或者加入多储能单元均流,这套模型的主电路部分可以直接复用,只需要替换外环控制策略。