【自制FOC驅動器】深入淺出講解FOC算法與SVPWM技術


轉載自 http://www.pengzhihui.xyz/2020/07/02/foc/

  1. 前言前陣子工作太忙,好久沒做個人項目了,最近久違地想做一個機器人項目,設計中需要用到高性能超小體積的伺服電機。

0. 前言

前陣子工作太忙,好久沒做個人項目了,最近久違地想做一個機器人項目,設計中需要用到高性能超小體積的伺服電機。

電機這一塊性能滿足項目需求的基本上只有無刷電機可以選了–又要大功率、大扭矩,又要體積小,成本還最好不要太高,選擇低 KV 值的無刷電機顯然是最合適的。我預計的方案中計划把減速器也省略了,采用扭矩無刷電機直驅。那么作為機器人硬件三大核心部件(電機減速器驅動器)之一的驅動器,我感覺是有必要自己設計一下的,因此這里把我學習 FOC 過程中看到的一些有關無刷電機矢量控制的資料和個人理解整理分享出來。

0.1 什么是 FOC?

FOC(Field-Oriented Control),直譯是磁場定向控制,也被稱作矢量控制(VC,Vector Control),是目前無刷直流電機(BLDC)和永磁同步電機(PMSM)高效控制的最優方法之一。FOC 旨在通過精確地控制磁場大小與方向,使得電機的運動轉矩平穩、噪聲小、效率高,並且具有高速的動態響應。

簡單來說就是,FOC 是一種對無刷電機的驅動控制方法,它可以讓我們對無刷電機進行 “像素級” 控制,實現很多傳統電機控制方法所無法達到的效果~

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

玩過航模的同學可能對無刷電機很熟悉,也應該知道航模中對於無刷電機的驅動使用的是電子調速器(ESC)也就是我們常說的電調,那么這個 FOC 驅動器和普通的電調有什么區別呢?

航模中的無刷電調

FOC 的優勢:

  1. 低轉速下控制
    由於控制原理的區別,無刷電調只能控制電機工作在高轉速下,低速下無法控制;而 FOC 控制器則完全沒有這個限制,不論在什么轉速下都可以實現精確控制。
  2. 電機換向
    同上面的理由,由於電調無法反饋轉子位置,因此很難實現電機正反轉的換向(當然有感電調可以實現);而 FOC 驅動器的換向性能極其優秀,最高轉速下正反轉切換可以非常順暢;此外 FOC 還可以以能量回收的形式進行剎車控制。
  3. 力矩控制
    普通電調都只能控制電機轉速,而 FOC 可以進行電流(力矩)、速度、位置三個閉環控制。
  4. 噪音
    FOC 驅動器的噪音會比電調小很多,原因是普通電調采用方波驅動,而 FOC 是正弦波。

電調的優勢:

  1. 兼容性
    電調驅動不同的 BLDC 不需要進行參數整定,而 FOC 需要。
  2. 算法復雜度
    電調的算法實現更簡單,運算量少,很適合需要提高帶寬的超高轉速電機。
  3. 成本
    電調的成本比 FOC 低很多。

綜上大家應該可以看出來,FOC 驅動器在控制性能上是要比電調強大得多的,其優異的性能和磁場定向控制的原理是密不可分的,下面就會詳細介紹 FOC 控制的實現方法。

1. 從電機原理說起

1.1 一些基礎知識

  1. 左手定則
    用於判斷導線在磁場中受力的方向:伸開左手,使拇指與其他四指垂直且在一個平面內,讓磁感線從手心流入,四指指向電流方向,大拇指指向的就是安培力方向(即導體受力方向)。

  1. 右手定則
    伸開右手,使大拇指跟其余四個手指垂直並且都跟手掌在一個平面內,把右手放入磁場中,讓磁感線垂直穿入手心,大拇指指向導體運動方向,則其余四指指向感生電動勢的方向。也就是切割磁感線的導體會產生反電動勢,實際上通過反電動勢定位轉子位置也是普通無感電調工作的基礎原理之一

  1. 右手螺旋定則(即安培定則)
    用於判斷通電線圈判斷極性:用右手握螺線管,讓四指彎向螺線管中電流方向,大拇指所指的那端就是螺線管的 N 極。直線電流的磁場的話,大拇指指向電流方向,另外四指彎曲指的方向為磁感線的方向。

  1. PWM(脈沖寬度調制)

不同占空比的 PWM 波形

本質是利用面積等效原理來改變波形的有效值。舉個例子,一個電燈只有兩個狀態,那么要怎么讓它實現 50% 亮度的效果的呢?只需要讓它在一半時間,一半時間,交替執行這兩個動作只要頻率足夠高,在人眼(低通濾波器)看起來就是 50% 亮度的樣子了。而其中高電平占一個開關周期的比例,就叫做占空比。利用 PWM 可以實現使用離散的開關量來模擬連續的電壓值。

1.2 無刷電機原理

考察下圖情況中的直流電機基本模型,根據磁極異性相吸同性相斥的原理,中間永磁體在兩側電磁鐵的作用下會被施加一個力矩並發生旋轉,這就是電機驅動的基本原理:

對於簡化的無刷電機來說,以三相二極內轉子電機為例,定子的三相繞組有星形聯結方式和三角聯結方式,而三相星形聯結的二二導通方式最為常用,這里就用該模型來做個簡單分析:

如上圖所示,無刷電機三相的連接方式是每一相引出導線的一頭,而另一頭和其他相兩兩相連。這個情況下假如我們對 A、B 極分別施加正電壓和負電壓,那么由右手螺旋定則可以判斷出線圈磁極的方向如下圖:

思考一下這時候中間的轉子處於什么角度的時候收到的力矩最大呢?

沒錯就是和 CO(O 為中心點)連線平行的時候,磁鐵會受到 A、B 兩個磁極一推一拉的作用,直到旋轉到與 AB 連線平行的且磁鐵內部磁力線方向和 AB 間磁力線方向一致的時候,受合力矩為 0 且穩定,也就是上圖中右邊的狀態。換句話說,AB 相通電會讓轉子努力轉到上圖中右邊的狀態。至於 C 這時暫時不起作用。

同理,我們下一階段換成 AC 相通電,這時候轉子會傾向於轉到下圖右邊水平的角度:

然后 BC 相通電:

以此類推,可以得到每個通電狀態下轉子的角度,就是下圖中的 6 個狀態,每個狀態相隔 60 度,6 個過程即完成了完整的轉動,共進行了 6 次換相:

整個過程就好像騎在毛驢上吊一根胡蘿卜一樣,旋轉的磁場牽引着永磁體不斷旋轉:

而這個換向的操作,就是需要驅動器去完成的

這也是無刷電機有刷電機最大的區別,即不像有刷電機的機械換向,無刷電機是通過電子換向來驅動轉子不斷地轉動,而換向的頻率則決定了電機的轉速。

至於什么時候怎么知道該換到哪個供電相?如何產生更平滑的換向電壓?如何提高電源的利用效率?這些都是 FOC 控制方法要探討和解決的問題。

1.3 關於 BLDC 和 PMSM 的區別

無刷電機其實可以分為無刷直流電機(BLDC,我們航模上都是用這種)永磁同步電機(PMSM),結構大同小異,主要區別在於制造方式(線圈繞組方式)不同導致的一些特性差異(比如反電動勢的波形)。

從上面分析的無刷電機模型其實可以看到,由於轉子在磁場中只有 6 個穩定的狀態,因此旋轉過程其實是不平滑的,存在扭矩的抖動(沒有通電的時候可以用手轉一下無刷電機,會感受到這種 “顆粒感”)。因此為了解決這個問題,從“硬件” 和從 “軟件” 出發有兩個解決方案,這就衍生出了 BLDCPMSM 的區別。

簡單地說,BLDC 由於反電動勢接近梯形波,所以依然是采用方波驅動,肯定是會有上面說的抖動問題的,但是轉一圈抖 6 下太明顯了,如果我增加電機槽、極對數(也就是磁鐵對數),那以前是 360 度里面抖 6 下,現在變成 120 度里面抖 6 下,甚至更小,這樣 “顆粒感” 不就變得更小了嘛?實際中買到的 BLDC 電機基本都是多極對的(比如下圖),原理跟之前的分析是一樣的,出來的都是三相信號(圖中的三根線),可以自己進行類推。

而另一方面,為什么我們非得用方波這種不平滑的波來驅動電機呢,用正弦波它不香嗎?是的,這就是 PMSM 解決問題的方式,由於 PMSM 的反電動勢被設計為正弦波的形狀,我們用軟件和算法結合 PWM 技術將方波轉變成等效的正弦波,再來驅動電機,結果美滋滋,控制效果很理想。當然為了產生更好的正弦波、更好的旋轉磁場,驅動器、控制算法就變得非常復雜,這也是 FOC 的實現原理,后面會進行詳細介紹

1.3 驅動電路實現

無刷電機的驅動電路主要使用三相逆變電路來實現,如下圖:

所謂逆變電路,即把直流電變換為交流電,或者簡單點說就是一個可以產生不同電流流向的電路,通過前面的電機模型分析我們也可以看出,對於無刷電機的驅動是需要在不同時刻施加不同方向的電壓(電流)的,因此需要逆變電路。

而逆變電路具體的實現則一般是采用半橋 MOS 電路來制作的。半橋電路的原型如下,其實很簡單,就是兩個 MOS 管組成的上橋臂下橋臂,中間引出一條輸出線:

用 3 個半橋電路就可以組合成三相逆變電路,每個半橋引出的一根輸出線跟無刷電機的一根相線相連,就完成了最基本的無刷驅動電路。

原理方面,MOS 管可以看作電壓控制的高速電子開關,在 MOS 管的柵極(上圖中的 High Drive 和 Low Drive)施加高電平或者低電平,就可以控制 MOS 源極和漏極的導通或者關閉。比如在下圖中,我們打開第一組半橋的上橋臂、第二組和第三組半橋的下橋臂(其余的關閉),那么就可以讓電流從電源正極流過電機的 a 相,流經 b、c 相,然后回到電源負極

三相逆變驅動電路

於是通過控制三個半橋的不同開關狀態,我們可以控制電流在電機中的不同流向了。

注意,在這個電路中,每個狀態下電機的三相線圈都會有電流;而在上一節的示例中我們同一時刻只會讓兩相線圈有電流,另一相不起作用。
那么這么修改的原因是啥呢?當然是:浪費可恥啊~
浪費一相不用那不就白白損失了一部分扭矩嘛?通過上圖中的方式驅動原理也是和之前分析一致的,但是可以產生更大的扭矩,所以當然是更好的選擇啦。

接下來我們將半橋電路的狀態做一個編碼,首先限定一個半橋只有兩種狀態:

  • 上橋開通下橋關斷定義為狀態 1
  • 上橋關斷下橋開通定義為狀態 0

這樣,三組半橋就一共有 8 種組合方式,編碼分別為:000001010011100101110111,記住這點,后面會用上~

可能有人會問,為什么一個半橋只能上橋臂和下橋臂有一個導通呢?都關閉或者都導通不行??
害,仔細想想就知道,上下都導通顯然是不可能的,因為這就相當於把電源短路了啊…
上下都斷開呢?也不需要,因為這樣就回到前面提到的,這時候電機有一相不起作用,浪了個費。
實際上半橋驅動電路的實現會比上面的分析要復雜一些,比如需要考慮開關管的開關頻率、開啟和關斷時間不對稱、死區問題等等,我后面設計的 FOC 驅動使用的是專用的半橋 MOS 柵極驅動 IC 來實現的。

1.4 旋轉的三相電機波形

按照前面的無刷電機基本模型,假設我們拿到這樣一個電機,手動勻速轉動它的轉子,然后用示波器觀察它的三相輸出電壓(也就是反電動勢產生的電壓),會看到什么波形呢?

其實很自然可以想到,我們會得到 3 根正弦曲線,而且三根曲線兩兩相位差為 120°:

實際上三相發電機的發電原理就是這樣的,輸出的就是三相幅值為 220V 的交流電(線電壓為 380V,即 V)。

發電機反過來就是電動機啦,所以假如反過來我們在三相無刷電機的三相線圈上輸入上述三相正弦電壓,那么就可以驅動無刷電機平穩高效地旋轉了。

而這也是 FOC 驅動無刷電機的基本手段,即通過計算所需電壓矢量,使用 SVPWM 技術產生調試信號,驅動三相逆變電路,合成出等效的三相正弦電壓驅動電機。

這個會在后面進行詳細介紹。

2.FOC 控制原理

ok 基礎知識鋪墊完畢,終於要進入正題啦~

大家剛開始接觸 FOC 查閱相關資料文獻的時候,可能都會感覺有點暈:

為什么要做各種變換和反變換?

空間矢量到底代表了啥??

不同扇區內為什么非得是這樣的狀態切換順序???

不要擔心,某奧力給曾經說過:戰勝恐懼的最好方法就是面對恐懼。

下面就由我嘗試深入淺出為大家拆解一下 FOC 控制,帶大家直面矢量控制的核心原理~

2.1 FOC 算法的 Pipeline

我們先來看一下 FOC 控制的整個流程圖景:

稍微解釋一下,這幅圖是以電流閉環控制為例的,也就是讓電機始終產生一個恆定的力矩(也就是恆定的電流,因為力矩和電流成正比)。

可以看到控制器的輸入是最左邊的 \(I_{q}-ref\)\(I_{d}-ref\) ,兩個變量經過PID控制器進行反貴調節,其中還涉及到幾個變換模塊,有 Park變 換 和 Clark變換;最后通過前面提到的 SVPWM模塊 作用到三相逆變器上進而控制電機;而PID控制器的反饋量,是對電機輸出電流的采樣 值。
上面的過程不好理解沒關系,先概括一下,FOC控制的整個過程是這樣的:

  1. 對電機三相電流進行采樣得到 \(I_{a}\), \(I_{b}\), \(I_{c}\)
  2. \(I_{a}\), \(I_{b}\), \(I_{c}\) 經過 Clark變換 得到 \(I_{\alpha}\), \(I_{\beta}\)
  3. \(I_{\alpha}\), \(I_{\beta}\) 經過 Park變換 得到 \(I_{q}\), \(I_{d}\)
  4. 計算 \(I_{q}\), \(I_{d}\) 和其設定值 \(I_{q}-ref\)\(I_{d}-ref\) 的誤差
  5. 將上述誤差輸入兩個PID (只用到PI) 控制器,得到輸出的控制電壓 \(U_{q}\), \(U_{d}\)
  6. \(U_{q}\), \(U_{d}\) 進行 反Park變換 得到 \(U_{\alpha}\), \(U_{\beta}\)
  7. \(U_{\alpha}\), \(U_{\beta}\) 合成電壓空間矢量,輸入 SVPWM模塊 進行調制,輸出該時刻三個半橋的狀態編碼值 (前文有提到)
  8. 按昭前面輸出的編碼值控制三相逆變器的MOS管開關,驅動電機
  9. 循環上述步驟

下面我們來分別介紹每一步的具體操作以及意義。

2.2 Clark 變換與 Park 變換

前面分析了,如果要平穩地驅動三相電機轉動,我們就需要生成三個相位相差 120 度的正弦波,但是我們最終的控制對象是 MOS 管的開通和關斷,只有電壓最大值0 值兩個狀態啊,怎么去生成連續變化的正弦波呢?

對了,用前面提到的 PWM 技術就可以做到,所謂 SPWM 就是這么干的,如下圖:

大家觀察一下上圖的波形,我們用上面坐標系中的正弦波和三角波的交點投影到下面的坐標軸,以此確定 PWM 的占空比變化規律,這樣合成的 PWM 波,經過低通濾波器之后,其實就等效為了一個正弦波!所以 SPWM 就是在 PWM 的基礎上用正弦波來調制合成的具有正弦波規律變化的方波。

這不是很理想嗎?不對,我們在 FOC 控制中並不會采用 SPWM 的調制方式。

最主要的原因是,通過上面三個半橋逆變器電路的分析我們可以知道,我們並不好在某一時刻獨立地控制某一時刻電機的三個相電壓,也就很難合成三路這種 SPWM 波了;另外 SPWM 也比后面要說的 SVPWM 的電壓利用率要低 15%(具體怎么算的這里就不介紹了)。

另一方面來看,我們甚至根本就不想跟什么三個正弦波打交道!

因為要對於非線性的信號進行准確控制就要使用復雜的高階控制器,這對於建模成本、處理器算力、控制實時性等都是不利的。簡單地說就是,咱們控制器的反饋輸入變量不是三個電流采樣值嘛,你要我穩穩地跟蹤三個正弦波太麻煩啦!能不能簡單點跟蹤一條直線(常量)啊?

答案是可以的~ 只需應用一點數學小技巧

Clark 變換

我們回到上面 FOC 控制過程 9 個步驟的第 1 步,也就是對電機的三個相電流進行采樣,這一步會使用串聯的采樣電阻(Shunt)進行電流采樣。

由於電機工作的電流一般很大,所以采樣電阻的阻值非常小,甚至和導線的電阻接近了,因而實際的采樣電路 PCB 設計的時候還有一些講究,比如使用開爾文接法 (Kelvin connections)

但是我們實際電路設計時不會使用三個采樣器,只需要兩個就夠了。因為由基爾霍夫電流定律(KCL),在任一時刻,流入節點的電流之和等於流出節點的電流之和,也就是說

只需要知道其中兩個就可以計算出第三個了。

這三個電流基本上就是三個相位相差 120 度的正弦波,在把這些信號輸入控制器反饋控制之前,我們先來做點數學游戲:

我們知道三相坐標系 如下:

問題:這明明是一個二維平面內的坐標系,為啥要用 3 個坐標軸來表示呢?

而且很明顯 這三個基向量是非正交的,學過線性代數的同學可能會想到,我們可以做一個很簡單的基變換將其正交化為一個直角坐標系,我們把新的直角坐標系命名為 **** ** 坐標系 **,變換公式如下:

其實就是個很簡單的坐標軸投影計算,寫成矩陣形式如下:

於是我們就回到直角坐標系啦,是不是很開心,變換前后的波形如下:

可以看到變換后其實還是正弦波… 只不過我們少了一個需要控制的變量了,現在只需要控制 這兩個變量,讓其滿足上圖的下面的波形變化規律就可以控制電機旋轉 了,頻率還是不變的。

注意這里的 是我們虛擬出來的變量,所以在計算出一組 后,我們通過上述公式的反向變換公式變換回去再應用到電機的三相上。

就這?

當然不是,如果只是為了減小一個控制變量那這個變換 / 反變換操作顯然有點多此一舉。

有趣的是我們還可以接着變換:雖然 坐標系下少了一維變量,但是新的變量還是非線性的(正弦),有沒有辦法把它們線性化呢?有的,Park變換就是做這個工作的。

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 個空間電壓矢量作為基向量來合成任意矢量。在每一個扇區,選擇相鄰兩個電壓矢量以及零矢量,按照伏秒平衡原則來合成每個扇區內的任意電壓矢量,即:

\[\int_{0}^{T} U_{r e f} d t=\int_{0}^{T_{x}} U_{x} d t+\int_{T_{x}}^{T_{x}+T_{y}} U_{y} d t+\int_{T_{x}+T_{y}}^{T} U_{0}^{*} d t \]

離散化后等效為下式:

\[U_{\text {ref }} \cdot T=U_{x} \cdot T_{x}+U_{y} \cdot T_{y}+U_{0}^{*} \cdot 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}\) 的方 向,由正弦定理有:

\[\frac{\left|U_{r e f}\right|}{\sin \frac{2 \pi}{3}}=\frac{\left|\frac{T_{6}}{T} \cdot U_{6}\right|}{\sin \theta}=\frac{\left|\frac{T_{4}}{T} \cdot U_{4}\right|}{\sin \left(\frac{\pi}{3}-\theta\right)} \]

又因為 $ \left|U_{4}\right|=\left|U_{6}\right|=\frac{2}{3} U_{d c} $ ,所以可以計算得到 \(T_{4}\)\(T_{6}\) :

\[\left\{\begin{array}{l} T_{4}=m T \sin \left(\frac{\pi}{3}-\theta\right) \\ T_{6}=m T \sin \theta \end{array}\right. \]

其中m為SVPWM的調制系數 (即調制比) : \(m=\sqrt{3} \cdot \frac{\left|U_{r e f}\right|}{U_{d c}}\)
顯然在電流環控制過程中m設置得越大代表了期望力矩越大。
而零矢量分配的時間為: \(T_{0}=T_{7}=\frac{1}{2}\left(T-T_{4}-T_{6}\right)\)
為什么 $ 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 驅動器做好啦~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM