拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Vienna整流器SVPWM调制详解:7扇区划分、矢量时间与中点平衡

Vienna整流器SVPWM调制详解:7扇区划分、矢量时间与中点平衡

开篇先聊两句大实话。三相两电平PWM整流器玩得再熟,第一次把Vienna整流器的SVPWM工程模型搭起来,照样会卡壳。原因很简单:Vienna是三相三电平整流器,可用的开关状态比两电平多了好几倍,但因为有电流单向性限制,实际能用的矢量组合又比通用NPC三电平少一大截。再加上中点电位平衡这个绕不开的话题,很多人调了几天波形还是漂的。这篇文章就围绕Vienna整流器SVPWM调制里的7扇区划分、矢量作用时间计算、中点电位平衡这三个核心问题,把MATLAB/Simulink里的实现思路完整拆开讲清楚。不管你是刚接触三电平整流器的研究生,还是要在实际项目里落地的工程师,这套逻辑和代码框架都能直接拿来做底子。

1. 为什么Vienna整流器要单独折腾一套SVPWM

1.1 三电平不是简单“加一个电平”

Vienna整流器的拓扑特点是每相桥臂通过双向开关引到直流母线中点,输出电平有三种:正母线电压P、负母线电压N、和中点钳位O。相对于两电平只有P和N两个状态,三电平的矢量数量从8个一下子跳到27个。矢量变多意味着输出电压更细腻,谐波更小,开关管电压应力减半,这也是它被大量用在充电桩、通信电源、航空电源里的原因。

但矢量变多也带来麻烦。两电平SVPWM只需要判断6个扇区,然后查表算两个非零矢量和零矢量的作用时间就完事。三电平SVPWM在6个大扇区基础上,还要判断参考电压矢量落在哪个小三角形里,而每个小三角形对应的开关序列,又涉及冗余小矢量怎么分配的问题。对于Vienna整流器来说,由于能量只能单向流动,某些开关状态组合并不能在任意电流方向下都放出来,所以实现时比通用NPC逆变器还要多一层电流极性逻辑。

很多初学者以为把两电平SVPWM的代码改一改,加几个电平状态就能用在Vienna上,实际调起来会发现脉冲乱跳、中点电位不受控、电流过零畸变等问题一个接一个。原因就是没有真正理解三电平矢量平面的结构,以及Vienna拓扑对开关状态的额外约束。

1.2 Vienna整流器对SVPWM的特殊约束

Vienna整流器本质上是一个Boost型PFC整流器,输入电流被强制控制在和电网电压同相位,能量从交流侧单向流向直流侧。在这个前提下,每相输出P还是N,不仅仅取决于开关管的通断,还取决于该相电流的方向。

打个比方:两电平逆变器的开关状态是“拨开关”,由控制器说了算;Vienna整流器的开关状态是“看电流方向再拨开关”,输出电平是电流方向与开关管的组合结果。设计SVPWM生成算法时,先生成的是一组P/O/N逻辑状态,到了主电路这一层,还必须做一次基于三相电流极性的状态映射,把P/O/N翻译成实际的开关管驱动信号。这一步漏了,仿真模型就是错的,实验板更不可能跑起来。

正因为有这层限制,Vienna整流器在三电平SVPWM的实现里,对冗余小矢量的选取逻辑和中点电位平衡策略都提出了更高要求。冗余小矢量输出电压相同,但O状态的分布不同,导致中点电流方向不同。Vienna整流器能用的冗余小矢量组合,要结合三相电流方向去筛选,不能像NPC逆变器一样把27个状态全拿出来用。

1.3 “7扇区”到底指什么

先回答一个最常被问的问题:三电平SVPWM的扇区划分,明明在αβ平面上按60°分一次就是6个扇区,为什么很多Vienna实现里会说“7扇区”?

这里其实是工程习惯和文献叫法差异造成的。常见的有两种理解:一种是把整个矢量平面按电压矢量作用效果分为外围6个有效扇区,外加中心低调制区域单独作为一个扇区,一共7个区域来处理;另一种是在扇区编号里,把角度临界状态、过零状态单独标为第7扇区,专门用来处理参考电压矢量幅值很小、不需要细分小三角形的情况。

无论采用哪种解释,核心目的都一样:避免在中心区域和扇区边界反复切换,减少脉冲抖动,同时为冗余小矢量的分配留出统一处理入口。后面要讲的MATLAB实现里,我会按这种“6+1”的思路处理,实际跑起来波形更干净。

2. 空间矢量扇区划分与“7扇区”的实现逻辑

2.1 从基本电压矢量说起

三电平空间矢量平面里,27种开关状态对应19个独立电压矢量,按幅值分成零矢量、小矢量、中矢量、大矢量四类。小矢量有一个重要特征:两个开关状态对应同一个电压矢量,比如POO和ONN都对应小矢量V1,这是中点电位平衡能够实现的根本来源。

把6个大扇区在αβ平面上画出来,每个60°扇区内又分为4个小三角形。常规三电平SVPWM的做法是:先根据参考电压矢量的角度判断落在哪个60°大扇区,再在大扇区内部根据电压分量判断落在哪个小三角形,然后根据小三角形顶点对应的三个基本矢量计算作用时间。

“7扇区划分”的思路是在这个大框架下做一点调整:参考电压矢量幅值很低时,无论落在哪个60°扇区,它都只可能用到零矢量和小矢量,基本不会触及中矢量和大矢量。这时候与其在6个扇区之间频繁切换,不如直接在程序里加一个幅值判断,把它统一丢给中心扇区处理,输出固定的零矢量序列或经过中点平衡修正的小矢量序列。程序逻辑更简单,开关次数也更少。

2.2 扇区判断代码怎么写

在MATLAB/Simulink里用MATLAB Function实现扇区判断,最常规的写法是先算角度和幅值:

function sector = fcn(u_alpha, u_beta, Vdc) % 计算参考电压矢量角度与幅值 theta = atan2(u_beta, u_alpha); if theta < 0 theta = theta + 2*pi; end mag = sqrt(u_alpha^2 + u_beta^2); % 中心区域作为第7扇区处理 if mag < 0.01 * Vdc / 2 sector = 7; else sector = floor(theta / (pi/3)) + 1; % 1~6 end

这里的阈值0.01是经验值,意思是参考电压幅值小于半母线电压的1%时,认为系统处于低压工作区。阈值设得太大,低调制区波形会失真;设得太小,扇区切换时的抖动又会变得明显。实际项目里我会根据最低运行电压去折算,一般取0.005到0.02之间。

另外一个容易踩的坑是atan2的角度边界。当参考电压矢量正好处在0°或360°附近时,浮点误差可能导致扇区号在6和1之间来回跳,最终体现在占空比上就是脉冲毛刺。所以角度计算完先取模到[0, 2π),这是一个性价比极高的防抖处理。

2.3 为什么留一个中心扇区

中心扇区不参与常规小三角形判断,它的功能更像一个“缓冲区”。参考电压矢量接近零时,任何扇区判断都有很大的相对误差,不管算出来是哪一扇区,实际输出电压都很小,没必要做精细的三电平矢量合成。

更重要的是,Vienna整流器在中心区域运行时,三相电流方向组合变化频繁,很多冗余小矢量状态并不总是能用。如果把中心区域单独拿出来,可以在控制逻辑里直接采用“三相都输出O”或者根据电流极性选定的小矢量序列,避免电流过零时发生开关状态冲突。

我在仿真里测过,加了中心扇区处理之后,电流过零点的畸变明显减小,开关管动作次数也有一定下降。这可能不算理论上的重大创新,但在工程实现里确实能解决实际问题。

3. 矢量作用时间与公共量X、Y、Z的推导

3.1 从伏秒平衡解出中间变量

SVPWM计算作用时间的理论基础是伏秒平衡:参考电压矢量在载波周期Ts里的积分效果,等于各基本电压矢量分别作用一段时间后的叠加效果。两电平SVPWM里,非零矢量作用时间T1、T2的表达式里会反复出现几个组合项,把这些组合项提前算出来,就是网上经常说的公共量X、Y、Z。

以第一扇区为例,两个非零矢量分别是V1和V2。设直流母线电压是Vdc,参考电压在αβ坐标系的分量是Uα、Uβ,采样周期是Ts。根据伏秒平衡:

Vα·Ts = (2/3)Vdc·T1 + (1/3)Vdc·T2
Vβ·Ts = (√3/3)Vdc·T2

从第二个式子可以直接解出T2 = √3·Vβ·Ts / Vdc。代回第一个式子,得到:

T1 = (3/2)·Vα·Ts / Vdc - (√3/2)·Vβ·Ts / Vdc

如果把公共量定义为:

X = √3·Vβ
Y = (3/2)·Vα + (√3/2)·Vβ
Z = -(3/2)·Vα + (√3/2)·Vβ

那么第一扇区的T1、T2就可以分别表示为(Y - X)·Ts/Vdc和X·Ts/Vdc。不同文献里X、Y、Z的定义可能有符号上的差异,但推导思路是一致的:把伏秒平衡方程里的固定组合提前算好,查扇区表时只做加减法,节省实时计算量。

3.2 三电平每个扇区里怎么扩展

三电平SVPWM在一个60°大扇区内,思路和两电平类似,只要把该扇区内的参考电压矢量先旋转到以扇区下边界为基准的局部坐标系里,再按该扇区几个基本电压矢量的幅值做伏秒平衡,就可以得到对应小三角形的作用时间。

区别在于,三电平里非零矢量不只是两个,而是三个顶点对应三个矢量,其中往往包含一个冗余小矢量对。计算出来的是“小矢量总作用时间”“中矢量作用时间”“大矢量作用时间”的组合,然后还要把小矢量总时间拆成两个冗余状态各自的作用时间。这一拆,中点电位平衡的控制自由度就出来了。

具体到代码实现,我习惯在每个大扇区内用局部坐标换算后的分量重新计算类似X、Y、Z的中间量,再根据小三角形编号查表得到各矢量作用时间。这样做的好处是程序结构统一,一个60°扇区的计算函数可以复用在所有扇区,只需要在外面套一个扇区旋转。

3.3 七段式开关序列怎么编排

SVPWM的脉冲序列通常采用七段式,也就是在每个采样周期里,半导体开关状态按照“起点矢量—中间矢量—终点矢量—中间矢量—起点矢量”的对称形式排列。七段式的目的是让开关状态在相邻段之间只变化一相,降低开关损耗和电压跳变率。

在三电平里,扇区不同、小三角形不同,七段式序列也不一样。例如在某一扇区的小三角形1内,序列可能是起点为O状态,经小矢量过渡到中矢量或大矢量,再进入另一个小矢量,最后回到起点。选择不同的起点和冗余小矢量,会直接影响流入中点的电荷量,进而影响上下电容电压平衡。

这一步在Simulink里实现时,我通常是用查表方式生成一个长度为7的状态序列数组,数组里存的是P、O、N三个电平状态,后续再交给电流方向映射模块生成实际开关管信号。查表方式虽然看起来笨,但调试时非常直观,波形有问题一眼就能看出是哪段序列出了问题。

4. 中点电位平衡原理与PI调节实现

4.1 中点电位为什么会漂

Vienna整流器直流侧由两个电容串联,理想情况下每个电容电压各占一半,中点电位保持在零。实际运行中,只要有一个采样周期内流入中点的电荷不为零,两个电容的电压就会发生变化。三相输出状态中,只有当某一相输出O时,该相电流才会流经中点,因此中点电流等于所有输出O状态的相电流的代数和。

负载突变、电网电压不对称、调制比变化,都会导致一个周期内流入中点的平均电流不为零。长时间累积下来,上下电容电压就分开了。中点电位偏移严重时,输出电压谐波增大,开关管承受的电压应力不再均匀,甚至可能损坏器件。

4.2 冗余小矢量是唯一的“平衡旋钮”

要平衡中点电位,最直接的办法就是调整冗余小矢量的作用时间。比如POO和ONN对应同一个电压矢量,但它们对中点电流的影响正好相反。原本小矢量总作用时间是固定的,我们可以把它拆成两部分:一部分用POO,一部分用ONN。两部分的比例一变,输出电压矢量的效果不变,但中点电流的大小和方向就变了。

这个比例通常用一个分配系数k表示。令小矢量总作用时间为Ts,则POO作用时间为(1 - k)·Ts,ONN作用时间为k·Ts。k=0.5时两个状态各占一半,从统计上看对中点电位不产生净影响;k大于0.5还是小于0.5,由中点电压偏差的方向和当前电流方向共同决定。

需要注意,不是所有运行区域都能用上冗余小矢量。当参考电压矢量落在大矢量或中矢量区域时,冗余小矢量不参与合成,这时候中点电位的调节能力很弱。所以中点平衡的控制本质上是一种“在可调区域内尽力补偿”的策略,调制比越高,能补偿的空间越小。

4.3 分配系数k的PI调节与限幅

工程里最常用的做法是用PI调节器输出分配系数k的修正量。

检测上下电容电压差ΔU = Uc1 - Uc2,目标值是0。PI调节器的输入就是ΔU,输出经过限幅后作为k的修正量。关键点在于,这个修正量应该加在“中点电流对ΔU的作用方向”正确的方向上。如果极性反了,平衡环不但不收敛,还会加速中点电位发散。

我见过很多初学的人在这里被坑过。调试时可以先开环,把k固定为0.5,观察ΔU往哪个方向漂,再手动加大或减小k,确认能拉回来,最后再接PI。这样至少能排除极性接反的问题。

PI参数方面,比例系数不宜过大,一般0.01到0.1之间;积分系数更小,通常零点几就够。离散化采样时间与控制周期保持一致。P太大,会把开关纹波放大,导致k来回抖动;I太大,中点电位会出现低频振荡。

4.4 Simulink里接平衡环的常见坑

在Simulink里做中点平衡环,最容易出现的是代数环问题。PI调节器读到的ΔU来自电容电压测量,它的输出又会影响SVPWM的PWM脉冲,脉冲再决定中点电流,最后又反馈到电容电压。为了避免这种环,我一般会在PI输出到SVPWM模块之间加一个单位延迟Unit Delay,相当于把平衡环的控制量延迟一个控制周期。控制周期也就是PWM载波周期,延迟一个周期对中点电位调节来说完全够用,还能避免模型报代数环错误。

另外,ΔU的测量值含有明显开关纹波,如果直接进PI,k值会被高频分量污染,表现出来就是PMW波形抖动、输出波动异常。我会先经过一个一阶低通滤波器,或者用均值模块滤掉一个载波周期的高频分量,再做PI运算。

还有一个小细节:平衡调节只在有冗余小矢量的扇区和小三角形里有意义,在纯中矢量或大矢量作用的时刻分配系数k不会产生影响。因此很多实现里会在SVPWM函数内部判断当前小三角形类型,只有在小矢量参与的区间才把k真正用进去。这个细节决定了平衡环不会在某些区域做无用功甚至产生负面效果。

5. MATLAB/Simulink完整搭建步骤

5.1 主电路与参数

主电路我用Simscape Electrical搭建,三相交流源采用相电压幅值311V、频率50Hz,线电压有效值380V。Vienna整流器桥臂如果没有现成库模型,可以用受控电压源加逻辑判断的方式搭建P/O/N输出模型,也可以用三个单刀三掷开关模拟。直流侧上下电容各取1000μF,负载电阻根据额定功率折算,比如额定10kW直流650V,负载电阻约42Ω。

控制参数按10kHz采样周期设计,Ts = 1e-4s。PWM载波频率10kHz,死区时间先设0,等仿真波形正常后再加死区验证。Simulink里主电路功率模块用离散化求解器,采样时间设置为1e-6s,和Powergui模块的离散采样时间保持一致,否则PWM波形会出现插值失真。

5.2 控制环路总览

控制结构采用经典的双闭环:电压外环加电流内环。电压外环采样直流母线总电压Udc,与给定值650V做差,经过PI调节后得到有功电流基准,再乘以锁相环输出的同步单位正弦信号,得到三相电流基准。电流内环采用dq旋转坐标系下的PI加解耦控制,PI输出得到Vd、Vq,再经反Park变换得到Vα、Vβ,送入SVPWM模块。

锁相环直接用Simulink自带的PLL模块,离散化模式,带宽设在50Hz到100Hz之间。电压外环PI带宽要低,一般5到10Hz;电流内环PI带宽要高,500到1000Hz。这套参数初调时比较好稳住,后面再根据波形微调。

5.3 SVPWM的Matlab Function实例

SVPWM核心函数输入是Vα、Vβ、直流母线电压Vdc、上下电容电压Uc1、Uc2,输出是七段式PWM对应的占空比信号。下面给出一个骨架代码,重点展示扇区判断、公共量计算和小矢量分配的思路:

function [Ta, Tb, Tc] = fcn(u_alpha, u_beta, Vdc, Uc1, Uc2) % 参数 Ts = 1e-4; E = Vdc / 2; % 扇区判断 theta = atan2(u_beta, u_alpha); if theta < 0 theta = theta + 2*pi; end mag = sqrt(u_alpha^2 + u_beta^2); if mag < 0.01*E sector = 7; else sector = floor(theta / (pi/3)) + 1; end if sector == 7 % 中心扇区直接输出零状态 Ta = 0; Tb = 0; Tc = 0; return; end % 扇区旋转到第一扇区 theta1 = theta - (sector-1)*pi/3; u_alpha1 = mag * cos(theta1); u_beta1 = mag * sin(theta1); % 公共量X、Y、Z,参考电压以E归一化 X = sqrt(3) * u_beta1 / E; Y = 1.5 * u_alpha1 / E + 0.5 * sqrt(3) * u_beta1 / E; Z = -1.5 * u_alpha1 / E + 0.5 * sqrt(3) * u_beta1 / E; % 这里根据小三角形编号查表计算T1、T2、T3 % 小三角形判断与时间计算省略,属于标准三电平SVPWM查表层 % 中点平衡:根据Uc1、Uc2的偏差修正冗余小矢量分配 Kp_bal = 0.05; d_bal = Kp_bal * (Uc1 - Uc2); d_bal = max(-0.5, min(0.5, d_bal)); % 将d_bal叠加到冗余小矢量占空比上 % 具体叠加位置在查表层完成 % 最终输出三相占空比 Ta = 0.5; Tb = 0.5; Tc = 0.5;

代码里的注释已经点出关键位置。实际完整实现时,小三角形判断和作用时间查表需要把三电平矢量平面的4个小三角形逐一写清楚,代码长度会多出几百行,但框架就是上面这个逻辑。公共量X、Y、Z的提前计算,让后续不同扇区、不同三角形的组合查表都变成简单加减法。

5.4 仿真结果怎么看

仿真跑起来后,先看SVPWM模块输出的三相PWM波形,确认是标准的三电平PWM,波形台阶清楚,没有异常跳变。然后看输入电流波形,正常情况下是平滑正弦波,与电网电压同相位。再看直流侧电压,Uc1和Uc2稳定在325V左右,差基本为零。

一个重要的中间观测量是分配系数k的实际值。运行稳定后,k应该在0.5附近小幅波动。如果k一直顶在限幅值上,说明中点平衡环已经饱和,要么是PI参数不合适,要么是当前运行点调制比过高、平衡能力不足。

6. 调试实录与常见问题排查

6.1 中点电位振荡

这是Vienna整流器调试里最常遇到的问题。振荡分两种,一种是高频小幅振荡,一般是PI参数偏大,或者ΔU滤波不够;另一种是低频大幅振荡,多半是平衡环方向接反了,或者采样时序有问题,平衡量作用早了一个周期或者晚了一个周期。

排查方法:先把PI积分项关掉,只保留很小的比例项,比如0.01,然后把负载从一个比较轻的工况开始跑。如果ΔU还是单调发散,基本可以断定方向反了;如果收敛但很慢,再慢慢加积分项。整个过程用Scope盯着Uc1和Uc2,波形方向对不对一目了然。

6.2 扇区切换毛刺与角度跳变

扇区切换时出现毛刺,先检查角度是不是在扇区边界发生了抖动。我遇到过的情况是参考电压刚好在边界附近,一个采样周期内MATLAB Function算出来的扇区在1和6之间跳,导致序列选错。

解决方法有两个:一是给扇区判断加滞环,切换条件里留一个小裕量,避免边界抖动;二是用前面讲的中心扇区思路,把接近0°和360°的角度做一次统一处理。两种都很有效,我实际项目里是两种都加上。

6.3 代数环问题

Simulink里SVPWM模块如果直接使用电容电压作为输入来计算PWM,很容易出现代数环,因为电容电压本身受到PWM占空比影响。解决方法是把PI输出到SVPWM这条路线上加Unit Delay,或者在SVPWM模块内部对电容电压使用上一采样时刻的延迟信号。

一开始我习惯在模块内部直接写u_Memory,后来发现不如在外部加Unit Delay来得直观,而且方便切换不同SVPWM实现做对比。

6.4 低调制区的选择

低调制区就是前面说的第7扇区,处理方式可以是固定输出零矢量,也可以输出和当前三相电流方向匹配的小矢量序列。固定输出零矢量最简单,但电流纹波会偏大,适合用在轻载或启动阶段;匹配小矢量序列在稳态运行时波形更好,代价是控制逻辑更复杂。

我的建议是:第一版仿真先固定输出零矢量,整个系统能稳定工作以后,再优化低调制区的序列选择,避免一开始引入过多变量。

6.5 过调制防止与限幅

Vienna整流器一般运行在单位功率因数整流模式,调制比不太需要做到极限。但电网电压跌落或者负载突增时,电流内环输出瞬间可能让Vα、Vβ超过线性调制范围。这时候如果不做限幅,SVPWM计算出来的时间会是负值,波形直接乱掉。

限幅策略我习惯限Vα、Vβ的幅值,把它限制在三能电平调制最大输出对应的内切圆半径以内。虽然会牺牲一点动态响应,但系统稳定性优先。更激进的做法是采用过调制算法,那部分工程复杂度和收益不成正比,多数项目不需要。

6.6 电流过零畸变

Vienna整流器的双向开关在电流过零附近存在换流困难,如果不做处理,输入电流在过零点附近会出现明显的台阶。SVPWM层面能做的改善是尽可能让过零点的开关序列平滑过渡,避免P/O/N状态强行切换。配合第7扇区的中心区域处理,电流过零畸变会明显改观。

硬件上可以优化双向开关的驱动电路,但这属于另一个话题。仿真里先把扇区切换逻辑调顺,电流波形基本就能看了。

7. 按这个顺序调,能少走一半弯路

第一次搭Vienna整流器SVPWM仿真时,很容易一上来就把电压环、电流环、中点平衡环全部接好,然后面对一团乱麻的波形毫无头绪。我自己的调试顺序是严格分层的,每一步都确认没问题后再进入下一步。

第一步,先把SVPWM模块单独拿出来测试。给一组固定的Vα、Vβ,看看输出PWM序列是否正确,扇区判断是否稳定,作用时间是否有负值。第二步,主电路接上开环的SVPWM,用固定占空比跑,确认主电路能正常工作,直流电压稳定。第三步,接上电流内环,不用电压外环,电流跟踪正常后再接电压外环。最后一步才是把中点平衡环并入,先固定k=0.5看波动趋势,再加PI调收敛。

这套顺序看起来慢,实际是最快的。每一步出的问题都能缩小到很小的排查范围,而不是让你在整条链路里猜。最后再分享一个我个人的习惯:每次修改参数前,都在Simulink里把仿真结果导出成工作区变量,记录下关键波形和参数快照。Vienna整流器里的耦合效应比两电平复杂得多,没有对照记录,很多时候改了参数都分不清波形变好变坏的原因。这算是踩过不少坑之后的后知后觉吧。

返回列表