User Tools

Site Tools

study:svpwm-paper:241021-001:index

SVPWM原理分析-基於STM32 MC SDK 5.0 (2024-10-21)

Local Backup

  • FOC控制的整個過程如下:
  • 論壇和貼文有很多講理論的,很少實際操作,本文理論聯繫實際,為大家一步一步揭開SVPWM神秘的面紗。
  • 本文基於ST-FOC 5.4 SVPWM函數分析,力求讓讀者可以透過這篇文章了解SVPWM的本質:
  • SVPWM的目的如下:
    • SVPWM核心思想透過輸入的Vα和Vβ計算出三相PWM佔空比。
  • 本文的目錄如下:
    • 1.任意向量如何透過基本空間向量合成?任意向量都可以透過相鄰的基本空間向量+V0+V7合成。
    • 2.向量扇區的判斷?透過(α,β)座標系下V α和V β值的大小,判斷需要合成的向量位於哪個扇區。
    • 3 .基本空間向量作用時間計算?透過計算(α,β)座標系下V α和V β值的大小,計算出相鄰基本空間向量作用的時間
    • 4 .佔空比計算如何計算? (高電位持續的時間or定時器暫存器的值) ,根據七段式SVPWM發波原理計算出:hTimePhA ,hTimePhB,hTimePhC的值。
    • 5.總結SVPWM原理總結。
    • 6.附錄。
  • 看一下SVPWM函數原型,輸入變數:
    uint16_t PWMC_SetPhaseVoltage ( PWMC_Handle_t * pHandle, alphabeta_t Valfa_beta )
    typedef struct
    {
      int16_t alpha;
      int16_t beta; 
    } alphabeta_t;

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
  • 表1開關狀態與相電壓,線電壓的關係
  • 以上分析主要給予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]
  • 表2 clark變換後基本空間向量的計算【第一象限】
  • 同理我們可以計算(α,β)在第四象限對應的轉換關係:
  • 注意以上公式的變化點:
  • 有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]
  • 表2 clark變換後基本空間向量的計算【第四象限】
  • 綜上所示,以上兩種情況所得到的基本向量分佈如下:
  • 以上可以看到,基本向量的相對位置是沒有改變的。
  • 如下圖所示:(根據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 .扇區的判斷

  • 程式碼如下:
    //下面是找出定子電流的磁區號
    if (wY< 0 )
    {
      if (wZ< 0 )
      {
        bSector = SECTOR_5;
      }
      else // wZ >= 0
      if (wX<= 0 )
      {
        bSector = SECTOR_4;
      }
      else // wX > 0
      {
        bSector = SECTOR_3;
      }
    }
    else // wY > 0
    {
      if (wZ>= 0 )
      {
        bSector = SECTOR_2;
      }
      else // wZ < 0
      if (wX<= 0 )
      {
        bSector = SECTOR_6;
      }
      else // wX > 0
      {
        bSector = SECTOR_1;
      }
    } 
  • V OUT這個向量按照我們的設定在圓內依次運行,在每個扇區內V OUT都是有兩個相鄰的向量根據不同的時間合成的向量,因此第一步我們需要知道V OUT在哪個扇區。
判斷條件 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扇區的判斷
  • 設定: X>0則wX=1,否則wX=0.
  • 設定:Y >0則wY=1,否則wY=0.
  • 設定:Z >0則wZ=1,否則wZ=0.
  • 程式中的定義:
    wUAlpha = Stat_Volt_Input.qV_Component1 * T_SQRT3;
    wUBeta = -(Stat_Volt_Input.qV_Component2 * T);
     
    wX = wUBeta;
    wY = (wUBeta + wUAlpha)/ 2 ;
    wZ = (wUBeta - wUAlpha)/ 2 ;

  • 圖3基本空間向量的作用時間計算
  • 以上是理解下面運算的基礎。特別要注意的是,(α,β)軸分量V α和V β表示(第四象限) ,在第一象限以V α '和V β '表示。

3 .基本空間向量作用時間計算

  • 知道扇區的位置,接下來計算向量的作用時間。先討論一下磁區的發波問題,本文選取7段式SVPWM
  • 關於更多SVPWM的發放方式,詳見:https://blog.csdn.net/michaelf/article/details/94013805
  • 採用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
    • c橋臂: Tc=Tb-T2=Tb-X
  • 同理可以推算出其他各扇區的切換時間,總結各扇區的切換時間,對應如下:
I II III IV V VI 備註
N 3 1 5 4 6 2 程式對應的名稱
Ta hTimePhA
Tb hTimePhB
Tc Tb-X Tb-Y Tb-Y Tb-X Tb-Y Tb-Y hTimePhC

* 表6個橋臂作用時間計算

  • 以上內容是結構ST的SVPWM教材分析, ST官方教學使用3頁PPT標識,詳細推到過程如以上所示。
  • 結合程式碼,我們會發現幾個問題點,
    • 1) 為什麼要除以4? pHandle→PWMperiod / 4
      • 前面wUBeta 和wUAlpha 計算式PWMperiod *2,因此在這裡需要除去2.實際結果是T/2.
      • 參考PWM定時器配置:
      • htim1.Instance = TIM1; //設定頻率為16k
        htim1.Init.Prescaler = ((TIM_CLOCK_DIVIDER) - 1 ); //分頻係數為0
        htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1; //TIM中央對齊模式1計數模式
        htim1.Init.Period = ((PWM_PERIOD_CYCLES) / 2 ); /*Period max 4500設定了在下一個更新事件裝入活動的自動重裝載暫存器週期的值。value :0x0000~0xFFFF*/
        htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2; /*設定定時器時脈CK_INT頻率與死區產生器以及數位濾波器取樣時脈頻率分頻化。Value :*/
        htim1.Init.RepetitionCounter = REP_RATE; /*是否使用重複定時器,當該值不為0的時候,計數器計數值達到週期數時,該值減1 ,計數器重新計數,當該值減到0的時候才會產生事件。*/
        htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
      • 正好配置TIM1為中央對齊模式1(TIM_COUNTERMODE_CENTERALIGNED1 ),在上面程式碼的配置中,載波週期為1 6 KHz,Period(ARR)= 4500 ,CH1的CntPhA (CCR)=800。採用的PWM1模式,
      • 即CNT小於CCR時,輸出有效電平,大於CCR小於ARR時,輸出無效電平,又配置CHx的有效電平為高電平,CHxN的有效電平為高電平,則可以得到下面的PWM波形:
      • 如果CHxN的有效電平是低電平,則輸出的CHx和CHxN的波形是相同的。 (可能CHx和CHxN有效電平的叫法相反)
      • 從以上可T=(PWM_PERIOD_CYCLES) / 2.,PWM_PERIOD_CYCLES=2T .
    • 2)為什麼要除以131072? ((((T + wX) - wZ)/2)/131072)
      • Q15,電流採用了Q15表示(左對齊),2^15 = 32768
    • 3)為什麼要除以262144 ? ( ( wX - wZ ) / ( int32_t )262144 );
      • 同問題2 ,262144 =32768×4=Q15*4.

5.總結

6.補充內容, PPT截圖如下:

TAGS

Permalink study/svpwm-paper/241021-001/index.txt · Last modified: 2024/10/21 16:37 by jethro

oeffentlich