st foc 扇區判斷解析

USTHzhanglu發表於2024-03-15

前言

本文為學習st的FOC庫筆記,記錄FOC庫判斷扇區的邏輯,並結合其他文章進行對比。

關鍵詞:SVPWM

扇區判斷

參考文章:《徹底吃透SVPWM如此簡單》

st foc 扇區判斷解析
圖1

參考圖1,為了便於判斷扇區,將αβ座標系用三條直線分割,分別是:

\[ β = 0\\ β = tan(\frac{\pi}{3})*α =\sqrt{3}α\\ β = -tan(\frac{\pi}{3})*α =-\sqrt{3}α \]

透過判斷向量在每條直線的上下即可判斷扇區。
因此記

\[ X = -β\\ Y = \frac{\sqrt{3}α - β}{2}\\ Z = \frac{-\sqrt{3}α - β}{2} \]

對XYZ的大小進行判斷,即可得知當前所在扇區
(注:這裡除2的原因目前不太清楚;st的αβ座標系以向下為正)。

扇區 X Y Z
1 \(>0\) \(>0\) \(<0\)
2 \(>0\) \(>0\) \(>0\)
3 \(>0\) \(<0\) \(>0\)
4 \(<0\) \(<0\) \(>0\)
5 \(<0\) \(<0\) \(<0\)
6 \(<0\) \(>0\) \(<0\)

對比ST程式碼:

    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){}
      else /* wZ >= 0 */
      if (wX <= 0){}
      else /* wX > 0 */
      {}
    }
    else /* wY > 0 */
    {
      if (wZ >= 0)
      {}
      else /* wZ < 0 */
      if ( wX <= 0 ){}
      else /* wX > 0 */
      {}
    }

首先,根據傳入的αβ值生成中間值wUAlpha,wUBeta。有

\[wUAlpha = 2\sqrt{3}V_αT_s\\ wUBeta = -2V_βT_s \]

計算得

\[ wX = -2V_βT_s\\ wY = (-V_β + \sqrt{3}V_α)T_s\\ wZ = (-V_β - \sqrt{3}V_α)T_s \]

根據\(wX,wY,wZ\)目前可以確定扇區,但是還無法確定各向量的作用時間。

時間計算

先分析st的計算流程:

    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) ;
      }
    }

wY<0時,wZ<0時,扇區為5。
然後看\(T_a,T_b,T_c\)的計算,和\(wY,wZ\)有關,且隨扇區變化。

看結果看不出來,需要正向推導下。

參考圖2:

st foc 扇區判斷解析
圖2

記總導通時間為\(T_s\)

\[\begin{gather} |U_4| = V_4T_s\\ |U_6| = V_6T_s\\ \end{gather} \]

\(U_{out}\)分解,記\(T_4\)為基本向量\(V_4\)的作用時間,\(T_6\)為基本向量\(V_6\)的作用時間,有

\[\begin{gather} |U_1| = V_4T_4\\ |U_2| = V_6T_6 \end{gather} \]

\(U_{out}\)在αβ軸的投影記為\(U_{\alpha},-U_{\beta}\),有

\[\begin{gather} U_{\alpha} = |U_1| + |U_2| cos(\frac{\pi}{3})\\ -U_{\beta} = |U_2|sin(\frac{\pi}{3}) \end{gather} \]

聯立\((1)\)~\((6)\)可得:

\[ U_{\alpha} = \frac{|U_4|}{T_s}\times T_4 + \frac{|U_6|}{T_s}\times T_6 cos(\frac{\pi}{3})\\ -U_{\beta} = \frac{|U_6|}{T_s}\times T_6sin(\frac{\pi}{3}) \]

解得

\[ T_4 = \frac{(\sqrt{3}U_{\alpha} +{U_{\beta}})T_s}{\sqrt{3}|U_4|}\\ T_6 = -\frac{2U_{\beta}T_s}{\sqrt{3}|U_6|}\\ \]

在一般情況下,\(|U_4| = |U_6| = \frac{2U_{dc}}{3}\),其中\(|U_{dc}|\)為最大輸出相電壓,但是\(|U_{out}|\)無法完全維持在\(U_{dc}\),如圖3所示:

st foc 扇區判斷解析
圖3

為了避免輸出電壓失真,將\(|U_{max}|\)限制在\(|\frac{\sqrt{3}U_x}{2}|\)

則有:

\[ T_4 = \frac{\sqrt{3}U_{\alpha}T_s +U_{\beta}T_s}{2|U_{max}|}\\ T_6 = -\frac{U_{\beta}T_s}{|U_{max}|}\\ \]

在ST的庫中,\(\frac{U_{\alpha}}{|Umax|} = V_{\alpha},\frac{U_{\beta}}{|Umax|} = V_{\beta}\),因此

\[ T_4 = \frac{(\sqrt{3}V_{\alpha}T_s + V_{\beta}T_s)}{2} = -\frac{wZ}{2}\\ T_6 = -V_{\beta}T_s = \frac{wX}{2}\\ \]

在第一扇區,向量分佈如圖4:

st foc 扇區判斷解析
圖3

由於採用中心對稱計數模式,計算單側時間即可。
可得

\[ T_a = \frac{T_0}{4} = \frac{T_s - T_4 - T_6}{4} = \frac{T_s}{4} + \frac{(wZ - wX)}{8}\\ T_b = T_a + \frac{T_4}{2} = T_a - \frac{wZ}{4}\\ T_c = T_b + \frac{T_6}{2} = T_b +\frac{wX}{4}\\ \]

程式碼解讀

這時候對比st的程式碼

    pHandle->Sector = SECTOR_1;
    wTimePhA = (((int32_t)pHandle->PWMperiod) / 4)+ ((wX - wZ) / (int32_t)262144);
    wTimePhB = wTimePhA + (wZ / 131072);
    wTimePhC = wTimePhB - (wX / 131072);

顯然

\[262144 = 32768 \times 8\\ 131072 = 32768 \times 4 \]

觀察\(wX\):

\[ wX = -2V_βT_s\\ \]

其中\(V_β\)int16_t,即q15格式。在前面有

\[ V_β = \frac{U_{\beta}}{|Umax|}\\ \]

顯然\(V_β\in [-1,1]\),為浮點型。因此這裡除以\(32768\)實際上是將q15轉換為float

因此st計算公式可表示為

\[ T_a = \frac{T_s}{4} + \frac{(wX - wZ)}{8}\\ T_b = T_a + \frac{wZ}{4}\\ T_c = T_b -\frac{wX}{4}\\ \]

可以看到,和我們推算出的公式符號不一致。

參考st的定時器配置,發現st採用的向下中心計數模式,前面參考的圖為向上計數,因此重新推算公式如下:

\[ T_a =\frac{T_s}{2} - \frac{T_0}{4} =\frac{T_s + T_6 + T_4}{4} = \frac{T_s}{4} + \frac{(wX - wZ)}{8}\\ T_b = T_a - \frac{T_4}{2} = T_a + \frac{wZ}{4}\\ T_c = T_b + \frac{T_6}{2} = T_b - \frac{wX}{4}\\ \]

和程式碼中吻合。

其他扇區按照相同方法推算,得出每個扇區對應的計算公式,實際使用時,根據扇區選擇對應的計算公式即可。

過調製

前面為了向量不失真,將\(|U_{max}|\)限制了在\(|\frac{\sqrt{3}}{2}U_x|\)\(|\frac{\sqrt{3}}{3}U_{dc}|\)

\([0,\frac{\sqrt{3}U_{dc}}{3}]\)稱之為線性區,線上性區內,\(U_{out}和U_{\alpha}U_{\beta}\)線性相關;

\((\frac{\sqrt{3}}{3}U_{dc},\frac{2}{3}U_{dc}]\)稱之為過調製區,在過調製區內,需要對\(U_{\alpha}U_{\beta}\)進行縮放,以保證合成向量\(U_{out}\)不超出最大幅值。過調製方法這裡不再探討,可以參考相關文章:

《STM32 MC SDK Overmodulation (new in V5.Y) - stm32mcu (stmicroelectronics.cn)》

《電控入門之五(電機FOC,SVPWM過調製演算法) - 知乎 (zhihu.com)》

《stm32 foc 庫輸出波形 - USTHzhanglu - 部落格園 (cnblogs.com)》

相關文章