虽然simulink里自带了两电平SVPWM模块,但是为了熟悉一下SVPWM算法原理,还是决定自己搭建一个。
两电平的SVPWM算法按以下3个步骤来实现:
- 判断参考电压矢量Uref所在的扇区,以得到需要作用的两个相邻矢量
- 计算这两个相邻矢量的作用时间。
- 计算空间电压矢量的切换点,产生PWM脉冲。
一、判断扇区
比较常见的方法是通过分析Uα和Uβ的大小关系来判断扇区。方法如下:
- 如果Uβ>0,则使A = 1,否则A = 0;
- 如果3Uα−Uβ>0,则使B = 1,否则B = 0;
- 如果3Uα+Uβ>0,则使C = 0,否则C = 1;
- 扇区号N=A+2B+4C。
这个方法实现比较简单,但是不太容易理解,其扇区编号规则不是逆时针1~6的编号方法,而是以逆时针3、1、5、4、6、2的顺序编号,如下图中红色编号。

编号规则很重要,采用不同的编号规则,后面计算的各矢量作用时间也要作出相应的改变。
对于我这个有强迫症的人来说,一定要按照1~6的顺序编号才舒服。因此,我决定采用一个比较笨的办法,用参考矢量的角度θ的来判断其所在扇区。仿真模型如下图。

根据输入的Uα和Uβ值,获取参考适量的角度θ。
θ=arctan(Uβ/Uα)
计算得到的θ角范围是[−2π,2π],其中第一象限计算结果与第三象限相同,第二象限计算结果与第四象限相同。因此为了区分所在象限,所以要对θ进行修正。
当Uα>0时,θ角范围是[−2π,2π];
当Uα<0时,将计算得到的θ角加上π,将其范围修正为[2π,23π];
计算到这一步,θ在一、二、三象限都是正值,但是在第四象限是负值,因此当θ<0时,加上2π。此时,不论参考矢量落在哪个象限,都能得到θ角在[0,2π]范围内的值。
每一个扇区的角度是3π,因此将所得到的θ角除以3π,得到的结果向上取整,便可以得到矢量所在扇区。
该方法的扇区编号顺序如上图中所示I、II、III、IV、V、VI。
二、计算这两个相邻矢量的作用时间。
得到了矢量所在扇区,就可以利用该扇区两端的矢量对其进行合成。通过合理分配两个零矢量(000和111)可以使每一次矢量切换只有一相的功率器件动作,能够减少开关损耗。在这里采用七段式SVPWM调制。以第一扇区为例,在第一扇区的矢量要以U0、U1、U2、U7、U7、U2、U1、U0的原则进行合成,此时开关状态是 000 100 110 111 111 110 100 000。这8个开关状态,每一个的第一位是A相桥臂状态,第二位是B相桥臂状态,第三位是C相桥臂状态。可以看出,每一次状态切换,只改变了其中的一位,也就是只有一个桥臂的功率开关动作。
矢量在第二扇区时,此时合成的原则是U0、U3、U2、U7、U7、U2、U3、U0。注意,是先U3后U2。此时对应的开关状态是000、010、110、111、111、110、010、000,这样就是每次只有一个桥臂的功率开关进行切换。如果是先U2后U3,则开关状态是000 011 010 111 111 010 011 000 ,这种状态下,从000到011、010到111都改变了两个桥臂的状态,增加了开关损耗。
其他几个扇区也是按类似的方法分析。最后得到在各扇区的矢量作用顺序如下:
| 扇区 |
矢作用量顺序 |
| I |
U0、U1、U2、U7、U7、U2、U1、U0 |
| II |
U0、U3、U2、U7、U7、U2、U3、U0 |
| III |
U0、U3、U4、U7、U7、U4、U3、U0 |
| IV |
U0、U5、U4、U7、U7、U4、U5、U0 |
| V |
U0、U5、U6、U7、U7、U6、U5、U0 |
| VI |
U0、U1、U6、U7、U7、U6、U1、U0 |
接下来,就可以根据矢量作用顺序计算矢量作用时间。总的计算是依据是伏秒平衡。

以第一扇区为例:
UT1′+UT2′=UrefTs
式中T1′是矢量U1作用时间,式中T2′是矢量U2作用时间,式中Ts是矢量Uref作用时间。
变换到直角坐标系上来表示,也就是用模和相角来表示,得到:
T1′32Ud(cos0+jsin0)+T2′32Ud(cos3π+jsin3π)=Ts(Uα+jUβ)
在这里采取恒功率变换,相电压幅值取32Ud。保证式中实部和虚部相等,可以解得:
T1′=(26Uα−22Uβ)Ts/UdT2′=2UβTs/Ud
关于相电压幅值是32Udc还是32Udc,可以参考这个帖子:SVPWM调制中的6个非零基础电压矢量的幅值到底是Udc还是2/3Udc ?
同理可以计算其他扇区的矢量作用时间,得到表格如下。如果前面扇区编号规则不同,该表格也有些差别。
如果前面扇区编号规则不同,该表格也有些差别。
如果给定的电压矢量太长,超过调制范围的话,计算出来的T1和T2之和可能会大于脉冲周期Ts,因此需要做相应的处理。
T1=T1′Ts/(T1′+T2′)T2=T2′Ts/(T1′+T2′)
这样处理之后,并没有改变两个矢量作用时间之间的比例关系。模块搭建如下。

三、计算空间电压矢量的切换点
以参考电压矢量在第一扇区来说明。此时一个周期内的矢量作用顺序是U0、U1、U2、U7、U7、U2、U1、U0,开关状态分别是000、100、110、111、111、110、100、000。由此可以画出一个周期内的三相桥臂作用时间。

由图中可以看出,零矢量(000和111)作用时间被一分为四,两个有效矢量的作用时间为一分为二。A相桥臂状态,其状态切换是在零矢量作用时间结束之后。其切换时间点为:
tcm1=(Ts−T1−T2)/4
B相桥臂切换状态是在000和100矢量作用时间之后切换状态,其切换时间点为:
tcm2=tcm1+T1/2
C相桥臂切换状态是在000、100、110矢量作用时间之后切换状态,其切换时间点为:
tcm3=tcm2+T2/2
将这三个值用一个周期为Ts,幅值也为Ts/2的三角载波进行PWM调制,就可以得到各矢量的作用时间。其他几个扇区的计算方法与此类似,各个扇区的矢量作用切换点对应关系如下表:
| 扇区 |
I |
II |
III |
IV |
V |
VI |
| TA |
tcm1 |
tcm2 |
tcm3 |
tcm3 |
tcm2 |
tcm1 |
| TB |
tcm2 |
tcm1 |
tcm1 |
tcm2 |
tcm3 |
tcm3 |
| TC |
tcm3 |
tcm3 |
tcm2 |
tcm1 |
tcm1 |
tcm2 |
以此为依据搭建仿真模型如下。

由此整个SVPWM模块搭建完成,经测试模块工作正常。