做储能变流器算法验证的时候,有一件事让我印象特别深刻:每次想看电池充放电切换的动态特性,都得先调台架、接通讯、等电池上电,一套流程下来大半天就没了。后来我换了个思路,先用Simulink把“双向DC-DC变换器 + 储能电池SOC + 充电放电双模式”这套系统完整搭出来,跑仿真把控制逻辑和时序问题捋顺,再上硬件验证。这么做的直接收益是硬件联调阶段基本不返工,很多坑在模型里就已经踩完了。
这篇文章就围绕这个仿真项目来写,重点拆解三块内容:一是为什么储能接口要选双向DC-DC而不是两组单向变换器,二是充电和放电两种模式下SOC估算与控制策略怎么配合,三是模型搭建时PI参数、PWM生成、模式切换这些关键环节的实操经验。适合正在做储能、微电网、车载电源方向的工程师和学生参考,哪怕你之前没碰过电力电子仿真,按着这个思路也能把模型跑起来。
1. 先从方案选型说起:为什么是双向DC-DC + Simulink组合
1.1 双模式不是仿真噱头,是实际工况的真实还原
储能电池在系统里的角色是“能量缓冲池”,既要能吸收多余电能(充电),又要能释放电能供给负载(放电)。如果把这套逻辑放到微电网或者直流母线上看,变换器需要处理两个方向的功率流:母线侧向电池侧流动是充电,电池侧向母线侧流动是放电。
我一开始也动过“偷懒”的念头:用两个单向变换器,一个管充电、一个管放电,两个电路并联到一起,模式切换时把对应的变换器使能。这种做法在控制上确实更直观,充电回路和放电回路彼此独立,不存在共用功率管的问题。但放到实际工程里一算就发现问题:功率器件数量翻倍、磁性元件翻倍、体积重量上去了,成本和损耗也跟着上去。
双向DC-DC变换器直接用一级拓扑解决双向流动问题,功率管、电感、电容都是复用同一套。对储能这种对效率和功率密度敏感的场景来说,这个优势是决定性的。而且双向拓扑在控制上并没有复杂多少,本质就是在Buck和Boost之间“切换身份”,只需要改变上下管的驱动逻辑就行。
1.2 拓扑选型:半桥Buck-Boost是最实用的入门结构
双向DC-DC的拓扑其实不止一种,常见的有半桥式(也叫双向Buck-Boost)、Cuk式、Sepic式,还有隔离型的双有源桥DAB。我这次选的是半桥式,没有选隔离型。
原因有三点:第一,储能电池工作在低压侧,直流母线在高压侧,两侧之间不需要电气隔离,非隔离拓扑就够了;第二,半桥式只需要两个开关管,结构最简单,控制上就是一个Buck和一个Boost的合成,调试周期短;第三,中小功率储能系统对成本敏感,半桥式的器件、驱动电路、电感设计都是最成熟的方案。
这个拓扑的关键特征我在模型里会反复用到:两个开关管串联成半桥,中点串联一个电感,电感另一端接电池正极,上管漏极接母线高压正端,下管源极接母线负极。充电时上管作为主功率管工作,电路工作在Buck状态,把母线的高压降到电池电压;放电时下管作为主功率管,电路工作在Boost状态,把电池电压抬升到母线电压。两个管子的体二极管也参与工作,所以换向瞬间不需要额外的换向电路。
1.3 为什么我把仿真平台选在Simulink
市面上能仿真电力电子的工具不少,比如专业仿真软件PLECS、PSIM,或者直接用电路仿真软件SPICE。我之所以最后用Simulink,核心原因是它把控制算法和主电路放在同一个环境里,可以让Simscape Electrical(老版本叫SimPowerSystems)的功率器件、传统的Simulink信号处理模块以及我自己写的状态机逻辑直接连起来调试。
举一个很具体的例子:SOC估算逻辑如果用PLECS或者SPICE来写,需要实现基于安时积分的自定义模型,难度不大但封装起来比较麻烦;而在Simulink里,一个积分模块加几个开关信号就能搭出完整的SOC计算逻辑,而且还能和电池模型自带的SOC端口对比验证。另外一个重要因素是后面要做硬件在环或者直接生成嵌入式代码,Simulink的代码生成工具链是现成的,模型调好后可以直接衔接,不用重新移植算法。
2. 控制策略与SOC估算的逻辑细节
2.1 充电模式:恒流-恒压是底线
锂电池充电不能一直用大电流怼。低SOC阶段用恒流充电,电流大小一般是按电池倍率来定的,比如20Ah的电池用0.5C倍率就是10A;当电池端电压上升到充电截止电压附近时,必须切换成恒压充电,电压不再上升,电流自然下降,直到电流降到截止值以下就认为充满。
对应到双向DC-DC的充电模式,变换器工作在Buck状态,控制目标是电池侧充电电流和电池端电压。我在模型里用了两个层级的控制:外环负责电压或者电流的给定,内环负责快速跟踪电流。恒流阶段直接把电流参考设在10A,电流内环闭环跟踪;恒压阶段外环电压控制器输出一个电流参考,交给电流内环执行。两个阶段之间不需要人为切换,只需要让电压外环在电池电压低于阈值时饱和输出,自然退化成恒流模式。
这里有一个容易踩的细节:电压外环的输出必须做限幅,否则它给出的电流参考可能超过变换器的安全范围,仿真里表现出来就是充电电流比设定值大很多甚至发散。我通常把电压环输出限幅设为1.2倍额定充电电流,也就是12A。
2.2 放电模式:母线稳压控制
放电模式下,电池通过双向DC-DC向直流母线供能,变换器工作在Boost状态。控制目标一般有两种:一是稳定母线电压,二是稳定输出功率。储能系统最常见的场合是维持直流母线电压恒定,所以我的模型选择了稳压控制。
控制结构还是电压外环加电流内环,但方向完全反过来了。母线电压参考设在60V,外环电压控制器根据母线电压偏差给出放电电流参考,电流内环控制电池侧放电电流。由于放电时电池电流方向与充电相反,我在模型里规定电池电流正方向为“从电池正极流出”,那么充电时电流参考就是正,放电时电流参考就是负,两个模式的物理意义直接通过符号体现。
Boost和Buck的控制参数不建议直接共用。我做过对比测试,用同一套PI参数跑两个模式,结果要么是Boost模式下电压恢复慢,要么是Buck模式下电流振荡。原因是两种模式下控制对象传递函数的零极点不同,尤其是Boost模式下输出电容对控制环路的影响更明显。
2.3 SOC估算:安时积分怎么做才不飘
SOC是储能电池管理中最基础也最容易出错的状态量。工程上用得最多的是安时积分法,公式很简单:当前SOC等于初始SOC减去电池电流对时间积分再除以电池容量。
我定义了电池放电方向为正电流,所以充电时电流是负值,积分项在减小,SOC从初始值往上走;放电时电流为正,SOC往下走。这个符号约定直接决定了模型里SOC计算模块的搭建方式,建议大家在搭模型之前先把电流方向和SOC方向定义清楚,不然后面看波形会一头雾水。
Simulink的电池模型本身自带一个基于内部安时积分的SOC输出端口。我建议的做法是:先直接用这个自带端口,同时自己额外搭一个SOC积分器作为对照。这样做的好处是能快速发现电池模型内部参数设置有没有问题。如果两个SOC差别很大,先检查模型里电池容量设置和电流参考方向。实测下来,纯安时积分在仿真环境里精度足够,但长时间运行会出现积分饱和漂移问题,所以我在SOC计算模块后加了一个一阶低通滤波,抑制高频纹波对SOC波形的干扰。滤波时间常数不能太大,我取了5秒,否则SOC变化趋势会滞后太多。
2.4 模式切换的软处理手段
充电和放电模式不是凭空切换的。真实系统中,如果正在大功率充电,突然把PWM驱动切到放电模式,电感电流方向需要时间换向,母线电压会有一个明显的冲击过程。我在仿真里试过直接切换,结果电流尖峰能达到正常值的3倍以上。
正确的处理顺序是:先封锁所有PWM脉冲,让变换器进入短时“自由停机”状态,等待电感电流下降到零附近,再切换工作模式,重新开启对应管的PWM。整个过程在仿真里可以简化成一个带延时的使能信号:MODE信号变化后,先触发PWM封锁延时模块,延时时间我设为200微秒,之后才允许新的驱动脉冲通过。
这个软切换逻辑看起来简单,但很多第一次做仿真的人都不会提前加进去。等到上硬件时才发现直通短路或者电流尖峰的问题,那时候再回来改模型代价就大了。
3. 模型搭建全过程实录
3.1 主回路:从电池到双向变换器的搭建细节
进入实际建模环节。我用Simulink的Simscape Electrical库,版本不同模块名称会略有差异,不要照抄名称,关键是结构对应。
先拖一个电池模块出来,参数设置为Lithium-Ion类型,额定电压48V,额定容量20Ah,初始SOC设为60%,SOC端口选择输出百分比格式。这里的重点是把内阻参数按实际电池规格填进去,不是越大越好,因为内阻直接影响了充放电切换瞬间的电压突变量。模型里的直流母线侧我接了一个并联电容,参数选100微法,用来稳定母线电压。
双向变换器主电路我用了两个MOSFET模块加反并联体二极管来实现,而不是用理想开关。MOSFET可以设置导通电阻和开通关断时间,更接近真实器件行为。电感取1毫亨,接在两个开关管的中点与电池正极之间;低压侧还有一个支撑电容,我取470微法。两个开关管的门极驱动信号通过G端口接入,控制信号来自后面的PWM生成模块。
有一个文档里不会重点提的细节:Simscape Electrical的物理信号是电气连接,和Simulink普通信号完全不同。测量电池电流或者母线电压时,必须把电气端的测量模块转换成物理信号,再通过PS-Simulink转换模块变成普通信号送给控制器,否则控制环路根本拿不到反馈值。
3.2 控制回路:双闭环与PWM生成的参数计算
控制回路的搭建是整个仿真模型的灵魂。我采用典型的电压外环、电流内环结构,充电模式下外环是电压环(限幅输出),放电模式下外环也是电压环(稳压母线),内环都是电感电流或者说电池电流。
电流内环PI参数我用了工程带宽法估算初值。电感L是1毫亨,电池侧等效电阻很小,约0.1欧姆,电流环带宽我取2000弧度每秒,对应频率约318Hz,这个数值比开关频率20kHz低一个数量级,不会和开关纹波产生耦合。按比例系数Kp约等于电感乘以带宽估算,算出来Kp约为2,积分系数Ki则把PI零点放在低频处,取800。这个初值跑完仿真要再微调,我实调后的结果是,Kp调到了2.4,Ki保持800能获得更好的动态响应。
电压外环的带宽要比内环低一个数量级,我取200弧度每秒,输出电容100微法,估算电压环Kp约为0.02,Ki取2。电压环输出经过限幅之后送给电流内环作参考,限幅值根据电池充放电电流极限设定。
PWM生成我用的是Simulink自带的两电平PWM发生器,载波频率20千赫兹,载波幅值自然三角波。调制波由控制器输出,幅值我限制在0到1之间。要注意的是,上管和下管的驱动信号必须互补,而且不能有交叠导通,否则会造成直流母线直通短路。仿真层面最简单的方式是通过PWM发生器直接输出一组互补信号,再在信号路径里加一个小延时模拟死区时间,建议死区时间设1微秒。
3.3 工况设置与仿真参数:速度与精度的平衡
仿真工况我设计成了三段时间的序列:前6秒充电模式,电池从初始SOC 60%开始恒流充电,观察SOC上升和电池电压变化;6到8秒停机,切换PWM封锁,观察模式切换是否平滑;8到14秒放电模式,母线电压目标60V,接一个20欧姆负载电阻,观察母线电压维持在60V的能力和SOC下降。
仿真求解器我推荐用固定步长离散求解器,步长设1微秒。这个步长对20千赫兹的载波来说,一个开关周期内有50个采样点,能比较准确地还原电流纹波和PWM切换细节。仿真时长14秒,实际跑完我这边大概需要几分钟不等,取决于电脑性能和模型复杂度。如果觉得太慢,可以把载波频率降到10千赫兹,步长放大到2微秒,波形细节会损失一点,但趋势判断完全够用。
关于PI参数再提醒一句:不同电源方向下的响应速度差异是客观存在的,跑完充电模式后复制一份控制器参数到放电模式前,建议先做一次阶跃响应测试,不要凭直觉直接套用。
4. 仿真结果怎么看、坑怎么填
4.1 典型波形长什么样才算正常
模型能跑起来只是第一步,很多人最后卡在“波形不知道算不算对”。根据我反复调参的经验,判断标准其实很直观。
充电阶段,电池电流稳定在设定的10A左右,理论上应该有5%以下的小幅波动;电池电压呈现缓慢上升趋势,这是SOC上升带来的端电压抬升;SOC从60%稳步向上增长,增长速度取决于充电功率:以48V乘10A约480W功率计算,对20Ah电池来说,理论上每小时能充进约8%的SOC,仿真里由于时间轴短,看到的是一条斜线。这一阶段母线侧其实在吸收能量,母线电压会略微下降,但会被电压环补偿。
放电阶段,最核心的观察点是母线电压。接上20欧姆负载后,电池通过Boost向母线供能,负载电流约为3A,母线电压应该稳定在60V附近,允许有短暂动态波动但应在几十毫秒内恢复。电池电流反向,幅值由负载功率决定,大约在3.75A水平,SOC曲线转为下降。放电时电感电流是断续还是连续也要看一眼,连续模式是设计预期。
模式切换时刻是最容易出问题的地方。理想情况下,切换瞬间电池电流波形有一段空白(PWM封锁期),然后从正电流翻转到负电流,或者反向翻转,中间不应该有明显的大幅过冲。如果看到电流尖峰超过正常值的两倍以上,大概率是切换时序没有做软处理。
4.2 常见问题速查与排查思路
我把调试过程中遇到的高频问题整理成了一张速查表,方便大家对照。
仿真初始化报错或者模型能跑但波形发散,最常见的两个原因是代数环和控制信号初始值不匹配。处理方式是在反馈通路上加memory模块或者滤波器,同时把PI控制器的积分初始值设成接近稳态的值。
充电恒压阶段电流出现锯齿状振荡,优先查电压外环PI的Kp和限幅,Kp过大会导致电流参考剧烈波动。把电压环Kp降一个数量级试一下,当前值如果是从0.02成功工作的测试结果,就不必追求更快的响应。
SOC波形上叠加了明显的锯齿纹波,这不是SOC计算错,而是电池电流里的开关纹波被积分器直接积分放大了。解决办法是在SOC计算模块前对电流信号做滤波,或者直接用Simulink电池模型内部自带的SOC输出。安时积分漂移的问题虽然在仿真里不太明显,但实际工程中周期性校正是必须的,主流做法是结合开路电压法定期修正。
模式切换之后母线电压出现了长时间的低频振荡,两个原因需要用两种手段排查:如果振荡频率在几十Hz以下,大概率是电压环带宽设置太低,提高外环PI的积分作用;如果振荡频率接近开关频率的几分之一,那是PWM调制与反馈采样频率之间的耦合风险,此时要检查步长和PWM载波比是否合理。
最后再说一点我自己常踩的坑:用了离散求解器之后,控制环路里的积分器和连续模式的传递函数块要统一用离散版本,否则会出现混合求解误差,表现为波形在稳态时还带小幅毛刺。把这个统一掉,波形瞬间干净很多。
仿真做完之后我把整个模型又重构了一遍,把模式切换状态机单独拿出来封装成了子系统,这样后面换电池参数、改母线电压等级,都不用动控制逻辑。如果你也在做类似的项目,我的建议是先把主电路跑通、波形看顺,再去抠控制精度和硬件实现细节,一步步来,这个模型稳得住。