【自製FOC驅動器】深入淺出講解FOC演算法與SVPWM技術]] (2024-10-08)

Local Backup

0. 前言

0.1 什麼是FOC?

0.2 FOC 驅動器和無刷電調的區別

1. 從電機原理說起

1.1 一些基礎知識

1.2 無刷馬達原理

1.3 關於BLDC 和PMSM 的差別

1.4 驅動電路實現

1.5 旋轉的三相馬達波形

2.FOC 控制原理

2.1 FOC 演算法的Pipeline

2.2 Clark 變換與Park 變換

Clark 變換

Park 變換

這一步驟我們接著Clark变换將座標系旋轉度,其中是轉子目前的角度,如下圖:

變換公式如下:

也很簡單,就是作用了一個旋轉矩陣,寫成矩陣形式:

也就是說,這個 座標系 是總是跟著轉子旋轉的!

這個操作是可行的,因為我們會透過編碼器輸入轉子的即時旋轉角度,所以這個角度總是已知數。經過這一步的變換,我們會發現,一個勻速旋轉向量在這個座標系下變成了一個定值! (顯然的嘛,因為參考系相對於該向量靜止了),這個座標系下兩個控制變數都被線性化了!

Park 變換前後的波形

接下來如果我們以這兩個值作為回授控制的對象,那麼顯然就可以使用一些線性控制器來進行控制了,例如PID(是的,儘管學術界有很多酷炫的高階控制方法, 但是工業界還是偏愛PID)。

至此我們已經理解完上面FOC 控制流程9 個步驟的前3 步驟了。

2.3 PID 控制

PID(比例、積分、微分)控制是啥這篇文章就不多講解了,基礎中的基礎,也有大把文章做介紹的,不熟悉的可以自行搜尋相關資料。

在FOC 控制中主要用到三個PID 環,從內環到外環依序為:電流環、速度環、位置環。

也就是說:我們透過電流回饋來控制馬達電流(扭力) → 然後透過控制扭力來控制馬達的轉速→ 再透過控制馬達的轉速控制馬達位置。

其中最內環的電流換控制框圖如下:

PID 電流環

可以看出來,這也就是前面提到的FOC 控制9 個步驟所描述的過程。實際上只用到了PI 控制,沒有引入微分,因為電流的取樣率非常高不需要加入微分項。

上圖中的Speed & Position模組可以是編碼器,或是霍爾感測器等能感應轉子位置的感測器。

特別說明一下其中的,前兩者大家知道是通過Clark变换和Park变换得到的,而後兩者是我們預期希望前兩者達到的值,這個值具體代表了什麼物理量呢?參考一下下圖:

也就是說我們一通操作將轉子磁鏈進行了解耦,分解為了轉子旋轉的徑向和切向這兩個方向的變數:

FOC 的控制目標

透過PID 控制器使用上述輸入(電流取樣值、編碼器位置)和輸出(MOS 管開關狀態)完成對馬達電流的閉迴路控制。

然後進入到下一層的速度環:

速度- 電流雙環控制

在上圖中,是速度設定值,是馬達的轉速回饋,可以透過馬達編碼器或霍爾感測器等計算得到,依然是使用PI 控制。

將計算得到的馬達速度與速度設定值進行誤差值計算,代入速度PI 環,計算的結果作為電流環的輸入,就實現了速度- 電流的雙閉環控制。

最外一層是位置環,也就是可以控制馬達旋轉到某個精確的角度並保持,控制框圖如下:

位置- 速度- 電流三環控制

同理應該很簡單可以理解,上圖位置控制PID 只用了P 項(也可以使用PI)。

在實際使用中,由於編碼器無法直接返回馬達轉速,因此可以透過計算一定時間內的編碼值變化量來表示馬達的轉速(也即以平均速度代表瞬時速度)。當馬達轉速比較高的時候,這樣的方式是可以的;但是在位置控制模式的時候,馬達的轉速會很慢(因為是要求轉子固定在某個位置嘛),這時候用平均測速法會存在非常大的誤差(轉子不動或動地很慢,編碼器就沒有輸出或只輸出1、2 個脈衝)。

所以為了避免速度環節帶來的誤差,在做位置控制的時候可以只使用位置與電流組成的雙環來控制,不過此時需要對位置環做一定的變化,控制框圖如下:

位置- 電流雙閉環控制

由於去掉了速度環,這裡的位置環我們使用完整的PID 控制,即把微分項加上(因為位置的微分就是速度,這樣可以減小位置控制的震盪加快收斂;積分項的作用是為了消除靜態誤差)。

好了,至此整個控制迴路基本上捋清楚了,但還有一些細節我們沒講到,就是上面框圖中的SVPWM模块。

細心的同學可會發現,在整個控制流程圖裡面有Park变换和對應的反Park变换,但是卻沒有Clark变换對應的反Clark变换,取而代之的是一個SVPWM模块。

以下會對SVPWM 技術進行詳細介紹。

2.4 空間電壓向量 什麼是空間電壓向量?

空間電壓向量是我們在控制馬達過程中虛擬出來的向量,既然是向量,自然是有大小和方向的,那麼它的大小和方向是什麼呢?

還是以前面三相逆變驅動電路那幅圖中的狀態為例,輸入100的狀態:

此時等效電路如圖:

因此馬達中三個相電壓(相電壓是每相對於馬達中間連接點的電壓)可以表示為:

其實就是一個最簡單的分壓電路,其中是母線電壓,也就是​​電源電壓。

如果我們規定指向中心的方向為正,反之為負,那麼此時我們可以畫出下圖中的三個電壓向量(左邊),以及它們的合成電壓向量(右邊):

也就是說,這個狀態下我們可以認為馬達中存在一個向量表徵的電壓(電流);然後根據右手螺旋定則,可以判斷出磁場的磁力線方向,也是和向量一致的。

再結合前面章節的分析,轉子永磁體會努力旋轉到內部磁力線和外部磁場方向一致,所以這個向量其實可以表徵我們希望轉子旋轉到的方向,也即所需要生成的磁場方向了。而這個向量是會不斷在空間中旋轉的,它的振幅不變,為相電壓峰值,且以角速度勻速旋轉。

我們後面將會看到,SVPWM 演算法的目的,就是使用三相橋的開關狀態把在空間中旋轉的向量表示出來,我們把這個向量稱為空間電壓向量。

用數學公式來表示的話就是:

為了研究各相上下橋臂不同開關組合時逆變器輸出的空間電壓向量,我們定義開關函數為:

上橋臂導通下橋臂導通

的全部可能組合共有8 個,包括6 個非零向量:

和兩個零向量:

可以看出零向量狀態下馬達三相間電壓都為0 不產生轉矩(不考慮反電動勢)。

以下以其中一種開關組合為例分析,假設,也即這張圖的狀態:

如前文分析,此時的電壓向量為AO 方向,大小為,我們把這個向量畫在座標軸中如圖:

ABC 座標系和αβ座標系下的向量表示

注意上圖的(100) 向量方向和AO 方向是相反的(變成OA 方向),這跟正方向的定義有關,這樣的規定更直觀一些。 同時可以注意到兩個零向量其實和原點重合了,因為這兩個狀態下馬達中產生力矩的磁場為0(不考慮旋轉過程中的反電動勢所產生的阻力力矩)。

同理,上圖還可以看出其餘5 個空間電壓向量,它們的端點組成了一個正六邊形,同時把平面劃分成了六個扇區(也就是圖中的Ⅰ、Ⅱ、Ⅲ、Ⅳ 、Ⅴ、Ⅵ)。

那這裡問題就來了:由這6 個空間電壓向量只能產生6 個方向的力矩啊,我們要怎麼產生任意方向的力矩呢?

2.5 SVPWM 技術 既然是“向量控制”,當然是有辦法的,答案就是:使用這6 個空間電壓向量作為基底向量來合成任意向量。在每一個磁區,選擇相鄰兩個電壓向量以及零向量,依照伏秒平衡原則來合成每個磁區內的任意電壓向量,即:

∫ T 0 U r e f d t = ∫ T x 0 U x d t + ∫ T x + T y T x U y d t + ∫ T T x + T y U ∗ 0 d t 離散化後等效為下式:

U ref ⋅ T = U x ⋅ T x + U y ⋅ T y + U ∗ 0 ⋅ T ∗ 0 式子中的 U r e f 是我們期望得到的電壓向量,T是一個PWM週期。 U x 和 U y 分別是用於合成 U r e f 的兩個空間電壓向量,也就是上面說的6個基底向量中的兩個, 至於是哪兩個? 這跟 U r e f 所在的扇區有關,例如 U r e f 在I 扇區,那麼 U x 和 U y 就是 U 4 和 U 6 ; T x 和 T y 就是在一個週期T中 U x 和 U y 所佔的時間。 U ∗ 0 指的是兩個零向量,可以是 U 0 也可以是 U 7 ,零向量的選擇比較靈活,透過合理地配置零向量可以讓空間電壓向量的切換更平順,後面會說明。

所以上面公式的意義就是:我們可以週期性地在不同空間電壓向量之間切換,只要合理地配置不同基底向量在一個週期中的佔空比,就可以合成出等效的任意空間電壓向量了。

是不是跟PWM 的想法完全一樣呢,這也是為什麼這個方法被成為SVPWM(空間電壓向量脈寬調變)。

下面舉一個栗子,假設我們要合成圖中所示的 U r e f ,在Ⅰ 扇區:

顯然我們可以透過 U 4 和 U 6 來合成 U r e f ,那麼如圖將 U r e f 投影分解到 U 4 和 U 6 的方向,由正弦定理有:

∣ ∣ U r e f ∣ ∣ sin 2 π 3 = ∣ ∣ T 6 T ⋅ U 6 ∣ ∣ sin θ = ∣ ∣ T 4 T ⋅ U 4 ∣ ∣ sin ( π 3 − θ ) 又因為

U 4

=

U 6

= 2 3 U d c ,所以可以計算得到 T 4 和 T 6 :

{ T 4 = m T sin ( π 3 − θ ) T 6 = m T sin θ 其中m為SVPWM的調變係數(即調變比) : m = √ 3 ⋅ ∣ ∣ U r e f ∣ ∣ U d c

顯然在電流環控制過程中m設定得越大代表了期望力矩越大。 而零向量分配的時間為: T 0 = T 7 = 1 2 ( T − T 4 − T 6 )

為什麼 T 0 = T 7 ? 這是我們將PWM波形設定為中央對齊模式對稱配置零向量的結果,後面會提到。

現在一個週期內所有狀態的持續時間我們都得到了,還差一個順序,也就是各個狀態切換的順序。

問題:不是任意順序都可以嘛?反正是做積分,重要的是持續時間而不是順序,一個週期內怎麼切換都行啊。

是的,理論上任何切換順序都是ok 的,但是實際上我們需要考慮更多限制,例如因為MOS 開關次數是有壽命限制的,我們希望能盡量減少MOS 管的開關次數,那麼以最大限度地減少開關損耗為目的,我們就可以設計出下面的切換順序:

上圖可以看出來,在每個狀態切換的時候,都只有一個相發生了轉變:000 → 100 → 110 → 111 → 110 → 100 → 000,這也是所謂的七段式SVPWM 調變法。

同時我們透過在合理的位置插入兩個零向量,並且對零向量在時間上進行了平均分配,以使產生的PWM 對稱,從而有效地降低了PWM 的諧波分量。

同理,我們也可以列出在其他磁區時的切換順序:

至此,SVPWM 的工作完成了,我們得到了每一時刻所需的空間電壓向量以及它們持續的時間,在處理器中賦值給對應通道的捕獲比較寄存器產生相應的三個PWM 波形,控制MOS 管的開關,進而產生我們期望的電壓、電流、力矩。

總結 至此FOC 的原理和整個控制連結都講完了,回想一下整個過程,再試著解答最開始提到的問題:為什麼在FOC 控制中要做這麼多變換和反變換?

因為所謂的「向量控制」 其實就是在做解耦,把互相耦合的三相磁鏈解耦為容易控制的交軸 I q 和直軸 I d 。整個過程就好比我們在做訊號處理的時候,透過FFT 把訊號變換到頻域進行處理之後再IFFT 反變換回時域是一個道理。

另外值得一提的是,本文介紹的是有感的FOC 控制方法,其實FOC 可以做到無感控制(也就是不需要編碼器等額外的感測器),當然控制演算法也會更複雜,需要引進前饋控制、觀測器等概念,無感的好處就是結構安裝更簡單,可以避免位置感測器失效的風險等等,當然這又是另一個話題了。

FOC 是個強大的控制方法,透過對馬達的“像素級” 控制,可以實現很多應用,因為可以做“力控”,FOC 是很多機器人驅動單元的基礎部件,例如:

MIT Mini Cheetah 四腳機器人

又例如,因為可以做到力矩的精確控制,我們可以用FOC 驅動器配合無刷馬達來實現各種力回饋裝置,這就好像iPhone 的Haptic Engine一樣,可以模擬出各種以假亂真的物理效果:

羅技的力回饋方向盤

最後順便提一下,我最近也在設計一個FOC 向量驅動器,熟悉我的同學應該知道我做東西的風格就是–唯小不破,因此這次也是準備設計一個超迷你的高性能FOC 驅動器。硬體已經基本完成了,電路設計如下圖,分為上下疊板設計,將邏輯單元和功率單元分開:

邏輯控制板

功率輸出板

最後組裝起來是這樣的:

同時我也為驅動器設計了一個外殼(畢竟顏值就是正義啊~):

關於這個驅動器的具體參數和功能呢,等我硬體加工了再來更新~

2020.9.5 更新,FOC 驅動器做好啦~

Back