這一步驟我們接著Clark变换將座標系旋轉度,其中是轉子目前的角度,如下圖:
變換公式如下:
也很簡單,就是作用了一個旋轉矩陣,寫成矩陣形式:
也就是說,這個 座標系 是總是跟著轉子旋轉的!
這個操作是可行的,因為我們會透過編碼器輸入轉子的即時旋轉角度,所以這個角度總是已知數。經過這一步的變換,我們會發現,一個勻速旋轉向量在這個座標系下變成了一個定值! (顯然的嘛,因為參考系相對於該向量靜止了),這個座標系下兩個控制變數都被線性化了!
Park 變換前後的波形
接下來如果我們以這兩個值作為回授控制的對象,那麼顯然就可以使用一些線性控制器來進行控制了,例如PID(是的,儘管學術界有很多酷炫的高階控制方法, 但是工業界還是偏愛PID)。
至此我們已經理解完上面FOC 控制流程9 個步驟的前3 步驟了。
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 驅動器做好啦~