2.3 計算相鄰兩個基本矢量電壓的作用時間:
扇區判斷結束后,就是計算相鄰兩個基本矢量電壓的作用時間
在扇區1時,由U6和U4合成,設在一個時間周期Ts內,U4作用的時間為T4,U6作用的時間為T6。由 基本矢量電壓在αβ軸上的投影 和 目標矢量電壓在αβ軸上的投影 分別相等建立等式:
到這里,計算出來的公式看著有點復雜,所以我們通過下面的方式稍稍簡化一下,記:
則在各個扇區內的作用時間就分別為:
到這里,合成目標矢量電壓Uref需要的兩個相鄰矢量電壓Ux,Uy以及分別作用的時間Tx,Ty就計算好了,但這里計算出來的時間不一定剛好滿足Tx+Ty=Ts,當Tx+Ty>Ts時需要進行等比例縮小處理,處理方式如下:
當Tx+Ty
2.4 三路PWM占空比計算
目標矢量電壓的所在扇區知道了,相鄰兩個基本矢量電壓及其作用時間也知道了,接下來就是7段式SVPWM的生成了。所謂的7段式SVPWM,即在一個周期Ts內,基本電壓矢量的作用順序為
,
作用的時間分別為:
。
以在第1扇區為例:基本電壓矢量作用的順序為
,
對應的三相電壓波形為:
這里,可能會問,Tx,Ty和U4,U6是怎么對應的呢?為什么要先U4再U6呢?把各個扇區的作用順序豎著列出來就能看出來了:
扇區 | U0 | Ux | Uy | U7 | Uy | Ux | U0 |
---|---|---|---|---|---|---|---|
1 | 0 | 4 | 6 | 7 | 6 | 4 | 0 |
2 | 0 | 2 | 6 | 7 | 6 | 2 | 0 |
3 | 0 | 2 | 3 | 7 | 3 | 2 | 0 |
4 | 0 | 1 | 3 | 7 | 3 | 1 | 0 |
5 | 0 | 1 | 5 | 7 | 5 | 1 | 0 |
6 | 0 | 4 | 5 | 7 | 5 | 4 | 0 |
1 | 0 | 4 | 6 | 7 | 6 | 4 | 0 |
可以看出,從一個扇區進入相鄰的另一個扇區時,只有一個基本矢量電壓發生改變。即通過這樣的作用順序,可以減小開關管的切換次數,從而減少開關損耗,尤其是在負載電流較大時更應該減小開關切換次數。
然后就是根據基本矢量電壓的作用時間去計算逆變H橋的占空比了,
仍然先以第1扇區為例:基本矢量電壓作用的順序為
即在一個周期Ts時間內,前面定義的開關函數
S(C)=1的時間為,
S(B)=1的時間為,
S(A)=1的時間為。
對應的ABC三路PWM的占空比就分別為。注意的是,看上面的三相電壓波形可知,輸出的PWM波時高電平中間對齊,所以在對你所使用的微控制器MCU的PWM定時器進行配置的時候要注意設置好計數方向(一般先向上計數在向下計數)和輸出極性(超過閾值為高電平)。
對于其他幾個扇區類似,這里不再重復詳細敘述,列個表出來
這里說明一下,前面進行Clarke變換和park變換的所有電壓電流參數都是標幺值,這里的Uα和Uβ采用的也是標幺值。
我們合成的輸出目標矢量電壓也用標幺值表示(令Uref_max=1),并令Ts=1時,這里的系數K就等于常數1,這樣的話,我們計算的時間Ta,Tb,Tc就等于占空比。下面簡單證明一下why。
仍以第1扇區為例:
已知最終的目標矢量電壓最大不失真的幅值為,
則,我們已經計算的有,
即(這里的Ux,Uy已經是標幺值)
令Uref_max=1把目標矢量電壓標幺值化,再令Ts=1,就可以把非零電壓作用的時間轉化為標幺值。
所以,我們在程序計算處理的時候,直接令K=1,然后按照上面列表計算出來的Ta,Tb,Tc就可以直接作為占空比了,占空比再乘以PWM定時器的計數周期值,就可以得到比較寄存器的值了,這樣計算量就減小很多了,然后就完成了整個SVPWM的操作。
剩下的就是PWM定時器相關的操作了,這里不詳說,后面有時間我再針對DSP和STM32這兩款處理器做簡要介紹。
04.算法流程
接著上一篇的坐標變換(上一篇鏈接:https://mp.weixin.qq.com/s/4PbY2FbnXcN2ai4aolGVcg)
上篇已經介紹,由park逆變換計算得到Uα,Uβ
step1:扇區判斷
計算,根據U1,U2,U3的符號計算N=4C+2B+A,再結合扇區表判斷所處的扇區。
C語言代碼示例:
v.U1 = v.Ubeta; \\
v.U2 = ( v.Ualpha*0.8660254) - (v.Ubeta*0.5); \\
v.U3 = (-v.Ualpha*0.8660254) - (v.Ubeta*0.5); \\
v.Sector = 0; \\
if(v.U1 > 0) v.Sector += 1; \\
if(v.U2 > 0) v.Sector += 2; \\
if(v.U3 > 0) v.Sector += 4; \\
step2:計算基本矢量電壓作用時間(占空比)
計算,并根據扇區確定相鄰兩個基本矢量電壓及其作用時間,然后對作用時間進行等比例縮小處理或引入零矢量電壓處理,使得總的作用時間等于Ts,或總的占空比等于1。
C語言代碼示例:
v.Tx = v.Ubeta; \\
v.Ty = ( v.Ualpha*0.8660254) + (v.Ubeta*0.5); \\
v.Tz = (-v.Ualpha*0.8660254) + (v.Ubeta*0.5); \\
switch(v.Sector) \\
{ \\
case 1:{ \\
v.t1=v.Tz; v.t2=v.Ty; \\
if((v.t1+v.t2)>1){ \\
v.t1 = v.t1/(v.t1+v.t2); \\
v.t2 = v.t2/(v.t1+v.t2); \\
} \\
v.Tb = 0.5*(1-v.t1-v.t2); \\
v.Ta = v.Tb + v.t1; \\
v.Tc = v.Ta + v.t2;}break; \\
case 2:{ \\
v.t1=v.Ty; v.t2=-v.Tx; \\
if((v.t1+v.t2)>1){ \\
v.t1 = v.t1/(v.t1+v.t2); \\
v.t2 = v.t2/(v.t1+v.t2); \\
} \\
v.Ta = 0.5*(1-v.t1-v.t2); \\
v.Tc = v.Ta + v.t1; \\
v.Tb = v.Tc + v.t2;}break; \\
case 3:{ \\
v.t1=-v.Tz; v.t2=v.Tx; \\
if((v.t1+v.t2)>1){ \\
v.t1 = v.t1/(v.t1+v.t2); \\
v.t2 = v.t2/(v.t1+v.t2); \\
} \\
v.Ta = 0.5*(1-v.t1-v.t2); \\
v.Tb = v.Ta + v.t1; \\
v.Tc = v.Tb + v.t2;}break; \\
case 4:{ \\
v.t1=-v.Tx; v.t2=v.Tz; \\
if((v.t1+v.t2)>1){ \\
v.t1 = v.t1/(v.t1+v.t2); \\
v.t2 = v.t2/(v.t1+v.t2); \\
} \\
v.Tc = 0.5*(1-v.t1-v.t2); \\
v.Tb = v.Tc + v.t1; \\
v.Ta = v.Tb + v.t2;}break; \\
case 5:{ \\
v.t1=v.Tx; v.t2=-v.Ty; \\
if((v.t1+v.t2)>1){ \\
v.t1 = v.t1/(v.t1+v.t2); \\
v.t2 = v.t2/(v.t1+v.t2); \\
} \\
v.Tb = 0.5*(1-v.t1-v.t2); \\
v.Tc = v.Tb + v.t1; \\
v.Ta = v.Tc + v.t2;}break; \\
case 6:{ \\
v.t1=-v.Ty; v.t2=-v.Tz; \\
if((v.t1+v.t2)>1){ \\
v.t1 = v.t1/(v.t1+v.t2); \\
v.t2 = v.t2/(v.t1+v.t2); \\
} \\
v.Tc = 0.5*(1-v.t1-v.t2); \\
v.Ta = v.Tc + v.t1; \\
v.Tb = v.Ta + v.t2;}break; \\
step3:計算PWM定時器比較寄存器值
這個很簡單,就是用占空比乘以定時器的計數周期
C語言代碼如下:
EPwm1Regs.CMPA.half.CMPA = (int16)(MPeriod * Svpwm1.Ta);
EPwm2Regs.CMPA.half.CMPA = (int16)(MPeriod * Svpwm1.Tb);
EPwm3Regs.CMPA.half.CMPA = (int16)(MPeriod * Svpwm1.Tc);
-
電壓
+關注
關注
45文章
5641瀏覽量
116319 -
SVPWM
+關注
關注
14文章
614瀏覽量
90759 -
FOC
+關注
關注
20文章
325瀏覽量
43027
發布評論請先 登錄
相關推薦
評論