哀吾生之須臾,羨長江之無窮。
每天總是過的那么快。白天寫代碼畫板子,忙到摸魚的空都沒有,晚上回來寫點代碼還老出BUG,然后一晚上就過去了。別人女朋友都換了好幾茬了,幾個孩子都輪流打醬油了,自己還脫單無望,腦子還感覺越來越不好使,人也越來越懶了,效率也低,真的是,過的好失敗啊。夢想都快支撐不起這個快三十還一事無成的軀殼了。看著稚暉君的那種效率和能力,真的是強啊。
前言
硬件探索過后,就是程序編寫了。
ESP32 IDF環境
前面已經介紹過,IDF環境是ESP官方主推的基于C語言的庫環境,提供了ESP32最豐富的功能。
關于ESP32 IDF的使用說明可以參考光放文檔【ESP-IDF編程指南】,官方的例程在【examples】中,我之前的ESP32環境搭建教程中有examples的使用方法,即使編輯器版本升級了,但是操作方法還是沒變的。
FOC入門算法
FOC控制算法相關視頻和文檔可以查看 【燈哥開源】的文檔【dengFOC 文檔】,里面有基本的入門教程和算法講解。此處簡單介紹其中的所需要的知識。
硬件控制原理
電機的運動本質上是靠開關六個MOS管,實現不同順序的電流導通,從而控制電流從電機三根導線的流通速度和方向,進而實現磁場強度和方向的控制,實現電機的運動。而控制它的原因,需要理解電機內導電磁場與四周的電磁鐵的位置關系與二者之間吸引力強度(力矩)的關系。所以FOC本質上就是找電機的三根導線實現的磁場與四周電磁鐵在不同角度下如何能得到目標力矩的換算關系。
我們在硬件上,除了能夠得到電機三個輸入端的實時電流ia,ib,ic(這三個電流也需要被實時控制),還能通過位置傳感器得到電機的旋轉角度,即硬件上的AS5600傳感器。而我們就是要靠這四個已知的值,加上一個目標值(本質上就是力矩,速度的大小也是靠力矩得到的),實現電機的運動控制。其中ia,ib,ic既是已知值,又是待求值。AS5600傳感器可求得位置值。目標值則是可以轉換為最終運動結果的值。
實現以上的運動結果,我們需要理解以下概念。
PWM
電機運動,是需要控制電流的大小和方向的。但是在硬件上,很難實現直接對電流的操作,而對電壓大小的控制則更容易實現。因為根據U=I*R,R是電機的線圈電阻,可視為不變(變化范圍很小,比如受溫度影響)的,則調節U的大小,即可控制導通電流I的大小。
而控制電壓U的大小的方式就是PWM。
【百度百科 PWM】
PWM是一種脈寬調制方式,簡單的理解就是將一個只能輸出0和1兩種狀態的數字電平(1只是代指最高電平,不表示實際電壓),通過將其按照固定時間劃分為一個個周期,在每個周期內按照百分比來切換輸出高電平和低電平的時間,達到將一個周期內的能量劃分為百分比輸出的能量。而這個百分比輸出的能量,則表現的最終狀態就是最高電圧的百分比電壓,從而實現電壓調控。
通過在特定順序的MOS管上使用PWM波形進行開關控制,就能得到需要的電壓,進而得到需要的電流。
克拉克變換 與 克拉克逆變換
- 直流無刷電機都是三根輸入線,通過MOS管來實現兩兩一對的通斷,于是在三根線上,就會有三個電流值,這三個電流值分別命名為ia,ib,ic,是我們可以實時測得的數據,就是硬件分析中每個電機上的兩路電流采樣芯片(由于后面的變換關系我們就知道了,實際上我們只采樣兩路電流值就能得知所有三相的值,所以電路上只有兩路電流采樣),他們的大小和方向都是隨時間(運動)規律變化的值,因此可視為矢量值,也是我們FOC控制中最終要得到并實現控制的值。
- 克拉克變換就是將這三個矢量變化的值進行降維換算,換算到靜止的二維坐標系中兩個方便計算的分量的算法。這個靜止的坐標系命名為Iα-Iβ坐標系。
- 克拉克變換變換后的結果簡單理解就是以一個電機實物的中軸心為原點建立一個靜態坐標系,電機轉動角度為橫坐標,兩個分量值的大小位縱坐標,得到的電機運動時兩個分量相對于運動角度的變化:
![image]()
具體可以參考【克拉克變換】
以及【克拉克 (Clark) 變換中等幅值 (2/3) 和等功率 (sqrt(2/3)) 變換的公式推導】
動圖可以參考【克拉克和帕克變換】
而 克拉克逆變換 ,就是反向升維計算的過程,也就是求解ia,ib,ic的過程,求解之后就能使用PWM控制MOS管,根據U=I*R來控制電流了。
具體公式此處不再列舉,參考文檔中的公式即可。
帕克變換
上一步的克拉克變換是變換為一個靜止的二維坐標系Iα-Iβ上的兩個分量值,得到旋轉角度與分量的變化規律。
而帕克變換就是變換一下視角,將坐標軸跟隨角度變化,得到兩個值在變化的坐標系下的變化情況。這種變化的好處就是,將上一步變換后的系數矩陣進一步轉換成為常數矩陣,而不是隨著時間和空間量變化的系數矩陣,這樣大大化簡了分析發電機、電動機的電磁關系的微分方程。我們將這個跟隨運動的坐標系命名為 Iq-Id坐標系。
其中Iq使目標磁場強度,也即力矩,是需要根據情況設定的值。Id常設為0。
于是,通過帕克逆變換,再通過克拉克逆變換,我們就將目標Iq值換算為可以操控的ia,ib,ic三個值,實現了電機的控制,也算打通了FOC的基本流程。其中還會用到一些小的方法或是算法,可以參考別人寫的教程文檔,后面不再細說。

關于帕克變換與實際電機運動的物理意義,還搞不明白的可以參考【通過帕克變換得到的Iq Id有什么具體的物理含義】,講的通俗易懂。
具體公式此處不再列舉,參考文檔中的公式即可。
PID調節
PID是一種帶反饋的控制算法。其中,P、I、D分別表示為 “比例(proportional)、積分(integral)、微分(derivative)”
具體說明可以參考【詳解什么是PID】
PID在FOC控制中,主要是用于電流反饋調節,但是對于其他可以基于反饋的參數都可以用來調節,比如位置調節,也可以調節Iq實現力矩調節。
- 而電流的PID調節則主要是用于調節ia,ib,ic的值,之前說了,這三個電流值既是測量值,又是控制值,所以二者之間使用PID實現反饋調節,得到更加平滑的調節。在實際應用中,PID三個環不一定同時用,也有可能只用PI環或是PD環。
而最終我們是需要操控PWM輸出的,所以可以參考【PID算法與直流電機的PWM技術控制】來簡單查看程序上PID與PWM的換算方法。
更多PID實例和教程可以參考【理解PID算法:筆記整理】
這里有一個python的可視化PID調節的參考代碼【PID-Example】,另外值得一提的是,他用的python的GUI庫看著很不錯,雖然沒有QT那種便利的拖拽界面,但界面很絢麗,用法也很簡單,值得使用。
軟件驅動實現
AS5600讀取
使用ESP32的IDF官方的IIC例子進行簡單修改,就能很輕松的讀取其中一路的AS5600的值,旋轉電機就能看到值跟隨變化。
但是ESP32的IDF控制雙路IIC我還沒有解決,使用庫的IIC讀寫函數,沒有發現能夠簡單切換IIC通道的方法,重新注冊IIC通道,會出現報錯甚至復位等問題,所以還需要一定的時間進行雙路AS5600的讀取測試,(IDF環境編譯真的好慢,要不是arduino的跳轉不好用,我都想換回arduino了),所以此處暫不放出代碼。
PWM輸出控制
PWM輸出即通過每路三個引腳輸出共計六路PWM波來控制兩個EG2133芯片,進而驅每路六個共計12個MOS管的導通情況。
ESP32的IDF官方例程中,提供了一個FOC測試的例子,可以用于參考。
電流數據采集
電流的采集實際上就是從四路INA240A2PWR芯片上采集電壓然后換算為電流值。
ESP32的IDF官方例程中,提供了ADC采集測試的例子,可以用于參考。
總結
綜上,就實現了FOC的全流程的理解,和基本的幾個硬件電路的驅動。由于時間關系,代碼沒有完善,此處暫不放出。
- 本文水平有限,內容很多詞語由于知識水平問題不嚴謹或很離譜,但主要作為記錄作用,希望以后的自己和路過的大神對必要的錯誤提出批評與指點,對可笑的錯誤請指出來,我會改正的。
- 另外,轉載使用請注明作者和出處,不要刪除文檔中的關于作者的注釋。
隨夢,隨心,隨愿,恒執念,為夢執戰,執戰蒼天! ------------------執念執戰

浙公網安備 33010602011771號