電調(diào)開發(fā)實(shí)戰(zhàn):從環(huán)境搭建到固件燒錄)
1. 項(xiàng)目概述最近一直在折騰無人機(jī)電調(diào)方向的開發(fā)手頭拿到的這塊STEVAL-ESC002V1評估板確實(shí)讓我花了不少時(shí)間。這塊板子不同于普通市售電調(diào)它是意法半導(dǎo)體為無人機(jī)和機(jī)器人應(yīng)用設(shè)計(jì)的電子速度控制器參考設(shè)計(jì)核心控制器用的是STSPIN32F0A——一顆把STM32F0系列MCU和三相柵極驅(qū)動器集成在一起的系統(tǒng)級封裝芯片。要在這塊板子上跑自己的固件繞不開的就是STM32CubeIDE這個(gè)官方開發(fā)環(huán)境。STM32CubeIDE其實(shí)是一個(gè)基于Eclipse架構(gòu)的免費(fèi)IDE內(nèi)置了STM32CubeMX配置工具、GCC交叉編譯工具鏈以及調(diào)試支持。對于玩過Keil或者IAR的朋友來說第一次切換到STM32CubeIDE可能會有點(diǎn)不適應(yīng)但它對ST自家芯片和板子的支持確實(shí)是最完整的。尤其是電機(jī)控制這個(gè)方向ST推出的MC SDK軟件包和CubeMX的圖形化配置能力配合起來能省掉非常多底層的初始化工作。這篇內(nèi)容適合誰我覺得只要是對無人機(jī)ESC開發(fā)、無刷電機(jī)FOC/方波控制感興趣或者手里正好有一塊STEVAL-ESC002V1不知道如何下手的朋友都可以參考。我會把我從搭環(huán)境到成功燒錄固件的完整過程寫出來包括踩過的坑和排查思路盡量讓你少走彎路。2. 硬件核心STEVAL-ESC002V1到底長什么樣2.1 STSPIN32F0A系統(tǒng)級封裝芯片STEVAL-ESC002V1最核心的器件就是STSPIN32F0A這個(gè)封裝內(nèi)部集成了三部分關(guān)鍵功能STM32F031C6或STM32F051系列MCU內(nèi)核、三相半橋柵極驅(qū)動器以及DC/DC降壓轉(zhuǎn)換器和LDO穩(wěn)壓器。很多人第一次拆開板子看到這個(gè)芯片會誤以為它只是一個(gè)普通的電機(jī)驅(qū)動IC但實(shí)際上它的核心是一個(gè)完整的MCU這意味著你可以完全自主編程而不是像傳統(tǒng)ESC那樣只能依賴出廠固件。芯片內(nèi)部MCU的主頻是48MHzFlash容量視具體型號而定對于電機(jī)控制這種實(shí)時(shí)性要求高但對存儲容量需求不是特別大的場景來說完全夠用。柵極驅(qū)動器部分支持最高600mA的拉灌電流能力可以直接驅(qū)動外部功率MOSFET。板載的DC/DC轉(zhuǎn)換器能把輸入電壓降到3.3V給MCU供電所以不需要額外再接一路邏輯電源。2.2 板載功率級與電流檢測設(shè)計(jì)STEVAL-ESC002V1的功率級采用三相全橋結(jié)構(gòu)每一相由兩個(gè)N溝道功率MOSFET組成。這塊板子在電源輸入端的支持范圍是6.5V到48V部分版本支持更寬范圍具體取決于板子上的MOSFET耐壓等級。實(shí)際測試中我使用3S鋰電池也就是12.6V滿電電壓功率余量很大。需要注意的是板子上的電流檢測方案它采用低邊采樣電阻加運(yùn)算放大器放大電流信號經(jīng)過放大后送入MCU的ADC引腳。這種低邊采樣方案成本低、實(shí)現(xiàn)簡單但缺點(diǎn)是采樣波形在PWM開關(guān)瞬間會有較大的噪聲需要在軟件里做同步采樣或者濾波處理。我現(xiàn)在用的固件是MCSDK的六步換相版本在處理電流信號時(shí)采用的是與PWM信號同步的觸發(fā)采樣方式效果比連續(xù)采樣穩(wěn)定得多。2.3 輸入信號接口與協(xié)議支持板子上預(yù)留了三類控制信號接口標(biāo)準(zhǔn)PWM信號輸入、PWM/DIR方向控制輸入和CAN總線接口。通用航模接收機(jī)或飛控輸出的50Hz到500Hz標(biāo)準(zhǔn)PWM信號是最常見的輸入方式MCU通過輸入捕獲功能解析脈寬把脈寬映射為期望轉(zhuǎn)速。而PWM/DIR模式在工業(yè)自動化中更常用一路PWM控制速度一路GPIO控制旋轉(zhuǎn)方向。CAN接口則是為了支持更復(fù)雜的多電調(diào)通信協(xié)議ST官方也提供了專門的固件例子來演示如何在CAN總線上控制電調(diào)。2.4 接線與供電注意事項(xiàng)第一次給這塊板上電之前有幾個(gè)點(diǎn)一定要確認(rèn)清楚。首先檢查輸入電源極性板子雖然有反接保護(hù)但我不建議去賭這個(gè)保護(hù)。其次確認(rèn)信號線共地不管是PWM信號還是CAN信號都必須和主控板共地否則信號完全不可靠。我在調(diào)試中出現(xiàn)過一次燒錄失敗最后排查出原因是信號線參考地電位漂移USB雖然連著電腦但電源地并沒有和電調(diào)電源地連在一起。官方的使用文檔中明確標(biāo)注了板子的最大持續(xù)工作電流測試時(shí)盡量留出30%以上的降額畢竟散熱條件在實(shí)際測試環(huán)境中很難達(dá)到數(shù)據(jù)手冊的理想狀態(tài)。我一般會在電源輸入端串一個(gè)電流限制的電子負(fù)載或直流穩(wěn)壓電源把限流值設(shè)到預(yù)期電流的1.2倍左右這樣即使程序?qū)戝e(cuò)導(dǎo)致MOS管直通也不會立刻燒毀板子。3. 環(huán)境準(zhǔn)備搭好STM32CubeIDE開發(fā)環(huán)境3.1 STM32CubeIDE版本選擇與安裝STM32CubeIDE版本迭代挺快的我建議直接從ST官網(wǎng)下載最新版本。安裝過程在Windows平臺下比較簡單一路Next到底就行。要注意的是安裝路徑最好不要包含中文或空格雖然新版IDE已經(jīng)對路徑兼容性做了優(yōu)化但有些第三方工具鏈插件仍然對路徑很敏感尤其是后面如果需要使用OpenOCD或者SEGGER的調(diào)試器路徑問題最容易引出莫名其妙的問題。Linux環(huán)境下安裝方式類似解壓后運(yùn)行install腳本。不過在Ubuntu下需要提前裝好一些依賴庫否則J-Link調(diào)試器可能無法被識別。其實(shí)我目前主要還是在Windows環(huán)境下開發(fā)畢竟做電機(jī)調(diào)試的時(shí)候Windows下可用的上位機(jī)工具更多。3.2 安裝MC SDK電機(jī)控制軟件包軟件環(huán)境除了IDE本身還需要安裝電機(jī)控制相關(guān)的依賴。在STM32CubeIDE中可以通過Help菜單里的Additional Software功能在線安裝ST Motor Control SDKMCSDK。這個(gè)SDK是整個(gè)電機(jī)控制項(xiàng)目的基礎(chǔ)里面包含了電機(jī)控制中間件、適用于不同ST評估板的固件工程模板、以及一些監(jiān)控調(diào)試工具。需要注意的坑在這里MCSDK發(fā)布時(shí)會綁定特定的IDE版本和HAL庫版本如果IDE版本過新或者過舊可能會出現(xiàn)插件無法正常加載的問題。我最初裝的是當(dāng)時(shí)最新版的STM32CubeIDE結(jié)果MCSDK還是上一個(gè)版本導(dǎo)致工程無法導(dǎo)入。后來只好卸載新版本重新安裝了MCSDK官方文檔中明確支持的IDE版本。所以安裝之前一定要先看MCSDK Release Notes中關(guān)于IDE兼容性的說明。3.3 創(chuàng)建與導(dǎo)入固件工程安裝完MCSDK之后有兩種方式拿到STEVAL-ESC002V1的固件工程。第一種是從CubeMX直接新建項(xiàng)目選擇Board Selector搜索STEVAL-ESC002V1然后由系統(tǒng)自動生成基于HAL的裸機(jī)工程。第二種是從MCSDK安裝目錄下找到專門為這塊板子提供的Motion Control示例工程直接以現(xiàn)有工程的形式導(dǎo)入IDE。我第一次使用CubeMX方式生成工程時(shí)遇到一個(gè)問題CubeMX生成的默認(rèn)工程只包含基礎(chǔ)的GPIO和時(shí)鐘配置并沒有集成電機(jī)控制庫。后來我才搞清楚通過CubeMX生成工程后還需要在工程屬性里配置MCSDK的庫路徑或者手動將MCSDK中間件文件夾添加到include路徑和鏈接路徑中。這個(gè)步驟非常關(guān)鍵否則編譯時(shí)會出現(xiàn)大量找不到頭文件的報(bào)錯(cuò)。3.4 編譯器與調(diào)試器配置STM32CubeIDE內(nèi)嵌的GCC工具鏈?zhǔn)蔷幾gARM Cortex-M0系列的絕佳選擇但默認(rèn)優(yōu)化級別是-O0面向調(diào)試階段沒問題。真正測試電機(jī)控制算法時(shí)如果發(fā)現(xiàn)PWM波形時(shí)序抖動比較明顯可以把優(yōu)化級別提升到-O2。但是升級優(yōu)化級別之后有些依賴時(shí)序的代碼行為會發(fā)生改變比如讀取定時(shí)器CNT寄存器或者ADC轉(zhuǎn)換完成標(biāo)志位的時(shí)候可能會因?yàn)榫幾g器重排指令而產(chǎn)生細(xì)微的時(shí)序偏差。這種情況我在調(diào)電流環(huán)PI參數(shù)時(shí)遇到過后來在關(guān)鍵代碼處加了volatile修飾符問題才得到解決。調(diào)試器方面STEVAL-ESC002V1板子上并沒有板載ST-Link需要在SWD接口上外接調(diào)試器。我推薦使用正版ST-Link/V2或者J-Link。在STM32CubeIDE的Run Configuration里選擇對應(yīng)的調(diào)試器接口并設(shè)置好SWV串行線查看器的時(shí)鐘頻率。SWV在電機(jī)控制調(diào)試中非常好用可以實(shí)時(shí)輸出變量變化曲線特別適合觀測轉(zhuǎn)速和電流波形。4. 固件架構(gòu)與核心設(shè)計(jì)思路4.1 電機(jī)控制算法選型STEVAL-ESC002V1的官方固件支持兩種控制算法六步換相也叫做梯形波控制或方波控制和磁場定向控制FOC。六步換相算法實(shí)現(xiàn)簡單通過對三相繞組按固定順序通電利用反電動勢檢測來完成換相適用于對低速性能要求不高的場景。它的優(yōu)點(diǎn)是CPU占用率低、對MCU的運(yùn)算能力要求不高在48MHz的STM32F0系列上跑起來非常輕松。缺點(diǎn)也同樣明顯因?yàn)榉措妱觿莸姆岛娃D(zhuǎn)速成正比在電機(jī)零速和極低速時(shí)反電動勢接近于零所以低轉(zhuǎn)速性能很差還有明顯的轉(zhuǎn)矩脈動。FOC算法則是通過Clark變換和Park變換將三相電流轉(zhuǎn)換為旋轉(zhuǎn)坐標(biāo)系下的直軸和交軸分量從而實(shí)現(xiàn)對電機(jī)轉(zhuǎn)矩的線性控制。FOC在低速性能和動態(tài)響應(yīng)方面遠(yuǎn)優(yōu)于六步換相但是計(jì)算量也大得多對采樣同步性要求高。STM32F0雖然主頻不高但憑借Cortex-M0內(nèi)核的高效運(yùn)算能力和ST提供的數(shù)學(xué)優(yōu)化庫依然能在適當(dāng)?shù)腜WM頻率下跑通FOC只是需要精心設(shè)計(jì)控制頻率和中斷優(yōu)先級。我實(shí)際在STEVAL-ESC002V1上對比過這兩種算法。使用六步換相時(shí)電機(jī)從靜止啟動需要人為設(shè)定一個(gè)起始的強(qiáng)制換相序列否則無法判斷轉(zhuǎn)子位置而使用FOC時(shí)可以通過注入高頻信號或者簡單的開環(huán)強(qiáng)拉方式實(shí)現(xiàn)平穩(wěn)啟動。如果你計(jì)劃把這套電調(diào)用于無人機(jī)螺旋槳驅(qū)動強(qiáng)烈建議上FOC雖然調(diào)試難度高一些但最終性能和噪音水平都更理想。4.2 電流采樣策略與PWM同步STSPIN32F0A片上集成的運(yùn)放將采樣電阻上的電流信號放大后送入MCU的ADC通道。問題來了PWM開關(guān)瞬間的噪聲非常大如果ADC持續(xù)采樣得到的電流值會包含嚴(yán)重的開關(guān)噪聲PI控制器看到這種噪聲后會瘋掉。解決方案是采用PWM中間對齊采樣。ST的電機(jī)控制庫中定義了特殊定時(shí)器事件來觸發(fā)ADC采樣確保ADC在每個(gè)PWM周期內(nèi)電流處于穩(wěn)態(tài)時(shí)才啟動轉(zhuǎn)換。具體實(shí)現(xiàn)時(shí)配置定時(shí)器的重復(fù)計(jì)數(shù)寄存器使得ADC在PWM周期的下溢事件或者中心計(jì)數(shù)匹配事件時(shí)刻觸發(fā)。這種方案需要仔細(xì)調(diào)整采樣觸發(fā)時(shí)刻因?yàn)殡娏髟陂_關(guān)管導(dǎo)通后半段才趨于穩(wěn)定采樣點(diǎn)太早會采到振鈴信號太晚會接近開關(guān)關(guān)斷時(shí)刻的電流下降沿。我這里提供一個(gè)經(jīng)驗(yàn)值對于20kHz的PWM頻率PWM周期是50微秒我一般在PWM高電平持續(xù)的中間位置觸發(fā)采樣偏移量設(shè)置在PWM周期的25%到30%左右。當(dāng)然這個(gè)值不是固定的需要結(jié)合MOSFET柵極驅(qū)動電阻、電流放大器帶寬等參數(shù)微調(diào)。你可以通過STM32CubeIDE的調(diào)試模式實(shí)時(shí)觀察ADC采樣值配合示波器對比電流波形找到最佳采樣點(diǎn)。4.3 速度環(huán)與電流環(huán)的級聯(lián)控制官方固件中默認(rèn)的控制結(jié)構(gòu)是級聯(lián)結(jié)構(gòu)外環(huán)是速度環(huán)內(nèi)環(huán)是電流環(huán)或轉(zhuǎn)矩環(huán)。速度環(huán)的輸出作為電流環(huán)的參考輸入電流環(huán)的輸出經(jīng)過PWM調(diào)制后驅(qū)動功率級。這種結(jié)構(gòu)的優(yōu)勢在于物理含義清晰便于參數(shù)整定。以FOC為例電流環(huán)PI控制器的帶寬通常設(shè)置為速度環(huán)帶寬的5到10倍。我在這塊板子上設(shè)置的電流環(huán)控制頻率為20kHz速度環(huán)為2kHz。如果你的PWM頻率是20kHz那么電流環(huán)可以每個(gè)PWM周期執(zhí)行一次而速度環(huán)每10個(gè)PWM周期執(zhí)行一次。實(shí)現(xiàn)方式是在PWM中斷服務(wù)函數(shù)里用一個(gè)計(jì)數(shù)器對周期進(jìn)行分頻代碼里只需要一個(gè)static變量累加輕松實(shí)現(xiàn)多速率控制。4.4 保護(hù)機(jī)制的固件實(shí)現(xiàn)電機(jī)控制固件里最不能省的就是保護(hù)機(jī)制。STEVAL-ESC002V1提供硬件級的過流保護(hù)和過溫保護(hù)但固件層面還需要自己實(shí)現(xiàn)軟件保護(hù)邏輯雙保險(xiǎn)才能避免炸管。我在固件中實(shí)現(xiàn)了三類軟件保護(hù)過流保護(hù)、欠壓保護(hù)、堵轉(zhuǎn)保護(hù)。過流保護(hù)的實(shí)現(xiàn)最簡單也最直接——在電流環(huán)中斷里比較三相電流的絕對值如果持續(xù)超過設(shè)定閾值1ms直接關(guān)閉PWM輸出并鎖存故障狀態(tài)。注意這里的持續(xù)時(shí)間的判斷很重要因?yàn)殡姍C(jī)啟動瞬間會有較高的浪涌電流瞬時(shí)過流不一定代表故障直接關(guān)斷反而會導(dǎo)致啟動失敗。欠壓保護(hù)主要針對電池供電場景電池電壓在放電末期會急劇下降如果不及時(shí)保護(hù)MOSFET會工作在非完全導(dǎo)通狀態(tài)導(dǎo)致熱損耗劇增。堵轉(zhuǎn)保護(hù)的實(shí)現(xiàn)思路是檢測速度環(huán)的誤差值如果給定轉(zhuǎn)速很高但實(shí)際轉(zhuǎn)速在較長時(shí)間內(nèi)沒有提升就判定為堵轉(zhuǎn)主動關(guān)斷PWM。4.5 通信協(xié)議與參數(shù)在線調(diào)整官方固件中預(yù)留了通過UART串口進(jìn)行參數(shù)調(diào)整的功能。通過串口命令行接口可以實(shí)時(shí)修改PID參數(shù)、PWM頻率、啟??刂频群诵膮?shù)。這個(gè)功能在調(diào)試階段幫助非常大不用每次改參數(shù)就重新編譯燒錄。我建議在開發(fā)初期就搭好一套完整的串口通信協(xié)議即使官方固件沒有提供也可以基于HAL庫的UARTDMA中斷自己實(shí)現(xiàn)一個(gè)輕量級的指令解析器。協(xié)議格式可以參考常見的AT指令風(fēng)格或者采用簡單的幀格式幀頭命令字?jǐn)?shù)據(jù)長度數(shù)據(jù)體CRC校驗(yàn)。串口波特率設(shè)置為115200或者更高注意在電機(jī)運(yùn)行時(shí)串口中斷和PWM中斷之間的優(yōu)先級安排盡量把串口中斷放在低優(yōu)先級避免干擾實(shí)時(shí)控制。5. 實(shí)操過程從編譯到燒錄的全流程記錄5.1 編譯前設(shè)置與工程配置檢查在執(zhí)行編譯之前有幾項(xiàng)工程配置必須逐項(xiàng)確認(rèn)。第一項(xiàng)是芯片型號確保工程中選定的目標(biāo)芯片是板子上實(shí)際焊接的型號如果Boot引腳配置不同F(xiàn)lash大小可能不匹配。第二項(xiàng)是時(shí)鐘配置STSPIN32F0A內(nèi)部雖然有HSI振蕩器但電機(jī)控制對時(shí)鐘精度要求較高建議使用外部晶振或者利用內(nèi)部PLL將系統(tǒng)時(shí)鐘提升到48MHz。在CubeMX圖形化界面中直接配置時(shí)鐘樹比手動修改寄存器可靠得多。第三項(xiàng)是優(yōu)化等級。調(diào)試階段保持-O0正式功能驗(yàn)證時(shí)改為-O2。但要注意在FOC算法中涉及arm_sin_f32之類的數(shù)學(xué)函數(shù)時(shí)優(yōu)化等級對計(jì)算精度的影響有時(shí)是意想不到的最好在改優(yōu)化等級后重新驗(yàn)證一次電機(jī)輸出波形的質(zhì)量。5.2 編譯錯(cuò)誤排查實(shí)錄我在第一次編譯下載的官方示例工程時(shí)遇到了幾個(gè)令人抓狂的錯(cuò)誤。第一個(gè)錯(cuò)誤是找不到stm32f0xx_hal_conf.h頭文件。排查后發(fā)現(xiàn)是MCSDK頭文件的包含路徑?jīng)]有完全配置好IDE的Include路徑里缺少M(fèi)CSDK中間件目錄。解決辦法是在工程屬性里的C/C General→Paths and Symbols選項(xiàng)中手動添加MCSDK的Middlewares目錄以及對應(yīng)芯片型號的HAL驅(qū)動目錄。第二個(gè)錯(cuò)誤是鏈接器報(bào)錯(cuò)undefined reference to MCTRL_StartMotor這類函數(shù)是電機(jī)控制庫中的接口函數(shù)。出現(xiàn)這個(gè)錯(cuò)誤的原因是庫文件.a文件沒有被正確鏈接。在工程屬性的Linker配置中檢查Library Search Path是否包含對應(yīng)庫文件的目錄同時(shí)確認(rèn)Library Names中填寫的庫名稱沒有拼寫錯(cuò)誤。庫文件名在MCSDK不同版本中可能有差異不要想當(dāng)然。第三個(gè)錯(cuò)誤跟啟動文件有關(guān)報(bào)的是Reset_Handler重復(fù)定義。這個(gè)問題常見于工程里同時(shí)包含了ST官方的startup_stm32f0xx.s文件和CubeMX自動生成的啟動文件兩個(gè)文件中的向量表重復(fù)定義了。解決辦法是刪除CubeMX生成工程時(shí)附帶的那份啟動文件保留MCSDK工程模板自帶的版本。5.3 燒錄過程與調(diào)試器連接STEVAL-ESC002V1板上預(yù)留的SWD接口是4針SWDIO、SWCLK、GND、3V3或者VDDA。我使用ST-Link/V2連接順序如下ST-Link的SWDIO接板子的SWDIO引腳ST-Link的SWCLK接板子的SWCLK引腳GND接GND必須3.3V參考電壓接板子的3V3引腳用于電平轉(zhuǎn)換參考燒錄前在Run Configuration中確認(rèn)調(diào)試器類型選擇ST-Link接口選擇SWD并將時(shí)鐘頻率設(shè)置為4MHz即可。如果你使用J-Link需要在Debug Probe中選擇SEGGER J-Link然后設(shè)置Device為對應(yīng)的STM32芯片型號。燒錄過程中如果出現(xiàn)Cannot connect to target先檢查接線再用萬用表量一下SWDIO和SWCLK引腳上的電平是否正常可以用示波器看是否有波形不排除調(diào)試器固件版本過舊需要升級的情況。5.4 首次上電波形驗(yàn)證燒錄完成并復(fù)位板子后不要急著接電機(jī)。先用示波器測量三個(gè)下橋臂MOSFET的柵極驅(qū)動信號也就是MCU輸出的PWM波形經(jīng)過柵極驅(qū)動器后的信號。正常情況下的PWM頻率應(yīng)該和代碼中配置一致占空比在執(zhí)行方向指令后應(yīng)該有規(guī)律地變化。我之前犯過的錯(cuò)誤直接接上電機(jī)然后發(fā)現(xiàn)電機(jī)不轉(zhuǎn)反復(fù)檢查固件也沒找到問題。后來用示波器一測才發(fā)現(xiàn)PWM波形根本就沒輸出。根本原因是我在初始化階段把PWM輸出引腳復(fù)用配置錯(cuò)誤PA8引腳被配置成了普通GPIO而非TIM1_CH1的復(fù)用功能。CubeMX中圖形化的引腳配置比較容易發(fā)現(xiàn)這類問題但如果你是手動初始化這一步很容易遺漏。5.5 上位機(jī)監(jiān)測與數(shù)據(jù)驗(yàn)證ST的MCSDK工具包中帶有Motor Pilot或者Workbench上位機(jī)軟件通過串口或USB連接板和PC后可以實(shí)時(shí)顯示電機(jī)轉(zhuǎn)速、母線電壓、三相電流、功率等參數(shù)還可以修改PID參數(shù)并立即生效。我在實(shí)際調(diào)試中就是通過這臺軟件觀測電流波形發(fā)現(xiàn)電流環(huán)的比例系數(shù)設(shè)定過大導(dǎo)致電流波形出現(xiàn)明顯振蕩把Kp從0.003降到0.0015之后波形明顯平滑。這種在線調(diào)整參數(shù)的能力和反復(fù)編譯燒錄的調(diào)試節(jié)奏相比效率實(shí)在高太多了。6. 常見問題排查與經(jīng)驗(yàn)總結(jié)6.1 電機(jī)啟動失敗或起步無力這類問題通常是啟動策略不合理導(dǎo)致的。對于無感FOC電機(jī)在零速時(shí)無法通過反電動勢獲取轉(zhuǎn)子位置必須采用開環(huán)強(qiáng)拉或高頻注入法啟動。我在這塊板子上的經(jīng)驗(yàn)是啟動階段先用開環(huán)方式以固定電流幅值讓轉(zhuǎn)子建立旋轉(zhuǎn)磁場然后以勻速或勻加速方式拖動轉(zhuǎn)子轉(zhuǎn)動當(dāng)轉(zhuǎn)速達(dá)到設(shè)定閾值通常在500 rpm以上后再平滑切換到閉環(huán)控制模式。切換瞬間如果出現(xiàn)電流突變多半是開環(huán)角度和實(shí)際轉(zhuǎn)子位置偏差過大可以嘗試降低切換到閉環(huán)時(shí)的轉(zhuǎn)速閾值或者減小開環(huán)電流幅值。對于六步換相起步無力往往是起始換相時(shí)序不對。無刷電機(jī)控制器在沒有霍爾傳感器的情況下普遍采用反電動勢過零檢測來換相但在零速啟動時(shí)只能先強(qiáng)制換相讓轉(zhuǎn)子轉(zhuǎn)起來后反電動勢才能被檢測出來。強(qiáng)制換相的時(shí)間間隔設(shè)置太短會導(dǎo)致失步太長會導(dǎo)致抖動你需要結(jié)合電機(jī)的極對數(shù)、額定轉(zhuǎn)速進(jìn)行估算這個(gè)值通常在幾十毫秒到幾百毫秒之間。6.2 電機(jī)運(yùn)行中異常噪音與電流尖峰運(yùn)行噪音大、電流波形毛刺多通常是采樣噪聲和PWM死區(qū)設(shè)置不當(dāng)造成的。先檢查PWM死區(qū)時(shí)間STSPIN32F0A的柵極驅(qū)動器雖然支持死區(qū)時(shí)間的硬件插入但如果你在CubeMX中配置的剎車和死區(qū)寄存器不對軟件上也需要做相應(yīng)處理。三相全橋上下管如果沒有足夠的死區(qū)時(shí)間會出現(xiàn)直通短路現(xiàn)象輕則異常噪音重則燒毀MOSFET。死區(qū)時(shí)間一般設(shè)置在幾百納秒到幾微秒之間和MOSFET的寄生電容以及柵極驅(qū)動電阻有關(guān)經(jīng)驗(yàn)值取1微秒左右起步。電流尖峰問題另一個(gè)常見來源是電流采樣窗口與PWM波形的對齊偏差??梢杂檬静ㄆ魍瑫r(shí)抓取PWM波形和采樣電阻上的電壓波形觀察ADC采樣觸發(fā)時(shí)刻是否落在電流穩(wěn)定區(qū)間內(nèi)。6.3 保護(hù)功能誤觸發(fā)過流保護(hù)經(jīng)常誤觸發(fā)先看電流限值是否設(shè)得太低其次看采樣濾波是否不足。如果只是瞬間電流尖峰導(dǎo)致誤保護(hù)可以在軟件里增加去毛刺處理例如連續(xù)采樣3次超過閾值才真正觸發(fā)保護(hù)?;蛘咛嵘Wo(hù)觸發(fā)閾值但前提是散熱條件允許不能盲目調(diào)高。過溫保護(hù)誤觸發(fā)的概率相對較低但要注意STSPIN32F0A內(nèi)部溫度傳感器的讀數(shù)可能和實(shí)際環(huán)境溫度有偏差傳感器位置靠近發(fā)熱源讀數(shù)會偏高。如果你的外殼散熱條件很好可以適當(dāng)把過溫保護(hù)閾值調(diào)高10攝氏度左右但絕對不要取消過溫保護(hù)。6.4 參數(shù)整定心得速查參數(shù)整定沒有標(biāo)準(zhǔn)答案但我可以給出自己的起始經(jīng)驗(yàn)值供參考對于電流環(huán)Kp從0.001開始Ki從0.01開始逐步增加直到電流波形出現(xiàn)輕微振蕩然后回調(diào)20%。速度環(huán)對參數(shù)更敏感Kp從0.0005開始Ki從0.005開始測試時(shí)給一個(gè)階躍轉(zhuǎn)速指令觀察速度響應(yīng)曲線調(diào)節(jié)目標(biāo)是超調(diào)量小于5%調(diào)節(jié)時(shí)間在200ms以內(nèi)。6.5 調(diào)試中的幾個(gè)小教訓(xùn)第一一定要學(xué)會使用SWV和定時(shí)器觸發(fā)的方式測量代碼段執(zhí)行時(shí)間比如電流環(huán)中斷服務(wù)函數(shù)總耗時(shí)。通過GPIO翻轉(zhuǎn)法在中斷入口拉高某個(gè)空閑引腳在出口拉低用示波器測量高電平持續(xù)時(shí)間就能精準(zhǔn)得到中斷執(zhí)行時(shí)間。我當(dāng)時(shí)測出的電流環(huán)中斷耗時(shí)是9微秒而PWM周期是50微秒那CPU負(fù)載大約18%余量完全夠用。第二修改電機(jī)控制參數(shù)時(shí)盡量在運(yùn)行時(shí)通過調(diào)試接口修改而不是每次重新編譯燒錄。我有一段時(shí)間幾乎是每調(diào)一次參數(shù)就編譯燒錄一次每次燒錄不僅耗時(shí)而且頻繁上下電對板子也是隱形傷害。第三示波器探頭的地線夾一定要夾在傳感器信號參考地的最近端避免大電流回路上的壓降影響測量結(jié)果。我曾經(jīng)因?yàn)樘筋^地線夾接得比較遠(yuǎn)量出尖峰電壓達(dá)到幾十伏后來把地線夾直接夾到采樣電阻附近毛刺立刻消掉了一大半。7. 后續(xù)擴(kuò)展方向STEVAL-ESC002V1這套硬件和代碼框架可以擴(kuò)展的方向非常多。把控制算法從方波控制升級為無感FOC是最有挑戰(zhàn)也最有實(shí)用價(jià)值的路線現(xiàn)在有不少開源方案比如AM32和BLHeli_S的固件思路可以參考但基于ST的MCSDK體系去開發(fā)會得到更好的底層支持。另一個(gè)方向是利用STSPIN32F0A內(nèi)部集成的運(yùn)放和比較器把電流環(huán)帶寬繼續(xù)推高這需要仔細(xì)設(shè)計(jì)電流采樣鏈路和PCB布局板上預(yù)留的過孔和走線布局其實(shí)已經(jīng)為高頻采樣做了優(yōu)化。CAN總線通信也是值得投入的方向如果你要做多電機(jī)同步控制比如四軸無人機(jī)的四路電調(diào)協(xié)調(diào)基于CANopen或者自定義CAN協(xié)議的固件擴(kuò)展會讓整個(gè)系統(tǒng)穩(wěn)定性和擴(kuò)展性大幅提升。我目前就在嘗試把官方UART協(xié)議改寫成CAN協(xié)議通信速率和抗干擾能力都遠(yuǎn)強(qiáng)于串口而且還能通過CAN喚醒和故障上報(bào)機(jī)制實(shí)現(xiàn)更安全的運(yùn)行管理。最后再分享一個(gè)小技巧STEVAL-ESC002V1板子背面的測試點(diǎn)很密集強(qiáng)烈建議在開始調(diào)試之前把電源電壓、三相相電壓、電流采樣輸出這幾個(gè)關(guān)鍵測試點(diǎn)用排針引出來后面接示波器或者邏輯分析儀能省掉很多手忙腳亂的麻煩。實(shí)測下來這套板子的潛力很大只要你愿意花時(shí)間深入折騰固件和算法它完全可以從一個(gè)評估板變成一塊真正實(shí)用的電調(diào)核心板。