【FOC】02_SVPWM
在永磁同步电机的工作原理中,我们知道,要使转子转动,必须在空间中能够产生一个旋转的磁场带着转子进行旋转,往静止的定子绕组中通入相位互差120度的交流电信号就能做到。然而这样的电信号在日常生活中的都是频率和幅值不可以发生改变的(市电220V50hz),这不利于使用。所以实际应用中,我们必须通过一系列电力电子手段向电机提供频率和幅值都可以改变的交流电信号。
1、电压矢量

上图是一个三相逆变器的简易原理图,每一个相所对应的两个桥臂的开关状态是互补的,例如S1开启,则S2就关断;S3开启,则S4就关断。上下桥臂不允许同时开启,若同时处于开通该半桥将短路。
那么我们可以定义一个开关函数,如下:

我们现在可以描述桥臂的开关状态。如 Sa=1 则表示A相上桥开通,下桥关闭;Sa = 0则表示A相上桥关闭,下桥开通。
例如上图中,S1、S4和S6开通,S2、S3和S5关断,那么对应的开关函数就是

由于每一相的开关函数都有两个状态,那么总共有2^3= 8种组合方式。
同样我们可以用向量来表示它,例如上面的开关函数也可以用一个向量(1,0,0)来进行表示。
当然也可以将其看作一个二进制数,例如上面的开关函数用二进制来表示就是 0’b 100 = 4。
这个开关状态下的等效电路如下所示:

由于电机的三相绕组是相等对称的,所以Ra、Rb和Rc的阻值相同,Vdc加在三个电阻上,那么电机三相的相电压幅值就可以用电源Vdc来表示:

另外七种状态下的三相电压如下表所示:

注意,这里只是讨论了三相电压的幅值,未考虑其在空间中的分布;在空间中,三相绕组是互差120度的情况下放置的。

我们认为A相的轴线为0度,那么在空间中,B相的轴线为120度,C相的轴线为240度。
那么我们可以得到电压矢量的计算公式(前面乘上的2/3系数代表等幅值,如果直接用三个电压矢量进行合成,得到的合成矢量的幅值会是原来幅值的1.5倍,为了让合成前后的幅值相等,固乘上系数2/3)

根据欧拉公式

我们可以算出来所有开关状态下的电压矢量幅值以及方向

由于e ^ (j1/3 * Π)代表逆时针旋转60°,我们可以画出电压矢量图

这样我们就得到了 6个方向互差60度、幅值为2/3 Udc的电压矢量,每两个矢量之间的区域,我们称之为扇区。
然而,如果仅仅依靠这六个电压矢量,我们只能产生六个方向的磁场,这样的控制是不够平滑的(也称六步换向的方法)。我们期望产生的是任意方向(0~360°)的磁场。
2、极坐标系下的SVPWM
为了让电机的旋转更加平滑,我们需要产生任意方向、任意幅值的电压矢量,进而产生任意方向的磁场。我们将期望产生的电压矢量称之为参考电压矢量Uref。
现假设我们期望产生的参考电压矢量Uref落在扇区1,为了合成这个矢量,很显然,仅仅依靠V4或者V6是办不到的。首先我们将电压矢量图中的扇区1绘制出来。

现在让V4作用一段时间 T4 再让 V6作用一段时间 T6,剩下的时间交给V0或者V7也就是T0或T7时间。根据伏秒平衡原理,有如下关系

那么T6和T4以及T0的时间如何计算呢?
根据正弦定理,通过上图中的几何关系,我们可以得到如下结论:

又知道,V4和V6的模长相同,且为电源电压的2/3

我们结合上述两个公式可以得到T4和T6关于Uref、Ts以及角度theta(与V4矢量的夹角)的方程。当然也可以算出T0的时间。

在上述方程中,电源电压Udc、参考电压Uref、周期长度Ts以及与角度theta我们都可以得到,所以可以求解得到T4和T6以及T0、T7。
也就是说,在扇区1中,一个周期Ts内,我们让电压矢量V4作用T4时间,让电压矢量V6作用T6时间,剩下的时间交给0矢量V0或者V7,就可以合成出我们的参考电压矢量Uref。
我们可以根据上述的方法推导出,各个扇区中,相邻两个电压矢量的作用时间

这里用Tm与Tn来表示先工作的电压矢量时间和后工作的电压矢量时间,这是为了减少Mos管的开关,我们并不绝对的让谁先工作,谁后工作。例如扇区1可能是V4先工作,那V4对应的时间计算Tm;同样的,由于PWM通道的模式的不同,那么MOS管开关的顺序不同,为了满足尽可能减少Mos管的开关次数这一原则,我们可能会让V6先工作,即V6工作Tm,V4工作Tn,这部分将在后面提到七段式SVPWM时进行解释说明。
最终在扇区1给到单片机PWM占空比将满足以下关系:

3、DQ坐标系下的SVPWM
根据前面的推导结果,在不同扇区中,我们可以得到两个关于角度theta与参考电压矢量幅值的方程以及PWM的占空比计算公式


这个方程意味着,我们现在只要给定单片机正确的PWM占空比,可以得到任意方向(与A轴夹角为theta)的电压矢量。
但是这样做,将会产生新的问题,我们的角度是自己输入的,这样的一个电压参考矢量对转子而言,并不一定可以发挥其全部力量,即这样的电压Uref对转子的水平方向和垂直方向都会有分量,我们知道,要让定子带动转子的力矩可以最大,最好的方法就是让电压(磁场)全部施加在转子的垂直方向,所以我们可以在DQ坐标系下对其进行分析。
让我们重新绘制一份六个电压矢量扇区的图,并为其加上D-Q旋转坐标、a-b静止坐标系。

我们将与A相轴线重合的轴命名a(阿尔法),与a轴垂直的轴命名为b(贝塔)。由阿尔法-贝塔组成的坐标系,称之为两相静止坐标系。
转子的轴线命名为D轴(或称直轴),与转子垂直的轴线命名为Q轴(或称交轴)。由D-Q轴组成的坐标系,称之为旋转坐标系。
其中,D轴(转子)与A相的夹角(或阿尔法轴的夹角),我们称之为电角度。电角度的值可以通过位置传感器或算法求得。
通过图中可以看到,D-Q旋转坐标系和a-b静止坐标系的相互转换只和电角度塞塔有关。我们可以使用简单的三角函数关系对其进行转换,即

上述式子表述了旋转坐标系到静止坐标系的转换形式,这个式子就是常说的 反帕克变换。反帕克变换是帕克变换的逆运算,即帕克变换就是静止坐标系到旋转坐标系的转换形式(帕克变换在ADC采样中会用到,这里暂不说明)。
前文我们说过,要使产生的磁场利用率最大化,就要让电压矢量尽可能的施加在Q轴,而让D轴尽量为0。
所以我们现在的策略应该是这样的
- 令Uq > 0,Ud = 0,带入电角度通过反帕克变换得到Ua 和 Ub。
- 根据 Ua 和 Ub,确认需要合成的电压矢量落在哪个扇区。
- 使用该扇区合成所需矢量,此时合成的电压矢量将全部施加在转子的Q轴上。
那么SVPWM的模块我们做如下定义

3.1、确认扇区
确认扇区的方法有很多,这里介绍一种。
首先,

接着
最后

这样我们可以得到六种不同的组合,刚好对应六个扇区
我们可以用公式来描述这六种情况,下面这个公式代表一个三位的二进制数,最高位代表C,最低位代表A

整理一下后,扇区判断的表格如下所示:

根据我们这种方式算出来的扇区逆时针为 3 、1 、5 、4、 6、 2。
这样我们就可以通过Ua和Ub的值,判断电压矢量落在哪个扇区中了。
3.2、占空比计算
前面介绍了静止坐标系下目标电压矢量的扇区确认方法,再确认了扇区以后,我们就可以用前文提到的基本电压矢量来进行目标矢量的合成,本质上就是计算相邻两个矢量的工作时间Tm和Tn,最后反应到三相的占空比上。
在进行静止坐标系下的占空比计算之前,我们先了解一个知识,前文提到过,一个周期的Ts由Tm、Tn以及T0组成。但是T0这段时间,是用0矢量V0还是0矢量V7呢?还是都用?
这取决于使用七段式SVPWM还是五段式SVPWM。对于七段式SVPWM,在一个周期内,T0的时间由基本矢量V7和基本矢量V0平分;对于五段式SVPWM,则在一个周期内只使用0基本矢量中的一种。
二者各有优势,对于五段式SVPWM,即一个周期内只进行5次MOS管的开关,开关次数少,但是谐波会很大;而对于七段式SVPWM,虽然一个周期进行了7此MOS管的开关,但是谐波小。而且五段式的矢量选择方式有很多,实现难度会更大,所以我们这里选择七段式的SVPWM。
回到基本电压矢量的计算上来,根据伏秒平衡的原则,我们可以得到如下结论:

例如在一象限中

从图中的三角关系可以得到

在V4、V6的模长2/3 Udc代入算出T4和T6的时间为

其它象限我们如法炮制,可以得到每个象限相邻电压矢量的工作时间

观察上表,可以发现很多共同点,很多电压矢量的工作时间与Ua Ub的关系实际上只是符号不同,我们令

则上述的表格可以简化为

我们已经算到每个扇区内各个电压矢量的持续时间,然而我们如何在一个周期内进行分配呢?我们前文有提到,为了使得逆变器的开关损耗最低,我们期望的是每个周期进行开关动作的次数最少,这也是我们进行分配的原则。现在假设我要在扇区一内进行分配,
我的分配可以是
也可以是
显然的是,前者的开关次数将更少,现在我们返回去看前面计算电压矢量时间的表格,我们都是根据这一原则进行的。
也就是保证电压矢量的逆变器开关从矢量0开始,再到开关次多的矢量,再到开关最多的矢量最后来到矢量7,以追求每次切换只改变一相,最后根据中心对称原则由矢量7回到矢量0,这样出来的PWM是对称的,能够有效的减少PWM的谐波分量。
袁雷老师的《现代永磁同步电机控制原理及MATLAB仿真(第二版)》的2.2.1节 基于软件模式的合成。这一章节很好的说明了当目标电压矢量落在不同扇区时,三相的开关切换顺序。


那结合上图,我们如何计算三相的PWM占空比呢?
我们令每一个扇区中,三相高电平最长的那一相为Ta,也就是整个周期中,它只在一开始T0时刻为低电平,Tm和Tn以及T7都是高电平。
Ta的时间就可以用 Ta = T0/4 = (Ts - Tm - Tn) /4来确定。
再找到整个周期中,高电平次长的那个周期,令其为Tb = Ta(T0/4) + Tm/2 ,也就是说 整个周期中,它其实只在Tn阶段出了力。
最后再找到整个周期中,高电平只有T7时刻的那一相,令其为Tc = Ta(T0/4) + Tm/2 + Tn/2。
综上所述,我们找到的Ta Tb Tc 代表了一个周期内,三相中每一相的低电平作用时间的一半,这个值写入到CCR中去,不正是PWM 模式2时(中心对称下,写入的CCR值代表0到CCR以及CCR到0这一部分为低电平),我们要写入的值吗。当然,如果是PWM 模式1,其实本质上就是将T0和T7进行交换,我们要写入的Ta = ARR - Ta;Tb = ARR -Tb;Tc = ARR -Tc。根据上图,我们不难确定每个周期中的Ta、Tb、Tc分别要写入U、V、W那一项。
4、线性调制区/过调制

由六个非0矢量组成的六边形中的内切圆,其半径为 Udc/sqrt(3),这个区域称之为线性调制区。顾名思义,在这个区域内,电压矢量旋转一圈是可以得到平滑的正弦波进而产生平滑的正弦电流。
内切圆的半径为Udc/sqrt(3),电机学中将其作为计算电压利用率的分母。
在线性区内,SVPWM的电压利用率就是 Udc/sqrt(3) / Udc/sqrt(3) = 1;而SPWM的电压利用率为Udc/2 / Udc/sqrt(3) = 0.866。这也就是SVPWM的电压利用率比SPWM的电压利用率高15%的原因。
当参考电压超过这个内切圆后,就进入了过调制区域。
由于参考电压来源于电流环的输出,这个值可能在调制区内也可能在非调制区内

如上图所示,这是SVPWM中的扇区1。
由OADG组成的圆弧即前面提到的内切圆为调制区,在这个区域内参考电压并不会超过 Udc/sqrt(3)
当参考电压的矢量轨迹落在OADG和OBEH之间时,此时参考电压的值在Udc/sqrt(3) 到 2Udc/3之间,这个区域称之为过调制一区。
当参考电压的矢量轨迹落在OBF和OHF或CBF和IHF时,即参考电压大于2Udc/3时,这个区域称之为过调制二区。
此时,当参考电压的矢量轨迹落在OADG和OBEH 或者 当参考电压的矢量轨迹落在OBF和OHF时,如果Tm+Tn大于了整个PWM开关周期,我们采取等比例缩放的方式重新计算Tm和Tn使其求和后不要超过整个开关周期,此时的电角度要维持不变。
当参考电压的矢量轨迹落在CBF时,直接使用OB对应的矢量进行处理;当参考电压的矢量轨迹落在IHF时,直接使用OH对应的矢量进行处理。即变为了六步换向的方波形式。
由此我们可以知道,当进入了过调制二区甚至参考电压轨迹落在CBF和IHF时,此时已经不是参考电压旋转一圈将不是标准的正弦波了,这也是为什么说过调制会引入谐波的原因。
5、代码
5.1 扇区判断
先看代码
U1 = p_foc_obj->Ubeta;
U2 = (0.866f * p_foc_obj->Ualpha) - (0.5f * p_foc_obj->Ubeta);
U3 = (-0.866f * p_foc_obj->Ualpha) - (0.5f * p_foc_obj->Ubeta);
if(U1 > 0){A = 1;} else{A = 0;}
if(U2 > 0){B = 1;} else{B = 0;}
if(U3 > 0){C = 1;} else{C = 0;}
N = 4 * C + 2 * B + A;
先看,U1用于判断Ubeta的正负,是什么意思呢?
当U1为正时,说明目标电压矢量的Ubeta为正,Beta对应的是Y轴,为正说明在Y轴的正半轴,也就是在X轴的上方;反之则在下方。
那么通过U1我们就可以确定,是1、2、3扇区还是4、5、6扇区。
当U2为正时,说明Ubeta < 根号3 alpha,也就说 这个矢量的斜率是小于根号3的,否则则是大于的。
当U3为正时,说明Ubeta < -根号3 alpha,也就说 这个矢量的斜率是小于-根号3 alpha的,否则则是大于的。
通过上面的三个约束条件,就可以确定唯目标矢量的落在哪个扇区内。
5.2 基础矢量时间
X = (1.732f * p_foc_obj->PwmCycle * p_foc_obj->Ubeta) / p_foc_obj->Ubus;
Y = (1.5f * p_foc_obj->Ualpha * p_foc_obj->PwmCycle + 0.866f * p_foc_obj->Ubeta * p_foc_obj->PwmCycle) / p_foc_obj->Ubus;
Z = (-1.5f * p_foc_obj->Ualpha * p_foc_obj->PwmCycle + 0.866f * p_foc_obj->Ubeta * p_foc_obj->PwmCycle) / p_foc_obj->Ubus;
switch(N) {
case 3: /*扇区1 0-60度*/
T1 = -Z;
T2 = X;
break;
case 1: /*扇区2 60-120度*/
T1 = Z;
T2 = Y;
break;
case 5: /*扇区3 120-180度*/
T1 = X;
T2 = -Y;
break;
case 4: /*扇区4 180-240度*/
T1 = -X;
T2 = Z;
break;
case 6: /*扇区5 240-300度*/
T1 = -Y;
T2 = -Z;
break;
case 2: /*扇区6 300-360度*/
T1 = Y;
T2 = -X;
break;
default:
T1 = 0;
T2 = 0;
break;
}
这里和前面我们推导的表格是一致的。
5.3 过调制处理
T1Temp = T1;
T2Temp = T2;
if (T1+T2 > p_foc_obj->PwmLimit) {
T1 = p_foc_obj->PwmLimit * T1Temp / (T1Temp + T2Temp);
T2 = p_foc_obj->PwmLimit * T2Temp / (T1Temp + T2Temp);
}
当目标矢量落在过调制区域时,对T1和T2进行等比例缩放
5.4 计算三相占空比
Ta = (p_foc_obj->PwmCycle - T1 - T2) * 0.25f;
Tb = Ta + T1 * 0.5f;
Tc = Ta + T1 * 0.5f + T2 *0.5f;
switch(N)
{
case 3:
p_foc_obj->Du = Ta; //在扇区1 U相的占空比最高 因为扇区1的矢量由(1,0,0) 和 (1,1,0)共同合成,U相一直保持的是高电平
p_foc_obj->Dv = Tb; //在扇区1 V相的占空比次高 V相只有T1时刻为高电平
p_foc_obj->Dw = Tc; //W相一直是下管开启,所以占空比最低
break;
case 1: //扇区2由 (0,1,0)和(1,1,0)合成
p_foc_obj->Du = Tb;
p_foc_obj->Dv = Ta;
p_foc_obj->Dw = Tc;
break;
case 5: //扇区3由 (0,1,0)和(0,1,1)合成
p_foc_obj->Du = Tc;
p_foc_obj->Dv = Ta;
p_foc_obj->Dw = Tb;
break;
case 4: //扇区4由 (0,0,1)和(0,1,1)合成
p_foc_obj->Du = Tc;
p_foc_obj->Dv = Tb;
p_foc_obj->Dw = Ta;
break;
case 6: //扇区5由 (0,0,1)和(1,0,1)合成
p_foc_obj->Du = Tb;
p_foc_obj->Dv = Tc;
p_foc_obj->Dw = Ta;
break;
case 2: //扇区6由 (1,0,0)和(1,0,1)合成
p_foc_obj->Du = Ta;
p_foc_obj->Dv = Tc;
p_foc_obj->Dw = Tb;
break;
default: //扇区6由 (1,0,0)和(1,0,1)合成
p_foc_obj->Du = Ta;
p_foc_obj->Dv = Tb;
p_foc_obj->Dw = Tc;
break;
}
注意,这里计算的是低电平的作用时间,如果使用的是PWM模式2,那么将这个Du、Dv、Dw直接写入到CCR寄存器即可;如果是PWM模式1,还需要使用周期时间Tperiod-Du(或Dv或Dw)才能写入到CCR中去。
6、总结
本章节介绍了传统的SVPWM调制方法,除此之外还有一些别的调制手段,在这里不作介绍。通过这部分代码,我们就可以通过给定Uq、Ud以及编码器角度让电机旋转起来了。
已有 4 条评论
OωO