☰
DAB双移相电源如何通过扫频与Bode图补偿实现PI参数整定
2026/10/20 9:54:26 网站建设 项目流程

最早做DAB(双有源桥)双向电源那会儿,我在相位裕度上栽过不少跟头。开环仿真好端端的,把闭环一合上就振荡;闭环勉强稳了,负载突加一下电压又掉得没法看。后来把“扫频、开环闭环仿真、Bode图补偿、PI参数整定”这条链路完整走通之后才发现,DAB-ESP双移相全桥这套东西,真正的难点不在拓扑本身,而在小信号模型的准确获取和补偿器的量化设计。这篇文章就是围绕这套完整的仿真与整定流程写的,把DAB双移相全桥的扫频方法、开闭环仿真对比、Bode图补偿前后的差异、以及一套可复算的PI参数整定计算程序全部拆开讲透。适合正在做双向DC-DC电源仿真验证的工程师,也适合刚接触DAB控制、想从“调参拍脑袋”转到“按Bode图定量设计”的研究生和硬件爱好者。

1. 先搞懂DAB-ESP双移相:这不是玄学,是四组开关管的相位游戏

1.1 DAB拓扑与ESP双移相的基本原理

DAB变换器结构上并不复杂:原边一个全桥、副边一个全桥,中间经由高频变压器和串联电感相连。能量的流向和大小,取决于两个全桥交流侧方波之间的相位关系。只要控制好原副边桥臂开关脉冲的错开角度,功率就能双向流动,这也是它在车载充电、储能、直流微网这些场合越来越吃香的根本原因。

很多人容易把“移相”理解成一个参数,其实DAB的移相控制是一个家族。最传统的单移相SPS只控制原副边桥之间的外移相角δ,两个桥都是50%占空比方波,简单但轻载下环流大、软开关范围窄。ESP(扩展移相,也叫内移相)在其中一个桥内再引入一个内移相角α,另一个桥保持全50%占空比,相当于把方波削出了阶梯,环流明显下降。DPS(双移相)则是两个桥都加内移相角,通常让两个内移相角相等,进一步对电流应力做优化。

我实际仿真和实验中用的“DAB-ESP双移相”,一般指以ESP为主、内外移相配合工作的控制方案。外移相δ决定了传递功率的大方向,内移相α负责电流波形整形。对电压环来说,真正用来做闭环调节的执行量通常还是外移相δ,内移相α往往按工作点预先设定或由效率优化算法给定。这里必须提醒一句:一旦引入了内移相,传递功率P(α, δ)的表达式就跟SPS那个简洁公式不一样了,它按α和δ的相对大小分成好几个工作模式,且模式边界处表达式不连续。这就引出下一个关键问题——为什么不能拿一个静态公式到处套。

1.2 为什么必须做“扫频+小信号建模”,而不是套静态公式

很多人第一次接触DAB,先记住功率公式P=V1·V2·d·(1−d)/(2·fs·L),然后直接拿它算工作点、算增益,结果一做闭环就露馅。原因很实在:这个公式只是在SPS、且忽略各种寄生参数和数字控制延迟的条件下成立。你一旦切到ESP或DPS,功率特性变成分段函数,同一个外移相δ在不同内移相α下的传输增益完全不同;负载变了、工作点换了,小信号增益也在变。

扫频的本质,是在一个稳定工作点上给控制量叠加一组不同频率的小正弦扰动,测量输出端对应频率的幅值和相位,从而得到该工作点下的频域传递函数。这样做有两个好处:第一,不管拓扑策略多复杂、模式多分几段,扫频得到的永远是这个小信号特征,不会因为公式记错而失真;第二,它能同时看到相位信息,而相位恰恰是判断环路稳定性的关键。所以我把“扫频”当成DAB控制设计的地基——后面的开闭环仿真、Bode图补偿、PI整定,全都建立在扫频结果之上。你要是跳过去直接调PI,本质上就是在看不见相位裕度的情况下盲调。

1.3 控制变量与被控对象的“电流源+RC”等效

在动手扫频之前,还需要理解DAB电压环被控对象长什么样。从输出端口看,两个全桥和变压器电感把输入功率转换成送往输出的等效电流,输出电容和负载电阻并联构成一个RC网络。于是控制量δ到输出电压Vout的小信号传递函数,天然就是一个“可控电流源灌进RC负载”的形式:

Gvd(s) = (∂P/∂δ / Vout_op) × R / (1 + s·R·C)

这个式子解释了为什么大多数DAB电压环对象看起来像一阶系统:低频段有平台,过了极点之后以−20dB/dec下降,相位最终趋向−90°。极点频率由负载电阻和输出电容决定,即fp = 1/(2π·R·C)。而低频增益则正比于该工作点下功率对移相角的偏导∂P/∂δ。这个结论在ESP双移相下依然成立,只是∂P/∂δ要按照实际分段公式或直接由扫频结果读出。

理解了这层等效关系,扫频时你就知道该重点看什么:低频平台高度对应∂P/∂δ和负载电阻,极点位置对应R·C,高频斜率能判断是否还有别的极零点混进来。有了这个预判,扫频数据就算偶尔抽风,你也能一眼看出哪里不对劲。

2. 扫频仿真全流程:从扰动注入到Bode图出炉

2.1 扫频的两种技术路线

实际做DAB扫频,我常用两条路。一条是时域扰动法:在仿真中给控制量叠加单一频率的正弦小信号,等输出进入稳态后用FFT或相关检测提取该频率的幅值和相位,然后逐个频点扫过去。这个方法的优点是不依赖软件内置功能,任何能跑时域仿真的工具都能做;缺点是慢,尤其是低频点,需要跑很多个周期才能压住FFT泄漏。

另一条是软件自带的AC扫频分析,典型原理是在开关周期稳态的基础上做小信号线性化,一次性算出全频段响应。这方法快得多,而且精度高,但要求模型拓扑清晰、工作点稳定,并且软件本身支持这类分析。两条路我在实际项目里是搭配用的:快速摸底用AC扫频,最后闭环验证和异常工况检查用时域扰动法。

如果你用的是时域扰动法,单点仿真时长一定要够。经验值是每个频点至少跑满10~20个扰动周期,再额外加一段等待初始暂态衰减的时间。低频比如10Hz,扰动周期100ms,一个点就要跑1~2秒仿真时间;如果是开关级模型,步长纳秒级,这样扫一圈下来非常耗时。所以我的习惯是先建平均模型来扫频定补偿,最后再用开关级模型复验,效率能差一个数量级。

2.2 扰动注入点与幅值的选择,不能拍脑袋

扰动注在哪里,决定了你测到的是哪条传递函数。开环扫频时,直接把扰动叠加在移相角指令上,测的就是对象Gvd。闭环扫频时,如果想测环路增益T,扰动要加在误差信号或者控制器输出的注入点上,测的是“扰动点到返回点”的完整环路;如果想测参考电压到输出的闭环传函,扰动加在参考上。这几者含义完全不同,搞混了后续补偿设计全乱套。

扰动幅值的选择是个容易被忽略的坑。幅值太小,仿真噪声、FFT量化误差会淹没信号;幅值太大,又会偏离工作点、触发工作模式跳变,导致测出来的频率响应失真。我一般取移相角标幺值的0.5%~2%,以不引起模式和输出纹波明显变化为上限。输出侧检测时,最好做相关检测或加窗FFT,只提取注入频率附近的能量,别用普通有效值去算幅值,否则高压纹波会污染结果。

扫频范围也要有讲究:从10Hz左右起步(通常够覆盖动态指标关心的低频段),上限取开关频率的1/10左右比较稳妥,再高就超出了数字控制器和小信号线性化模型的合理范围,测出来的相位会被采样延迟和PWM量化噪声搞得不可信。频点密度按每十倍频程10~20个点布置,对数均匀分布。

2.3 扫频结果怎么读:从Bode图反向验证对象结构

扫完以后先别急着做补偿,先把Bode图和理论预期对齐一遍。一阶对象最典型的三件事:低频平台幅度≈(∂P/∂δ/Vout)·R;在极点频率fp处幅度开始转折;相位从0°逐渐掉到−90°。如果实测曲线在高频段又出现一次−20dB/dec以上的陡降,说明还有一阶惯性或数字延迟没有考虑;如果中频出现相位的非单调变化,大概率是工作点漂移或模式穿越,这时必须减小扰动幅值重新扫。

我自己调DAB时吃过一个教训:扫频结果和理论公式算出来的低频增益对不上。排查了半天,发现是内移相α在扰动过程中被某个效率优化模块悄悄调整了,导致实际工作点一直在变。从那以后,扫频前我一定会先把所有附加控制策略冻结,只保留纯手动设定的α和δ,确保扫频期间变换器老老实实待在一个固定工作点上。这个习惯帮我节省了大量无效复扫时间。

3. 开环与闭环仿真对照:把环路增益的账算明白

3.1 开环仿真先做:拿到的“裸对象”Gvd有什么用

开环仿真的目标非常明确:在没有任何反馈补偿的情况下,拿到控制量到输出量的原始传递函数Gvd。它回答了三个问题:低频增益有多高、主极点在哪、高频有没有额外滞后。这三个信息直接决定了补偿器该选什么结构、零点该放多高。

举一个我常用的数值例子:DAB输入电压Vin=400V,输出电压Vout=50V,变压器变比8:1,开关频率fs=100kHz,串联电感L=50μH,输出电容Co=470μF,标称负载R=1Ω(对应2500W输出)。工作点取外移相δ对应的标幺d=0.2左右。用功率公式计算该点的传输增益:

∂P/∂d = Vin·(n·Vout)·(1−2d)/(2·fs·L) ≈ 9920 W/单位移相标幺

于是对象低频直流增益:

Gvd(0) = (∂P/∂d / Vout) × R ≈ 198 V/单位标幺

极点频率fp = 1/(2π·R·C) ≈ 339Hz。到了2kHz附近,对象增益大致是198×339/2000≈33.6倍(约30.5dB)。这个数字后面算PI时直接要用。

开环仿真还有个作用:验证对象建模是否正确。把扫频实测的低频增益和极点位置,跟上面这些计算值对一对,能对就能放心往下走;对不上就必须先解决模型或工作点问题,别指望补偿器替你擦屁股。补偿器只会放大你对象模型的错误。

3.2 闭环仿真的搭建关键:采样、延迟和控制步长

闭环仿真看起来比开环复杂,本质上只是把补偿器插进环路里。但DAB这种数字控制场景,有几个坑必须提前处理,否则扫出来的Bode图会带“假相位”,误导你的设计。

第一是采样方式。数字控制器通常在一个开关周期内的固定点采样输出电压(比如电感电流谷底或开关中点),这等于在环路里引入了一个采样保持效应。严格扫频时,要么把采样器包含在仿真链路里,要么至少意识到Bode图在高于fs/10后测到的相位不可靠。

第二是计算延迟和PWM更新延迟。从采样到占空比更新,通常有一个开关周期的滞后,PWM再实现一次零阶保持。工程上常用等效延迟Td=1.5·Ts来近似这一段。以100kHz开关频率为例,Ts=10μs,Td=15μs。在2kHz处,这个延迟贡献的相位滞后是:

Δφ = −2π·fc·Td = −2π×2000×15×10⁻⁶ ≈ −10.8°

千万别小看这10°,设计相位裕度目标55°~60°时,预留掉这10°,实际只有45°~50°。很多人调完PI直接拿仿真闭环波形看“稳不稳”,完全没意识到自己的裕度已经被数字延迟吃掉一大块,换一批参数、换一个负载点就露馅。

第三是控制步长。如果仿真模型中控制器部分用连续s域模块,而实际代码是离散的,两者会有可见差异。规范做法是:控制器直接按离散域建模,比如用后向欧拉或Tustin离散后的差分方程,这样仿真结果才和实测代码行为一致。

3.3 开环、补偿后环路、闭环传函三条曲线怎么对比

很多初学者把“闭环Bode图”默认成参考到输出的传递函数,但设计补偿器时真正要看的是环路增益T(s)=Gc(s)·Gvd(s)·H(s)。这两者不是一回事。

  • 开环对象Gvd:只反映被控对象,决定“裸特性”。
  • 环路增益T:在对象基础上叠加补偿器和反馈系数,穿过0dB线的频率就是穿越频率fc,该处的相位裕度直接决定系统稳定性,这是Bode补偿对比的核心曲线。
  • 闭环传函Vout/Vref=T/(1+T):反映跟踪性能、带宽和闭环响应形态,通常看幅频特性的−3dB带宽和峰值。

我做补偿前后对比时,习惯把三条线画在一张图里:先看Gvd的斜率,确认是单极点;再叠加补偿后的T曲线,检查穿越频率和相位裕度是否落在目标区间;最后看闭环传函的峰值是否小于2~3dB,避免闭环谐振峰过大。这套“三线对比”比单独看某一条曲线有用得多,也是整理资料时最有说服力的一组图。

4. Bode图补偿对比:PI补偿器的零点放哪最合适

4.1 补偿前先做对象诊断,别急着上PI

拿到开环扫频的Bode图,第一步是判断对象属于哪种类型。DAB电压环对象绝大多数是单极点型:低频平台、−20dB/dec下降、相位往−90°走。个别场景下,输出电容ESR会引入一个零点,使相位回升一点;如果输出侧还有第二级LC滤波,就可能出现双极点甚至谐振峰,那补偿结构就完全不一样了。

我之前做过一个带LC输出滤波的DAB,当时按单极点对象设计PI,结果相位裕度虚高,状载和轻载切换时振荡。后来仔细扫频才发现,LC谐振频率附近对象增益有一个明显的峰,相位急剧跌落。这种情况单靠PI压不住,必须加陷波器或把穿越频率压到谐振峰以下。所以我的原则是:不诊断清楚对象,绝不写PI参数。

如果确认是干净的单极点对象,补偿设计就非常简单:用一个PI补偿器就够了。PI在穿越频率处贡献约−90°到0°之间的相位,配合对象本身的−90°,总相位能做到−90°到−180°之间,相位裕度完全可控。没有必要为了“显得高级”去加超前滞后环节,那反而会把噪声放大。

4.2 PI补偿器设计:按穿越频率和相位裕度反推参数

这里给出我自己一直在用的设计流程,可以说成“三步反推法”。

第一步定穿越频率fc。穿越频率不能定太高,受开关频率和数字延迟限制,我通常取fs/10以内。上节的例子里fs=100kHz,fc定在2kHz。定低一点更稳,但动态响应慢;定高一点动态好,但相位裕度被延迟吃得多。对充电、储能这类对动态要求不苛刻的场合,fc取fs/20都可以。

第二步定零点频率fz。PI补偿器的传递函数可写成:

Gc(s) = Kp + Ki/s = Kp·(s+ωz)/s,其中ωz=Ki/Kp

把零点放在fc/7到fc/10附近,比如fc=2kHz时取fz≈300Hz。这样做的原因是:在穿越频率处,PI的幅值主要由Kp决定(零点早已过,积分项幅值只有Kp的约1/7),相位只比−90°回升约8°~10°,不会把相位裕度算虚高。零点放太低,低频增益不够,稳态精度差;放太高,中频段相位回升太多,但高频增益也被抬高,容易放大开关纹波。

第三步算增益。对象在fc处的增益前面已经估过,约33.6倍。要让补偿后的环路在fc处穿过0dB,需要:

Kp ≈ 1 / |Gvd(fc)| ≈ 1/33.6 ≈ 0.03

然后零点频率确定后:

Ki = Kp·ωz = 0.03×2π×300 ≈ 56.5

注意这里的量纲都是基于“移相角标幺”控制量。如果你的控制程序里移相角用弧度或用计数值表示,必须做对应的量纲换算,否则仿真好、上机炸,这两年在别人代码里见过太多次这种低级事故。

4.3 补偿前后的Bode对比到底在看什么

把补偿前后的Bode放在一起,你应该确认四件事:第一,补偿后环路在fc=2kHz处正好穿过0dB;第二,该处相位裕度PM=180°+∠T(fc)达到目标,在本例中约70°~80°(含数字延迟后仍有约60°以上);第三,低频段增益被PI的积分项拉高,保证稳态精度和负载调整率;第四,高频段没有多余的峰,增益随频率单调下降,避免噪声放大。

我实测对比中,补偿前对象在2kHz处相位已经到−90°,补偿后环路总相位大约在−105°到−110°,所以PM在70°~75°左右,比较舒服。如果算下来PM不足45°,我会选择降低fc——这是最简单有效的补救手段,而不是去调高Kp一根筋地试。记住:Bode图补偿不是“画得好看”,而是把穿越频率、相位裕度、增益裕度三个数字死死钉在目标区间内,仿真和实测才能一致。

5. PI参数整定计算程序:从手动算到一键出数

5.1 整定方法怎么选:针对一阶对象,不需要花哨算法

市面上PI整定方法很多:Ziegler-Nichols临界比例法、Lambda整定、极点配置、甚至粒子群优化。但对DAB这种典型一阶对象,我强烈推荐“零点配置+穿越增益匹配”——也就是上一节那套三步反推法的程序化实现。它解析、快速、可解释,改一个参数就能看它对Kp、Ki的影响,比黑盒优化靠谱得多。

ZN法在学术文章里常被引用,但它本质上是针对能自激振荡对象的经验整定,对电源这种强约束、低裕度容忍度的系统来说,它的参数往往偏激进,容易引发振荡。而纯粹的优化算法(粒子群、遗传)用来调PI,在DAB这种单极点对象上纯属杀鸡用牛刀,还容易过拟合到某个工作点。所以我的程序里核心算法就是解析设计,留一个“校验”接口让用户复核自己的裕度目标,不搞花里胡哨。

5.2 程序核心计算流程与代码骨架

程序分四步走:读参数、算对象、算补偿、出报告。第一步输入电路参数和期望指标(fc、PM目标);第二步用功率偏导公式或直接读取扫频CSV计算对象特征;第三步按三步反推法算出Kp、Ki并预估相位裕度;第四步做离散化并输出验证脚本。

关键计算段可以这样组织:

def plant_characteristics(cap, res, dp_ddelta, vout): fp = 1.0 / (2 * 3.1415926 * res * cap) g0 = dp_ddelta / vout * res return fp, g0 def tune_pi(fc, fz, gain_at_fc): kp = 1.0 / gain_at_fc ki = kp * 2 * 3.1415926 * fz return kp, ki def pm_estimate(fc, fz, fs, ts): delay_deg = -360 * fc * 1.5 * ts # 数字延迟折算 pi_deg = 90 - (180 / 3.1415926) * 3.1415926 / 2 # 占位示意 plant_deg = -90 return 180 + pi_deg_fc + plant_deg + delay_deg

实际程序里,PM估算要精确计算PI在fc处的相位角:

∠Gc(fc) = atan(fc/fz) − 90°

以上面数值为例,atan(2000/300)≈81.5°,PI相位−8.5°,对象相位−90°,再扣数字延迟约−10.8°,总相位约−109.3°,PM≈70.7°。一步就能算出来,不需要猜。这也是我推荐解析法的原因:每个参数物理意义明确,程序还能顺带输出一份“PM预算表”,让使用者知道裕度被谁吃掉了。

5.3 离散化:s域转z域,别在这里翻车

程序算出的Kp、Ki是连续域参数,实际代码里的是差分方程系数。这一步是最容易翻车的地方。常用的离散化方法有三个:后向欧拉、双线性Tustin、带预畸变的Tustin。对PI控制器,我推荐后向欧拉或Tustin。

后向欧拉最简单:积分项离散成Ki_d=Ki×Ts,Kp不变。以本例来说,Ts=10μs,Ki_d=56.5×10⁻⁵=5.65×10⁻⁴,Kp=0.03。Tustin会稍微复杂一点:Kp_d=Kp+Ki·Ts/2,Ki_d=Ki·Ts。如果控制器实现的是增量式PI,那么直接使用:

Δu = Kp×(e(k)−e(k−1)) + Ki_d×e(k)

用增量式的好处是天然带抗积分饱和,切换手动/自动模式也平滑,我在实际程序里几乎是标配。

这里必须提醒量化问题:DSP里PI系数通常要按Q格式定点化,Ki_d这种5.65×10⁻⁴的小数,如果直接截断成16位整数会丢精度。要么提高采样频率对应的系数尺度,要么用32位定点,要么把控制量改成标幺后再整定。我在某次实验里就因为这个吃了亏:仿真PI波形漂亮,下板后输出电压带0.2V的静态偏差,查到最后就是Ki系数被定点化截没了。

5.4 整定完必须做的三步验证

出参数不等于结束,我每次整定完都强制自己跑三轮验证,缺一不可。

第一步是阶跃响应:给参考电压加一个5%~10%的小阶跃,记录超调量和调节时间。超调超过20%或调节时间超过目标值,说明PM估计偏乐观,回头检查是不是忽略了某个延迟环节。

第二步是负载阶跃:在额定负载和半载之间切换,看输出电压跌落和恢复时间。对DAB这种电流源特性对象,负载阶跃造成的电压跌落主要跟输出电容、穿越频率有关,粗略可估:

ΔV ≈ ΔI_load/(2π·fc·Co)

以本例ΔI=25A、fc=2kHz、Co=470μF估算,跌落约4V上下,恢复时间在0.5ms以内算合理。如果实测跌得比估算大很多,多半是环路带宽虚高或工作点增益计算有误。

第三步是复扫环路增益:把整定后的PI接进闭环,重新做一次扫频,确认Bode图上穿越频率和PM与设计值偏差在可接受范围内。再顺手把电感L和电容C在±20%范围拉偏,重复扫频,确认裕度不塌。这套鲁棒性检查只需要几分钟仿真时间,却能避开大量“参数刚好在某个负载点能跑”的假象。

6. 资料完整度的现实标准:一份能复现的DAB仿真资料该有什么

6.1 一份合格资料的文件清单

标题里强调“资料完整”,我理解这四个字的分量。我自己整理DAB仿真项目资料时,固定按七类文件归档:仿真模型、参数表、扫频脚本、Bode原始数据、补偿设计与整定程序、验证波形、说明文档。缺一样,别人复现时就要多踩一个坑。

仿真模型要有两个版本:平均模型用于快速扫频和参数初调,开关级模型用于最终验证。参数表必须覆盖所有元件值、变压器变比、开关频率、死区时间、采样时刻、控制周期这些看似不起眼的量——实际上死区和采样时刻对高频段Bode影响极大,漏了就等于自断双臂。

Bode原始数据建议以CSV格式保存测量结果,并标注清楚是哪条曲线(开环Gvd、环路T还是闭环传函)、哪个工作点、扰动幅值多少。这些元数据比曲线图本身更值钱,因为后续修改补偿器要反复回到原始数据去对账。扫频脚本则要保证换了电脑、换了工作点还能一键重跑。

6.2 最容易漏掉但最关键的复现细节

我把复现性排在资料完整度的核心位置。软件版本、求解器设置、步长、精度选项,这些看似琐碎的东西往往决定别人能不能复现你的Bode曲线。我见过一份很好的DAB资料,唯独没写仿真步长,结果别人用默认步长扫出来的高频相位差出快10°,补偿器跟着白设计。

还有一个细节:工作点初始化。DAB要先把电路稳定在指定工作点再做扫频或闭环测试,很多资料只给出电路参数,不给初始占空比或初始相位角。启动过程如果和扫频混在一起,结果基本没法看。正确做法是明确写出“先开环定工作点→再开扫频→再合闭环”的时序,必要时在模型里设置初始状态,跳过启动暂态直接进入稳态。

另外,文件命名和版本管理也属于“完整度”。我习惯用日期+版本号命名每个阶段的Bode图和PI参数,比如“Bode_202407_v2_负载100%.csv”,避免一周后自己都分不清哪组参数对应的哪条曲线。这个习惯在项目后期做参数对比时能省下大量时间。

6.3 我做这套流程的几点实操体会

最后说几个只有真正跑过完整流程才会注意到的细节。第一,扫频和闭环验证尽量用同一套对象模型,不要扫频用平均模型、验证用开关模型,两者寄生参数差异会让你误判裕度。第二,PI整定程序里一定要留“手动覆盖”接口,某些极端工况下解析算出的参数并不合适,手动微调后要能自动重算PM并反馈给用户。第三,保存Bode图时把相位展开,别让–180°和+180°的跳变干扰判断——这个坑看起来低级,但在多频点自动扫频出图时很常见。

我个人的经验是,把“扫频→开闭环对比→Bode补偿→PI整定”这条链路做成固定套路之后,DAB的调试周期至少缩短一半。以前改一次负载指标要重新拍脑袋调参一个下午,现在改一下程序输入,十分钟内拿到一套有相位裕度依据的PI参数,剩下的时间都花在真正的硬件验证上。这套方法不止适用于DAB-ESP双移相,换到别的双向电源拓扑,只要对象还是“电流源+RC”结构,流程几乎可以原样平移。

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

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

立即咨询