study:svpwm-paper:241021-001:index
SVPWM原理分析-基於STM32 MC SDK 5.0 (2024-10-21)
Local Backup
1.任意向量如何透過基本空間向量合成?
圖1典型三相逆變器拓撲
定義[a,b,c]表示逆變橋上半開關管的狀態,當a,b,c為1是表示Q1,Q2,Q3導通,當a,b,c為0時表示Q1,Q2 ,Q3關閉,且同一橋臂的上管和下管狀態相反。根據a,b,C的狀態組合,開關管一共有8種狀態。如下圖所示:
序號 | 開關管狀態 | 相電壓 | 線電壓 |
| a | b | c | V AN | V BN | V CN | V AB | V BC | V CA |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 | -V dc /3 | -V dc /3 | 2V dc /3 | 0 | -Vdc | Vdc |
2 | 0 | 1 | 0 | -V dc /3 | 2V dc /3 | -V dc /3 | -Vdc | Vdc | 0 |
4 | 1 | 0 | 0 | 2V dc /3 | -V dc /3 | -V dc /3 | Vdc | 0 | -Vdc |
3 | 0 | 1 | 1 | -2V dc /3 | V dc /3 | V dc /3 | -Vdc | 0 | Vdc |
5 | 1 | 0 | 1 | V dc /3 | -2V dc /3 | V dc /3 | Vdc | -Vdc | 0 |
6 | 1 | 1 | 0 | V dc /3 | V dc /3 | -2V dc /3 | 0 | Vdc | -Vdc |
7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 |
以上分析主要給予KCL和KVL定律,有疑問的夥伴可以複習電路的相關知識。其中有兩個零向量和六個非零向量,整個空間也被分割成以下六個磁區。應用clark變換(三相-兩相變換或3/2變換,詳見《電力拖曳自動控制系統-運動控制系統 》第四版P164) ,將V AN, V BN, V CN旋轉的座標系轉換到靜止的( α , β )座標系。
-
可以得到V α和V β的計算公式:
-
有Va+Vb+Vc=0 , Vc=-Va-Vb 。
-
-
-
得到計算公式如下:
-
-
a | b | c | V AN | V BN | V s α | V s β | V ector | 向量 | 角度 | 二進位 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0[000] | |
1 | 0 | 0 | 2 V dc /3 | - V dc /3 | 2 V dc /3 | 0 | 2 V dc /3 | V1 | 60 | 4[100] |
1 | 1 | 0 | V dc /3 | V dc /3 | V dc /3 | 2 V dc /3 | V2 | 120 | 6[110] | |
0 | 1 | 0 | -V dc /3 | 2 V dc /3 | -V dc /3 | 2 V dc /3 | V3 | 180 | 2[010] | |
0 | 1 | 1 | - 2V dc /3 | V dc /3 | -2 V dc /3 | 0 | 2 V dc /3 | V4 | 240 | 3[011] |
0 | 0 | 1 | - V dc /3 | -V dc /3 | - V dc /3 | 2 V dc /3 | V5 | 300 | 1[001] | |
1 | 0 | 1 | V dc /3 | -2 V dc /3 | V dc /3 | 2 V dc /3 | V6 | 360 | 5[101] | |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 7[111] | |
同理我們可以計算(α,β)在第四象限對應的轉換關係:
-
注意以上公式的變化點:
-
有Va+Vb+Vc=0 , Vc=-Va-Vb 。
-
係數K的作用是可以將裝換變成等振幅或等功率轉換
這裡我們才管用等幅值變換K=2 / 3,可以得到:
-
因此可以得到,如下公式:
-
-
a | b | c | V AN | V BN | V s α | V s β | V ector | 向量 | 角度 | 二進位 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0[000] | |
1 | 0 | 0 | 2 V dc /3 | - V dc /3 | 2 V dc /3 | 0 | 2 V dc /3 | V1 | 60 | 4[100] |
1 | 1 | 0 | V dc /3 | V dc /3 | V dc /3 | 2 V dc /3 | V2 | 120 | 6[110] | |
0 | 1 | 0 | -V dc /3 | 2 V dc /3 | -V dc /3 | 2 V dc /3 | V3 | 180 | 2[010] | |
0 | 1 | 1 | - 2V dc /3 | V dc /3 | -2 V dc /3 | 0 | 2 V dc /3 | V4 | 240 | 3[011] |
0 | 0 | 1 | - V dc /3 | -V dc /3 | - V dc /3 | 2 V dc /3 | V5 | 300 | 1[001] | |
1 | 0 | 1 | V dc /3 | -2 V dc /3 | V dc /3 | 2 V dc /3 | V6 | 360 | 5[101] | |
1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 7[111] | |
綜上所示,以上兩種情況所得到的基本向量分佈如下:
-
以上可以看到,基本向量的相對位置是沒有改變的。
如下圖所示:(根據ST -官方教學如下圖所示)
圖2基本空間向量圖
大家要特別注意V α和V β的方向,本文以ST的FOC庫為準。
-
圖中2有幾個問題比較有趣:
1 ) .為什麼向量的排列順序是依照4-6-2-3-1-5 或是4 -5-1-3-2-6順序排列那?這裡面值得順序是二進位開關組合代表的組合。
答:這六個向量控制的是功率半導體-Mosfet或IGBT;這些管子在開關和導通過程中會有熱量產生,也就是損耗。為了最大限度的降低損耗,每個扇區(包含扇區內部)的開關切換,都需要確保只改動一個橋臂的動作,這樣發熱量最小,功率密度才能做更高
2).向量的排列順序是4-6-2-3-1-5 或是4 -5-1-3-2-6順序代表什麼意思?
答:這是馬達正反轉的區別,假定4-6-2-3-1-5 逆時針為馬達正傳,則4 -5-1-3-2-6表示反轉。
備註:不同文件中向量的名稱可能會有改變,這裡影響不大,只要調整a,b,c的排列順序,大家就可以發現其實都一樣的,大家看文檔的時候不用過於糾結。
SVPWM的目的是為了透過基本的空間的向量組合得到一個旋轉的向量V OUT ,V OUT可以用(α,β)軸分量V α和V β表示(第四象限) 。
2 .扇區的判斷
區 | 判斷條件 | X ( wX ) | Y(wY) | Z(wZ) | SECTOR |
I | | >0 | >0 | <0 | SECTOR_1 |
II | | >0 | > 0 | > 0 | SECTOR_2 |
III | | >0 | <0 | >0 | SECTOR_3 |
IV | | <0 | <0 | >0 | SECTOR_4 |
V | | <0 | < 0 | < 0 | SECTOR_5 |
VI | | <0 | >0 | < 0 | SECTOR_6 |
3 .基本空間向量作用時間計算
知道扇區的位置,接下來計算向量的作用時間。先討論一下磁區的發波問題,本文選取7段式SVPWM
-
採用7段式SVPWM的優點是減少損耗,同時可以較少高次諧波含量,本文不再這裡展開,大家了解一種即可
第一區計算:
圖4第一扇區基本向量作用是時間計算
-
其中T為PWM波形週期, T4是基本向量V4持續的時間, T6是基本向量V6持續的時間。 T-T6-T4為V 0和V7向量持續的時間。
將V out投影到兩個相鄰的兩個向量V4,V6上,在座標系α '和β '座標系下計算,可以得到以下關係:
-
-
為了後續計算,基本向量歸一化處理,步驟如下:
所有的基本空間向量的振幅都是2Vdc/3 ,當兩個零電壓向量作用時間為0時,一個PWM週期內非零電壓向量的作用時間最長,此時的合成空間向量振幅最大,由下圖可以,其振幅最大不會超過圖中所示的正六邊形邊界,而當合成向量落在該邊界之外是,將發生過調試,逆變器輸出電壓波形將失真。
-
以上計算得到最大不失真向量電壓為幅值為
-
-
圖5 基本空間向量歸一化
因此計算:
-
-
-
得到 :
-
-
計算結果總結如下:
區 | N | T1 | T2 | T0+T7 |
I | 3 | -Z | X | T+ZX |
II | 1 | Z | Y | TYZ |
III | 5 | X | -Y | T-X+Y |
IV | 4 | -X | Z | T+XZ |
V | 6 | -Y | -Z | T+Y+Z |
VI | 2 | Y | -X | T+XY |
* 表4基本向量作用時間計算
4 .佔空比計算(高電位持續的時間or定時器暫存器的值)
根據3分析,我們可以計算出合成向量在不同的扇區,相鄰向量作用的時間及V0和V7作用的時間。
向上代碼,後分析:
FOC 5.0代碼分析如下:
uint16_t PWMperiod; /**< PWM period expressed in timer clock cycles unit:
* @f$hPWMPeriod = TimerFreq_{CLK} / F_{PWM}@f$ */
#define PWM_PERIOD_CYCLES (uint16_t)(ADV_TIM_CLK_MHz*\
(unsigned long long)1000000u/((uint16_t)(PWM_FREQUENCY)))
#define ADV_TIM_CLK_MHz 72
#define PWM_FREQUENCY 16000
PWM_Handle_M1.PWMperiod = PWM_PERIOD_CYCLES,
__weak uint16_t PWMC_SetPhaseVoltage ( PWMC_Handle_t * pHandle, alphabeta_t Valfa_beta )
{
int32_t wX, wY, wZ, wUAlpha, wUBeta, wTimePhA, wTimePhB, wTimePhC;
wUAlpha = Valfa_beta.alpha * ( int32_t )pHandle->hT_Sqrt3;
wUBeta = -( Valfa_beta.beta * ( int32_t )( pHandle->PWMperiod ) ) * 2 ;
wX = wUBeta;
wY = ( wUBeta + wUAlpha ) / 2 ;
wZ = ( wUBeta - wUAlpha ) / 2 ;
/* Sector calculation from wX, wY, wZ */
if ( wY < 0 )
{
if ( wZ < 0 )
{
pHandle->Sector = SECTOR_5;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wY - wZ ) / ( int32_t ) 262144 );
wTimePhB = wTimePhA + wZ / 131072 ;
wTimePhC = wTimePhA - wY / 131072 ;
pHandle->lowDuty = wTimePhC;
pHandle->midDuty = wTimePhA;
pHandle->highDuty = wTimePhB;
}
else /* wZ >= 0 */
if ( wX <= 0 )
{
pHandle->Sector = SECTOR_4;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wX - wZ ) / ( int32_t ) 262144 );
wTimePhB = wTimePhA + wZ / 131072 ;
wTimePhC = wTimePhB - wX / 131072 ;
pHandle->lowDuty = wTimePhC;
pHandle->midDuty = wTimePhB;
pHandle->highDuty = wTimePhA;
}
else /* wX > 0 */
{
pHandle->Sector = SECTOR_3;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wY - wX ) / ( int32_t ) 262144 );
wTimePhC = wTimePhA - wY / 131072 ;
wTimePhB = wTimePhC + wX / 131072 ;
pHandle->lowDuty = wTimePhB;
pHandle->midDuty = wTimePhC;
pHandle->highDuty = wTimePhA;
}
}
else /* wY > 0 */
{
if ( wZ >= 0 )
{
pHandle->Sector = SECTOR_2;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wY - wZ ) / ( int32_t ) 262144 );
wTimePhB = wTimePhA + wZ / 131072 ;
wTimePhC = wTimePhA - wY / 131072 ;
pHandle->lowDuty = wTimePhB;
pHandle->midDuty = wTimePhA;
pHandle->highDuty = wTimePhC;
}
else /* wZ < 0 */
if ( wX <= 0 )
{
pHandle->Sector = SECTOR_6;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wY - wX ) / ( int32_t ) 262144 );
wTimePhC = wTimePhA - wY / 131072 ;
wTimePhB = wTimePhC + wX / 131072 ;
pHandle->lowDuty = wTimePhA;
pHandle->midDuty = wTimePhC;
pHandle->highDuty = wTimePhB;
}
else /* wX > 0 */
{
pHandle->Sector = SECTOR_1;
wTimePhA = ( int32_t )( pHandle->PWMperiod ) / 4 + ( ( wX - wZ ) / ( int32_t ) 262144 );
wTimePhB = wTimePhA + wZ / 131072 ;
wTimePhC = wTimePhB - wX / 131072 ;
pHandle->lowDuty = wTimePhA;
pHandle->midDuty = wTimePhB;
pHandle->highDuty = wTimePhC;
}
}
pHandle->CntPhA = ( uint16_t )wTimePhA;
pHandle->CntPhB = ( uint16_t )wTimePhB;
pHandle->CntPhC = ( uint16_t )wTimePhC;
return ( pHandle-> pFctSetADCSampPointSectX ( pHandle ) );
}
先看第一扇區七段式SVPWM的順序是: 0-4-6-7-6-4-0.重點V0和V7的作用時間相等。很重要。
-
扇區切換時間如下: X=1,Y=2
同理可以推算出其他各扇區的切換時間,總結各扇區的切換時間,對應如下:
5.總結
6.補充內容, PPT截圖如下:
Permalink study/svpwm-paper/241021-001/index.txt · Last modified: 2024/10/21 16:37 by
jethro