《極海芯得》系列內容為用戶使用極海系列產品的經驗總結,均轉載自21ic論壇極海半導體專區,全文未作任何修改,未經原文作者授權禁止轉載。
1、咱們先聊一個靈魂問題
咱們做電機控制時,最怕什么?不是算法不會寫,而是算得不夠快。
尤其在單軸伺服、磁編碼器、旋變這些場景里,角度解算是每個控制周期的“必修課”。最經典一步就是把 (sin, cos) 或 (x, y) 算成 atan2,再喂給位置環、速度環、電流環。
問題來了,假如沒有 FPU 怎么辦?
純軟件 atan2 常常慢得讓中斷服務程序壓力山大,20kHz 甚至 40kHz 一上來,時間預算直接告急。所以這次咱們不空談,直接看 G32R430 的做法,不用通用浮點硬剛,走 CDE 協處理器 + ATAN2 硬件加速。
這篇文章我們一起來看看這三件事:
為什么 atan2 在編碼器場景里是剛需?
G32R430 的 CDE + ATAN2 具體怎么干活?
實測周期到底差多少,值不值得咱們上車?
2、測試前提:先把口徑說清楚
在實驗開始前,先把實驗臺參數擺出來,避免后面各說各話,有想要復刻測試的朋友們可以參考這里~
芯片/內核:G32R430(含 CDE,無 FPU/DSP/MVE)
SDK:G32R430 DDL SDKV1.0.2
(ATAN2例程路徑Examples/Board_G32R430_Tiny/ATAN2/ATAN2_Math/)
關鍵頭文件版本:Libraries/ATAN2/MathLib.h
示例工程版本:ATAN2_Math/Source/main.c
關鍵 API:int32_t ATAN2(int32_t nX, int32_t nY, int32_t nPrecisionLevel)
編譯配置:與官方一致,如-mcpu=cortex-m52+nomve+nofp+cdecp3
主頻/測量:示例工程系統時鐘120 MHz,使用DWT cycle counter
3、測試前提:先把口徑說清楚
旋變、磁編碼器常吐出 sinθ、cosθ 這對好兄弟,咱們要拿到角度,實際上還得看下面這個老朋友
θ = atan2(sinθ, cosθ)
在 FOC 鏈路里,這一步還是個常駐嘉賓。Clarke/Park、反變換這些環節都盯著當前電角度,atan2 基本常年在實時路徑加班。所以我們都知道,atan2 對于整體來說,并不是錦上添花,反倒是最重要的一環。它快不快、穩不穩,直接影響閉環是否絲滑。
4、G32R430 不求全能,但求對癥下藥
很多 MCU 是全家桶,但 G32R430 反而更像是個“偏科天才”:
不帶 FPU/DSP/MVE;
引入 CDE 協處理器;
重點照顧角度解算這類高頻定點任務。
這就意味著,G32R430是把晶體管預算花在咱們最常跑、最該快的路徑上。
5、CDE+ATAN2怎么用?接口不難,坑點要記住
SDK 接口如下:
/**
* [url=/u/brief]@brief[/url] Computes the angle of a point (nX, nY) on a two-dimensional plane in Q32 format.
* @param: nX X-axis coordinate
* @param: nY Y-axis coordinate
* @param: nPrecisionLevel Specifies the precision level from 1 to 8;
* higher precision increases accuracy but slows computation.
* Recommended values: 6, 7, 8
* [url=/u/return]@return[/url] The angle value in the range (-1, 1], Q31 format, corresponding to (-π, π].
*/
nX/nY:Q 格式定點輸入坐標;
nPrecisionLevel:1~8 檔,官方建議常用 6/7/8;
返回值:Q31,范圍對應 (-π, π](接口文檔中寫作 (-1, 1] 歸一化表示)。
這里我重點提醒一個巨容易踩的坑:
標準數學庫是atan2(y, x),SDK 接口是ATAN2(x, y, level)。(請注意是大寫哦)
示例代碼也是這個順序:x=cos(theta)、y=sin(theta),調用 ATAN2(x, y, level)。這個順序寫反,角度就可能“人還在家,坐標先飛了”。
6、工程落地:咱們讓關鍵代碼跑在ITCM
極海官方提供的.sct鏈接腳本把ATAN2 函數默認放到了 ITCM,目的是減少取指等待和周期抖動。程序啟動后從 Flash 拷到 ITCM,運行階段零等待取指。

所以即使你切“Flash 工程”或“ITCM/RAM 工程”,CDE 這段關鍵角度解算代碼依然在 ITCM 跑,花費的時間便是“穩穩的幸福~”。
7、實測數據如下,這波到底快了多少?
先補一句對照平臺說明,避免“拿不同選手硬比”,咱們這里引入的 G32R501,也是 Arm Cortex-M52 架構平臺,但定位更偏“全功能性能型”:
雙核 Cortex-M52,主頻最高 250 MHz;
內置自研紫電數學指令擴展單元;
支持 Arm Helium 技術;
支持單精度/雙精度 FPU;
支持 DSP。
一句話理解:G32R430 是專精取舍路線,G32R501 是功能更完整路線。所以這組圖和表主要用于看“工程實現路徑與周期數量級差異”。
下面開始看圖,這張是G32R430 平臺、Flash 工程、-O3 配置下的測試數據。

這張是G32R430 平臺、ITCM/RAM 工程、-O3 配置下的測試數據。

這張是G32R501 平臺、CBUS Flash 工程、-O3 配置(DP FPU路徑)下的測試數據。

這張是G32R501 平臺、ITCM/RAM 工程、-O3 配置(DP FPU路徑)下的測試數據。

來看看這次對比下的條件,基本控制在同一變量,咱們避免G32R430和G32R501是“蘋果橘子一起比”:
兩平臺均用各自官方示例工程,優化等級按工程配置為 -O3;
周期統計統一看 DWT cycle;
G32R430 數據來源為 ATAN2(..., 6) + 軟件參考 atan2 對照;
跨平臺對比用于看數量級,不代表完全同軟件棧下的絕對橫評。
測試點:angle_param = PI/65536.0 * idx * 4.0,idx=-5~0。其中 G32R430 使用 ATAN2 精度檔位 6。

為了讓比較更直觀,我們把同一組數據畫成了相對倍數柱狀圖,以每個測試點的 G32R430 Flash CDE 為 1.0x 基準,其他路徑都按相對倍數計算。

G32R430 Flash CDE 全程是 1.0x(基準線);
常規角度點(idx=-5~-1)里,G32R430 Flash ref 大約在 16x~19x,和 CDE 路徑差距非常直觀;
G32R430 ITCM CDE 基本貼近 1.0x,說明 CDE 路徑在不同工程放置下都很穩;
idx=0 時,軟件路徑倍數明顯回落(快速路徑觸發)。
7.1、咱們怎么讀這組表
常規角度點(序號 1~5)里,G32R430 CDE 大約 299~321 cyc;
同平臺軟件參考 atan2 在 5k~6k cyc,差距是數量級的;
Flash CDE 和 ITCM CDE 接近,核心原因就是 ATAN2 關鍵路徑本來就在 ITCM;
idx=0 時軟件突然變快,通常是 atan2(0,1)=0 的快速路徑觸發;
對高頻中斷服務來說,我們更看重的是穩定快,偶爾飛快反倒不是重點。
7.2、手冊寫80cycles,為什么上面的是300多的cycles?
咱們先回到上面的對比表,會發現 G32R430 Flash CDE/G32R430 ITCM CDE 大多是落在 300+ cycles。很多讀者看到這里會問:手冊寫 80 cycles,怎么實測會到 300+?
這時候我們就需要把統計的口徑拆開來看,先看手冊(TMU/ATAN 指令說明),它給的是指令級口徑:

接著,我們單獨做一次單次 ATAN2 調用測試,盡量壓縮外圍流程,看看函數級口徑。
單次測量代碼(ATAN2_Math/Source/main.c):
SECTION_DTCM_DATA uint32_t single_atan2_cycles = 0U;
SECTION_DTCM_DATA int32_t single_theta_q31 = 0;
SECTION_DTCM_DATA int32_t single_x_q30 = double_to_q30(0.8660254037844386); /* cos(30deg) */
SECTION_DTCM_DATA int32_t single_y_q30 = double_to_q30(0.5); /* sin(30deg) */
/**
* @brief Standalone benchmark for one ATAN2 execution.
*
* @param None
*
* @retval None
*/
void RunSingleAtan2Benchmark(void)
{
GET_DWT_CYCLE_COUNT(single_atan2_cycles,
single_theta_q31 = ATAN2(single_x_q30, single_y_q30, 8);
);
printf("Single ATAN2 benchmark: ");
printf(" Input (Q30): x=%d, y=%d ", single_x_q30, single_y_q30);
printf(" Output (Q31 norm): %.10f ", q31_to_double(single_theta_q31));
printf(" ATAN2 cycles: %lu ", (unsigned long)single_atan2_cycles);
}
串口輸出如下:

這時就能把三個數字串起來了:
手冊口徑(指令級):80 cycles,對應 TMU ATANOP32 指令說明;
單測口徑(函數級):約 51 cycles,對應一次 ATAN2(...) 的最小調用路徑;
表格口徑(示例對齊級):約 300+ cycles,這是示例里為與軟件參考結果對齊而做的整套計算路徑,包含參數準備、測量宏開銷以及結果換算(例如 q31_to_double)等步驟。
所以看完上面這三串數字,我們可以得知 “80 / 51 / 300+ cycles” 在本質上并不沖突,反而是代表著三個不一樣的視角
手冊告訴我們硬件指令大概多快;
單測告訴我們函數本體大概多快;
表格告訴我們示例對齊比較時的整鏈路大概多快。
做本體性能判斷看函數級,做指令上限判斷看指令級;示例對齊數據用于橫向比較更合適。
8、精度檔位怎么挑:先6,再7/8
nPrecisionLevel 可調 1~8,因此咱們在實操上建議如下:
先從 6 檔起步(速度和精度通常更均衡);
誤差預算更緊時,再試 7/8;
每升一檔會有額外開銷,建議結合編碼器分辨率和環路帶寬做閉環驗證。
總結下來,就是先把實時性保住,再慢慢榨精度。
9、最后咱們最后記住三件事
這次實測我認為最關鍵的結論有三條
G32R430 用專用硬件路徑替代通用浮點大件
定點 + CDE 能把 atan2 壓到約 300 cycles 量級
在高頻控制環里,能同時拿到實時性、確定性和功耗收益
對編碼器和單軸伺服場景來說,這種思路很對路,沒有 FPU,也能把角度算得又快又穩。
10、參考
G32R430_DDL_SDK_V1.0.2/Libraries/ATAN2/MathLib.h
G32R430_DDL_SDK_V1.0.2/Examples/Board_G32R430_Tiny/ATAN2/ATAN2_Math/
注:文章作者在原帖中提供了代碼文件,有需要請至原文21ic論壇
原文地址:https://bbs.21ic.com/icview-3509559-1-1.html?_dsign=864041ab
-
電機控制
+關注
關注
3601文章
2163瀏覽量
278799 -
編碼器
+關注
關注
45文章
4007瀏覽量
143227 -
極海半導體
+關注
關注
0文章
221瀏覽量
4825
原文標題:極海芯得 EP.80 | 無FPU也能飛: G32R430實測ATAN2硬件加速有多快
文章出處:【微信號:geehysemi,微信公眾號:Geehy極海半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
PSoC 6 MCUBoot和mbedTLS是否支持加密硬件加速?
硬件加速模塊的時鐘設計
關于F28335,在DSP/BIOS使用sin、cos、atan、atan2,都不能得到正確的結果,而其他任務就沒有這個問題請問這是為什么?
找不到3d硬件加速器怎么辦
如何使用RSA硬件加速能多快生成2048bit的密鑰?
Nodemcu無法編譯sin/cos/atan2函數怎么解決?
Mentor Graphics硬件加速仿真服務使用Veloce 硬件加速仿真平臺加速驗證
基于Xilinx FPGA的Memcached硬件加速器的介紹
全新ROS 2 Humble硬件加速特性
如何確定一個硬件加速應用
極海全新發布首款G32R430編碼器專用MCU,為高精度運動控制與位置反饋場景設計
關于極海G32R430編碼器專用MCU和全棧式機器人芯片及應用解決方案介紹
極海G32R430實測ATAN2硬件加速有多快
評論