控一體板實戰(zhàn):從DRV8818到MK24的選型與調(diào)試全記錄)
最近在給一臺三軸直角機器人做驅(qū)控一體板電機用的是57系列雙極步進電機。原來的方案是成品步進驅(qū)動器加運動控制卡電柜里塞得滿滿當當客戶又要求每個軸能接編碼器回饋傳統(tǒng)開環(huán)接口根本滿足不了。折騰了一圈最終把驅(qū)動部分換成 DRV8818PWPR控制核心換成 MK24FN1M0VDC12做成一塊以兩片IC為主的驅(qū)控板體積和成本都壓下來了。這篇文章就把這個項目里的選型邏輯、電路設計、固件實現(xiàn)和調(diào)試記錄完整寫一遍重點說說雙極步進電機控制中的電流控制、微步進、速度規(guī)劃和位置閉環(huán)順便把大家經(jīng)常搜的步進電機FOC控制原理放在里面一起分析講清楚什么時候該用傳統(tǒng)STEP/DIR什么時候才需要真正上FOC。如果你正準備把成品驅(qū)動器換到嵌入式方案或者在學校、工業(yè)項目里想自己搭一套可靠的雙極步進電機驅(qū)動這篇應該能幫你少走不少彎路。1. 項目概述與整體設計思路1.1 分工DRV8818PWPR負責力氣MK24FN1M0VDC12負責腦子這套方案的本質(zhì)是“強電驅(qū)動和弱電控制分開”。DRV8818PWPR是TI的雙極步進電機驅(qū)動芯片內(nèi)部集成了兩個H橋和一個步進譯碼器支持STEP/DIR接口供電電壓8到45V峰值電流能到2.5A。它負責把控制器的微小脈沖變成繞組上實實在在的電流并通過內(nèi)部PWM斬波把電流限制在設定值附近。MK24FN1M0VDC12則是NXP Kinetis K24家族的MCU120MHz主頻的Cortex-M4F內(nèi)核帶硬件浮點單元和DSP指令1MB Flash、256KB RAM的容量對運動控制來說非常充裕。兩個芯片配合起來MCU不用管H橋里哪個管子開、哪個管子關(guān)也不用管繞組電流怎么換向只要給DRV8818發(fā)STEP脈沖和DIR電平再通過VREF定好電流上限剩下的事情全部由驅(qū)動芯片內(nèi)部完成。這種設計大大降低了固件復雜度。用個生活化的類比MK24是船長負責規(guī)劃航線、修正偏差、跟岸上通訊DRV8818是舵機船舵怎么打、液壓動作怎么配合它自己搞定船長只要說“往哪個方向轉(zhuǎn)多少度”。1.2 為什么不用成品驅(qū)動器、L298或者專用FOC驅(qū)動器很多人一聽到步進電機驅(qū)動第一反應就是買現(xiàn)成的DM542或者TB6600。這類驅(qū)動器確實省事但放到機器人項目里有一個致命問題接口是死的。你只能送脈沖很難直接在驅(qū)動器內(nèi)部做電流閉環(huán)更別說把編碼器信號、限位開關(guān)、抱閘控制全融到一塊板子上。而且工業(yè)型的成品驅(qū)動器體積偏大一個電柜要放三個軸就是三套面板走線亂成本也不便宜。L298這類分立全橋方案我也試過教學實驗沒問題但真正連續(xù)跑起來發(fā)熱太厲害。L298內(nèi)部的飽和壓降大PWM頻率高了以后開關(guān)損耗又高電機一堵轉(zhuǎn)散熱器都能當暖手寶。它更沒有微步進譯碼器想要細分得自己在MCU里做正弦表、兩路PWM分別調(diào)占空比還要處理死區(qū)復雜度和穩(wěn)定性都不劃算。我還專門對比了“三相柵極預驅(qū)加MOS管”的FOC方案。那套方案在電流波形質(zhì)量、轉(zhuǎn)矩紋波、動態(tài)響應上確實上限更高但板級設計復雜采樣電阻、運放、干擾處理、PID參數(shù)整定每一步都要花大把時間。在這個項目里電機只是做轉(zhuǎn)臺定位和輕負載搬運開環(huán)微步進加編碼器閉環(huán)已經(jīng)能很好地滿足要求所以DRV8818加MK24是性價比最高的組合。簡單說能滿足需求的前提下別為了所謂的高級技術(shù)增加不必要的系統(tǒng)風險。2. 核心芯片特性與關(guān)鍵原理拆解2.1 DRV8818PWPR的H橋、電流斬波和微步進原理要理解DRV8818先看它的功率級。雙極步進電機有兩相繞組每相繞組需要一個H橋來改變電流方向。DRV8818內(nèi)部正好集成了兩個H橋每個橋四個MOSFET。A相和B相分別由一個橋控制通過STEP/DIR引腳輸入的脈沖序列內(nèi)部譯碼器會生成對應的橋臂開關(guān)邏輯。電流限制是DRV8818最核心的功能。芯片通過外部檢流電阻采樣繞組電流當電流達到設定閾值后內(nèi)部比較器就會觸發(fā)PWM關(guān)斷讓電流先衰減下來然后再重新開通如此反復形成電流斬波。這個閾值由VREF電壓和檢流電阻共同決定常見計算式是Itrip VREF / (G_A × R_SENSE)其中G_A是增益系數(shù)不同引腳組合對應不同的放大倍速。舉個例子如果目標電流為1.5A檢流電阻用0.1Ω增益取1那么VREF只要0.15V。這個電壓很低所以我在硬件上用3.3V分壓加RC濾波生成并且靠近VREF引腳放了一顆100nF電容。為什么用模擬閾值而不是讓MCU實時采樣電流去算占空比因為步進電機在高速轉(zhuǎn)動時PWM頻率很高MCU如果每個PWM周期都去做電流PID會占用大量計算資源。DRV8818用一套比較器和邏輯電路完成電流調(diào)節(jié)相當于把最底層的實時任務卸載掉了MCU只發(fā)步進脈沖壓力小很多。2.2 雙極步進電機的相序和微步進波形雙極步進電機四根線A相兩根、B相兩根。每相可以正向通電、反向通電或者不導通組合起來就是轉(zhuǎn)子磁場的不同角度。整步驅(qū)動下電機轉(zhuǎn)子按四個90°方向走一步聽起來簡單但整步驅(qū)動的振動和噪聲在低速時非常明顯所以實際項目里至少會用到四細分甚至十六細分。所謂細分就是讓相電流不是一下子從0跳到額定值而是按階梯狀的正弦波形逐步過渡。DRV8818的MODE0、MODE1、MODE2三個引腳可以組合出不同細分倍數(shù)從整步、半步一直到1/32步。細分越高每一步對應的電流變化越小轉(zhuǎn)子定位位置越密振動和噪聲越低但它不會給電機增加額外保持力矩只是讓運動更平滑。我在實際調(diào)試中把57電機設置在1/16細分配合MK24的編碼器位置閉環(huán)轉(zhuǎn)臺低速轉(zhuǎn)動時基本聽不到高頻嘯叫。而如果是整步運行轉(zhuǎn)臺在某個轉(zhuǎn)速區(qū)間會明顯共振整塊底板都能感覺到抖動。這也是為什么我后來堅決不用最原始的驅(qū)動方式。2.3 MK24FN1M0VDC12的資源到底強在哪MK24FN1M0VDC12在運動控制場景里最值得看重的是Cortex-M4F的FPU和DSP指令。步進電機跑S曲線速度規(guī)劃時要在一個控制周期內(nèi)計算加減速度、位置增量還要做濾波器如果MCU沒有浮點單元用軟件浮點庫硬算控制周期根本做不長。這顆芯片還有兩個16位ADC多路FTM定時器以及正交解碼器模塊。FTM定時器可以直接接編碼器的A相、B相信號硬件計數(shù)不用MCU去軟件判斷方向。這一點在位置閉環(huán)里非常省心。另外它帶有豐富的串口、CAN、以太網(wǎng)外設以后要接Modbus、CANopen或者簡單以太網(wǎng)協(xié)議都方便。機器人控制板不是單獨一個電機驅(qū)動這么簡單MCU還要管限位開關(guān)、使能信號、狀態(tài)燈、診斷通信所以留出外設余量非常重要。我實際跑的參數(shù)是速度規(guī)劃頻率1kHz位置環(huán)PID也是1kHz步進脈沖由FTM硬件產(chǎn)生CPU占用率大概在20%左右剩余的算力用來處理限位邏輯和通信。如果換成沒有FPU的普通M3芯片S曲線的計算可能勉強能跑但一旦加上濾波器、多軸協(xié)同預算就不夠了。2.4 步進電機FOC控制原理以及和這套方案的邊界很多人搜“步進電機FOC控制原理”我得先把它講明白。FOC也叫磁場定向控制本質(zhì)上是要讓定子電流產(chǎn)生的磁場始終與轉(zhuǎn)子永磁體磁場保持正確的角度關(guān)系。實現(xiàn)過程是先采兩相或者三相電流做Clark變換把三相靜止坐標系變成兩相靜止坐標系αβ再做Park變換旋轉(zhuǎn)到轉(zhuǎn)子旋轉(zhuǎn)坐標系dq里面得到直軸電流id和交軸電流iq。FOC的最終目標通常是讓id趨近于0這樣所有定子電流都用來產(chǎn)生轉(zhuǎn)矩也就是iq。計算完電流誤差以后用PI調(diào)節(jié)器輸出d軸和q軸的電壓再經(jīng)過逆Park變換和SVPWM調(diào)制最終得到三相橋的開關(guān)占空比。這個過程每幾十微秒就要做一次計算量和實時性要求非常高所以FOC通常需要DSP或者帶FPU的高性能MCUMK24正好有這個算力。但問題在于DRV8818PWPR并不是為FOC設計的。它內(nèi)部有完整的STEP/DIR譯碼器你只能告訴它“走一步”或者“走多少細分”它內(nèi)部會自動生成電流波形。你沒法把SVPWM算出來的任意占空比直接注入它的兩個H橋。強行做FOC要么繞過內(nèi)部譯碼器用它的每個半橋做獨立PWM輸入但這樣芯片的內(nèi)部保護邏輯和譯碼器就浪費了要么直接換獨立的柵極驅(qū)動芯片讓MCU每個PWM周期更新橋臂狀態(tài)。所以這套方案里DRV8818用微步進去近似正弦電流本質(zhì)上是對FOC效果的一種低成本模仿。微步進在低速和輕負載場景下轉(zhuǎn)矩平穩(wěn)性已經(jīng)不錯但如果要追求極低的電流紋波、更高的高速性能或者電機需要大扭矩動態(tài)響應那就需要真正上FOC。我的建議是普通的機器人關(guān)節(jié)定位、轉(zhuǎn)臺搬運用這套方案完全夠如果是直線電機或者要求零轉(zhuǎn)速下保持極高力矩平穩(wěn)性的應用再考慮把DRV8818換成獨立三相預驅(qū)加采樣運放。3. 實操硬件電路設計與固件實現(xiàn)3.1 電源、檢流電阻、電荷泵和保護電路設計硬件設計我按這次項目的實際電路來說明這些參數(shù)基于常見的參考電路具體數(shù)值請以你手里的芯片官方評估板和數(shù)據(jù)手冊為準。供電方面我選了24V給VM供電因為57電機在24V下的高速性能還算可以。VM入口先放了一顆100μF電解電容再在靠近DRV8818的VM引腳位置放一顆100nF陶瓷電容目的很簡單吸收電流斬波瞬間的高頻沖擊。電荷泵的飛跨電容和儲能電容要靠近芯片對應引腳電容類型用X7R或者C0G不要用普通便宜的瓷片電容否則自舉電壓不穩(wěn)會出現(xiàn)上電不工作的怪問題。檢流電阻我用了兩顆0.1Ω、1%、功率1W以上的低電感貼片電阻分別接在兩個H橋的下管和地之間。電阻要放在芯片附近采樣走線要做成開爾文連接也就是說采樣的信號線應該直接從電阻兩端引出而不是從電阻的地端再走一大段銅皮去采樣。因為大電流流過地平面會產(chǎn)生地彈如果采樣點太遠測出來的電壓根本不準電流環(huán)會誤觸發(fā)保護。VREF信號我前面說了采用電阻分壓再并電容。如果板子上有DAC或者PWM加RC濾波也可以做成軟件可調(diào)的VREF好處是待機時可以自動降流。這里要注意VREF上的紋波必須非常小任何幾毫伏的抖動都會直接疊加到電流設定值上。我沒有直接用它做動態(tài)調(diào)節(jié)而是用GPIO控制一個MOS管切換分壓電阻實現(xiàn)運行和待機兩檔電流簡單可靠。3.2 引腳接線與STEP/DIR接口設計DRV8818和MK24之間的信號不多但我特別說明幾個容易踩坑的地方。STEP信號是脈沖輸入MK24輸出的3.3V邏輯電平一般可以直接連到DRV8818的STEP引腳但串一顆22Ω電阻能有效抑制信號振鈴。如果現(xiàn)場有變頻器或者接觸器干擾STEP信號線上再加一個RC濾波器比如100Ω加1nF要注意濾波時間常數(shù)不能把有效脈沖吃掉。DIR是方向電平MK24必須在發(fā)STEP脈沖之前提前一段時間穩(wěn)定好DIR電平不然電機偶爾反向亂跑一下就是方向和STEP邊沿太接近導致的。nFAULT引腳是開漏輸出MCU那邊接一個10k上拉到3.3V再用GPIO中斷輸入。工業(yè)現(xiàn)場最好加數(shù)字隔離STEP、DIR、nFAULT這三個信號都穿過隔離器MCU地線和驅(qū)動地線之間只通過隔離器跨接能有效防止強電側(cè)噪聲串進弱電電路。模式引腳MODE0、MODE1、MODE2我從MK24的GPIO引出軟件里隨時可以切換細分。調(diào)試時先用低細分確認相序確認沒問題再切換高細分這個習慣能幫你省下大量排查時間。3.3 固件速度規(guī)劃、定時器發(fā)脈沖和微步進控制固件部分我先把速度換算公式寫清楚。電機是200步每轉(zhuǎn)設置微步數(shù)為microstep所以每轉(zhuǎn)的步進脈沖數(shù)為200 × microstep。如果目標轉(zhuǎn)速是rpm那么每秒需要的脈沖頻率就是step_hz rpm × 200 × microstep / 60比如1/16細分轉(zhuǎn)速120rpm那么step_hz 120 × 200 × 16 / 60 6400Hz。MK24那邊把這個頻率換算成定時器的計數(shù)值然后讓定時器自動產(chǎn)生連續(xù)的脈沖波形。實際發(fā)脈沖我推薦用FTM定時器的硬件輸出而不是中斷里翻轉(zhuǎn)IO。中斷翻轉(zhuǎn)在低速沒問題但每秒幾萬次脈沖時中斷進入退出的開銷會把CPU占滿而且脈沖寬度不穩(wěn)定。我用FTM輸出一個固定脈寬的PWM高電平時間設為5μs左右周期由步驟頻率決定。修改頻率時要先關(guān)閉輸出改完定時器周期再使能避免因為寄存器異步更新產(chǎn)生半個異常脈沖。速度規(guī)劃上梯形加速度是最基礎的但機器人或者質(zhì)量稍大的負載我建議直接用S曲線。S曲線多了一個jerk限制加速度變化是連續(xù)的機械沖擊會小很多電機不容易失步。代碼層面只需要記住每個控制周期內(nèi)的加速度增量然后用實時的速度去計算FTM周期值。3.4 位置閉環(huán)與狀態(tài)機如果只是開環(huán)發(fā)脈沖步進電機一旦受到意外阻力就可能丟步而丟步之后系統(tǒng)完全不知道。所以我在每個軸上加了一個1000線的增量編碼器接到MK24的FTM正交解碼接口。位置環(huán)我用的是一個很常見的增量式PID控制周期1ms輸出作為速度指令再換算成step_hz。速度環(huán)不是必須的因為步進電機的轉(zhuǎn)速由脈沖頻率決定已經(jīng)算是一個天然的開環(huán)速度執(zhí)行器。位置PID的輸出經(jīng)過限幅避免剛上電時有很大誤差就猛懟最大速度導致失步。狀態(tài)機分成IDLE、RUN、HOLD、ALARM四個狀態(tài)。IDLE狀態(tài)下不發(fā)脈沖但保持電機使能RUN狀態(tài)下執(zhí)行位置規(guī)劃HOLD狀態(tài)在到位后把位置誤差清零保持轉(zhuǎn)矩ALARM狀態(tài)捕捉到nFAULT或者編碼器位置誤差超過閾值后進入輸出報警禁止繼續(xù)運動。實際項目里ALARM一定要單獨做成一個狀態(tài)而不是簡單報個錯就完事因為機器人應用里電機故障時后續(xù)動作可能很危險。這里給出PID代碼骨架基于常見SDK寫法細節(jié)可以移植到自己的工程里float pid_update(float target, float feedback, float dt) { static float integral 0.0f; static float last_error 0.0f; float error target - feedback; integral error * dt; integral (integral pid_imax) ? pid_imax : integral; integral (integral -pid_imax) ? -pid_imax : integral; float derivative (error - last_error) / dt; last_error error; return pid_kp * error pid_ki * integral pid_kd * derivative; }注意積分項一定要做限幅不然點位運動時有超調(diào)或者啟動誤差積分會累積很大電機猛地沖一下這是最容易忽略的問題。4. 調(diào)試經(jīng)驗與常見問題排查實錄4.1 上電不轉(zhuǎn)與故障引腳排查第一次上電我習慣先把VM調(diào)到最低工作電壓電流設定設到額定值的一半速度控制在很低的10RPM確認信號路徑?jīng)]問題以后再加電壓和電流。遇到過最典型的故障就是nFAULT一直拉低電機完全不動。用示波器測VM電壓發(fā)現(xiàn)24V在脈沖瞬間掉到十幾伏這基本就是VM側(cè)大電容離芯片太遠或者容量太小。電流斬波瞬間功耗很大電容太遠等于給高壓紋波留了一段長阻抗路徑。把100μF電容移到離芯片最近的位置以后問題立刻消失。還有一個情況是STEP信號有脈沖但電機只是嗡嗡響始終轉(zhuǎn)不起來。這通常是電機某一相繞組沒接好或者插頭壓線松動。用手指捏住電機軸感受一下是否有微弱力矩再用示波器分別測A相和B相的電流波形很快就能定位是哪一相出了問題。4.2 電流設置、衰減模式與發(fā)熱問題步進電機發(fā)熱是一個很難規(guī)避的問題。很多工況下電機是持續(xù)通電的如果電流設得跟電機額定值一樣高待機也會發(fā)熱。我一般先按電機額定RMS電流的1.4倍作為峰值電流去初設跑一段時間摸溫升如果外殼溫度超過70℃就要再往下調(diào)。如果廠商直接標的是峰值電流那就不要再去乘1.4這個一定要看清。DRV8818有衰減模式選擇慢衰減和混合衰減。慢衰減模式下電流紋波小但電流隨轉(zhuǎn)速升高時的響應偏慢適合低速大力矩混合衰減兼顧了高速續(xù)流和響應速度能明顯降低電機可聞噪聲。我最后的做法是讓MCU通過GPIO去切換這兩檔低頻運行時用慢衰減降低發(fā)熱高速運行時用混合衰減防止力矩跌落。不要指望一檔吃遍所有工況。如果你發(fā)現(xiàn)電機在某個轉(zhuǎn)速區(qū)間抖動特別大那十有八九是機械共振。步進電機的共振頻率主要跟負載慣量和電機轉(zhuǎn)矩常數(shù)有關(guān)出現(xiàn)這種情況不要急著折騰電流先把細分調(diào)高或者讓速度規(guī)劃快速越過這個轉(zhuǎn)速區(qū)間往往效果最好。4.3 電磁干擾與PCB布局DRV8818的PWM斬波頻段很容易產(chǎn)生電磁干擾尤其在24V電壓比較高的時候。我這次第一版PCB按照普通低速板卡走線結(jié)果位置閉環(huán)在高速時偶爾出現(xiàn)編碼器讀數(shù)跳變。用示波器抓編碼器A相B相信號發(fā)現(xiàn)上面疊加了很多毛刺。原因有兩點一是ISEN采樣走線跨過了大電流回路地彈疊加到采樣信號上造成電流斬波波形不穩(wěn)定二是編碼器線束和電機功率線在同一個連接器附近交叉耦合嚴重。我調(diào)整了PCB布局讓大電流的地路徑和編碼器地路徑分開在編碼器接口加了一級RC濾波把A、B相長的平行走線改成短引線加屏蔽地問題就消失了。DRV8818的VM引腳旁邊一定要有足夠多的去耦電容這一點我再重復一遍。很多“芯片容易燒”“電機抖動”的問題根源都是電壓跌落和尖峰過高而不是芯片本身不行。5. 我在這個項目里學到的一些一手經(jīng)驗5.1 三個最值得記住的PCB細節(jié)第一個是檢流電阻的開爾文連接。采樣信號線要直接從電阻兩端的焊盤引出走線越短越好不要在采樣線上串磁珠或者加多余電阻否則會破壞電流環(huán)的時序。第二個是STEP和DIR信號線上串電阻。哪怕只是串一個22Ω的電阻都能明顯改善脈沖沿的振鈴。工業(yè)現(xiàn)場長線傳輸時建議在驅(qū)動器側(cè)再并一個數(shù)百歐姆下拉電阻保證MCU未初始化時STEP腳處于確定電平防止上電瞬間誤走步。第三個是給DRV8818的散熱焊盤留足夠的過孔陣列并且把底層整片銅皮作為散熱路徑。2.5A峰值電流下芯片溫度不低如果是密閉機箱還必須加小型散熱片或者主動風道。散熱沒做好就算電流保護不觸發(fā)芯片長期高溫也會慢慢退化。5.2 后續(xù)擴展方向如果要上真正的FOC如果項目日后確實需要FOC不需要把所有電路都推翻。MK24FN1M0VDC12的計算能力足夠支撐20kHz左右的FOC控制循環(huán)你需要做的是把DRV8818換成帶獨立PWM輸入的三相柵極驅(qū)動芯片配合兩路或者三路電流采樣運放讓MK24直接控制每個橋臂的占空比。這樣做的好處是統(tǒng)一了控制系統(tǒng)同一顆MCU可以同時管理無刷電機和步進電機代碼架構(gòu)不用推倒重來。我個人的體會是驅(qū)動架構(gòu)決定了下限調(diào)試習慣決定了上限。DRV8818和MK24這套組合優(yōu)勢在于把底層電流環(huán)交給成熟的模擬芯片MCU專注做規(guī)劃和策略對整個系統(tǒng)的穩(wěn)定性和開發(fā)效率都很友好。最后再分享一個小技巧第一次上電調(diào)試時把速度設得很慢比如10RPM電流先設到額定值的一半。這一步不是為了跑功能而是為了確認每個STEP脈沖都對應正確的轉(zhuǎn)角和方向。很多復雜的失步、抖動問題其實都是最初把方向邏輯和編碼器相位搞反了。你把電機相序、DIR電平、編碼器方向這三者對齊后面所有問題排查起來都會輕松很多。