SimpleFOC(八)—— 理论+实践 深度分析SVPWM
目錄
- 說明
- 一、有感FOC控制原理
- 二、SVPWM原理
- 三、SimpleFOC(不帶電流采樣)的控制原理:
- 四、SimpleFOC核心代碼
- 五、代碼實驗
- 5.1、實驗目的
- 5.2、硬件準備
- 5.3、修改代碼 第一階段
- 5.3.1 打開例程
- 5.3.2 修改代碼
- 5.3.3 驗證上傳
- 5.3.4 電機觀測
- 5.3.5 修改力矩
- 5.3.6 修改轉速
- 5.4、修改代碼 第二階段
- 5.4.1 修改代碼
- 5.4.2 驗證上傳
- 5.4.3 電機觀測
- 5.4.4 串口操作
- 5.4.5 觀察三相波形
SimpleFOC的教程比較多,做了一個總的鏈接,歡迎點擊閱讀:SimpleFOC教程鏈接匯總
說明
??SimpleFOC的基本操作在前幾節都已經演示過了,雖然還有很多沒演示的例程,但是觸類旁通,仔細琢磨下難度不大。
??網上關于FOC和SVPWM的文章很多,但大都偏理論,最多用matlab驗證下,本文通過程序演示驗證SVPWM算法,有助于對理論的理解。對理論沒興趣的同學可以跳過。
?
一、有感FOC控制原理
1、測量電機三相定子電流,可得到Ia 和Ib。將三相電流通過Clark變換至兩相電流Iα和Iβ ,
2、按照控制環上一次迭代計算出的電機角度, 通過Park變換得到旋轉坐標系下相互正交的電流Id和Iq,
3、Id、Iq與設定值進行比較得到電流環PI控制器的輸入。調節PI控制器的參數,得到Vd 和Vq ,即要施加到電機上的電壓矢量,
4、通過位置傳感器得到新的電機位置,從而得到新的角度和轉速。新的電機角度可告知 FOC算法下一個電壓矢量在何處,
5、通過使用新的電機角度,Vd 和Vq經過Park逆變換產生下一個正交電壓值Vα、Vβ,
6、采用SVPWM算法判定其合成的電壓矢量位于哪個扇區,計算出三相各橋臂開關管的導通時間,最后經過三相逆變器驅動模塊輸出電機所需的三相電壓。
?
二、SVPWM原理
??由三相功率逆變器的六個功率開關元件組成的特定開關模式產生的脈寬調制波,能夠使電機電流波形盡可能接近于理想的正弦波形。
??請看下面這兩片文章:
《SVPWM算法原理及詳解》https://blog.csdn.net/qlexcel/article/details/74787619,
《SVPWM分析、各個扇區詳細計算以及Matlab仿真》https://blog.csdn.net/michaelf/article/details/94013805,
??推導的結果是一樣的,
??實際上大部分文章的SVPWM的算法結果都是這樣。我覺得這個結果主要是針對無感FOC的算法,無感FOC需要根據Vα和Vβ來確定扇區和角度,但是對于有位置傳感器,特別是有編碼器的電機來說可以直接獲取角度,上面的推導計算過頭了。
?
三、SimpleFOC(不帶電流采樣)的控制原理:
??首先去掉了電流采樣,所以簡單了很多,有位置傳感器,所以不用觀測器估算位置。對空間矢量作用時間可以直接利用下面的公式(這些公式來自《SVPWM分析、各個扇區詳細計算以及Matlab仿真》算法推導的中間狀態,《SVPWM算法原理及詳解》只寫了第一個扇區):
對照矢量圖,可以總結如下:
Udc表示電源電壓(在代碼中是voltage_limit),Uref表示設置的力矩大小(在代碼中是target_voltage),Ts表示PWM周期(代碼中沒有把Ts體現出來,代碼中的T1、T2是周期的百分比)。
??
四、SimpleFOC核心代碼
??在simpleFOC工程中,先來看下被創作者稱之為核心的代碼(代碼路徑: …\Arduino-FOC-minimal\library_source\ BLDCMotor.cpp)
??輸入變量Uq、Ud和角度θ,計算出3路PWM占空比。對照上面的SimpleFOC原理框圖,一個函數基本就把主要工作做完了,確實是核心。
??
五、代碼實驗
5.1、實驗目的
??通過設置不同的Ud和θ角度實現不同的波形輸出,并將三相輸出波形與SVPWM的理論波形做對比。
??本實驗分兩個階段來完成,第一階段先直觀感受下SVPWM參數對電機運轉的影響,第二階段電機三相輸出波形與理論做對比。
5.2、硬件準備
| 1 | Arduino UNO | 1 |
| 2 | simpleFOCShield V2.0.3 | 1 |
| 3 | 云臺電機 | 1 |
| 4 | 12V電源 | 1 |
| 5 | 方口USB線 | 1 |
按照開環模式連接
??
5.3、修改代碼 第一階段
5.3.1 打開例程
5.3.2 修改代碼
??simpleFOC工程以庫的形式安裝到Arduino中,不能修改底層代碼,所以只能把代碼復制出來,以子程序的形式放到當前程序中。之所以選擇standalone例程,是因為這個例程比較簡單,而且本身就是演示矢量控制的。
??①、增加SVPWM算法的子程序
??②、loop循環中調用子程序
??例程為只讀文件,可以驗證上傳,如需保存要“另存為”。
SVPWM子程序(為了讓代碼看起來更簡潔,所以程序中沒有約束條件,參數設置一定要按要求范圍輸入):
5.3.3 驗證上傳
5.3.4 電機觀測
??上電后電機開始轉動,當前的轉動方式其實就是開環速度模式。
5.3.5 修改力矩
??修改Uq值(范圍0—6.928),重新驗證上傳,會發現電機的力矩改變了,如果有萬用表會發現電機的工作電流隨Uq等比例改變。
??注意:Uq值設置越大,力矩越大,電流越大,電機發熱越嚴重。
5.3.6 修改轉速
??修改角度增量,重新驗證上傳,會發現電機的轉速改變了,
??注意:增量越大電機轉速越快,增量太大電機會因失步變振動。
??
5.4、修改代碼 第二階段
??
5.4.1 修改代碼
??在第一階段程序的基礎上,
??①、增加了串口通信子程序,實現通過串口設置電機的電角度,
??②、通信程序放入主循環
??③、角度值由上一節的循環增加變為串口設置。注意為了更加直觀,串口設置的角度單位為“度”,所以會有“度”轉換為“弧度”的計算。
串口通信子程序:
5.4.2 驗證上傳
5.4.3 電機觀測
??程序運行后,電機固定在0度位置,類似開環位置模式。
5.4.4 串口操作
??通過串口發送角度值(直接發送數字,范圍0—359),電機運動到指定的角度。(此時的角度為電角度,所以電機在一個很小的范圍內運動。比如當前用的電機為7對極,電機從0轉動到360度,轉過了電機的1/7圈。電角度和機械角度的概念請自行百度。)
5.4.5 觀察三相波形
??串口輸入角度,示波器查看三相輸出波形,并與理論做對比。(示波器只有兩個通道,所以三相波形只能通過拼接得到)
①、30度
②、90度
③、150度
④、210度
⑤、270度
⑥、330度
??
??順便說下,Arduino UNO 的PWM頻率是31.25KHz。16MHz晶振,時鐘不分頻,PWM模式為相位校正模式(Phase Correct PWM Mode,在STM32中稱之為 中央對齊模式),16000/256/2=31.25KHz。
??下面是PWM的配置代碼(代碼路徑:…\Arduino-FOC-minimal\library_source\drivers\hardware_specific\atmega328_mcu)
?
?
??本文涉及理論的部分寫的很籠統,存在用詞不準確,語句不通順的問題,請大家不要太糾結,做為一名合格的工程師就是要把科研人員的理論轉變為可以落地的代碼,理論不是我的強項也不是我的目標。
?
?
(完)
?
歡迎加入simpleFOC技術交流群:923734429 群已滿根據提示添加新群 (入群申請寫:CSDN)
?
請繼續閱讀相關文章:
SimpleFOC(一)—— 簡介(附有文件下載鏈接)
SimpleFOC(二)—— 快速入門 (開環控制)
SimpleFOC(三)—— AS5600角度讀取
SimpleFOC(四)—— 閉環控制
SimpleFOC(五)—— 雙電機控制
SimpleFOC(六)—— PowerShield和AS5047P
SimpleFOC(七)——STM32(Bluepill)的應用
SimpleFOC(八)—— 理論+實踐 深度分析SVPWM
SimpleFOC(九)—— 霍爾電機控制
總結
以上是生活随笔為你收集整理的SimpleFOC(八)—— 理论+实践 深度分析SVPWM的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu14.04环境编译vlc源码
- 下一篇: 仅对此用户禁用 java_Spring