
簡介本資源是ODrive開源電機(jī)驅(qū)動固件v0.3.6在Keil MDK平臺上的完整移植工程面向嵌入式開發(fā)者、機(jī)器人控制工程師及高校機(jī)電/自動化方向研究者解決FOC磁場定向控制驅(qū)動代碼在ARM Cortex-M4平臺如STM32F4系列上無法直接編譯與調(diào)試的工程化落地問題。壓縮包共436個文件涵蓋97個頭文件h、68個C源碼c、66個依賴描述d與目標(biāo)文件o、65個編譯中間文件crf以及Keil專屬工程配置uvprojx/uvoptx、鏈接腳本sct/ld、調(diào)試配置dbgconf/gdbinit和Python構(gòu)建腳本py/bat結(jié)構(gòu)完整開箱即用于硬件v3.6-56V版本的固件二次開發(fā)與調(diào)試。目前已有3027人學(xué)習(xí)下載資源提供可直接加載的Keil工程框架、預(yù)編譯數(shù)學(xué)庫libarm_cortexM4lf_math.a、多階段構(gòu)建批處理build_env_py.bat等及完整符號調(diào)試支持axf/elf/map文件顯著降低ODrive底層驅(qū)動移植門檻助力快速驗證FOC算法、修改電流環(huán)參數(shù)或接入自定義傳感器。 做機(jī)器人和自動化設(shè)備的人基本都繞不開ODrive這個名字。它是一套把無刷電機(jī)伺服控制做到極致的開源方案一塊板子同時驅(qū)動兩路大功率無刷電機(jī)FOC磁場定向控制、編碼器校準(zhǔn)、CAN通信、USB上位機(jī)交互整套代碼完全開放社區(qū)里從舵機(jī)達(dá)人、機(jī)械臂玩家到工業(yè)設(shè)備開發(fā)者都在用。唯一的門檻是官方固件默認(rèn)用Makefile和ARM GCC構(gòu)建對Windows下習(xí)慣了Keil的工程師非常不友好。我也是折騰了幾天才把ODrive-fw-master-v0.3.6-keil開源驅(qū)動Keil工程完整跑通今天把從源碼分析、工程配置到燒寫調(diào)試的過程全部分享出來。如果你正卡在“源碼拿到了但不知道從哪開始編譯”這一步這篇文章剛好對口。我會先講清楚ODrive固件v0.3.6本身的結(jié)構(gòu)再解釋為什么官方構(gòu)建方式在Windows上難用接著手把手拆解Keil工程里每個關(guān)鍵配置項最后用實際踩過的坑告訴你編譯、燒寫、調(diào)試時最容易被忽略的細(xì)節(jié)。不管你是做畢業(yè)設(shè)計、機(jī)器人競賽還是想把ODrive作為產(chǎn)品的控制核心這套Keil工程都能作為直接起點。1. 項目概述ODrive固件v0.3.6到底是個什么項目1.1 一套完整的開源電機(jī)伺服驅(qū)動方案ODrive是當(dāng)前開源界最活躍的高性能電機(jī)驅(qū)動項目之一核心硬件是一塊基于STM32F405主控的驅(qū)動板主頻168MHzCortex-M4內(nèi)核帶硬件FPU。軟件層面固件負(fù)責(zé)無刷直流電機(jī)和永磁同步電機(jī)的全閉環(huán)控制三相電流采樣、Clarke/Park坐標(biāo)變換、PI調(diào)節(jié)器、SVPWM空間矢量調(diào)制、編碼器信號處理全部在單片機(jī)內(nèi)實時完成。v0.3.6這個版本號屬于ODrive項目早期的穩(wěn)定分支代碼結(jié)構(gòu)相對干凈依賴項少非常適合用來理解FOC控制的完整軟件實現(xiàn)。這一版固件的主要功能點包括兩路電機(jī)的獨立FOC控制、支持增量式編碼器和絕對值編碼器、電機(jī)參數(shù)自動校準(zhǔn)、過流/過溫/過壓保護(hù)、USB虛擬串口通信、UART串口通信、以及簡單CAN通信協(xié)議。用戶可以通過命令行協(xié)議直接讀寫內(nèi)部變量比如查詢母線電壓、設(shè)置目標(biāo)速度、切換電機(jī)狀態(tài)調(diào)試起來非常直觀。1.2 這套Keil工程把使用門檻降到了什么程度官方ODrive固件默認(rèn)的構(gòu)建系統(tǒng)是Makefile加ARM GCC工具鏈這種組合在Linux和macOS環(huán)境下很流暢但在Windows上體驗就完全不同了。你需要自己安裝GNU工具鏈、配置環(huán)境變量、處理路徑分隔符一旦編譯報錯錯誤信息格式也跟Keil不一樣新手很容易卡在環(huán)境搭建這一步。而ODrive-fw-master-v0.3.6-keil這份打包工程做的事情就是把官方v0.3.6源碼整理成了標(biāo)準(zhǔn)的Keil MDK工程打開uvprojx文件配置好芯片型號和宏定義直接點Build就能得到BIN/HEX文件下載和調(diào)試也在同一個IDE里完成。它保留了源碼的完整性沒有任何功能閹割只是把構(gòu)建層從命令行換成了圖形界面。對Windows用戶來說這意味著可以從“先學(xué)會Linux環(huán)境再學(xué)ODrive”變成“打開Keil直接開始”。1.3 適合哪些人參考和復(fù)現(xiàn)這份工程尤其適合三類人。第一類是準(zhǔn)備用ODrive做產(chǎn)品原型或競賽裝置的開發(fā)者他們需要在Windows下快速編譯固件、修改參數(shù)、驗證電機(jī)控制邏輯第二類是正在學(xué)習(xí)FOC和伺服控制的嵌入式愛好者可以直接在Keil里單步調(diào)試觀察電流環(huán)、速度環(huán)、位置環(huán)的實時數(shù)據(jù)第三類是想要把任意Makefile工程遷移到Keil MDK的工程師ODrive是一個很完整的遷移樣例把啟動文件、鏈接腳本、編譯選項這幾個遷移要點看明白其他項目也能照搬方法。2. 構(gòu)建方式對比官方Makefile與Keil工程的核心差異2.1 官方構(gòu)建流程到底卡在哪里ODrive官方源碼中構(gòu)建入口是一個Makefile它調(diào)用arm-none-eabi-gcc等工具鏈完成編譯、匯編、鏈接最終生成elf文件和hex燒錄文件。Makefile里定義了芯片架構(gòu)、浮點單元、優(yōu)化選項、源文件列表、頭文件搜索路徑以及鏈接腳本。這套流程在Linux下只需一條make命令但在Windows上你需要先安裝工具鏈并確保make命令能找到編譯器路徑。更麻煩的是ODrive依賴STM32標(biāo)準(zhǔn)外設(shè)庫和CMSIS頭文件這些依賴在Makefile里通過相對路徑引用一旦目錄結(jié)構(gòu)不完全一致編譯立刻報錯。另外官方默認(rèn)沒有提供BIN/HEX的“一鍵生成”腳本有些版本還需要通過python腳本做后處理這在Windows環(huán)境下非常勸退。2.2 Keil工程體系的工作模式Keil MDK使用uvprojx作為工程文件把所有源文件、頭文件路徑、編譯選項、鏈接配置都集中在一個可視化界面里管理。編譯工具鏈?zhǔn)茿RMCCAC5或armclangAC6它們和GCC在指令集支持方面一致但宏定義、優(yōu)化級別、分散加載文件這些配置方式完全不同。ODrive固件遷移到Keil后最核心的工作就是保證源碼語義不變的同時用Keil的語法重新描述構(gòu)建過程。對比維度官方Makefile構(gòu)建Keil MDK工程編譯器arm-none-eabi-gccARMCC / armclang工程文件Makefile.uvprojx .uvoptx鏈接配置linker script (.ld)分散加載文件 (.sct)啟動文件gcc版startup.sKeil版startup.s調(diào)試方式openocd / pyocdJ-Link / ST-Link / DAP開發(fā)環(huán)境Linux/macOS為主Windows為主2.3 遷移過程中繞不開的四個核心難點第一個難點是啟動文件。GCC版啟動文件和Keil版啟動文件雖然都是匯編但符號命名、段定義、Reset_Handler寫法差異很大不能直接混用。第二個難點是分散加載文件GCC的鏈接腳本用MEMORY和SECTIONS描述地址段Keil用LR_IROM1、RW_IRAM1這類描述符必須重新編寫。第三個難點是編譯宏Keil工程里必須在C/C選項卡中手動定義芯片型號相關(guān)宏否則stm32f4xx.h頭文件根本不會包含正確的寄存器定義。第四個難點是浮點單元配置ODrive控制算法大量使用浮點運算FPU開啟方式和GCC的命令行參數(shù)完全不同配置錯了會直接進(jìn)HardFault。這幾個難點也是所有STM32工程從GCC遷移到Keil的通病。理解了它們你以后再看其他開源項目也能迅速判斷哪些代碼可以直接搬進(jìn)Keil哪些地方需要做適配。3. Keil工程實操從源碼到生成可燒錄固件3.1 工程目錄結(jié)構(gòu)與源碼組織解壓ODrive-fw-master-v0.3.6-keil之后你會看到典型的Keil工程結(jié)構(gòu)。Firmware目錄下是全部固件源碼其中src是核心代碼包含了odrive_main.c、motor_control相關(guān)的文件、通信相關(guān)文件以及各種外設(shè)驅(qū)動。Drivers目錄下是CMSIS和STM32標(biāo)準(zhǔn)外設(shè)庫頭文件這部分是官方源碼自帶的依賴不需要額外下載。在Keil工程中源碼被組織成幾個Group便于管理Startup放啟動文件和系統(tǒng)初始化文件Application放主程序與業(yè)務(wù)邏輯Driver放外設(shè)驅(qū)動Config放配置頭文件。打開工程后建議先核對每個Group里的文件與源碼目錄實際文件是否一一對應(yīng)尤其注意是否有文件引用缺失。Keil在編譯時報“cannot open source file”這類錯誤時80%都是源文件沒有加入工程剩下20%是頭文件路徑?jīng)]包含完整。3.2 芯片型號與啟動文件配置新建或打開工程后第一步要確認(rèn)Target選項卡里的芯片型號是否正確。ODrive v0.3.6固件基于STM32F405芯片型號應(yīng)選擇STM32F405RG或STM32F405VG具體以你手上的硬件為準(zhǔn)。芯片型號選對之后Keil會自動匹配默認(rèn)的啟動文件和內(nèi)存布局但沒有經(jīng)過適配的默認(rèn)啟動文件不一定適用于ODrive源碼建議使用打包工程里自帶的啟動文件確保Reset_Handler、SystemInit、Vectors這些符號符合Keil鏈接器的要求。啟動文件的作用是在芯片上電后完成堆棧初始化、中斷向量表拷貝然后跳轉(zhuǎn)到SystemInit和main函數(shù)。ODrive的main函數(shù)開頭會自行配置PLL時鐘到168MHz因此SystemInit函數(shù)可以不做事但不能缺失否則Keil默認(rèn)啟動文件會報鏈接錯誤。如果你從零開始建工程可以在啟動文件里保留對SystemInit的調(diào)用然后提供一個空實現(xiàn)即可。3.3 C/C選項卡里的關(guān)鍵宏定義ODrive源碼中stm32f4xx.h這個核心頭文件會根據(jù)預(yù)定義宏來決定包含哪些外設(shè)模塊。在Keil中你需要把以下宏加入C/C選項卡的Define欄STM32F40_41xxx,USE_STDPERIPH_DRIVER第一個宏告訴stm32f4xx.h當(dāng)前芯片屬于STM32F405/407系列這樣寄存器結(jié)構(gòu)體、中斷枚舉、外設(shè)基地址才會被正確定義。第二個宏用來啟用標(biāo)準(zhǔn)外設(shè)庫驅(qū)動。ODrive許多外設(shè)操作直接操作寄存器不依賴標(biāo)準(zhǔn)外設(shè)庫的封裝函數(shù)但編譯器在解析某些公共頭文件時依然需要這個宏保持一致性。缺少這兩個宏最典型的癥狀是滿屏報錯找不到RCC、GPIO_TypeDef等類型定義。除了宏定義還要確認(rèn)Language / Code Generation里選擇了C99或更晚的標(biāo)準(zhǔn)。ODrive源碼中部分函數(shù)聲明和變量定義使用C99風(fēng)格如果編譯器默認(rèn)C90會提示變量聲明位置錯誤。Keil AC5環(huán)境通常默認(rèn)支持C99但如果你的工程是從舊項目改過來的一定要手動核對。3.4 FPU和優(yōu)化選項直接影響控制性能ODrive的FOC算法離不開浮點運算STM32F405自帶FPUKeil里必須勾選Single Precision FPU選項并選擇Floating Point Hardware否則軟件浮點實現(xiàn)會導(dǎo)致計算耗時翻倍電流環(huán)頻率根本跑不上去。在AC5環(huán)境下勾選FPU后編譯器的float運算會生成硬件浮點指令調(diào)試時寄存器窗口能直接看到FPU寄存器的值。在AC6環(huán)境下同樣要選擇硬件浮點。這里有一個經(jīng)常被忽略的坑如果Target選項卡的浮點選項是“Not Used”即使代碼里沒有任何浮點運算報錯運行時一旦某個函數(shù)使用了浮點就會進(jìn)入HardFault。優(yōu)化選項方面ODrive控制循環(huán)對時序敏感建議使用-O2或-O3平衡性能。但調(diào)試階段可以選擇-O0以獲得更好的單步體驗。我自己的經(jīng)驗是編譯發(fā)布版本前先做一次-O2編譯如果代碼沒有未定義行為性能會比-O0快很多電流環(huán)可以穩(wěn)定跑在更高的頻率。3.5 分散加載文件與內(nèi)存規(guī)劃STM32F405RG擁有1MB Flash和128KB SRAM加上64KB CCM內(nèi)存。ODrive固件編譯產(chǎn)物大約在200KB左右Flash空間非常充裕。SRAM占用會根據(jù)配置的緩沖區(qū)大小變化標(biāo)準(zhǔn)配置下占用在幾十KB級別所以默認(rèn)分散加載文件可以這樣寫LR_IROM1 0x08000000 0x00100000 { ER_IROM1 0x08000000 0x00100000 { *.o (RESET, First) *(InRoot$$Sections) .ANY (RO) .ANY (XO) } RW_IRAM1 0x20000000 0x00020000 { .ANY (RW ZI) } }這里的關(guān)鍵是把0x20000000開始的SRAM區(qū)域大小寫成0x00020000也就是128KB。ODrive通常不使用CCM內(nèi)存因為CCM不支持DMA訪問而電流采樣和通信緩沖區(qū)可能依賴DMA強行放進(jìn)去會引發(fā)隨機(jī)性故障。如果你的Keil工程使用默認(rèn)分散加載RAM區(qū)域可能會被設(shè)成0x00030000這會把CCM也納入RW區(qū)編譯不會報錯但運行時可能出現(xiàn)莫名的數(shù)據(jù)損壞。另外如果ODrive源碼里自定義了較大的日志緩沖區(qū)或通信環(huán)形隊列RW_IRAM1大小需要相應(yīng)加大但絕不能超過0x00030000。我用過的配置是0x00028000預(yù)留了足夠的堆??臻g實測穩(wěn)定。3.6 編譯鏈接時的常見問題速查編譯過程最容易出現(xiàn)的是L6218E未定義符號錯誤。原因是鏈接階段缺少某個模塊或庫文件常見的解決方法是回到Project窗口確認(rèn)所有.c文件都已加入工程。ODrive源碼中有些文件是條件編譯的比如只針對特定編碼器的驅(qū)動如果你的硬件型號不滿足條件編譯器不會報錯但鏈接器會因為缺少對應(yīng)函數(shù)而報錯。L6220E區(qū)域溢出則是Flash或RAM分配超限。排查方法是看.map文件分析哪個段占用了太多空間。我遇到過一次因為把日志緩沖數(shù)組從static改成全局變量導(dǎo)致RW段暴漲最終RAM溢出把緩沖區(qū)放回static后問題解決。還有一類編譯警告比如聲明未使用變量、隱式函數(shù)聲明雖然不影響hex生成但在Keil AC5下可能伴隨C279等警告號建議不要忽略。ODrive源碼對編譯器版本比較敏感如果警告內(nèi)容指向某個系統(tǒng)函數(shù)先檢查宏定義是否完整再檢查啟動文件和系統(tǒng)文件版本是否匹配。4. 燒寫與調(diào)試讓電機(jī)真正轉(zhuǎn)起來4.1 下載器選擇和硬件連接ODrive板子提供SWD調(diào)試接口可以接ST-Link、J-Link或DAP-Link。默認(rèn)情況下板子已經(jīng)通過SWD口供電給主控但電機(jī)驅(qū)動部分需要單獨的主電源供電。我推薦使用ST-Link V2或更高版本兼容性好價格便宜Keil里選擇ST-Link Debugger就能直接識別。在Options for Target的Debug選項卡里選擇調(diào)試器后進(jìn)入Settings確認(rèn)SW設(shè)備列表能識別到目標(biāo)芯片。如果識別不到先檢查SWD四根線尤其是復(fù)位線。ODrive板載的復(fù)位電路比較簡單個別情況下需要手動給NRST引腳接10k上拉到3.3V否則ST-Link會一直報連接失敗。4.2 Flash Download算法與燒錄流程在Utilities選項卡中選擇Settings后進(jìn)入Flash Download頁面。這里需要添加正確的燒錄算法對于STM32F405RG選擇STM32F4xx 1MB Flash算法。地址起始是0x08000000大小根據(jù)芯片實際Flash容量填寫。編程算法不對會直接導(dǎo)致下載失敗報錯信息通常是“No Algorithm found for address范圍”。Keil默認(rèn)會在下載前先擦除整個芯片這個選項在Full Chip Erase里。ODrive固件出廠時有一個bootloader區(qū)如果你只是升級應(yīng)用固件可以選擇Erase Sectors而不是Full Chip Erase避免誤刪bootloader。但如果是第一次燒錄裸板建議全片擦除避免殘留的無意義數(shù)據(jù)干擾啟動。勾選Reset and Run后燒錄完成會自動復(fù)位運行。你會發(fā)現(xiàn)板子的LED開始閃爍USB設(shè)備被電腦識別為串口設(shè)備說明固件啟動成功。如果沒有反應(yīng)大概率是主電源未正常供電或者復(fù)位電路異常先檢查這兩個環(huán)節(jié)。4.3 Keil調(diào)試器里看FOC實時變量ODrive固件中每個電機(jī)相關(guān)的變量都掛在全局結(jié)構(gòu)體下比如axis0、axis1。在Keil調(diào)試模式下可以通過Watch窗口添加axis0.controller.pos_estimate這樣的變量實時觀察位置估計值、速度值、電流值。由于FPU已開啟Watch窗口還能正確顯示浮點變量的數(shù)值。設(shè)置斷點時要注意如果編譯優(yōu)化級別是-O2代碼行和匯編指令并非一一對應(yīng)斷點可能落在意料之外的指令上。調(diào)試控制算法時我通常先把優(yōu)化將到-O0或-Og確認(rèn)邏輯正確后再切回高優(yōu)化重新編譯。這樣做雖然時間成本高一點但能避免“代碼明明看著對跑起來全不對”的詭異情況。還有一個實用技巧ODrive支持通過串口終端實時查看內(nèi)部狀態(tài)。接好UART后通過任意串口工具連接對應(yīng)COM口波特率1152008N1格式。當(dāng)電機(jī)處于閉環(huán)狀態(tài)時可以向板子發(fā)送r axis0.encoder.pos_estimate查詢當(dāng)前位置發(fā)送w axis0.controller.input_pos 1.0讓電機(jī)轉(zhuǎn)到指定角度。這個方式在Keil調(diào)試之外提供了另一條驗證通道尤其適合快速驗證通信鏈路是否正常。4.4 第一次上電前必須確認(rèn)的安全項大功率無刷電機(jī)ODrive板默認(rèn)支持24V和48V供電任何一次上電都要認(rèn)真檢查接線。電機(jī)相線U/V/W不能接反否則編碼器校準(zhǔn)和方向檢測都會亂。編碼器線如果是SPI絕對值編碼器注意CS、CLK、DO、DI四根線的電平匹配。電機(jī)沒有固定好的情況下千萬不要給閉環(huán)指令。啟動校準(zhǔn)流程時電機(jī)會自動施加電流并轉(zhuǎn)動到一個固定位置如果電機(jī)沒有固定在臺鉗或結(jié)構(gòu)件上可能會甩飛傷人或損壞連線。這是ODrive調(diào)試中最常見的安全事故比代碼問題更值得警惕。5. 常見問題與排查實錄5.1 編譯階段報錯對照表錯誤/警告可能原因解決方案Cannot open source file源文件沒有加入工程在Project窗口手動添加對應(yīng).c文件unknown type name RCC_TypeDef芯片宏定義缺失在C/C Define欄添加STM32F40_41xxxL6218E: Undefined symbol鏈接階段缺少函數(shù)實現(xiàn)檢查條件編譯是否屏蔽了必要模塊L6220E: Region overflowFlash或RAM超限查看.map文件縮小緩沖區(qū)或優(yōu)化代碼體積L6050U鏈接輸出的庫/模塊名沖突檢查啟動文件和標(biāo)準(zhǔn)庫版本是否匹配error #541Keil組件包版本異常在Pack Installer里修復(fù)安裝對應(yīng)組件error #541是我在Keil新版MDK中遇到最多的軟件環(huán)境問題并不是ODrive源碼導(dǎo)致的。它通常在打開舊工程時出現(xiàn)原因是工程引用的某種ARM Compiler包或調(diào)試組件沒有正確安裝。解決方法是進(jìn)入Pack Installer找到對應(yīng)的Keil::ARM_Compiler包點擊Update或Reinstall再回到工程重新編譯。這個坑在2019年以后的MDK版本里頻繁出現(xiàn)如果你用的是ARM Compiler 6可能會遇到更多組件版本兼容問題。5.2 下載失敗和上電無響應(yīng)下載時如果提示“RDDI-DAP Error”或“No Target connected”優(yōu)先檢查SWD連接和復(fù)位電路。一個很容易漏掉的問題是接入ST-Link時USB線和接線過長會導(dǎo)致信號噪聲這時把SWD速率降低到1MHz以下通??梢越鉀Q。固件燒錄后板子沒有響應(yīng)先區(qū)分是固件沒運行還是運行了但外設(shè)異常。ODrive板子上有狀態(tài)LED如果LED不亮先量主控供電電壓是否正常。如果LED閃爍但USB不識別可能是USB時鐘配置問題檢查源碼里的時鐘樹配置和板載晶振頻率是否匹配。ODrive官方多數(shù)版本使用8MHz晶振內(nèi)部PLL倍頻到168MHz。如果晶振頻率不對USB枚舉會失敗但電機(jī)控制可能看起來正常。5.3 電機(jī)抖動、發(fā)熱和不轉(zhuǎn)圈的排查順序電機(jī)接入后如果出現(xiàn)抖動或堵轉(zhuǎn)不要急著改代碼。先校準(zhǔn)電機(jī)參數(shù)ODrive會自動測量電機(jī)電阻、電感、極對數(shù)校準(zhǔn)結(jié)果會寫入板載存儲。如果電機(jī)在校準(zhǔn)環(huán)節(jié)就一直失敗極大概率是電機(jī)相線接觸不良或編碼器數(shù)據(jù)異常。編碼器的count方向、校準(zhǔn)角度、增量值都必須穩(wěn)否則電流環(huán)反饋符號是反的電機(jī)只會越來越偏離目標(biāo)位置最后過流保護(hù)。還有一個很隱蔽的問題ODrive的電流采樣依賴低側(cè)分流電阻如果板子主電源地線沒有接好電流信號會持續(xù)漂移導(dǎo)致電流環(huán)震蕩。遇到這種情況檢查電源地和驅(qū)動板地之間的壓差必要時用短而粗的導(dǎo)線直接短接各組地。6. 個人經(jīng)驗這套工程還能怎么擴(kuò)展ODrive-fw-master-v0.3.6-keil這套Keil工程最讓我滿意的部分不是它能編譯通過而是它把源碼、依賴、工具鏈全部固化在了一個普通嵌入式工程師最熟悉的工具鏈里。改一行參數(shù)、重新編譯、燒錄、看波形全程十分鐘內(nèi)完成這在之前的Linux加GCC流程里是不敢想的。如果你已經(jīng)成功燒錄并讓電機(jī)轉(zhuǎn)起來下一步我建議做兩件事第一在Keil的調(diào)試模式下用實時波形窗口觀察電流環(huán)和速度環(huán)的響應(yīng)曲線把PI參數(shù)從源碼層面調(diào)一遍理解每一個增益對系統(tǒng)動態(tài)的影響第二把ODrive通信協(xié)議和你的主控板對接用串口或CAN把電機(jī)狀態(tài)量傳回上位機(jī)完成一個完整的運動控制鏈路。這套代碼無論用于學(xué)習(xí)還是二次開發(fā)都是一個極其合適的載體。調(diào)試FOC類驅(qū)動時我個人最大的體會是代碼編譯通過只是開始真正的難點在信號鏈。電流采樣噪聲、編碼器時刻偏差、PWM死區(qū)效應(yīng)任何一個環(huán)節(jié)都會讓電機(jī)表現(xiàn)“飄”。學(xué)會在Keil調(diào)試器里觀察內(nèi)部變量和存儲器數(shù)據(jù)比看任何理論公式都更能幫助你建立直覺。希望這篇ODrive固件v0.3.6的Keil工程實操分享能幫你少走一段彎路。本文還有配套的精品資源點擊獲取