最近我在调一个储能电池双向DC-DC变换器的Simulink仿真,前后折腾了一周,才把充电和放电两套控制逻辑装进同一个变换器模型里,并且让SOC正确参与模式切换。网上聊这个方向的资料大多是单向的,要么说Buck充电,要么说Boost放电,真正把“双向+双模式+SOC管理”串在一个模型里讲清楚的不多。这篇文章我想从头拆一遍我实际搭建的思路:拓扑怎么选、电池与SOC参数怎么设、充放电两套控制环怎么切换,以及调模型时最容易让波形崩掉的那几个坑。正在做储能仿真、或者准备拿这个方向做课程设计和毕业设计的朋友,可以把它当成一条可以直接照抄的建模路径。
1. 双向DC-DC变换器:为什么储能仿真的第一步是抛弃单向思维
1.1 单向模型拼不出真正的双向系统
很多人第一反应是:双向不就是Buck和Boost拼一起吗?充电时跑Buck降压,放电时跑Boost升压,两个变换器各干各的。我真见过有人这么搭——两套桥臂、两个电感,中间用理想开关切来切去。仿真能跑,但结果非常难看:切换瞬间电流毛刺大,两套回路之间的过渡状态还会造成电流断续,闭环控制参数怎么调都很别扭。
为什么会这样?因为两个变换器是独立设计的,一合并,电感和电容的储能路径全变了,等效小信号模型也跟着变,原来整定好的PI拿过来基本是失稳的。而真正的双向半桥只有一组电感、一组桥臂、一套电容,能量路径完全对称,正反两个方向用同一套硬件,切换过程天然平滑得多。所以做储能仿真,第一步就是抛弃“两个单向拼双向”的思路。
1.2 半桥双向Buck-Boost的两种工作模态
我用的拓扑是最常见的半桥双向Buck-Boost。结构上,电池接低压侧,直流母线接高压侧,中间一个电感L,桥臂由两个带反并联二极管的开关器件组成。简化成一句话:充电时它是Buck,放电时它是Boost,两个方向共用同一个电感和电容。
工作模态整理一下:
| 工作模式 | 主控开关 | 另一开关状态 | 能量方向 | 电压关系 |
|---|---|---|---|---|
| 充电(Buck降压) | 上管Q1高频PWM | Q2常关,靠体二极管续流 | 母线→电池 | 电池电压 = D × 母线电压 |
| 放电(Boost升压) | 下管Q2高频PWM | Q1常关,靠体二极管整流 | 电池→母线 | 母线电压 = 电池电压 / (1-D) |
这里要特别注意续流路径。充电模式下Q1关断时,电感电流是经过Q2的体二极管续流的,所以Q2虽然不给PWM,但它的反并联二极管必须存在。放电模式下Q2关断时,电流经Q1的体二极管流向母线。这也是为什么不能用两个理想开关简单代替——体二极管在方向切换里是正常工作路径,不是寄生损耗。
1.3 为什么中小功率储能场景偏爱半桥
半桥双向结构简单、器件少、控制成熟,比较适合电池电压在几十到几百伏、功率在几kW到几十kW的储能场景。更大功率或者需要电气隔离的场合,通常会上双主动全桥(DAB)或者隔离型双向变换器,但那是另一套建模思路。对于仿真入门和研究SOC充放电策略,半桥双向Buck-Boost是最合适的载体,模型搭建不复杂,又能充分体现双向控制的精髓。
2. 建模前先定三件事:拓扑方案、电池参数与控制目标
2.1 用开关模型还是平均模型:先想清楚你要看什么
建模型之前,我建议先回答一个问题:你这个仿真到底想看什么?
如果关心控制策略、SOC曲线、模式切换的动态过程,不关心开关纹波,那用平均模型最舒服,仿真速度快,可以跑很久的仿真时间,SOC变化看得非常直观。缺点是看不到电感电流纹波和开关管的电压应力。
如果关心实际波形,比如切换瞬间的电流尖峰、IGBT/MOSFET的开关应力,那得用开关模型。在Simulink里就是从元件库里拖实际的开关器件和二极管,配合20kHz左右的PWM驱动。代价是仿真步长会被开关频率限制,跑长时域仿真很慢。
我的实际经验是先开关模型跑通,再根据时间需求决定要不要简化。具体到本文的储能场景,充放电时间常数很大,几分钟的仿真里SOC可能只动几个百分点,开关模型勉强能接受;但如果你想验证SOC从20%充到90%的完整过程,那必须用平均模型或改变时间尺度,这一点后面会专门讲。
2.2 电池模块与SOC初值设置
电池建模我直接用的是Simscape Electrical里的Battery模块,它内置了电压特性、内阻、容量和SOC更新逻辑,比自己搭一个受控电压源加内阻的等效模型省事得多,而且SOC信号可以直接从模块输出引出来,不用自己写积分器。
参数上,我按一组实际储能系统做了设定:
| 参数 | 数值 | 说明 |
|---|---|---|
| 电池额定电压 | 200V | 高压电池组典型电压 |
| 电池容量 | 50Ah | 假定的储能单元容量 |
| 初始SOC | 30% | 模拟低电量起始状态 |
| 母线额定电压 | 400V | 变换器高压侧目标 |
| 开关频率 | 20kHz | 常见功率管开关频率 |
| 双向电感L | 5mH | 保证电流纹波在合理范围 |
| 母线电容C | 2200μF | 支撑母线电压 |
这里要提一个新手最容易忽略的细节:Battery模块的SOC输出单位在不同版本和不同配置下可能不一样,有的是0到1的标幺值,有的是0到100的百分数。如果后面接的比较器原来按0.2阈值设计,结果SOC信号是百分制,那模式切换逻辑会全部乱掉。我一般习惯先接一个Display模块,跑一秒钟仿真,确认SOC信号的实际量纲,再决定要不要加增益换算。
2.3 控制目标:充电恒流、放电稳压,以及SOC窗口
控制目标直接决定控制环结构。我这次仿真设了三个目标:
第一,充电模式采用恒流充电,给定充电电流指令10A,变换器工作在Buck降压状态,把母线能量送进电池。更完整的CC-CV两段式充电也可以做,但第一版先把恒流跑稳,再加电压限制。
第二,放电模式采用母线稳压,给定母线电压指令400V,变换器工作在Boost升压状态,把电池能量送到母线侧,带动一个约3kW的负载。也就是所谓的“恒定直流母线电压”控制,这是储能系统很常见的应用场景。
第三,SOC窗口管理:当SOC低于20%时强制停止放电、允许充电;当SOC高于90%时停止充电、避免过充。这个窗口逻辑放在下一节细说,但它必须在建模一开始就规划好,因为双闭环控制环结构和状态机是耦合在一起的。
3. SOC估算与模式切换:安时积分在Simulink里的落地细节
3.1 安时积分公式与最容易被坑的电流符号
SOC估算最常用也最容易写错的是安时积分法,也叫库仑计数法。它本质上是把电池当成一个容量固定的容器,对电流积分得到累积电量,再除以额定容量:
SOC = SOC(0) - (1 / Q额定) × ∫I dt
关键就在这个公式前面的负号和电流的正方向定义。Simulink的Battery模块默认规定电流从电池正极流出为放电正方向,所以放电时I为正,积分后SOC下降;充电时电流为负,积分后SOC上升。公式里的负号才能保证逻辑正确。
我见过一个很典型的翻车现场:有人把电流传感器的方向接反了,结果充电时SOC反而往下掉,一开始还以为是电池模块有问题,排查半天最后发现是Simscape那边的电流测量方向搞反了。所以说,SOC值异常时不要一上来怀疑算法,先查传感器方向和符号约定,这是最省时间的排错顺序。
3.2 用官方Battery的SOC输出,还是自己搭积分器
既然Battery模块本身就带SOC输出,我其实不建议再自己搭安时积分器。有些课程设计里习惯用一个Integrator模块,初始值设为SOC0,输入电流信号乘以增益1/(Q×3600),换算成每秒的SOC变化率。这个方法逻辑上没错,但有两个隐患:一是开环积分对噪声和直流偏置会不断累积,仿真时间一长SOC可能漂到超过100%或者变成负值;二是符号和量纲很容易出错,电流单位、时间单位、容量单位稍微混一下,结果完全不对。
官方Battery模块内部已经考虑了库仑计数和电压修正,输出的SOC信号是现成的。我实际建模时就直接把它拉出来,连接一个滞回比较逻辑,用于模式切换。如果非要用自己搭的积分器,建议只用于快速验证控制逻辑,并注意加饱和限幅,把SOC限制在0到1之间。
3.3 双模式切换的状态机与滞回控制
双模式切换的逻辑,我做了一个简单的状态机:**充电(Charge)、放电(Discharge)、待机(Standby)**三种状态。决策表大致如下:
| 当前状态 | 触发条件 | 切换动作 |
|---|---|---|
| 放电 | SOC ≤ 20% | 强制停止放电,进入待机或转充电 |
| 充电 | SOC ≥ 90% | 停止充电,进入待机或允许放电 |
| 待机 | 收到充电指令且SOC<90% | 进入充电模式 |
| 待机 | 收到放电指令且SOC>20% | 进入放电模式 |
在Simulink里可以直接用逻辑模块搭,也可以用Stateflow做状态机。我更推荐Stateflow,因为以后往里面加故障保护、加滞回区间、加通信指令都很直观。
这里有一个很重要的细节:阈值附近要加滞回,不能只设一个点。比如SOC下限设20%,如果SOC刚到20%就强制转充电,充电一两分钟又涨回20.1%,马上又允许放电,系统就会在阈值附近来回切换,波形抖得一塌糊涂。我的做法是设置一个恢复阈值:SOC低于20%强制转入充电,SOC回到25%才允许重新放电。中间的5%就是滞回带,能有效防止模式频繁切换带来的振荡。
4. 控制环路设计:电流内环加母线电压外环怎么搭
4.1 充电模式单电流环的PI整定
充电模式下,变换器工作在Buck状态,控制对象是电感电流,也就是电池侧的充电电流。给定指令I_ref = 10A,反馈值是电感电流的测量值,比较后进PI控制器,PI输出占空比D,送入PWM发生器。
PI参数的整定思路不能上来就两个参数一起调。我先令Ki=0,只加比例Kp,让电流跟随指令,观察系统的响应速度;Kp太小响应慢,Kp太大电流会有明显超调甚至震荡。找到一个能稳定跟踪、超调不大的Kp后,再逐渐加积分项Ki,用来消除稳态误差。充电模式一个典型的初值是Kp=0.2、Ki=20,但因为PI输出的幅值和PWM模块的输入范围可能经过归一化,不同版本Simulink里实际值会差不少,关键是把整定方法掌握住,参数微调靠仿真实验就好。
要特别注意PI输出必须限幅,占空比不能超过0到0.95的范围。如果不限幅,PI在启动阶段可能会出现占空比大于1的饱和状态,开关模态实际不再是理想的Buck,电流控制就失真了。
4.2 放电模式电压电流双闭环的参数分离思路
放电模式我采用母线电压外环+电感电流内环的双闭环结构。外环PI的输入是母线电压误差,参考值400V,输出是电流内环的指令值;电流内环再跟踪这个指令,输出占空比控制Boost开关。
两个环路的带宽必须拉开距离。电流内环反应的物理量是电感电流,速度快;电压外环的对象是母线电容电压,响应比电流慢。经典做法是电压环带宽设为电流环的五分之一到十分之一,否则外环会把内环的相位裕度吃干净,系统一加负载就震荡。我在仿真里实际用的初值是电压环Kp=0.1、Ki=5,电流环Kp=0.2、Ki=20。
这里要说一个很多人忽略的问题:充电模式和放电模式虽然共用同一套主电路,但Buck和Boost的小信号传递函数并不一样,最稳妥的做法是给两种模式各配一套PI参数,至少积分参数要分开。否则同一组PI在两个模式下往往只能保证其中一个稳定,另一个不是超调就是响应迟缓。
4.3 PWM互补输出与死区处理
开关模型做好以后,PWM信号的分配是个关键细节。充电模式要让上管Q1高频动作、下管Q2常闭;放电模式则反过来,让下管Q2高频动作、上管Q1常闭。所以两个PWM输出应该是互补关系,但千万不能在同一时刻给两个管同时发有效电平,否则母线正负极通过两个管子直接导通,仿真里就会看到直流短路,电流瞬间冲到几百安培。
我再加了一个死区环节,在实际电路中是为了防止直通,在仿真里则可以避免上述现象。死区时间取几百纳秒就够,比如200到500ns。这一步对控制策略验证意义不大,但对想观察真实开关波形的仿真非常有价值。
5. 实测调试记录:模式切换瞬间的波形异常与处理
5.1 一次切换实验的翻车现场
把充电放电两套控制环放进同一个模型后,我第一次做模式切换实验就直接翻车了。场景是这样:初始SOC=40%,模型先以10A电流充电,50秒后我发出切换指令,要求转入放电模式,带3kW负载稳压400V。
结果切换瞬间电感电流出现了一个接近80A的尖峰,母线电压从400V掉到280V,花了差不多0.2秒才恢复。这个现象其实非常典型。问题不在主电路,而在控制环的交接过程:切换前电流环指令是10A,切换后电压环给出的电流指令瞬间变成50A,参考值阶跃太大;同时PI积分器里可能存着充电模式下的旧状态,没有及时复位,导致占空比输出跳变。
所以遇到切换尖峰,先不要去调PI的Kp、Ki,先把模式切换时的PI状态交接处理好,问题能解决大半。
5.2 积分复位、指令斜率限幅与抗饱和
我后来做了三个改动,效果立竿见影。
第一,模式切换时对PI做复位或保持。在Stateflow的状态转移动作里给PI控制器发一个reset信号,让积分器清零,或者保持在切换前与当前稳态占空比接近的数值。这能避免旧模式遗留的积分量对新模式造成冲击。
第二,对电流指令做斜率限幅。用Rate Limiter模块限制电流指令的变化率,比如每毫秒最多变化5A,这样电压环输出的电流指令从10A变到50A是先经过一个斜坡,而不是直接阶跃,电感电流的冲击会小很多。
第三,给PI加抗积分饱和。模式切换瞬间容易出现积分饱和,原因是控制器输出占空比已经被限幅卡在边界,但误差仍然很大,积分器一直往一个方向累加,等误差反向时才慢慢退饱和,导致严重超调。我给PI控制器加了积分限幅,不让积分项超过设定范围,同时配合reset信号一起使用,切换过程中的振荡就基本消失了。
5.3 验证结果与调试顺序建议
改完以后我又跑了一遍同样的切换实验,效果对比如下:
| 指标 | 修改前 | 修改后 |
|---|---|---|
| 切换瞬间电感电流尖峰 | 约80A | 小于20A |
| 母线电压最低跌落值 | 280V | 390V以上 |
| 电压恢复时间 | 约0.2s | 小于0.05s |
| 切换后是否震荡 | 有明显振荡 | 基本无振荡 |
这个结果也印证了一个认识:双向DC-DC仿真里,主电路和控制参数不是最难的部分,模式切换过程中的状态交接才是真正的难点,仿真里体现为PI状态管理问题,实际电路里往往还要加软启动和模式平滑过渡策略。
最后分享一个我调试类似模型时固定的三步顺序,大家可以参考。第一步,先做纯充电仿真,观察充电电流是否为给定值、SOC是否按预期上升;第二步,做纯放电仿真,观察母线电压是否能稳压;第三步,才做双模式切换实验。很多同学为了省时间,一上来就搭完整系统,结果出了问题很难定位根源。我试过几次以后,还是老老实实按三步走,看着每一步的波形都对了再组合,整体调试效率反而高不少。