前阵子帮学生调一台10kW的并网整流样机,网侧电流畸变和功率因数问题折腾了整整一周。当时我们把网侧不可控整流换成三相电压型PWM整流器,控制策略没用最常见的电压定向,而是选了虚拟磁链定向。结果不仅把进线电流谐波压下来了,还省掉了交流电压互感器。这篇文章把三相电压型PWM整流器虚拟磁链定向的Simulink仿真从头到尾拆一遍:从把电网看成一台“虚拟电机”的建模逻辑,到磁链估算必须绕开的积分漂移坑,再到主电路参数怎么算、PI怎么调、波形怎么判断,最后聊几句从仿真走向数字控制时的离散化细节。适合正在做电力电子仿真、并网变流器或者电机回馈单元的工程师,也适合刚接触PWM整流器想快速跑通完整仿真入门者。
1. 为什么把电网看成“虚拟电机”:虚拟磁链定向的原理拆解
1.1 从电压定向到磁链定向的“90度转向”
传统电压定向控制(VOC)的逻辑很直观:电网电压是现成的参考,把同步旋转坐标系的d轴死死锁在电网电压矢量上,然后控制电流的d轴分量就是控制有功,q轴分量就是控制无功。这么做的前提是“电网电压干净、可测”,而且必须用锁相环(PLL)实时跟踪电压相位。可实际电网哪能那么理想,电压稍微有点畸变或者不均衡,PLL的输出就会抖,定向角一抖,电流环输出跟着乱,谐波和功率因数双双恶化。
虚拟磁链定向(VFO)换了一个思路。它借用交流电机里定子磁场定向那套思想:把三相电网和进线电感看成一个整体,等效成一台“虚拟交流电机”——电网电压就是这台虚拟电机的反电动势,进线电感就是它的定子漏感。这样,交流侧的状态变量不再是“电压”,而是“磁链”。虚拟磁链矢量的定义很直接:
[ \psi_{\alpha\beta} = \int e_{\alpha\beta},dt ]
其中 (e_{\alpha\beta}) 是电网电压矢量在静止坐标系下的分量。稳态下,三相对称正弦电压积分出来的磁链是一个滞后电压90度的正弦量。如果我们把旋转坐标系的d轴锁在磁链矢量方向上,那就等于把坐标系整体转了一个90度。这个“90度转向”正是整套方案的精髓:避开对电压的瞬时跟踪,转而去跟踪一个被积分作用天然滤波过的磁链信号。
1.2 关键坐标关系:磁链坐标系里电压在哪儿
这里必须把一个特别容易搞混的点讲透。在虚拟磁链坐标系里,d轴对准的是磁链矢量,而电网电压矢量因为在相位上超前磁链90度,所以它落在q轴上,而不是d轴。
这意味着什么?单位功率因数整流时,电流必须和电网电压同相位,也就是电流矢量也要落在q轴上。所以控制目标变成:
- (i_q) 控制有功功率,由直流电压外环的输出给定;
- (i_d) 控制无功功率,单位功率因数运行时给定为0。
这跟电压定向恰好相反——电压定向时d轴是电压方向,所以有功在 (i_d),无功在 (i_q)。如果你从电压定向的习惯直接转到虚拟磁链,第一件事就是把PI输出的正负号、解耦项符号全部搞反,仿真跑出来电流波形一定是歪的。我当初第一次搭VFO模型时就栽在这里,对着波形愣了半天才想起这90度相位关系。
由于 (e_{\alpha\beta}) 的幅值等于电网线电压(等幅值Clarke变换下是相电压幅值),稳态时磁链幅值为:
[ |\psi| = \frac{E_m}{\omega} ]
比如相电压幅值311V、50Hz电网,磁链幅值大约是311/314 ≈ 0.99 Wb。这个数值后面设置积分限幅时直接有用。
1.3 无电压传感器重构:开关状态加母线电压替代交流电压测量
虚拟磁链方案之所以吸引人,核心在于“省交流电压传感器”。因为磁链是对电网电压积分得到的,而电网电压本身可以通过整流器交流侧端电压 (v) 和电感压降推算出来。整流侧端电压 (v) 不需要额外传感器,用直流母线电压 (V_{dc}) 和三相桥臂开关状态就能重构:
[ v_{AN} = \frac{V_{dc}}{3}(2S_a - S_b - S_c) ]
[ v_{BN} = \frac{V_{dc}}{3}(-S_a + 2S_b - S_c) ]
[ v_{CN} = \frac{V_{dc}}{3}(-S_a - S_b + 2S_c) ]
然后按整流惯例(电流从电网流入整流器为正),电网电压估算为:
[ e_{\alpha} = v_{\alpha} + R i_{\alpha} + L\frac{di_{\alpha}}{dt} ]
[ e_{\beta} = v_{\beta} + R i_{\beta} + L\frac{di_{\beta}}{dt} ]
再经过一次积分就得到虚拟磁链矢量,定向角直接由反正切函数算出:
[ \theta = \mathrm{atan2}(\psi_{\beta}, \psi_{\alpha}) ]
整套算法只需要三个线电流传感器和一个直流电压传感器——对绝大多数系统来说,这三个霍尔和母线电压采样本来就是必须有的。真正省掉的,是网侧那组又贵又容易受干扰的交流电压互感器。这也让控制系统硬件BOM表变得更简洁,EMC干扰源还少了一路。
2. 虚拟磁链 vs 电压定向:一场关于参考系的“站队”
2.1 两种方案的工程对比
很多刚接触PWM整流器的人都会有疑问:既然电压定向实现简单、资料多,为什么要费劲做虚拟磁链?我把两种方案的关键差异整理成了一张表,方便对照:
| 对比项 | 电压定向(VOC) | 虚拟磁链定向(VFO) |
|---|---|---|
| 定向参考量 | 电网电压矢量 | 磁链矢量(电压积分) |
| 交流电压传感器 | 需要 | 不需要 |
| 坐标参考相位 | d轴与电压同向 | d轴与磁链同向,电压在q轴 |
| 对电网畸变的敏感度 | 高,PLL易受谐波干扰 | 较低,积分环节相当于低通滤波 |
| 启动复杂度 | 较低,锁相环收敛快 | 较高,磁链建立需要时间 |
| 实现资源 | 需要PLL模块 | 需要积分器和漂移抑制逻辑 |
| 典型场景 | 工业并网变流器 | 电机回馈单元、无网侧电压传感器场合 |
2.2 虚拟磁链的滤波天赋和两个“代价”
磁链估算在本质上是对电压信号的积分。积分这个数学操作在频域里就是20dB/dec的低通衰减。因此高频谐波在磁链信号里会被显著压下去,定向角度自然比直接跟踪原始电压要平稳得多。这是VFO在非理想电网下表现出色的根本原因,不是控制环路更强,而是参考系本身就有一层“天然滤波”。
但天下没有免费的午餐,VFO要付出两个明确的代价。
第一个代价是启动问题。磁链从零开始建立,角度在最初几十毫秒内是不稳定的,不能像PLL那样快速锁定。处理办法我后面专门讲,仿真里用斜坡给定加限幅积分器基本能压住。
第二个代价是积分漂移。纯积分器对直流偏置零衰减,任何微小的直流分量都会让积分输出一路跑飞。这在仿真里表现为磁链圆心不断偏移,角度乱跳,最终电流发散;在实际数字控制里表现得更隐蔽——磁链缓慢漂移,系统运行几分钟后突然失控。这个坑值得单独开一章仔细讲。
2.3 别被“无电压传感器”带偏:哪些传感器仍然必须保留
一个常见的误区是:虚拟磁链是不是连电流传感器也能省?不是。电流是整个控制算法的核心反馈量,磁链估算里也用到电流做电感压降补偿,电流传感器不仅不能省,精度还要有保证。特别是进线电感偏小的系统,(L di/dt) 项对测量噪声非常敏感,电流信号里的毛刺会直接被微分放大,污染磁链估算。
直流母线电压传感器同样不能省,因为开关状态重构端电压时需要它。有些论文会提到用电压估算来替代直流电压传感器,那是另一个方向的研究课题,工程上别轻易尝试。
所以虚拟磁链省的是“网侧电压传感器”,换来的是系统在最脆弱的高压测量环节少一个故障点。这句话值得牢牢记在心里。
3. 磁链估算最大的坑:积分漂移,以及三种常见救法
3.1 为什么纯积分器必漂:数学与仿真双重视角
先看数学。一个理想的积分器传递函数是 (1/s),在频域里,直流分量对应的增益是无穷大。也就是说哪怕输入里混入特别小的直流偏置,经过足够长时间,积分输出也会堆积成一个不可忽略的量。
Simulink里做纯积分器很容易,一个Integrator模块就完事。第一次仿真时我把积分初值设成0,电网电压源也没有直流偏置,前几百毫秒看起来一切正常,等我把电流换成实际采样信号、又加入了进线电阻压降补偿之后,磁链圆心开始往一侧缓慢移动。后来我把网侧电压实际值保留在模型里对比才发现,逆变器启动瞬间的暂态分量和电流测量零漂,经过积分器之后都被“记住”了,导致磁链估算逐渐偏离真实值。
这种漂移的直接后果是定向角出错。因为角度是用 (\mathrm{atan2}(\psi_\beta,\psi_\alpha)) 算的,圆心偏移以后,角度在一个工频周期内的变化就不再是均匀的,dq轴电流的坐标变换出现误差,电流环会误以为存在无功分量,持续调整输出电压,系统最终发散。
3.2 方案一:一阶惯性替代法
最简单的救法是放弃纯积分器,把积分环节换成带低频截止的惯性环节:
[ \psi = \frac{1}{s + \omega_c} e ]
这里 (\omega_c) 取一个很小的值,比如2~10 rad/s。从频域看,这个环节对直流分量的增益降到了 (1/\omega_c),不再无穷大,漂移会被限制在可控范围。对50Hz工频信号,它引起的幅值衰减和相位偏移很小,用起来基本不碍事。
代价是磁链矢量的幅值和相位在低频段会有一点失真,定向角会带细微误差。想做得更精细,可以在算出角度后加一个固定角度补偿,或者在磁链坐标系的q轴里对角度误差做闭环修正。仿真验证阶段,这个方案已经足够稳。
3.3 方案二:限幅积分器与交叉反馈积分器
限幅积分器的思路更直接:积分器的输出限幅在 (\pm \psi_{max}) 附近,超过限幅就把积分输入清零或者把多余部分反馈回去。(\psi_{max}) 可以按额定磁链幅值的1.2倍来取,前面算过0.99 Wb,那就限在 ±1.2 Wb。
限幅法的毛病是波形在限幅点附近会削顶,产生额外谐波。改进版是交叉反馈积分器:(\alpha) 轴和 (\beta) 轴的积分输出互相限幅,让两轴的漂移互相牵制。这个方案性能不错,但参数调整多,适合做产品固件时慢慢打磨。仿真阶段如果一上来就上交叉反馈,容易因为限幅系数没调好反而引入振荡。
3.4 Simulink里到底用哪种最省心
我的建议是:第一版模型直接用一阶惯性替代积分器,截止频率取5 rad/s,加上启动斜坡给定。这样做模型稳定、好调试,不用花大量时间盯漂移问题。等整个系统闭环跑通、控制逻辑验证完了,再回头把惯性环节换成限幅积分器,做一轮更贴近实际工程的仿真对比。
这里也分享一下在Simulink里的具体做法。惯性环节用Transfer Fcn模块,分子[1],分母[1, 5],输入是估算出来的 (e_\alpha)、(e_\beta),输出就是磁链的两个分量。为了防积分初值问题,模型里把Transfer Fcn模块的初始状态设为0,同时确保输入信号在t=0时不为无穷大——交流源如果直接满压接入,启动那一瞬间的电压跳变还是会让磁链估算产生一定的暂态误差,配合斜坡启动能有效缓解。
注意:不要试图让磁链估算一开始就完全精确。虚拟磁链在启动阶段的暂态误差是客观存在的,硬件上可以通过预充回路让直流母线先升压,软件上通过软启动让电流给定逐步爬升。仿真中做同样处理,比事后调一堆补偿参数更高效。
4. Simulink搭建实操:主电路参数与控制环整定
4.1 系统总体结构的模块划分
仿真模型按信号流可以拆成三块:主电路功率部分、电流/电压采样与磁链估算部分、控制与SVPWM调制部分。
主电路用Simulink Simscape中的三相电源、三相串联RL支路和Universal Bridge模块。Universal Bridge选择Three-arm类型,开关用IGBT/Diode,母线电容并联在直流侧,负载用电阻或者恒功率源。控制部分自己搭,包括Clarke变换、Park变换、磁链估算、电压外环PI、电流内环PI以及SVPWM发生器。整一套模型看起来清爽,也方便单独调试验证某一块。
磁链估算需要的开关状态不能从触发脉冲延迟环节里乱取,要从SVPWM模块输出的实际PWM脉冲上引过来,保证和真实硬件行为一致。如果直接用调制占空比去重构电压,仿真省事了,但换到硬件平台上思路会失真。
4.2 主电路参数计算:电感、电容、直流电压
参数设计有没有捷径?有,按工程经验公式先算初值,再用仿真微调。以一个380V线电压、10kW额定功率、650V直流母线输出的系统为例。
额定线电流:
[ I_{rms} = \frac{P}{\sqrt{3}U_{line}} = \frac{10000}{1.732 \times 380} \approx 15.2A ]
进线电感的选择依据是电感压降占比。经验上,电感在额定频率下的压降一般取相电压的10%~15%。用5mH电感算一下:
[ \Delta V_L = \omega L I_{rms} \approx 314 \times 0.005 \times 15.2 \approx 23.9V ]
占相电压220V的10.9%,在合理区间。电感太小,电流纹波大,(L di/dt) 项会引起磁链估算的噪声放大;电感太大,动态响应慢,成本也高。
直流母线电容按纹波指标估算。电容值取2200μF级别,验证一下:50Hz工况下2倍频纹波,母线波动幅值约为:
[ \Delta V_{dc} = \frac{P}{2\omega C V_{dc}} = \frac{10000}{2 \times 314 \times 0.0022 \times 650} \approx 11.1V ]
折算到650V母线大约是1.7%的波动,工程上是完全可以接受的。直流电压给定650V,比线电压峰值(约537V)高出约20%,给SVPWM调制留出充足线性区。
4.3 SVPWM自建模块的分块逻辑
SVPWM发生器我建议自己搭,不要用封装好的黑盒模块。自建的好处是方便调试、方便后期做代码生成。搭的时候按四个子模块去拆:
- 根据 (v_\alpha)、(v_\beta) 判断所在扇区;
- 计算相邻基本电压矢量的作用时间 (T_1)、(T_2);
- 加上零矢量分配,算出三相桥臂的切换时刻;
- 与三角载波比较,产生六路PWM脉冲。
扇区判断用最经典的“三值符号法”,把 (v_\beta)、(\frac{\sqrt{3}}{2}v_\alpha - \frac{v_\beta}{2})、(-\frac{\sqrt{3}}{2}v_\alpha - \frac{v_\beta}{2}) 三个量的符号规则组合映射到六个扇区。作用时间计算在 (\alpha\beta) 静止坐标系下做,最后统一修正到载波周期。
有一个经验:SVPWM模块输入的控制电压 (v_\alpha^)、(v_\beta^) 幅值要限制在 (V_{dc}/\sqrt{3}) 以内,否则会过调制,电流波形会出现明显削顶。电流环PI输出一定要加限幅,限幅值直接按SVPWM线性区上限计算。
4.4 电流环和电压环的PI设计
电流内环在dq坐标系解耦后,被控对象近似为一阶惯性加积分,可以用零极点对消法整定。电流环带宽 (\omega_{cc}) 取开关频率的1/10到1/20,10kHz开关频率下可取500~1000Hz,折合角频率3140~6280 rad/s。然后:
[ k_{p,i} = L \times \omega_{cc},\quad k_{i,i} = R \times \omega_{cc} ]
以L=5mH、R=0.05Ω、带宽取3000rad/s计算,(k_p \approx 15),(k_i \approx 150)。这组数据在绝对单位制下可以直接作为初值。带宽不宜太高,否则离散控制的采样延迟会引入相位滞后,导致电流振荡。
电压外环带宽要明显低于电流环,一般取电流环带宽的1/10左右,约100rad/s。电压环PI参数给一个手感范围供参考:(k_{p,v}) 在0.1~0.5,(k_{i,v}) 在1~5。具体数值以母线电压波形不出现明显振荡为上限,通过阶跃负载测试微调。
4.5 采样率与仿真步长设置
仿真里最容易出现的怪问题大多是步长设置不合理。控制环的采样频率和开关频率保持一致,10kHz,所以控制环计算周期是1e-4s。电力电子模型的最小仿真步长要足够捕捉开关动作,建议设成5e-6s甚至1e-6s,每开关周期内至少采样20个点。步长太大,电流纹波波形会明显失真,甚至出现数值振荡,仿真发散往往就是从这里开始的。
这里说的仿真发散,很多人第一反应是PI正反馈,其实仿真步长不匹配同样会引发。我建议模型进入闭环之前,先把仿真步长从默认的auto改成固定步长,控制环节也做成离散模块,这样后期切到真实控制器的离散周期时,参数迁移会很顺利。
5. 仿真跑起来之后:波形判断与调试避坑
5.1 软启动设计与启动波形解读
虚拟磁链最怕冷启动。直流母线电压从0直接给定到650V,电压外环瞬间饱和,电流给定冲到限幅值,再叠加磁链估算尚在建立角度,第一波电流冲击直接打到IGBT耐受极限。解决方案在仿真和工程上都通用:直流电压参考用斜坡爬升。
我在模型里做了一个斜坡函数,从0经过0.3s线性升到650V,同时电流环给定全部加限幅。跑出来的启动波形很有参考意义:最开始几十毫秒母线电压缓慢上升,电流波形呈正弦但幅值较小;等母线电压接近设定值以后,电流逐渐加大,最终稳定。磁链估算在启动初期会有短时波动,但因为惯性环节兜底,随后收敛到额定幅值。
如果启动冲击还是太大,可以把PWM使能信号也做延迟,先等母线电压被整流桥预充到一定水平再启动。这些都是真实工程的常见处理,放在仿真里提前验证,心里有数。
5.2 单位功率因数怎么验证
闭环跑通后,第一件事不是调谐波,而是验证定向是否正确、功率因数是否为1。把网侧电压和网侧电流放到同一个示波器里对比,整流工况下,电压和电流应当同相位;再看电流的d轴分量是否稳定在0附近,q轴分量是否跟随电压环输出。如果 (i_d) 明显不为0,说明无功分量没有被抑制,这时不要急着调PI,先检查角度相位是否差了一个90度——这是虚拟磁链定向最容易犯的错误。
还可以用XY Graph直接画磁链圆。X轴 (\psi_\alpha),Y轴 (\psi_\beta),正常情况看到一个圆心在原点的圆。如果圆心偏了,说明积分漂移;如果圆不圆,说明谐波含量大或方向角抖动。之后把电流的 (\alpha\beta) 分量也画成圆,和磁链圆叠在一起看相对位置,能直观看到功率因数和有功无功的方向关系。这一招在调联机系统时对我帮助很大。
5.3 常见仿真失败现象和对应排查链路
这个环节列几个仿真中高频出现的“翻车”现场,排查思路一并给出:
- 电流发散为正弦持续扩大:先查坐标变换矩阵里的2/3系数是不是漏了,再查PI输出限幅是不是没做,最后确认电流环带宽是否过高,数值上是否存在离散延迟引起的正反馈。
- 磁链圆心持续偏移:改用一阶惯性替代纯积分器,或加入限幅器,同时检查电流采样是否含直流偏置。
- d轴电流无法收敛到0:先确认角度定的是不是虚拟磁链角度,而不是电网电压角度。两个角度相差90度,坐标系搞错必然导致控制失效。
- 母线电压有2倍频振荡:电压环带宽过高,调低 (k_{p,v}),同时检查电容值是否过小。
- SVPWM输出异常:检查过调制保护,电流环输出幅值限制在 (V_{dc}/\sqrt{3}) 以内。
5.4 谐波分析与性能验收
模型稳定后,用Powergui的FFT工具看网侧电流谐波。10kHz开关频率下,电流谐波主要集中在开关频率及其倍数附近,有源滤波作用范围内THD应当控制在5%以内,调好参数后做到3%左右很常见。如果THD明显偏高,优先查进线电感是不是太小、PWM死区时间是否设置过大、电流传感器采样是否引入了太多噪声。
我这里说一个参考值:THD在5%以下、功率因数在0.99以上,这个参数水平可以支撑工程样机的设计评审了。再往下降就要开始抠死区补偿、传感器标定和印制电路板布局这些精细活,仿真阶段做到这个程度已经足够。
6. 从仿真走向工程:离散化、延迟补偿与进阶扩展
6.1 离散化与一拍延迟
仿真模型验证完算法逻辑,后面就要开始想怎么把这套控制放进真正的MCU或DSP里。第一件事就是把连续域的PI控制器改成离散形式。Simulink里的离散PI模块支持前向欧拉、后向欧拉、梯形法等不同积分方式,工程里最常用的是前向欧拉法,因为它实现简单,且只要采样周期足够短,性能跟连续域差别很小。采样周期直接取PWM载波周期,也就是1/10000s,100微秒更新一次。
数字控制器有个逃不掉的问题:一拍延迟。从采样到计算再到更新PWM比较器,整个过程至少滞后一个控制周期。这个延迟在高带宽电流环里会带来明显的相位滞后,表现为电流环响应变慢,甚至出现高频振荡。工程上常见做法是在dq轴电流计算里做角度补偿,把同步旋转坐标系的角度往前预移一个采样周期对应的电角度:
[ \theta_{comp} = \theta + \omega T_s ]
这个补偿量很小,但能把电流解耦的相位关系修正回来。Simulink里可以通过在角度信号上叠加这个偏移量实现,调完电流波形会干净不少。
6.2 从Simulink到C代码:Embedded Coder与DSP移植
模型里的控制部分可以直接用Embedded Coder生成C代码,生成出来的代码经过调整就能烧进DSP跑。这套流程有几个前提条件,启动前必须改到位:所有连续时间积分器换成离散模块;所有输入输出信号用Simulink数据对象定义类型;采样时间全部明确标注;避免不支持的模块和手动延迟环节。我建议在项目启动前就按代码生成标准建模,中间临时替换模块往往会被各种类型不匹配卡住。
生成代码之后的工作往往是硬件在环测试。把真实控制器的C代码放到MCU中,整流器主电路和电网部分用实时仿真器模拟,先验证控制器的时序、采样、保护逻辑,再逐步过渡到真实功率硬件。如果直接从仿真跳真机,很容易因为传感器标定误差、信号调理延迟这类细节导致系统不稳定。
6.3 进阶方向:LCL滤波器、不平衡电网与正负序控制
基本虚拟磁链仿真跑通后,可以拟合实际工程场景继续深入。进线侧加LCL滤波器是常用的并网结构,能进一步压低开关频率附近的电流谐波,但LCL会在某些频率点引入谐振峰,控制参数需要考虑有源阻尼。虚拟磁链在这种结构下的好处是,磁链估算里的电压和电流滤波本身对高频谐振有一定抑制,再配合电容电流反馈的有源阻尼,整体调起来比纯电压定向方案要顺手。
另一个实际场景是电网电压不平衡。负序分量混入电网后,虚拟磁链的坐标参考也会带上2倍频的波动,导致功率因数变差、直流母线出现2倍频纹波。这时候需要用到正负序分离控制,把正序和负序分量在各自的dq坐标系里分别处理,负序电流抑制环负责把负序分量压到零。Simulink里做正负序分解可以用陷波滤波器或延迟信号消除法(DSC),实现思路清晰,调起来也直观。
电网电压不平衡再加上弱电网的阻抗变化,系统的鲁棒性要求就更高了。我在实际项目里测试下来,虚拟磁链在这种恶劣场景下的表现确实比电压定向要稳定,主要是积分滤波帮了大忙,少了一路被干扰的电压采样,控制系统的抗干扰裕量明显更大。
最后再分享一个个人经验:调试虚拟磁链仿真,千万别急着把PI参数往大了给。我见过太多人一上来就追求“响应快”,结果磁链估算里的暂态误差被高带宽电流环放大,最终就是发散。先把磁链圆和电流圆看稳,确认定向角正确、功率因数为1,再把带宽慢慢往上抬,每一步都留个余量。这套流程走下来,模型既稳定又贴近工程实际。后面想去尝试EMC问题分析、非理想电网适应性或者多机并联协调,也都是在这套基础上加模块的事。