ARTICLE DETAIL

资讯详情

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

Vienna整流器SVPWM仿真从原理到实现:7扇区划分、作用时间推导与中点电位平衡

Vienna整流器SVPWM仿真从原理到实现:7扇区划分、作用时间推导与中点电位平衡 做Vienna整流器仿真的同学应该都有体会主电路拓扑其实不算难真正卡人的是SVPWM调制那一大坨。尤其是“7扇区划分”“中点电位平衡”“矢量作用时间里的公共量推导”三座大山摞在一起模型一跑就发散波形乱七八糟。这篇文章就把这三件事从原理到MATLAB/Simulink实现一次讲透。不管你是正在做毕业设计还是在做电源产品预研只要你在用Simulink搭Vienna整流器这篇应该能帮你省下好几周的踩坑时间。我默认你已经知道Vienna整流器的基本结构也就是三相二极管前端加双向开关、直流侧两个电容串联出中点。如果对这个拓扑还不熟建议先把主电路原理图过一遍再往下看否则后面的扇区讨论容易找不到北。1. 先把Vienna整流器的调制问题看清楚1.1 单开关三电平简洁拓扑背后是约束Vienna整流器每相只有一个双向开关管但输出却有三个电平P、O、N。这个“一管三电平”是怎么实现的靠的是电流极性帮你换流。以A相为例电流为正时开关管导通输出O开关管关断则电流走二极管到直流母线正端输出P电流为负时开关管导通还是输出O开关管关断就输出N。所以同样一个占空比在不同电流极性下实际加在交流侧的电压波形方向是不同的。这个特性既是Vienna省管子、效率高的原因也是调制算法必须特殊处理的原因——你不能像两电平逆变器那样给一个开关信号就完事还要考虑电流方向对可用电平的限制。控制上我们最终给每个开关管的只是一个0~1的占空比信号主电路根据当前电流方向自动选择合适的电平输出。理解这一点非常关键它决定了后面Simulink模型里PWM信号该怎么生成。1.2 为什么两电平SVPWM不能直接拿来用很多初学者第一反应是把三相逆变器的SVPWM例程直接搬过来。我也这么干过结果输入电流波形惨不忍睹直流中点电压直接漂到一边去。两电平SVPWM只有6个扇区每个开关周期只用两个非零矢量加零矢量不需要考虑中点电位。而Vienna是真正意义上的三电平对象它有更多的基本电压矢量不同矢量的作用效果里多了一个“中点电流”维度。更麻烦的是Vienna受电流极性约束某个60°扇区内可用的开关状态并不是全排列像NPC三电平那样随便切换状态是会出问题的。因此Vienna需要一个专门针对它的SVPWM方案。通常的做法是先按60°划分6个大扇区再在大扇区内细分小区间结合中点电位控制确定每个小区间的矢量序列。这就是大家常说的“7扇区SVPWM”的由来。1.3 SVPWM本质扇区判断加伏秒平衡不管两电平还是三电平SVPWM的本质都是伏秒平衡在一个开关周期Ts内用有限个基本电压矢量合成参考电压矢量保证平均值等于参考值。数学表达也很简单选n个最近矢量让它们的导通时间累加后等于参考矢量乘Ts同时所有时间之和等于Ts。难点在于两个一是怎么快速判断参考矢量落到了哪个扇区二是怎么根据矢量位置算出每个矢量的精确作用时间。Vienna的7扇区SVPWM就是把这两个环节做细顺带把中点电位平衡塞进矢量时间的分配里。2. 7扇区划分把60°大扇区切成7块2.1 为什么用60°坐标系先问一个问题在大扇区内部用什么坐标来描述参考矢量最方便直角坐标当然可以但矢量作用时间公式会很繁琐。工程上更聪明的方法是用60°坐标系也就是以扇区两条边界作为坐标轴。在第一个60°大扇区里三电平矢量图可以画成大三角形顶点分别是零矢量、两个小矢量、两个大矢量和中矢量。用60°坐标表示这六个关键矢量的坐标非常整齐矢量类型60°坐标(x, y)物理含义零矢量 V0(0,0)三段桥臂全输出O小矢量 Vs1(1,0)靠近α轴的短矢量小矢量 Vs2(0,1)靠近60°轴的短矢量中矢量 Vm(1,1)30°方向的中间矢量大矢量 Vl1(2,0)靠近α轴的长矢量大矢量 Vl2(0,2)靠近60°轴的长矢量这套坐标最大的好处是后面所有作用时间公式都能用简单的加减法算出来不需要反复调用三角函数。2.2 大扇区判断的两种写法第一步还是判断参考电压矢量落在哪个60°大扇区。两种常用方法方法一是角度判断。先算 θ atan2(Uβ, Uα)然后除以60°取整。注意负角度要加360°再除否则取整会出错。Simulink里用MATLAB Function写起来很直观也容易调试。方法二是用三个中间变量的符号判断和两电平SVPWM类似N sign(Uβ) 2*sign(√3Uα/2 - Uβ/2) 4*sign(-√3Uα/2 - Uβ/2)然后查表得到大扇区编号。这个方法省去了反正切函数适合以后往DSP、STM32上移植时用。仿真阶段我建议先用角度法因为可读性强出问题容易定位。2.3 从αβ坐标旋转到第一扇区判断完大扇区N之后把参考矢量旋转到第一扇区坐标系里。旋转矩阵是Vr_alpha Uα*cos(N*π/3) Uβ*sin(N*π/3) Vr_beta -Uα*sin(N*π/3) Uβ*cos(N*π/3)这里N是大扇区编号0代表0°到60°1代表60°到120°以此类推。旋转之后任意扇区的参考矢量都等效到第一扇区处理一套公式通吃不用为每个扇区单独写计算逻辑。接下来要把直角坐标换成60°坐标。由于60°坐标系的基向量分别是(1,0)和(1/2,√3/2)反解得到y 2*Vr_beta / √3 x Vr_alpha - Vr_beta / √3再用直流母线电压归一化。三电平矢量图里大矢量幅值等于2Udc/3对应60°坐标里的(2,0)所以归一化系数取Udc/3x x / (Udc/3) y y / (Udc/3)到这一步参考矢量在任意大扇区内都变成了一个大三角形内部的点(x, y)满足0≤x≤2、0≤y≤2、xy≤2。后面所有工作都围绕这两个数展开。2.4 7小区间判断条件现在进入核心环节在大三角形里划分7个小区间。划分逻辑很简单用几条直线把三角形切碎分别对应不同的三矢量组合。判断条件如下子扇区判断条件最近三矢量1xy≤1且x≤0.5y≤0.5V0, Vs1, Vs22xy≤1且x0.5y≤0.5V0, Vs1, Vs23xy≤1且x≤0.5y0.5V0, Vs1, Vs24xy≤1且x0.5y0.5V0, Vs1, Vs25xy1且x≤1y≤1Vs1, Vs2, Vm6x1Vs1, Vm, Vl17y1Vs2, Vm, Vl2可能有人会问子扇区1到4用的矢量组合明明一样为什么还要拆成四块原因是这四个小区间里零矢量和小矢量的占比不同而小矢量有正负冗余状态直接影响中点电流的大小和方向。拆开之后中点电位平衡策略可以针对不同区域做差异化处理靠近零矢量的区域平衡能力强远离零矢量的区域平衡能力弱分开处理比一刀切更精细。判断条件在MATLAB Function里就是几个if-else没有浮点陷阱跑起来非常稳。3. 矢量作用时间与公共量的推导3.1 所谓“公共量”就是x和y网上搜Vienna SVPWM总能搜到“两个非零电压矢量的作用时间所需的中间变量公共量”。很多人卡在这里不知道公共量到底是什么。其实在我们这套60°坐标体系里公共量就是前面算出来的x和y。之前推导过x和y是参考矢量在扇区两条边界方向上的投影。一旦把参考矢量表示成这两个数所有7个小区间的作用时间都可以用x、y、1-x、1-y、xy-1、2-x-y这几个简单表达式查表得到。这就是为什么所有扇区可以共用一套公式也是“公共量”三个字的来源。3.2 第一扇区各小区间的完整推导下面把第一大扇区里每个小区间的作用时间用伏秒平衡推一遍。设三个矢量的作用时间分别为T0、T1、T2总和等于Ts。子扇区1到4最近三矢量为V0(0,0)、Vs1(1,0)、Vs2(0,1)。伏秒平衡方程x*Ts T1*1 T2*0 T0*0 T1 y*Ts T1*0 T2*1 T0*0 T2 T0 T1 T2 Ts所以直接得到T1 x*Ts T2 y*Ts T0 (1 - x - y)*Ts子扇区5最近三矢量为Vs1(1,0)、Vs2(0,1)、Vm(1,1)。设它们的作用时间为T1、T2、Tm伏秒平衡x*Ts T1 Tm y*Ts T2 Tm T1 T2 Tm Ts由前两式得T1 xTs - TmT2 yTs - Tm代入第三式(x*Ts - Tm) (y*Ts - Tm) Tm Ts Tm (x y - 1)*Ts于是T1 (1 - y)*Ts T2 (1 - x)*Ts Tm (x y - 1)*Ts子扇区6最近三矢量为Vs1(1,0)、Vm(1,1)、Vl1(2,0)。伏秒平衡x*Ts T1 Tm 2*Tl y*Ts Tm*1 T1 Tm Tl Ts由第二式得Tm y*Ts。代入第三式得T1 Ts - Tm - Tl (1-y)*Ts - Tl。再代入第一式x*Ts (1-y)*Ts - Tl y*Ts 2*Tl x*Ts Ts Tl Tl (x - 1)*Ts回代T1 (2 - x - y)*Ts Tm y*Ts Tl (x - 1)*Ts子扇区7对称处理最近三矢量为Vs2(0,1)、Vm(1,1)、Vl2(0,2)结果T2 (2 - x - y)*Ts Tm x*Ts Tl2 (y - 1)*Ts3.3 查表整理把上面结果汇总成一张总表Simulink里直接按子扇区号查表即可子扇区T_aT_bT_c1-4V0: (1-x-y)TsVs1: x·TsVs2: y·Ts5Vs1: (1-y)TsVs2: (1-x)TsVm: (xy-1)Ts6Vs1: (2-x-y)TsVm: y·TsVl1: (x-1)Ts7Vs2: (2-x-y)TsVm: x·TsVl2: (y-1)Ts注意子扇区1到4虽然矢量组合相同但后续分配冗余小矢量时间时策略不同所以查表后还要走一遍中点平衡处理不能直接输出。这一点在下一章讲。4. 中点电位平衡原理、公式与调试经验4.1 中点电位漂移的根源Vienna整流器直流侧是两个串联电容中间抽头O就是中点。负载电流流过中点时上下电容的充放电量就不相等中点电位自然偏移。具体来说某个开关周期内流向中点的平均电流不为零就会让一个电容多充电、另一个多放电Uc1和Uc2之差越来越大。中点位偏移的后果很直接谐波增大、开关管电压应力不均、严重时直接击穿器件。4.2 冗余小矢量是平衡的唯一抓手三电平SVPWM里有一种特殊现象同一个电压矢量可以由两组不同的开关状态产生这就是冗余小矢量。比如POO和ONN在三电平坐标系里对应同一个空间矢量位置但两组状态流过中点的电流方向完全相反。一个让中点放电一个让中点充电。这就给了我们一个机会保持输出电压矢量不变通过调节冗余小矢量对的作用时间比例主动控制中点电流把Uc1和Uc2拉回来。三电平SVPWM的中点平衡绝大多数方案都是从这点切入的。Vienna整流器也一样只是可用状态受电流极性限制冗余小矢量对没有NPC那么多更需要在扇区划分时提前规划好。4.3 调整因子k的计算工程上最常用的方法是给冗余小矢量分配一个调整因子k取值范围[-1,1]。设某个小矢量原计划作用时间T_small实际分配为T_positive T_small * (1 k) / 2 T_negative T_small * (1 - k) / 2T_positive对应让中点电流为正的小矢量T_negative对应让中点电流为负的小矢量。k为正时正小矢量作用时间更长中点电压向一个方向调整k为负则反向。k怎么算最简单的做法是滞环控制if Uc1 - Uc2 h k -k_max; elseif Uc1 - Uc2 -h k k_max; else k 0; endh是滞环宽度k_max通常取0.3到0.5太大会导致电流谐波增大太小则平衡速度慢。要求更高时可以用PI调节器k sat( Kp*(Uc1 - Uc2), -k_max, k_max )Kp先给0.05量级根据仿真效果调整。我个人经验是先上滞环调通波形后再换PI这样定位问题更清楚。4.4 7扇区划分下怎么分配小矢量时间回到7扇区模型。子扇区1到4包含V0和两个小矢量是平衡能力最强的区域因为小矢量占比高。具体做法是把查表得到的Vs1、Vs2时间各自拆成正负两份按k值重新分配。子扇区5包含Vs1、Vs2、Vm平衡能力中等。子扇区6和7只含一个小矢量加中矢量加大矢量小矢量占比较低平衡能力最弱必要时可以通过微调k把平衡需求延后到下一个开关周期处理不用硬顶。这个分层思路很实用。不要在平衡能力弱的区域强行加大k否则会矫枉过正引起中点电压低频振荡。我见过不少仿真发散都是因为k全区域一刀切结果在大矢量区域把电流波形搞出了畸变。4.5 死区和电容参数的影响死区时间会轻微改变实际作用时间对中点平衡造成扰动。仿真阶段可以先忽略死区但样机调试时一定要补死区补偿否则中点电压会有固定偏移。上下电容参数不一致也会造成中点电位周期性波动。仿真里建议两个电容都用理想电容先把算法逻辑调通再考虑ESR和容差的影响。5. Simulink模型搭建主电路、控制链路与核心代码5.1 主电路搭建要点主电路建议用Simscape Electrical里的元件搭每相一个双向开关用两个反向串联的MOSFET和反并联二极管实现或者直接用带体二极管的开关管模块。交流侧接三相电压源和输入电感直流侧两个电容串联负载接电阻或恒功率负载。参数参考值参数数值三相相电压有效值220V / 50Hz输入电感1mH ~ 3mH直流母线电压给定750V~800V上/下电容各1000μF ~ 2200μF开关频率20kHz~50kHz负载5kW~20kW可调电感太小电流纹波大THD难看电感太大动态响应慢压降也大。先用2mH起步试再根据电流纹波调整。5.2 双闭环控制链路Vienna控制常用电压外环加电流内环。外环把直流电压Udc给定值和反馈值做PI输出有功电流指令Id_ref无功电流指令Iq_ref给0。内环在同步旋转坐标系下对输入电流做解耦控制输出Ud、Uq。再经过反Park变换得到Uα、Uβ送给SVPWM函数。电流内环PI参数可以先按典型I型系统整定Kp给个0.5~2Ki给Kp的10倍左右然后看波形微调。电压外环带宽要比内环低一个数量级否则两个环互相掐架。5.3 MATLAB Function核心代码SVPWM用MATLAB Function实现核心逻辑分四步判断大扇区、旋转坐标、求60°坐标、查表算占空比。为了简洁下面代码只给出框架重点体现x和y的计算、7扇区判断和占空比输出function [Da, Db, Dc] svpwm_vienna(Valpha, Vbeta, Udc, Uc1, Uc2, Ts) % 1. 计算参考矢量角度判断大扇区 theta atan2(Vbeta, Valpha) * 180 / pi; if theta 0 theta theta 360; end N floor(theta / 60); % 大扇区编号 0~5 % 2. 旋转到第一扇区 theta_rot (theta - N * 60) * pi / 180; [Vmag, ~] cart2pol(Valpha, Vbeta); Vr_a Vmag * cos(theta_rot); Vr_b Vmag * sin(theta_rot); % 3. 60°坐标并归一化 y 2 * Vr_b / sqrt(3); x Vr_a - Vr_b / sqrt(3); K Udc / 3; x x / K; y y / K; % 4. 7扇区判断与作用时间查表 if x y 1 if x 0.5 y 0.5 sector 4; elseif x 0.5 sector 2; elseif y 0.5 sector 3; else sector 1; end T1 x * Ts; % Vs1 T2 y * Ts; % Vs2 T0 Ts - T1 - T2; else if x 1 y 1 sector 5; T1 (1 - y) * Ts; T2 (1 - x) * Ts; T0 (x y - 1) * Ts; elseif x 1 sector 6; T1 (2 - x - y) * Ts; T2 y * Ts; T0 (x - 1) * Ts; else sector 7; T1 x * Ts; T2 (2 - x - y) * Ts; T0 (y - 1) * Ts; end end % 5. 中点电位平衡调整简化版 du Uc1 - Uc2; k max(min(0.1 * du / 100, 0.4), -0.4); % 再把T1/T2按冗余正负小矢量拆分并转化为三相占空比 % 具体映射需要根据大扇区N和电流方向确定 % 此处省略映射表细节仿真中按第5.4节方式处理 Da ...; Db ...; Dc ...;这段代码不是可以直接复制的完整工程但把最关键的扇区判断和公共量用法写清楚了。实际模型里需要补上“矢量时间到三相占空比”的映射表以及中点平衡时对T1/T2的拆分逻辑。5.4 从矢量作用时间到三相占空比这是很多simulink模型最后卡壳的地方。SVPWM算出来的是矢量作用时间但Vienna主电路要的是三个开关管的占空比。转换逻辑很简单在一个开关周期里统计每相开关管导通输出O的总时间占比就是这相的占空比。具体做法是把每个矢量的三相状态用1、0、-1表示P、O、N查出来乘以对应作用时间累加得到每相O状态的总时间再除以Ts。这个查表过程对大扇区编号N有依赖因为不同扇区可用的开关状态不同。更工程化的替代方案是用载波PWM实现SVPWM先把参考电压归一化叠加零序分量得到三相调制波再和三角载波比较。理论上SVPWM和注入零序分量的载波PWM是等价的Simulink里用这个方式可以快速验证算法调试更简单。5.5 仿真参数推荐开关周期Ts取载波周期比如20kHz开关频率对应Ts5e-5秒。求解器用变步长ode23tb最大步长设为Ts/20这样可以看清PWM细节。仿真时间从0.1秒起步等稳态后再把中点平衡使能开关打开对比观察。6. 仿真调试中容易踩的四个坑6.1 扇区切换瞬间出现电压毛刺参考矢量在扇区边界附近来回跳的时候如果扇区判断存在抖动会导致矢量序列突然切换电流波形上出现毛刺。解决办法是给扇区判断加一点滞环或者把角度θ做低通滤波。但滤波会增加相位延迟幅度要小不然电流环受影响。6.2 中点电位发散中点电位如果越偏越大先检查k的符号对不对。很多模型不是控制策略不对而是冗余小矢量的正负定义搞反了平衡变成了正反馈。建议先用滞环控制把k_max设小一点比如0.2确认方向正确再调大。6.3 过调制区分不清当参考矢量幅值超过大三角形边界时x和y会溢出有效范围查表时间出现负值。必须在进入SVPWM之前做限幅把调制比压到最大线性范围以内。Vienna在SVPWM下的最大调制比是1对应相电压峰值Udc/√3超过这个值就要走过调制策略否则时间公式失效波形直接削顶。6.4 从Simulink移植到STM32的实时性注意点如果后续要把算法搬到STM32F103之类的中低端MCU上有几个坑提前说一下。atan2和三角函数尽量少用改用三个中间变量符号判断大扇区。浮点运算在F103上比较慢可以考虑把x、y归一化到定点数比如扩大4096倍用整数运算查表。开关频率不要设太高STM32F103跑到20kHz会很紧张降低到10kHz更稳代价是电感体积变大一点。最后分享一个我自己的调试习惯先把中点电位平衡关掉用固定k0跑通整个SVPWM确认输入电流波形和直流电压都正常了再打开平衡算法一步一步调k。这样如果波形还是不对你能清楚地知道问题出在调制部分还是平衡部分而不是一锅粥。Vienna整流器调通之后性能确实很能打值得多花点时间把SVPWM这块啃下来。
返回列表