行业资讯
📅 2026/9/7 23:31:51
双有源全桥DAB变换器控制策略深度对比:MPC与PI的Simulink仿真实践
在电力电子仿真这个圈子里,双有源全桥DAB变换器配上模型预测控制MPC和传统PI控制的对比,基本上是研究生阶段绕不开的一个标准动作。DAB拓扑本身在储能、电动汽车充电、固态变压器里到处都是,而MPC与PI谁更强几乎是每次组会必被追问的问题。我这次把两者放到同一个Simulink平台里,基于单移相SPS调制做了完整闭环仿真,把建模思路、参数整定、踩坑记录、对比结论一次性整理出来,给正准备做这个方向或者正在被导师催仿真结果的读者一份可以直接抄作业的参考。1. 为什么选DAB拓扑和SPS调制:这个项目到底在对比什么1.1 DAB的工作原理:两台H桥与一台变压器如何完成能量搬运双有源全桥DAB变换器,结构上就是原边一个全桥、副边一个全桥,中间夹一个高频变压器。原边全桥把直流电压逆变成高频方波,变压器负责隔离和电压匹配,副边全桥再把高频方波整流成直流。关键点在于双有源这三个字,意思是副边H桥不是被动整流,而是主动产生一个与原边同频率、但是相位可调的方波电压。这两个方波电压加在变压器漏感两侧,电感上的电压差就决定了电流怎么流动。当副边方波滞后于原边时,功率从原边流向副边;反过来,副边超前时功率反向流动。这个相位差就是移相角D的核心,也是整个SPS单移相调制的基本原理。一句话概括:DAB就是通过控制两个H桥输出方波之间的相位关系来控制功率大小和方向。我在模型里用的是电压匹配的情况:原边直流400V,变压器变比1:1,副边额定输出200V,开关频率20kHz。这样设计的好处是电感电流在零移相时为零,移相后电流对称,波形分析直观,控制特性也更线性。实际工程里如果电压不匹配,比如变比和电压比对不上,DAB会进入回流功率增大的工况,效率会变差,这属于另一个可以深挖的话题。1.2 单移相SPS的功率传输公式:一切控制的数学基础单移相SPS控制的核心公式是传输功率表达式:P n * V1 * V2 * D * (1 - D) / (2 * fs * L)其中n是变压器变比折算系数(这里按副边电压折算到原边后的等效值),V1是输入电压,V2是输出电压,fs是开关频率,L是串联总电感(变压器漏感加外部串联电感),D是移相占空比,D的取值范围理论上在0到1之间。这个公式是所有后续推导的地基。用我选的参数(V1400V,V2200V,n1,fs20kHz,L100μH)代入,P 20000 * D * (1-D)。也就是说,功率与D呈抛物线关系,在D0.5时达到最大传输功率,P_max5000W。D0.276时P4000W,对应200V输出到20Ω负载的稳态工作点。这个抛物线的形状特别重要。它意味着同样的功率增量,在小移相角下需要较大的D变化,在大移相角下需要较小的D变化,被控对象增益会随工作点漂移。这就是为什么传统PI固定参数很难在整个工作区间内都表现优秀,也是MPC这种基于模型的控制方法有意义的原因之一。后面我讲PI整定和MPC对比时都会回到这个非线性上来。1.3 MPC与PI对比的真实意义:被控对象非线性在哪里很多人做对比仿真时有个误区,以为MPC和PI的差别只是一个先进一个传统,对比结果无脑说MPC好就完事了。实际上,这两种控制策略的本质区别在于:PI是基于误差反馈的被动调节,它不管被控对象内部机理是什么,只看输出电压偏差;MPC是基于被控对象数学模型的主动预测,它通过模型预测未来多个时刻的输出,再根据预测结果优化当前控制量。DAB在这两种控制下表现差异最明显的场景是输入电压突变。如果V1突然从400V跌到300V,PI控制器要等输出电压实际跌落之后才开始调整,属于事后补救;MPC呢,因为模型里明确包含了V1这个参数,采样到V1变化时就能立刻在预测方程里反映出来,控制器可以直接改变移相角来对抗扰动,属于事前预判。这种由于原理差异带来的动态性能差距,是仿真结果里最能体现价值的部分。但是MPC也不是没有问题。它对模型参数的依赖度高,电感L如果实际值和模型里差得远,预测就不准;枚举式MPC还有计算量问题,虽然DAB这个对象模型简单,枚举的实时性可以接受,但直接把MPC说得无所不能也是不负责任的。这个项目做对比,真正想做清楚的就是:在DAB这个具体对象上,MPC相比PI的改善有多少、代价是什么、什么条件下两者差距不明显。2. 主电路参数设计与仿真选型:先算清楚再动手搭模型2.1 一套可用于验证的DAB主电路参数仿真的第一步不是拉模型,而是先把参数算明白。我的参数选择如下:参数数值说明输入电压 V1400V前级直流母线输出电压 V2200V闭环控制目标变压器变比1:1原副边电压匹配开关频率 fs20kHz周期50μs串联电感 L100μH变压器漏感加外部电感合计输出电容 C470μF滤波电容,影响电压纹波负载 R20Ω稳态输出功率4000W为什么开关频率选20kHz而不是更高?一方面20kHz对绝缘栅双极型晶体管或MOSFET都友好,仿真的计算步长也不至于太小导致仿真速度难以接受;另一方面,频率如果提高到100kHz,同样的L下功率传输能力会提升5倍,或者L可以缩小到20μH,但仿真步长必须压到微秒以下,仿真时长会拉长很多。做对比研究没有必要在频率上追求极端。L100μH这个数值直接决定了最大传输功率。实际设计时要先根据额定功率反推L:P_max nV1V2/(8fsL),这是D0.5时的极限情况。如果你要做的系统额定功率只有500W,那L得选100μH乘以8,即800μH左右。我选100μH是为了让最大功率5000W覆盖4000W的额定工况,留出约25%的调节裕量,这个比例在工程上比较健康。2.2 电路级仿真选型:元件级H桥加变压器,还是平均值模型Simulink里做DAB仿真有两条路线:一条是用Simscape Electrical里的元件级模型,四个MOSFET或者直接用Universal Bridge搭H桥,配合Linear Transformer真实模拟每个开关周期内的电流电压纹波;另一条是用平均值模型,把H桥加变压器等效成受控源,仿真速度快但看不到开关纹波。做MPC和PI的对比研究,我强烈建议用元件级模型。原因很简单:MPC是周期同步的算法,它的预测基于开关周期的平均功率模型,但实际的输出电压和电感电流是带纹波的。如果平均值模型把纹波都抹掉了,MPC和PI的对比会在一个过于理想的环境里进行,很多在实际电路里会暴露的问题都看不到,比如采样点落在纹波峰谷对预测精度的影响、开关瞬间的电流尖峰等。元件级模型的具体结构是:直流电压源接Universal Bridge1(原边H桥),桥臂输出接Linear Transformer原边,变压器副边接Universal Bridge2(副边H桥),再经过滤波电容和负载电阻。用Universal Bridge比手动搭四个开关管省事,而且内部集成了缓冲吸收电路和导通压降,波形在宏观层面是准确的。2.3 高频变压器与串联电感参数的归属细节变压器模型是整个电路里最容易出问题的地方。Simscape里的Linear Transformer参数包含额定功率、频率、原副边电压、漏感百分比、励磁电感等。如果你在变压器参数里设置了漏感,又在外部串了一个电感,那么总电感是两者之和,传输功率会低于理论值。我在第一次跑模型时,变压器设置了2%漏感(折算约4μH),又加了个标称100μH的外部电感,实际总电感约104μH,功率下降接近8%,D0.276对应的输出电压只有约193V,闭环还能自动补偿,但开环标定就会产生偏差。我的建议是:变压器漏感直接设0.1%,外部串联电感承担全部L的作用。这样做的原因是控制模型里用到的是总的L,与其在变压器参数里设一个不好换算的百分比,不如把全部磁感集中在外部电感上,方便与理论公式一一对应。变压器本身只需要保证变比正确、励磁电感够大(比如设1mH以上),让励磁电流远小于负载电流即可。还有一个细节:变压器副边绕组电压的设置。Linear Transformer的Nominal Power要按额定传输功率设,或者直接设一个比最大传输功率大20%左右的值;如果设小了,仿真时磁路会饱和,波形会异常畸变。绕组电压按原边400V、副边200V设置,配合1:1变比,这样副边H桥出来的电压幅值就是200V级别。这里也不要忘了原副边绕组的电阻值,默认值通常偏大,建议设得小一些(比如0.01Ω),否则重载时电阻压降会在DAB的功率公式之外再引入额外损耗,让你看到输出怎么都到不了理想值。3. 传统PI控制在DAB上的整定路径与性能防线3.1 电压单环PI的系统近似与参数试凑方法DAB的SPS控制最常用的闭环方案是电压单环PI:采样输出电压,与给定值比较,经过PI控制器直接输出移相角D,再送给PWM生成模块。内环电流环在某些高性能场合也会加,但作为MPC的对比基准,单电压环足够说明问题。被控对象在工作点附近的传递函数可以从平均模型推导。在稳态点D0、V0附近线性化,C*dv/dt P(D)/v - v/R,其中P(D)nV1V2D(1-D)/(2fsL)。代入参数后,对象可以近似成一阶惯性环节,直流增益取决于P(D0)和负载电阻,时间常数主要由RC决定。R20Ω、C470μF对应的时间常数约9.4ms,这是被控对象里最慢的极点,所以电压环带宽很难做得太高。我的整定路径是:先用Simulink Control Design的PID Tuner自动给出第一版参数,然后在手动模式下做阶跃微调。第一版参数通常是Kp0.012、Ki6,对应的响应有约12%的超调,调节时间5ms左右。之后我手动把Kp加到0.02,响应变快但出现了明显的振荡;再往下压到0.015,同时把Ki提到8,最终得到一组超调8.5%、调节时间4ms的参数。这个试凑过程的核心逻辑是:P决定响应速度,I决定稳态精度,先P后I,P调过头就会振,I调过头就会低频晃动,反复几次就能找到平衡点。3.2 SPS-DAB系统中PI控制的结构性短板PI控制在DAB上有一个先天短板,我在多次仿真中被反复提醒:它本质上是在线性化工作点附近设计的控制器,一旦工作点大幅迁移,控制增益和对象的真实增益就对不上了。前面提到P(D)是D*(1-D)抛物线,D0.1时斜率高,D0.4时斜率已经明显下降。如果PI参数按大移相角工况整定,在小移相角时容易增益不足、响应慢;反过来按小移相角整定,在大移相角时容易超调甚至振荡。另一个容易出现的问题是积分饱和。DAB启动时输出电压从0开始建立,PI的积分项会快速累积到一个很大的值,当输出接近给定值时,积分项的惯性把输出推到远超给定值,然后需要很长一段时间才能回落。这在负载较轻的工况下尤其明显。我处理积分饱和的办法是给PI控制器的输出加限幅,同时把积分项也限制在对应限幅值的范围内,Simulink里自带的PID Controller模块勾选限幅选项就能自动做积分抗饱和,不用自己写。波形上,PI控制的另一个特点是动态响应受限于线性设计点。负载突变时,输出电压跌落多少取决于环路带宽,带宽高跌落小,但带宽受稳定裕度限制。在我这套参数下,负载从20Ω跳到10Ω,电压跌落约8V,恢复时间5ms左右。这个数字不算差,但对比MPC时会看到明显的差距,原因不是PI调得不好,而是它的反馈结构决定了它必须等误差出现才能调整。4. MPC模型预测控制在DAB上的离散建模与算法落地4.1 从平均模型到离散状态方程MPC的第一步是获得足够准确的离散预测模型。对于DAB,我们不用去预测每一个开关周期内的电流细节,而是用平均功率传输公式来描述输出电容上的电荷平衡。输出电容的状态方程如下:C * dv/dt n * V1 * D * (1-D) / (2 * fs * L) - v / R等式右边第一项是从原边传递到副边的平均电流,第二项是负载消耗的电流。这里有一个细节需要注意:为什么传输功率除以V就是平均电流?因为传输功率最终由输出电压源(Vout)吸收,输出电流平均值Iout P / Vout,P nV1V2D(1-D)/(2fsL),V2就是Vout,所以Iout nV1D(1-D)/(2fsL),和Vout两者约掉了。对状态方程做前向欧拉离散,控制周期Ts可以取一个开关周期50μs,得到:Vout(k1) Vout(k) (Ts/C) * [n * V1 * D(k) * (1-D(k)) / (2 * fs * L) - Vout(k) / R]这个式子看着简单,但它是整个MPC算法的核心。每一个候选D都能算出对应的预测电压,然后由代价函数确定哪个D最优。4.2 代价函数设计与枚举式求解有了预测模型,下一步是定义代价函数。我用的代价函数是:J (Vref - Vout(k1))^2 λ * (D(k) - D(k-1))^2第一部分是电压跟踪误差的平方,保证控制目标;第二部分是控制量变化率的惩罚项,λ是权重系数,作用是抑制D的剧烈跳变。λ设得太大,MPC会变得像PI一样迟钝;设得太小,移相角在小范围内抖动,输出电压纹波会增大。我经过测试,λ取0.0002时,电压跟踪精度和控制动作的平顺性比较均衡。求解方式我采用的是枚举法。把移相角D从0.02到0.5按0.005的步长离散成96个候选值,逐一计算预测电压和代价,选代价最小的D作为当前周期的输出。这个方案的好处是简单直观,完全避开了二次规划等复杂求解器,在一个50μs的控制周期内肯定能算完。有同学问为什么不用解析法直接求极值,当然也是可以的,代价函数对D求导置零可以得到解析解,但枚举法天然支持加入各种非线性约束,比如D的最大变化率限制,扩展性好很多。4.3 Simulink中MATLAB Function实现要点把枚举式MPC写进Simulink,用MATLAB Function模块是最直接的方案。代码结构如下:function Dout mpc_dab(Vsamp, Vref, Dprev, V1) % MPC for DAB-SPS, enumeration method fs 20000; % 开关频率 L 100e-6; % 串联电感 C 470e-6; % 输出电容 R 20; % 负载电阻(注意实时测量的情况) Ts 1/fs; % 控制周期,一个开关周期 lambda 0.0002; % 控制量变化率惩罚系数 Dmin 0.02; Dmax 0.5; Dstep 0.005; cand Dmin:Dstep:Dmax; Vpred zeros(size(cand)); for i 1:length(cand) Dc cand(i); Pavg V1 * Dc * (1-Dc) / (2*fs*L); Vpred(i) Vsamp (Ts/C) * (Pavg - Vsamp/R); end J (Vref - Vpred).^2 lambda * (cand - Dprev).^2; [~, idx] min(J); Dout cand(idx);有几个关键点必须注意。第一,V1作为函数输入,而不是在函数内部写死,是为了在输入电压突变时让MPC模型能看到扰动,这也是MPC预判能力的来源;第二,R参数我在这里是固定值,但如果负载是实时变化的,最好由测量环节提供,否则负载预测不准会影响MPC的性能;第三,Vsamp采样的是输出电压,这里建议采平均值或者滤波后的值,而不是直接采带纹波的瞬时值,否则预测会叠加纹波误差。代码里还有一个容易被忽略的细节:MPC更新周期与开关周期必须对齐。我的做法是在Simulink里用一个定时器模块或者直接让MATLAB Function在离散采样时间等于一个开关周期时触发,确保移相角在每个开关周期开始时更新且保持整个周期不变。如果你把采样时间设成连续,MPC每个仿真步长都会运算,不仅慢,而且算法含义会变得模糊。5. Simulink仿真搭建的五个常见翻车点与对应处理5.1 移相驱动信号生成方式原边桥和副边桥的驱动信号是DAB仿真里最先让人头疼的地方。原边H桥的对角管Q1/Q4一组导通,Q2/Q3一组导通,两组交替导通构成50%占空比方波,频率是开关频率20kHz。这个方波在Simulink里用Pulse Generator就能生成:频率设20000,占空比设50,相位延迟0。副边H桥同样需要50%方波,但相位要延迟DT,其中T50μs,所以Pulse Generator的相位延迟设成D50e-6秒。这个相位延迟参数就是PI或者MPC的输出,直接连到Pulse Generator的相位端口是不行的,因为Pulse Generator的相位端口在标准模块里不开放。解决办法是用Relay或Compare To Constant模块,把方波与移相阈值比较:原边方波在0~25μs为高电平,25~50μs为低电平;副边方波根据移相角D,比较器阈值设置为D50μs对应的等效时间(用周期计数器加比较器)。我习惯用离散计数器模块产生锯齿波,周期T,然后分别与0.25T和0.25TDT比较,得到原边和副边的两组驱动信号。还有一个必须做的事是死区设置。实际电力电子电路必须防止同一桥臂上下管直通,仿真里如果不加死区,开关瞬间的短路电流尖峰会让仿真速度急剧变慢。用Dead Time模块给每路PWM加0.5μs死区,既接近工程实际,又不会对平均模型下的动态响应产生明显影响。5.2 代数环的成因与消除DAB闭环系统里很容易出现代数环,具体表现是Simulink报Algebraic loop detected或者仿真速度突然极慢。代数环的成因是控制量D同时被输出电压关联,而输出电压又取决于D,形成了瞬时反馈回路。最典型的位置是:电压测量值直接进入MPC/PI函数,函数输出D,而D又直接影响当前时刻的变压器/整流桥电流,电流又影响电压测量值。解决代数环的标准做法是在反馈回路里插入一个单位延迟Unit Delay模块,把测量值延后一个采样步。对MPC来说,这完全不影响算法正确性,因为我们本来就是离散控制,控制器只能在每个控制周期开始时用上一周期的测量值进行决策;对PI来说,插入一个单位延迟或把PID控制器设成离散模式同样能断开代数环。我前期用连续PID时代数环问题反复出现,后来把PID Controller模块的采样时间显式设置为1/20000秒,代数环自动消失了,输出波形也没有受影响。5.3 求解器与步长选择对开关纹波的影响元件级H桥模型是强非线性系统,包含开关动作,对求解器非常敏感。我实测的经验是用变步长ode23tb,最大步长限制为0.5μs,仿真一个100ms的工况大约需要5到10分钟,结果比较可靠。如果用ode45而不限制最大步长,开关瞬态会被跳过,输出纹波形状严重失真。如果你追求更快的仿真速度,可以用离散求解器fix-step,步长设0.2μs,一个开关周期50μs内有250个采样点,精度足够。关于步长还有一个容易踩的坑:Simscape电气模型的采样求解和离散控制器的采样求解默认可能是不同的速率。你在Simulink里同时有连续电气域和离散控制域时,需要勾选Treat each discrete rate as a separate task或者单独配置,否则仿真会出现奇怪的步长错误。更简单的方案是搭建好模型后在求解器设置里把Automatically handle data transfer between different rates选中,它可以自动处理速率转换问题。5.4 启动过程与限幅设计DAB启动时输出电压从零开始,如果MPC或PI一开始就按稳态功率需求计算,移相角D可能直接冲到最大值,输出电容充电电流极大,波形惨不忍睹。我给两种控制器都设置了D的下限0.02和上限0.5,并且把MPC初始化时的Dprev设成0.02,PI的积分初始值也设成0.02对应的稳态值,这样启动过程会平缓很多。如果你想让启动过程更接近真实样机,可以在控制环节外面再加一个软启动斜坡:让电压参考值Vref从0在20ms内斜坡到200V。这个方法对PI和MPC都有效,而且不会影响后续动态响应的对比,我强烈建议在对比实验中加上,不然启动瞬间的差异会掩盖稳态控制性能的对比重点。5.5 变压器与测量模块的参数校验最后但同样重要的是,仿真模型的参数一定要和理论计算对应上,我的习惯是先开环测试:给定一个固定的D0.276,检查输出电压是否稳定在200V附近。如果开环结果都与理论值偏差超过5%,说明某个参数(变压器漏感、绕组电阻、snubber电阻)有问题,必须先解决开环问题再谈闭环。测量模块方面,电压测量建议用Mean Value模块在一个开关周期内取平均,而不是直接采瞬时值,这样控制器看到的是更有代表性的直流成分,控制器的离散模型也能与仿真波形对得上。6. 相同工况下的仿真结果对比:动态响应的差距在哪来的6.1 启动阶跃与电压参考值跳变在完全相同的启动和给定值跳变工况下,我先对比两者的阶跃响应性能。启动阶段,两者都带软启动斜坡20ms上升,MPC全程跟踪误差在2V以内,基本没有超调;PI在斜坡结束时有约7V的超调,随后在5ms内收敛。更有说服力的是稳态后的给定值跳变:在60ms时刻把电压参考值从200V跳到220V。MPC因为预测模型能提前计算功率需求变化,移相角D在跳变瞬间就大步提升,输出电压在1.5ms左右到达新稳态,超调约2%。PI则因为需要等待误差积累,在参考跳变后约3.5ms才到达,超调接近9%。这个差距的本质就是预测控制与反馈控制的区别:MPC是算出来的,PI是追出来的。6.2 负载突变与输入电压扰动负载突变工况是我设计在80ms时刻把负载电阻从20Ω切换到10Ω,相当于输出功率从4000W跳到8000W(但受D上限0.5限制,最大功率只有5000W,所以输出电压会掉下来)。这个工况其实是DAB的一个极端场景,因为SPS下最大传输功率就是5000W,没法满足8000W需求。我实际是用这个极限工况观察控制器在尽力而为时的表现:MPC会直接输出限幅值D0.5,输出电压以最快速度回升,但受限于物理极限无法回到200V,稳定在约177V;PI则因为积分饱和,恢复过程有明显振荡。更贴近正常工况的是输入电压扰动测试:在120ms时刻把V1从400V突变到300V。这个场景下,MPC的优势体现得最充分。因为V1直接进入了模型,MPC在一个周期内就能感知到功率传输能力下降,并且通过调整D来补偿;PI控制器则要等待输出电压真正跌落才做出反应,虽然最终也能恢复,但瞬态跌落幅度大了一倍多。实测结果:MPC跌落约4V,恢复时间2ms;PI跌落约9V,恢复时间6ms。6.3 两种控制方案各自的波形特征把两者的波形放在一起看,特征非常鲜明。MPC的移相角D波形带有明显的预测性跳变,每次扰动出现后,D会先大幅度调整然后逐步回稳,呈现一种矫枉过正再回来的形态;PI的D波形则更像传统PID的指数收敛形态,从旧稳态平滑过渡到新稳态。这个区别反映在输出电压上就是MPC的超调更小、恢复更快,但代价是D变化率更大,对执行器(H桥的开关管)的冲击应力也更大。我在代价函数里加入了λ惩罚项限制D的跳变,但即便这样,D的变化率仍然比PI要猛。另外我还要提一句,MPC对采样噪声的敏感性确实高于PI。预测模型假设测量值是准确的,但实际波形里开关噪声不可避免,如果采样没有做滤波处理,MPC的预测误差会直接体现在控制量上,移相角出现高频抖动。解决办法一是滤波采样值,二是在代价函数里保持λ惩罚项不为零。这些都是从仿真波形里能直观看到、并且在真实系统里一定会碰到的问题,提早处理好能让后续做硬件实验时少走很多弯路。按照我个人做这个项目的经验,如果你的重点是想论证预测控制优于反馈控制,DAB的输入电压突变和负载突变两个场景足够你讲清楚了;但如果你同时需要说明MPC的工程代价,那一定要把计算量、采样滤波和对模型参数的敏感性也一起呈现出来。仿真对比从来不是为了证明某个方法万能,而是把每种方法在特定工况下的长短处摆到台面上,这样选型才有依据。