電機(jī)驅(qū)動方案:從選型到調(diào)試全復(fù)盤)
先說一下我為什么會寫這篇文章。之前做一臺三軸桌面機(jī)械臂的時候我在關(guān)節(jié)驅(qū)動上直接用了市面上那種步進(jìn)驅(qū)動模塊結(jié)果一掛負(fù)載跑起來就丟步電機(jī)表面燙得沒法碰。后來把方案換成 DRV8818PWPR 配 PIC18LF46K40 自己做板子才終于把低速扭矩、發(fā)熱和定位精度這三件事同時壓住。這篇文章就把這套從選型到固件再到調(diào)試的完整鏈路復(fù)盤一遍適合正在做機(jī)器人關(guān)節(jié)、小型工業(yè)設(shè)備或者想從“模塊思維”轉(zhuǎn)向“芯片級設(shè)計”的嵌入式開發(fā)者參考。1. 為什么是 DRV8818PWPR PIC18LF46K40從模塊到芯片級方案的選型邏輯先聊清楚這個組合是怎么來的。市面上的步進(jìn)方案大體分成四類一體式步進(jìn)驅(qū)動器加脈沖口、標(biāo)簽式模塊比如常見的 A4988 類小板、集成驅(qū)動芯片自研板以及伺服閉環(huán)方案。絕大多數(shù)入門項目會用第二種因為它便宜、接線快壞了一塊換一塊就行。但真到了工業(yè)級機(jī)器人場景模塊方案的短板就藏不住了散熱差、芯片假貨多、電流反饋不可控、過流保護(hù)不夠細(xì)致而且模塊的引腳和布局往往沒有為長時間高負(fù)載預(yù)留余量。DRV8818PWPR 本身是 TI 的雙 H 橋步進(jìn)驅(qū)動芯片HTSSOP 封裝底部帶 PowerPAD。它最大的價值不只是“能發(fā)脈沖讓電機(jī)轉(zhuǎn)”而是在芯片內(nèi)部集成了完成的電流斬波調(diào)節(jié)。也就是說板子上的 MCU 不需要去算正弦波、不需要做 PWM 電流環(huán)只要給出 STEP 和 DIR 信號芯片會自動把相電流穩(wěn)定在設(shè)定值附近。這個特性對工業(yè)場景極其重要——電機(jī)負(fù)載一變模塊方案往往會因為電壓波動導(dǎo)致相電流飄移而 DRV8818PWPR 這類芯片會通過采樣電阻和內(nèi)部比較器把電流拉回來扭矩輸出就穩(wěn)得多。PIC18LF46K40 這邊的選型理由也很直白。它屬于 Microchip 的 8 位低功耗系列工作在 3.3V單電源供電就能和 DRV8818PWPR 的邏輯引腳直連不需要額外加電平轉(zhuǎn)換。40 引腳版本提供了足夠的 GPIO 和幾個關(guān)鍵外設(shè)獨立內(nèi)核 PWM、可編程邏輯單元 CLC、內(nèi)置 DAC、多個定時器都是做運動控制很順手的資源。更重要的是PIC18LF46K40 有 128KB 程序空間和 4KB RAM放得下一套完整的加減速曲線和位置狀態(tài)機(jī)。很多人會先入為主覺得 8 位機(jī)做不了機(jī)器人控制實際上步進(jìn)電機(jī)開環(huán)控制并不需要跑復(fù)雜的算法關(guān)鍵在定時器和中斷響應(yīng)的確定性——8 位 MCU 反而更容易做到穩(wěn)定。再回頭說說為什么不直接用 PLC 或者一體式驅(qū)動器。工業(yè)上大量使用脈沖方向接收型驅(qū)動器它們確實可靠但一套下來成本高、占地面積大而且很難做“細(xì)顆粒度的電流動態(tài)調(diào)整”。比如機(jī)器人關(guān)節(jié)在啟動時需要短時大扭矩到位鎖定時又要降低電流防止發(fā)熱一體式驅(qū)動器不會給你這么細(xì)的控制接口DRV8818PWPR 的 VREF 引腳卻允許隨時調(diào)整電流目標(biāo)。這種靈活性正是自己做電機(jī)驅(qū)動板的核心價值??紤]到一些讀者可能從模塊直接跳到芯片我把常見方案的差異列一下方案集成度電流控制粒度適合場景主要痛點一體式步進(jìn)驅(qū)動器高面板電位器PLC 控制的工業(yè)設(shè)備體積大、調(diào)電流不靈活模塊小板高電位器調(diào)節(jié)教學(xué)、原型驗證散熱差、假貨多、長時間運行不穩(wěn)DRV8818PWPR 自研板中高VREF 引腳動態(tài)調(diào)整機(jī)器人關(guān)節(jié)、定制化設(shè)備需要自己做 PCB 和底層驅(qū)動伺服一體化方案高閉環(huán)矢量控制高速高精度應(yīng)用成本高、調(diào)參復(fù)雜這個表格不是為了說明誰絕對好而是告訴大家選型本質(zhì)是交換成本和控制力。像桌面機(jī)械臂、AGV 底盤、傳送帶分揀機(jī)構(gòu)這類“對成本敏感但又要一定扭矩和定位能力”的場景DRV8818PWPR 這類芯片級的開環(huán)方案往往是最均衡的選擇。2. DRV8818PWPR 的電流斬波與微步機(jī)制控制精度的底座很多人在芯片方案上翻車不是接線接錯了而是沒搞懂 DRV8818PWPR 內(nèi)部那個“電流斬波”到底在干什么。步進(jìn)電機(jī)本質(zhì)上是一個電感負(fù)載相電流不能瞬間建立。如果直接用固定電壓去驅(qū)動電感會把電流慢慢推高高到一定程度就可能燒繞組反過來如果電壓不夠電流又建立不起來扭矩就軟綿綿的。因此芯片內(nèi)部要做的是讓母線電壓反復(fù)地接通和斷開看著平均值差不多等于期望電流時就停止導(dǎo)通并進(jìn)入續(xù)流衰減這就是斬波控制。DRV8818PWPR 里有一個內(nèi)部比較器實時比較采樣電阻上的電壓和 VREF 引腳設(shè)定的參考電平。電流達(dá)到設(shè)定閾值時芯片關(guān)閉高側(cè) MOSFET進(jìn)入衰減模式電流掉下來后再次打開從而把相電流維持在設(shè)定值附近。這里有三個外部參數(shù)決定控制效果采樣電阻 RSENSE 的阻值、VREF 引腳的電平以及衰減模式的選擇。電流設(shè)定值的計算方式在 TI 這類基于 DAC 的驅(qū)動器里通常可以寫成Ipeak VREF / (A_V × RSENSE)其中 A_V 是芯片內(nèi)部的可變增益系數(shù)一般在 5 到 8 之間。我用這顆芯片調(diào)試時用的是 A_V 8 的典型參數(shù)RSENSE 選了 0.22Ω設(shè)定 VREF 為 2.2V那么峰值電流大概是Ipeak 2.2V / (8 × 0.22Ω) 1.25A如果你的電機(jī)額定電流是 1A 到 1.5A 這個范圍這個配置基本合適。需要注意的是A_V 的具體數(shù)值一定要以手頭芯片數(shù)據(jù)手冊為準(zhǔn)不同批次和型號之間會有差異我第一次就吃了個虧拿著某篇博客里的公式直接用結(jié)果實際電流比預(yù)期大了不少電機(jī)空載就發(fā)燙。衰減模式是 DRV8818PWPR 另一個容易被忽略但極其重要的設(shè)置。當(dāng)芯片檢測到電流過流后殘余電感能量需要通過續(xù)流回路釋放這個釋放方式?jīng)Q定了電流紋波、噪聲和動態(tài)響應(yīng)。慢衰減模式下電流下降慢續(xù)流效率高紋波相對小但高速切換時電流跟上速度的能力差快衰減模式電流下降快適合高速運轉(zhuǎn)但效率和噪聲不如慢衰減混合衰減則是在電流變化的不同階段切換適合微步細(xì)分場景。我自己的經(jīng)驗是全步和半步運行時可以優(yōu)先考慮慢衰減而 1/8 和 1/16 微步模式下混合衰減效果最好。很多模塊方案沒有提供衰減模式選擇這正是芯片方案可以做得更好的地方。微步機(jī)制則是另一層精度來源。DRV8818PWPR 內(nèi)部通過電流 DAC 把正弦電流波形細(xì)分MCU 每給一個 STEP 上升沿芯片就讓電流波形前進(jìn)一步。1/16 微步模式下原來 1.8 度一步的電機(jī)就變成了 0.1125 度一步表面上看只是平滑了實際上對低速穩(wěn)定性和定位噪聲影響巨大。機(jī)器人關(guān)節(jié)在低速運行時如果沒有微步電機(jī)會出現(xiàn)明顯的齒輪感抖動加了 1/16 微步之后那種顆粒感基本消失。3. PIC18LF46K40 端到端接線把脈沖、方向、電流設(shè)定落到實處芯片原理搞清楚之后接下來是把 PIC18LF46K40 和 DRV8818PWPR 真正連起來。這顆 MCU 最大的優(yōu)勢之一就是外設(shè)引腳選擇 PPS 機(jī)制——大部分外設(shè)可以映射到多個引腳布線的時候不需要為了 PWM 或者中斷引腳做很多繞線。實際項目中我用的引腳分配如下PIC 引腳功能目標(biāo)外設(shè)/信號說明RA2STEP 輸出定時器驅(qū)動產(chǎn)生步進(jìn)脈沖RA3DIR 輸出方向信號高/低電平切換RA4nSLEEP 輸出芯片睡眠控制RA5MODE0 輸出微步模式選擇位RB0MODE1 輸出微步模式選擇位RB1MODE2 輸出微步模式選擇位RC2nFAULT 輸入帶內(nèi)部上拉過流/過溫故障檢測RC3DECAY 輸出衰減模式選擇RC6VREF 出/DAC 輸出設(shè)定電流目標(biāo)注意 STEP 信號要接到 MCU 的定時器比較輸出或者用普通 IO 翻轉(zhuǎn)因為 DRV8818PWPR 的 STEP 是邊沿觸發(fā)的STEP 的高電平時間只要超過數(shù)據(jù)手冊規(guī)定的最小脈寬一般是 1 到 2 微秒量級就行。DIR 信號則需要特別注意建立時間在改變方向之后至少要等待一個較短的時間再給 STEP 上升沿否則芯片可能誤判方向。這個時序我在最初測試時沒當(dāng)回事結(jié)果電機(jī)經(jīng)常在回程時多走或少走半步后來查手冊才發(fā)現(xiàn)是 DIR 的建立時間不夠。供電架構(gòu)上我的做法是先讓母線電壓 VM 進(jìn)來經(jīng)過一個 10uF 到 100uF 的電解電容穩(wěn)壓再單獨用 LDO 把電壓降到 3.3V 給 PIC18LF46K40 供電。這樣做有一個好處3.3V 的邏輯電源不會因為 VM 上大電流抽動而波動STEP 信號的電平也就能保持穩(wěn)定。DRV8818PWPR 的邏輯電源 VDD 可以直接接到 MCU 的 3.3V兩邊共地。電機(jī)電源和邏輯地一定要單點匯接否則大電流回流會在邏輯地上產(chǎn)生噪聲尖峰導(dǎo)致 MCU 誤觸發(fā)。另一個容易踩坑的地方是采樣電阻 RSENSE 的布局和功率。RSENSE 走的是相電流阻值雖然只有 0.22Ω但峰值電流到 1.25A 時功耗是 I2R (1.25)2 × 0.22 ≈ 0.34W。設(shè)計時至少要選額定功率 1W 的電阻否則電阻發(fā)熱后阻值漂移電流設(shè)置也就不準(zhǔn)了。布局上RSENSE 的兩端要走短而粗的銅皮并且用開爾文接法把采樣線的兩個端點直接引到芯片的感測引腳不要讓主電流路徑上的壓降干擾采樣。這一點很多新手會忽視總覺得采樣線拉長一點沒影響結(jié)果實際跑到高速后電流波形全是毛刺。DRV8818PWPR 的 PowerPAD 是整個芯片散熱的命門。HTSSOP 封裝底部的散熱焊盤必須大面積接到 PCB 的敷銅上再通過過孔陣列把熱量導(dǎo)到背面。我第一版打樣時偷懶PowerPAD 下面只放了四個過孔連續(xù)跑 20 分鐘芯片表面就飆到 70 度。后來重新布局放了一排 8 個 0.3mm 的過孔底部鋪了大面積的地銅溫度直接降了 10 度以上。工業(yè)機(jī)器人場景通常要在機(jī)箱里長時間運行散熱這一項不能妥協(xié)。4. 固件里的加減速與位置狀態(tài)機(jī)從空轉(zhuǎn)夾具到機(jī)械臂關(guān)節(jié)硬件連好之后真正決定系統(tǒng)能不能用的其實是固件。很多人第一次接觸步進(jìn)控制時直接在定時器中斷里固定頻率發(fā)脈沖電機(jī)空載轉(zhuǎn)得挺好看一掛負(fù)載或者一提高轉(zhuǎn)速就丟步。原因很簡單步進(jìn)電機(jī)在快速啟動瞬間需要克服轉(zhuǎn)子的慣性和負(fù)載阻力扭矩不夠就失步了。解決的辦法是給脈沖頻率加一條加減速曲線讓電機(jī)的啟動速度從較低值逐漸爬升到目標(biāo)速度到達(dá)目標(biāo)位置前再逐漸降速。我用 PIC18LF46K40 實現(xiàn)的方式是位置狀態(tài)機(jī)放在主循環(huán)里負(fù)責(zé)規(guī)劃下一時刻的頻率和方向定時器中斷負(fù)責(zé)真正產(chǎn)生脈沖邊沿。狀態(tài)機(jī)分成幾個階段1. IDLE : 等待位置指令 2. ACCEL : 逐步提高脈沖頻率 3. RUN : 恒速運動 4. DECEL : 逐步降低脈沖頻率 5. DONE : 到達(dá)目標(biāo)發(fā)出到位標(biāo)志梯形加減速是初學(xué)者最快能跑通的方案比如設(shè)置起始脈沖頻率 200Hz目標(biāo)頻率 5kHz把加速過程分成 N 步每步增加 (5000-200)/N Hz。N 根據(jù)負(fù)載慣量來調(diào)一般取 20 到 50 步。如果負(fù)載比較重或者結(jié)構(gòu)剛性不足建議改用 S 形曲線讓頻率變化率本身也平滑過渡。S 形曲線可以用查表加插值的方式實現(xiàn)PIC18LF46K40 的 128KB Flash 完全放得下一張幾百個點的速度表。脈沖產(chǎn)生的核心代碼框架可以這樣組織// 定時器中斷服務(wù)函數(shù)用于產(chǎn)生下一個STEP邊沿 void __interrupt() timer_isr(void) { if (PIR1bits.TMR1IF) { // 清中斷標(biāo)志 PIR1bits.TMR1IF 0; // 步進(jìn)脈沖輸出拉高 STEP保持幾個微秒后拉低 STEP_IO 1; __delay_us(2); STEP_IO 0; // 計步當(dāng)前位置遞增或遞減 if (dir_flag) { current_position; } else { current_position--; } // 更新下一次中斷的定時器周期 TMR1H speed_table[accel_index].high; TMR1L speed_table[accel_index].low; accel_index update_index_by_state_machine(); } }實際使用時需要注意2 微秒的高電平時間對 DRV8818PWPR 通常夠用但如果 MCU 主頻較低__delay_us 的精度會受影響更好的做法是讓定時器輸出比較模式直接產(chǎn)生脈沖波形把 MCU 從脈沖產(chǎn)生的負(fù)擔(dān)里解放出來。PIC18LF46K40 的獨立內(nèi)核 PWM 就能干這個事但脈沖個數(shù)可控的 PWM 波形需要 CCP 和 TMR 配合理念和上述代碼一致。微步模式會直接改變位置和速度的換算。1.8 度的雙極步進(jìn)電機(jī)整步模式下轉(zhuǎn)一圈需要 200 步1/16 微步模式下需要 3200 步。脈沖頻率和轉(zhuǎn)速的關(guān)系可以寫成轉(zhuǎn)速(rpm) 脈沖頻率(Hz) × 60 / 每轉(zhuǎn)步數(shù)比如 1/16 微步模式下3200 步每轉(zhuǎn)如果脈沖頻率給 32kHz那么轉(zhuǎn)速是 32,000 × 60 / 3,200 600rpm。我的機(jī)械臂關(guān)節(jié)通常運行在 30 到 120rpm 的區(qū)間對應(yīng)脈沖頻率只有 1.6kHz 到 6.4kHz這對 8 位 MCU 來說完全沒壓力。如果你追求更高的轉(zhuǎn)速就需要同步降低微步細(xì)分或者換更大電流驅(qū)動的方案這也是為什么微步模式不是越大越好要配合實際轉(zhuǎn)速需求。電流動態(tài)調(diào)整策略放在固件里是體現(xiàn)這塊板子價值的一個重點。我的做法是啟動和帶載過程把 VREF 設(shè)成最大確保扭矩充足勻速運行階段降到 80%到位鎖定階段直接降到 50%。因為 DRV8818PWPR 的電流設(shè)定完全由 VREF 引腳決定而 PIC18LF46K40 內(nèi)置 DAC 正好可以輸出 0 到 3.3V 的任意電壓這一步實現(xiàn)起來一丁點額外硬件都不用加。鎖定電流減半以后電機(jī)的發(fā)熱明顯下降這對長時間通電的機(jī)器人關(guān)節(jié)來說是很實用的省心特性。5. AC實際測試中繞不開的四個坑嘯叫、丟步、過熱、上電跳轉(zhuǎn)調(diào)試階段才是真正讓人長記性的環(huán)節(jié)。我把自己在這套方案上踩過的坑按出現(xiàn)頻率整理一下希望能幫后面的人省掉幾天的排查時間。第一個坑是嘯叫。電機(jī)運行時發(fā)出尖細(xì)的“嘶嘶”聲聽起來像是固定頻率的蜂鳴。一開始我以為是機(jī)械共振后來斷開負(fù)載只留一個電機(jī)空轉(zhuǎn)嘯叫聲依然存在那就基本可以確定是電流斬波頻率或者微步刷新頻率落進(jìn)了人耳可聽范圍。處理辦法有兩步先檢查衰減模式如果當(dāng)前用的是快衰減試著切換到慢衰減很多時候聲音會立刻小很多再檢查 STEP 脈沖的頻率抖動如果 MCU 的定時器周期更新方式不夠平滑脈沖串里會出現(xiàn)少量高頻抖動驅(qū)動芯片會把這種抖動直接放大成噪聲。調(diào)整定時器裝載值讓頻率在加減速階段按小步長遞變嘯叫會明顯緩解。第二個坑是丟步這也是最讓人頭疼的故障。我第一次帶負(fù)載測試時電機(jī)轉(zhuǎn)一小段就開始“咔咔”響位置完全對不上。按照典型排查鏈路一步步來先停掉所有加減速邏輯讓電機(jī)低速手動轉(zhuǎn)排除接線問題。然后用電流鉗看相電流結(jié)果發(fā)現(xiàn)一負(fù)載大電流波形就塌下去再量母線電壓發(fā)現(xiàn) VM 在電機(jī)啟動瞬間掉到 8V 以下。根因是電源沒留夠裕量啟動尖峰電流直接把母線電壓拉崩了。換了一個更大功率的開關(guān)電源并在芯片 VM 引腳進(jìn)線處加了 220uF 電解電容之后情況有所改善但還是偶爾丟步。接著查加速度曲線發(fā)現(xiàn)是從 200Hz 直接跳到了 5kHz轉(zhuǎn)子慣性根本跟不上。把加速步數(shù)從 20 調(diào)到 40丟步就消失了。完整鏈路走下來結(jié)論很簡單先查供電再查電流設(shè)定再查曲線參數(shù)順序不能亂。第三個坑是芯片過熱。這有幾種不同的情況如果你測的是芯片表面很燙先懷疑 PowerPAD 的焊盤沒焊好或者底層散熱銅皮太小如果電機(jī)也一起燙那就查電流設(shè)定是否超出電機(jī)額定。還有一個容易被忽略的點是芯片長期工作在最大電流附近沒有任何降額。工業(yè)設(shè)計里我習(xí)慣把連續(xù)工作電流控制在芯片規(guī)格的 70% 左右扭矩不夠就換更大規(guī)格的電機(jī)和驅(qū)動而不是讓芯片頂著紅線跑。第四個坑是上電瞬間電機(jī)跳動。第一次上電時電機(jī)“咔”地跳一下位置就偏了。這個現(xiàn)象通常和 nSLEEP 引腳的電平時序有關(guān)。如果 MCU 在上電初始化期間IO 輸出還沒有穩(wěn)定到預(yù)期電平DRV8818PWPR 會隨機(jī)進(jìn)入某個輸出狀態(tài)電機(jī)線圈就可能短暫導(dǎo)通并產(chǎn)生位移。解決方法是讓 MCU 先完成配置把 nSLEEP、DIR、MODE 等引腳全部設(shè)置好再延時一段時間后釋放芯片的睡眠狀態(tài)。另一個做法是控制母線電壓的建立時序盡量讓 VM 晚于邏輯電源 VDD 到達(dá)避免芯片在供電不穩(wěn)的狀態(tài)下輸出。這兩種措施疊加以后上電跳動基本不會再出現(xiàn)?,F(xiàn)象優(yōu)先檢查項常見根因處理方式電機(jī)嘯叫衰減模式、脈沖抖動快衰減 頻率毛刺切換衰減模式、平滑定時器更新帶載丟步母線電壓、加速度曲線電源拉崩、加速過猛加大電容/電源功率調(diào)整曲線芯片燒燙焊盤布局、電流設(shè)定PowerPAD 散熱不足加大過孔陣列、降額使用上電跳動nSLEEP 時序初始化時輸出不穩(wěn)定先配 IO 再釋放睡眠6. 從開環(huán)走向半閉環(huán)堵轉(zhuǎn)檢測與現(xiàn)場可靠性很多人覺得步進(jìn)電機(jī)只能是開環(huán)控制因為一旦丟步系統(tǒng)并不知道。但實際工業(yè)應(yīng)用中大部分丟步發(fā)生前是有征兆的負(fù)載增大導(dǎo)致電流上升、脈沖目標(biāo)位置和電機(jī)實際轉(zhuǎn)角逐漸偏離。充分利用 DRV8818PWPR 的 nFAULT 引腳和 MCU 的 ADC可以在不加編碼器的情況下做一版“軟堵轉(zhuǎn)檢測”。具體做法是MCU 在 RUN 階段定時通過 ADC 讀取母線電壓和 VREF 相關(guān)信號如果檢測到電流異常升高或者電壓跌落結(jié)合位置誤差累計判斷是否為堵轉(zhuǎn)。比如目標(biāo)位置設(shè)置為前進(jìn) 10000 步但電機(jī)在 3000 步左右就已經(jīng)出現(xiàn)連續(xù)多次電流異??梢灾苯优卸ó惓2⑼V馆敵?。這種方式無法做到閉環(huán)控制的精度但足以在工業(yè)現(xiàn)場避免電機(jī)長時間堵轉(zhuǎn)導(dǎo)致的過熱損壞。如果項目最終需要真正的閉環(huán)定位可以考慮外接編碼器。PIC18LF46K40 的 PPS 機(jī)制可以方便地讓編碼器的 A/B 相信號映射到外部中斷引腳或者讓 SPI 接口讀取絕對值編碼器。做了閉環(huán)之后就不再只是“發(fā)脈沖了”而是位置環(huán)控制MCU 根據(jù)實際位置偏差修正目標(biāo)脈沖丟步可以被實時糾正。這個過程相比直接用伺服電機(jī)成本低很多對于很多機(jī)器人關(guān)節(jié)場景已經(jīng)足夠。我的個人體會是DRV8818PWPR 這類芯片方案的最大價值并不在于它比模塊驅(qū)動多強(qiáng)而在于它把“電流控制”的主動權(quán)交回到了軟件手里。VREF 動態(tài)可調(diào)、衰減模式可選、故障引腳可讀這些對模塊方案來說都是被閹割掉的接口。如果你和我一樣需要長期維護(hù)一套機(jī)器人運動控制板一開始就按芯片級方案做后面現(xiàn)場排查問題真的會省力很多。