荣誉证书

荣誉证书

只做让客户省心放心的逆变器及逆变电源

首页 > 荣誉证书 > ballbet贝博BB

彻底吃透SVPWM如此简单

时间: 2024-02-20   作者: ballbet贝博BB

  本人在做电机控制的项目时花了不少时间在SVPWM(Space Vector Pulse Width Modulation,空间矢量脉宽调制)算法上,看了不下10处的文献。最终本人除了在MATLAB上做了该算法的模拟外,还将其形式做了变换用以控制speedgoat系统的真实三相逆变器以驱动一台电机,效果良好。本人希望在总结这些文献优缺点的基础上给出SVPWM技术从理论推导到算法落地的全面清晰的讲解,力求让没有扎实理论和编程功底,甚至是初次接触该算法的读者仅通过阅读此文就能够扎实掌握其原理并实现该算法,希望为读者彻底扫除理解盲点。本文希望一次性弥补如下列出的不足。如果读者存在疑问或者有所指教可以直接在评论区留言,我会尽力完善此文。

  过往本人有幸读到很多不错的SVPWM文献,它们大多都很优秀,有很多可圈可点之处,但它们也有一些局限性:

  (4)有些地方只给出结论,不讲解其原理。比如很多文献都说SVPWM能减小电机转矩脉动但并不讲解原因。

  (5)算法使用C语言等代码实现,而且代码还做过简化,不利于没有强大编程基础的同学学习。

  (7)有些讲解SVPWM技术的文章使用的方法较为简洁,做过太多简化,使读者难以理解,且跟当前工业界广泛使用的算法设计方式有很大出入。

  SVPWM算法很适合在数字系统中使用,有很高的直流电压利用率,还能够大大降低电机的转矩脉振和噪音(这些原因将在后面讲解)。

  为了理解SVPWM算法原理,我们先从逆变器说起。为了达到控制电机的目的,电机驱动系统要有能力给电机提供频率和幅值可以变化的电压。工业电源输出电压的频率和幅值是固定的。我们第一步可以将工业电源输出的电压变为直流电压源,也就是图1中你们可以看到的V_{dc},这一步叫做整流。这一直流电压源通过图1中的三相逆变器就可以变换为频率和幅值可以变化的电压,这一步叫做逆变。图1中的逆变器连接电机三个定子相绕组,该逆变器有三个桥臂a,b,c所以被称之为三相逆变器。每个桥臂上有两个开关。比如在a相我们有V_{T1}和V_{T4}两个开关,它们分别控制该相的上半桥臂和下半桥臂的导通和切断。图1中的N点代表电机三相绕组的中性点。

  SVPWM算法实际上计算的是上图所示逆变器的六个开关何时导通,何时切断。在算法模拟中,图1的逆变器是虚拟的模型。在真实工况中,该逆变器是真实的元器件。通过控制这六个开关的导通和切断,配合左边的直流电压源V_{dc},该逆变器可以在右侧三个电机定子相上产生所需要的正弦电压。注意,后面大家会看到该正弦电压是PWM(脉宽调制,Pulse Width Modulation)形式的。这六个开关的开关状态是离散的,所以该算法很适合离散的数字系统。

  下面我们用一个小例子来理解PWM信号。图2是一个直流电路,它有一个电阻,一个开关,一个灯泡,和一个驱动灯泡的10V直流电压源。我们如何能得到2.5V电压驱动下的灯泡亮度呢?

  我们可以设定一个很短暂的开关周期(Period),该周期内25%的时间里我们令开关导通而其余的时间开关被切断。我们不断的重复这一短暂开关周期的开关动作。只要这个开关周期足够小,人眼将不会察觉灯泡的频闪,只会观察到稳定的光亮,而这一光亮的亮度对应的就是2.5V电压输入下的亮度。在下文中,图3的Period也就是SVPWM算法的PWM开关周期,以后用T_s来表示。T_{on}代表在一个PWM开关周期内该开关导通的时间,单位是秒。图3的Duty cycle代表占空比,是一个百分比。在图3中,黑线处于高位代表开关导通,低位代表切断。如果我们将黑线视为信号线,它可以被看做持续很多个开关周期的脉冲信号,通过调整每个开关周期内脉冲信号的宽度(开关导通的时间长度)我们可以控制电灯输入电压的大小。这也是为什么我们称此技术为脉宽调制技术(PWM)。

  现在我们可以进入正题了。在图1的三相逆变器中,每一相桥臂上的两个开关状态是互补的。如果该相上开关是导通的,那么下开关必然是切断的。我们可以先定义一个开关函数。

  比如S_a=1就代表a相上开关导通,下开关切断。S_a=0代表的状态则相反。如果图1逆变器的V_{T1},V_{T6},V_{T2}开关导通,V_{T4},V_{T3},V_{T5}切断。那么该状态对应的开关函数就是:

  这三个开关函数值可以用一个向量(1 0 0)来表示,当然也可以看做一个三位的二进制数。 逆变器有三个相而且他们可以被三个开关函数表示,这三个开关函数的值一共有2\times2\times2=8种组合形式。

  图4中大写的A,B,C代表电机的三个相绕组,小写的a,b,c就是图1中三相逆变器三个相和电机绕组的连接点,他们处于三个相的中间。V_{AN}=-V_{NA}是 电机A相绕组的相电压(也即电机绕组的相—中性点电压),V_{BN}和V_{CN}代表的意义类似。N是Neutral的首字母,代表电机三相绕组的中性点。SVPWM算法都假设电机拥有三相平衡绕组,也就是说所有的电机三相的相电阻相等(那么电机三相绕组的连接点就是中性点喽)。相电阻R_b和R_c并联,它们的总电阻就是相电阻R_a的一半(三个电阻相等)。根据串联分压定理有:

  请注意,在以上三个式子中只计算了电机三个相电压的幅值,并没有考虑他们在空间中的分布。

  把二进制的(1 0 0)转化为10进制后是数字4,所以下标4就代表该状态。电机的三个相绕组是在空间中互相间隔120°放置的,那么在这三个电机相绕组上的相电压在空间中就合成了一个空间电压向量。V_4就是逆变器三个相开关函数为S_a=1\ \ \ S_b=0\ \ \ S_c=0时电机三个相绕组上相电压合成的空间电压向量。 请注意,V_0, V_1, V_2, V_3, V_4, V_5, V_6, V_7是空间向量。V_{NA}, V_{BN}, V_{CN}, V_{dc}是代表幅值的标量。V_0, V_1, V_2, V_3, V_4, V_5, V_6, V_7可以用固定在电机定子上的一个直角坐标系\alpha-\beta坐标系来表示(图5),该坐标系\alpha轴指向电机A相绕组(图8)。

  它们可以被分为两组:一组零向量V_0, V_7和一组非零向量V_1, V_2, V_3, V_4, V_5, V_6。6个非零向量具有相同的模长,\frac{2}{3}V_{dc}。它们在空间中间隔60°。将这六个非零向量的顶点连接起来可以得到一个正六边形。两个相邻的向量再加它们顶点的连线可以组成一个正三角形。一共有6个这样的正三角形。我们也可以做一个正六边形的外接圆(未在图5中画出),两个相邻向量和他们顶点之间的圆弧可以组成一个扇区,这个外接圆可以被划分成6个扇区,可以用罗马数字I-VI来表示。

  在上面计算6个非零电压向量的公式中的每个公式都另外乘了一个\frac{2}{3},下面我们将会讲到如果给电机三个定子施加特定的三相交流电压,那么合成的电压向量的幅值是每个相所加相电压的1.5倍。我们用SVPWM重现该合成电压向量,但是希望重现的合成电压向量的幅值和所加相电压的幅值完全一样,所以在这里乘以\frac{2}{3}。当然有的人会在Clark里面乘这个系数,有的人兴许会在其他的地方做此处理。

  讲到这里我希望插入一段讲解电机运行原理的内容,对电机合成电压矢量原理熟悉的读者可以直接跳过下面两条虚线之间的内容。

  我们复习一下安培定理。右手握住通电的螺线圈,四指和电流方向一致。则该螺线圈产生的磁场方向和拇指方向一致。S和N为该磁场的两个磁极。

  图7是一个三相电机的定子(没有转子)。 该定子有A,B,C三个相绕组。所有的绕组的一端连接在一起,另外一端用来加载电压。如果在A相加正电压,则A相产生的磁场的方向根据安培定则由红色箭头表示,同理B加负电压产生的磁场的方向由蓝色箭头表示。这两个相绕组产生的磁场的合成磁场的方向由绿色箭头表示,而且该合成磁场可以看做一个磁铁(在右侧画出)。假设电机的转子也是一块只有一个N极和一个S极的磁铁,则电机转子会趋向于和这个磁场对齐。在定子三相的两相施加电压,我们一共有三种选择方式AB,AC和BC。再考虑到每相电压有两种加载情况(正或者负),所以我们一共有6种电压施加的方式,也就是说我们能产生六个不同的磁场方向。假如这六个不同的磁场方向是按顺序产生的,那么磁体转子也会按该顺序和每个磁场方向对齐,该转子也就转起来了。请注意,产生磁场的方向和相电压的方向是一致的。比如我们给A相加正电压后磁场方向(红色箭头)沿着A相圆柱绕组的轴线指向该圆柱绕组靠近电机转轴的那一侧(图中磁场方向箭头起始的黑点),电压也是这个方向。

  以上讨论的是在三个相绕组中选取两个加载直流电压,这种情况下我们只能产生6个不同的磁场方向。但我们希望产生任意方向的磁场。

  我们可以在电机的三个相绕组A,B,C分别上加图8所示的正弦交流电压u_a,u_b,u_c。u_m是他们的幅值,\omega_e是他们的角频率。图中出现虚线双箭头是因为正弦电压有正有负。比如若u_a为正值时,它和A相绕组方向相同,否则相反。这三个电压加在在了三个在空间中两两相差120°空间角度的绕组A,B,C上。而这三个电压又互差120°,这个120°可跟三相绕组在空间中差的120°是两回事,它是指在时间相位上的120°。

  V_\delta是u_a,u_b,u_c的合成电压向量。我们看看如何得到该合成电压向量。

  A相方向代表0°。e^{j∙120°}表示从A相方向开始逆时针旋转120°的方向。如果j前面有负号则代表顺时针旋转。e^{j∙120°}其实是一个在实数轴和虚数轴组成的直角坐标系中模长为1的向量(e^{j∙120°}可以表示成cos120°+jsin120°,该式实部和虚部取平方和然后开平方是1),那么它可以代表方向(方向是模长为1的向量)。那么u_b∙e^{j∙120°}代表u_b沿着e^{j∙120°}方向分布。请注意,图8是放在实数轴和虚数轴组成的直角坐标系下讨论(实数轴和虚数轴分别对应\alpha轴和\beta轴)。

  我们能够正常的看到合成的电压向量V_\delta是\frac{3}{2}u_me^{j\bullet\omega_et},它的大小是恒定的,而且是所施加三相正弦电压幅值的1.5倍(这里用到幅值是因为三相电压是正弦变化的)。它在空间中以一定的角速度旋转,该角速度和所施加的三相正弦电压的角频率一致。图9绿色,红色和蓝色箭头表示所施加的三相正弦电压,黑色箭头表示他们的合成电压向量。三个相绕组A,B,C的位置已经在图上标出。

  (或者输入可以合成该黑色电压向量的等效电压组合u_a,u_b,u_c),经过控制图1中三相逆变器的6个开关的状态它会合成等效的,PWM形式的电机相电压。也就是以PWM形式重现V_\delta,重现的这个电压输出可以叫做V_{out}(它可以是一个合成的电压向量,也可以是等效的电压组合)。图9的黑色合成电压向量可以叫做参考电压向量。这个V_\delta顶点的轨迹可以放到图5里面(图10所示)。>

  可以在任何位置,而且幅值也是可以变化的。但我们只有6个非零向量和2个零向量,而且它们的幅值都是固定的。下面我们来看看我们如何用这6个非零向量和2个零向量来重现V_\delta。每一个PWM开关周期T_s(图3),SVPWM算法便可以使用图中的8个向量(V_0-V_7)来合成一次V_{out}。T_s越短,则V_\delta旋转一圈的时间中合成V_{out}的次数就越多,V_{out}顶点的轨迹也就越平滑且越接近V_\delta顶点的轨迹(圆)。现在假设

  两个相邻的非零电压向量V_4,V_6和两个零向量V_0,V_7来合成它,合成后的电压向量为V_{out}。T_4是在一个PWM开关周期T_s内电压向量V_4持续的时间(该电压向量对应的逆变器开关状态是S_a=1\ \ \ S_b=0\ \ \ S_c=0)。同理T_6就是一个T_s内电压向量V_6(S_a=1\ \ \ S_b=1\ \ \ S_c=0)持续的时间。V_{first}和每个扇区中逆时针方向第一个向量同向(这里和V_4同向),V_{second}和每个扇区中逆时针方向第二个向量同(这里和V_6同向)。u_\alpha和u_\beta是电机三相电压u_a,u_b,u_c投影到图10中所示\alpha-\beta坐标系后的电压。则根据伏秒平衡等效原理我们有如下关系(T_s很小)。

  平移到右侧平行的虚线位置(平行四边形的右边)。虚线和V_{second}平行那么它们的同旁内角相等(\frac{\pi}{3}),它们的内错角也相等(\frac{\pi}{3}–θ)。 另外图11中用到了电角度,为了泛化推导过程这我们使用一个任意角度\theta来代替。组合以上两个等式我们有下列关系。

  的幅值是电机三相正弦输入电压u_a,u_b,u_c幅值u_m的1.5倍。但我们大家可以在图5下面计算合成电压向量时或者在坐标变换(将电机三个定子相A,B,C上的相电压u_a,u_b,u_c变换到电机定子\alpha-\beta坐标系上)的过程中乘一个\frac{2}{3}使合成电压向量V_\delta的幅值依然和这三个相电压的幅值相等。V_{out}是对V_\delta的重现,也拥有和三个相电压一样的幅值u_m。下面我们可以定义一下调制比M。

  的幅值u_m小于图5正六边形的内切圆(图12可见)的半径,该半径的大小是\frac{\sqrt3}{3}V_{dc}。但实际上V_{out}的幅值最大可以达到图5正六边形外接圆的半径,即\frac{2}{3}V_{dc}。此时调制比可以达到1.1547。和正弦脉宽调制技术(Sinusoidal Pulse Width Modulation, SPWM)比较SVPWM的调制比更大。这也是怎么回事SVPWM的直流电压V_{dc}的利用率更高。正弦脉宽调制技术不在我们讨论范围内。>

  代表电压向量V_4(S_a=1,\ S_b=0,\ S_c=0)在一个开关周期T_s内的持续时间。但只知道这个持续的时间是不够的。我们还需要知道这个状态的持续时间T_4是如何在一个开关周期T_s内分配的。我们有一个原则来分配它。由之前的分析可知,如果要合成落在第一个扇区内的参考电压向量V_\delta,那么V_4,V_6,V_0,V_7要参与合成(合成过程中它们之间互相切换)。这些电压向量对应着不同的逆变器开关状态(开关函数S_a,\ S_b,\ S_c),那么这些电压向量之间的切换就对应着不同的逆变器开关状态(开关函数)之间的切换。我们希望在合成一次参考电压时(一个开关周期T_s内),开关动作次数最少。这样逆变器上开关的损耗也就最小。所以我们希望在切换电压向量的时候只动一个开关函数,也就是说只改变逆变器一个相上的开关状态(一个相有两个开关)。通过引入零向量V_0,V_7我们大家可以轻松实现这一目标。如果参考电压向量V_\delta落在第一个扇区,要合成这它的线需要在一个开关周期内维持T_4的时间,V_6要维持T_6的时间,V_0,V_7分别要维持T_0,T_7的时间。这些时间是可以计算出来的,但问题是这四个向量出现的顺序什么?这些向量所需要维持的时间在一个开关周期内如何分配呢?现在我们尝试合成落在第一个扇区的参考电压向量,上述四个电压向量出现的顺序可以是这样的(两个零向量被平均分配到了中间和两边):V_0→V_4→V_6→V_7→V_7→V_6→V_4→V_0。 当我们从V_0切换到V_4时开关函数从(0 0 0)变为(1 0 0),图1中的逆变器只有a相的开关状态发生了变化(之前是上开关切断,下开关导通,现在变为上开关导通,下开关切断)。同理在上述切换顺序中任意一次切换只有图1中的逆变器只有一个相上的开关状态发生改变。图13表示了上述的开关切换顺序。>

  V_7)。如果参考电压向量在下一个开关周期T_s从一个扇区转到了下一个扇区,合成过程总是从一个零向量开始,这就保障了参考电压向量合成的连续性。表2列出了参考电压向量在六个扇区的电压向量(逆变器开关状态)切换顺序。最右边的图形表示在每个扇区各电压矢量的切换顺序以及维持的时间。a代表逆变器的a相。在对应于第一个扇区的行中最右边我们大家可以看到V_0,代表开关状态(0 0 0)先维持了\frac{T_0}{4}秒然后切换到了V_4,也就是开关状态(1 0 0)。>

  V_7被放到了中间。这样做还有一个很重要的好处,分析如下。在表2第二个扇区开关状态切换顺序下,电机的相电压(相中性点电压)V_{AN},V_{BN},V_{CN}

  V_{ab},V_{bc},V_{ca}为电机线电压(相相之间的电压),请读者忽略掉。>

  V_{AN}=\frac{2}{3}V_{dc},V_{BN}=V_{CN}=-\frac{1}{3}V_{dc}(请读者现在在图15上对应着看一下这个情况)。在其他开关状态下电机相电压也在表1中列出。我们能够正常的看到所有的相电压都被分成了相等的两份并且在开关周期T_s内对称分布,对称于开关周期的中点。图16(a)显示在一个开关周期内,相电压没有被分成两份(只有一个电压脉冲)。图16(b)显示相电压被分成了两份(两个电压脉冲),也就是图15所示的情况(我们把零电压向量放中间的时候)。>

  Δt却是(a)中的一半。所以(b)中的电流波纹被大大削减了。那么和电流波纹相关的转矩脉动以及磁场能量损失也被削减了,电机运行更加平稳且噪音更小了。L是电感。

  本节介绍SVPWM算法在MATLAB Simulink中的实施。所有算法模块均采用Simulink block设计,方便没有扎实编程功底读者理解。所有算法的讲解遵循清晰第一,效率第二的原则,力求 使读者清楚原理。读者若认为算法和讲解有可优化改进的地方待自己清楚其原理后可自行修改。在这里个人会使用V_{ref}

  B=1(即图18蓝线的蓝域), 否则B=0(图18蓝线蓝域的另外一侧);如果V_{ref3}0

  C=1(即图18粉红域), 否则C=0(图18红线另一侧)。通过A,B,C

  N=4C+2B+A转化为一个十进制数。该10进制数也和扇区编号是一一对应的(表3可以看到)。图19是Simulink里的扇区判定算法,该算法计算的是十进制数N。>

  为了在其他扇区中重复利用在第一个扇区得到的上述结论并简化表达式,我们大家可以定义三个变量。

  T_{second}代表同一扇区第二个非零电压向量持续的时间。在第一个扇区,显然T_{first}和T_{second}分别是T_4和T_6,对应的非零电压向量分别为V_4和V_6。在六个扇区每个扇区内合成参考电压向量用到的相邻两个非零向量以及两个零向量它们分别持续的时间列在表4内。>

  V_4)对应的状态。我们将表2对应于第一个扇区的开关状态图拿出来分析(图22)。此处a,b,c可以表示图1三相逆变器三个相上开关的状态(因为每个相的下开关状态和该相上开关状态相反,知道上开关状态就知道下开关状态了)。在图22中,两个零向量V_0(0 0 0) 和V_7(1 1 1)在一个开关周期T_s的维持的时间为:T_0=\frac{T_s–T_4–T_6}{2}

  T_s内各电压向量(也就是各开关状态)是对称分布的,那么图22中a相上开关由导通(高电平)切换到切断(低电平)的时刻距离该周期结束的时间也是T_a。>

  cm1代表a相上开关何时由切断切换到导通状态。其实该图中T_4应该变为T_{first},T_6要变为T_{second}。>

  T_a,T_b,T_c表达(表5)。此处的N不是扇区编号,但和扇区编号一一对应。>

  T_s,那么高度就代表半个开关周期。这样的程序里生成的三角波信号的值(三角波的幅值是高度)就和沿底边变化的时间一一对应了。比如在前半个开关周期。时间(三角形底边)经过\frac{T_0}{4}后,三角波的值沿高度也增加到了\frac{T_0}{4}。再具体一点 ,在前半个开关周期当时间经过T_{cm1}时,三角波的值沿高度也越过了T_{cm1}(当该三角波的值达到T_{cm1}算法就知道时间也过去了T_{cm1})。此时逆变器a相的开关通过比较三角波值的大小和预设定的T_{cm1}就知道要从切断切换到导通状态了(对于b,c相原理相同)。在\frac{T_s}{2}时,三角波的值沿高度变化到最大(此时三角波的值就等于下图三角形的高了),时间沿着三角形底边也走到了底边的中点。如果在前半个开关周期三角波的值越过T_{cm3}达到最大(三角形的高)需要的时间是\frac{T_{s}}{2}–T_{cm3},那么在后半个开关周期三角波的值经过同样的时间\frac{T_{s}}{2}–T_{cm3}也会变为T_{cm3}并且在这一时刻c相开关就从导通切换到了切断状态。在后半个开关周期跟着时间的增加,三角波的值是下降的。>

  在图32中时间一但到达相应逆变器相的开关函数的切断—导通切换点,Relay(继电器)模块就将开关状态变为on并保持,同样的到了导通—切断切换点该模块也可以将开关状态变为off并保持。因我们需要6个开关信号。开关函数Sa,Sb,Sc代表图1中

  三相的上开关的状态。对于每相下开关我们用NOT模块取反就可以了。图33计算出的PWM信号送给了图32的逆变器模型以驱动其六个开关。

  本篇文章中的算法模型来自于[2]的随书模型,理论讲解有些内容参考了[1]和[2],扇区判断原理部分参考了[7],一个合成电压向量公式推导参考了[4],电机转动原理参考了[5]。本文中涉及的一些图形是从[3],[4],[5],[6]中截取并修改的。