電機(jī)控制方案:從硬件到調(diào)試)
如果你也在做工業(yè)定位設(shè)備、小型機(jī)器人關(guān)節(jié)或者送料機(jī)構(gòu)的運(yùn)動(dòng)控制很快就會發(fā)現(xiàn)“步進(jìn)電機(jī)”這四個(gè)字背后全是細(xì)節(jié)。最近我在一個(gè) 24V 供電的物料推送項(xiàng)目里用 TI 的 DRV8818PWPR 驅(qū)動(dòng)芯片搭配 Microchip 的 PIC18F47K42 單片機(jī)重新搭了一套完整的雙極步進(jìn)電機(jī)控制方案從硬件、固件到帶載調(diào)試都跑了一遍。這篇文章就把這套方案完整拆開講為什么選這兩個(gè)芯片、電路怎么搭、固件怎么把運(yùn)動(dòng)曲線跑穩(wěn)、現(xiàn)場調(diào)試又踩了哪些坑。適合正在做選型評估或者準(zhǔn)備自己動(dòng)手做工業(yè)級、機(jī)器人級步進(jìn)驅(qū)動(dòng)電路的人參考。1. 為什么是 DRV8818PWPR PIC18F47K42先講選型動(dòng)機(jī)1.1 驅(qū)動(dòng)與主控的分工DRV8818 把最難的部分消化掉了以前自己用分立 MOSFET 搭過雙 H 橋驅(qū)動(dòng)雙極步進(jìn)電機(jī)那種體驗(yàn)屬于“能轉(zhuǎn)但不敢用”。原因在于雙極步進(jìn)電機(jī)的兩套繞組都需要雙向電流并且線圈是強(qiáng)感性負(fù)載開通、關(guān)斷、續(xù)流、電流斬波、過流保護(hù)、死區(qū)控制任何一環(huán)做不好輕則發(fā)熱噪音重則炸管。DRV8818PWPR 這類集成驅(qū)動(dòng)芯片存在的意義就是把這一大堆功率級問題全部收進(jìn)一顆芯片里。這顆芯片內(nèi)部集成雙 H 橋自帶電流斬波調(diào)節(jié)和微步細(xì)分譯碼器。對我這種做系統(tǒng)應(yīng)用的人來說最大的好處是主控根本不需要管換相順序。PIC18F47K42 只需要在 STEP 引腳上輸出脈沖在 DIR 引腳上給出方向電平DRV8818 內(nèi)部就會自動(dòng)把脈沖計(jì)數(shù)、查微步電流表、控制 H 橋通斷這些事情做完。這是一條非常重要的工作分工線主控負(fù)責(zé)“什么時(shí)候走、走多快、走到哪”驅(qū)動(dòng)芯片負(fù)責(zé)“怎么把電流灌進(jìn)線圈里、灌多少”。這種分工帶來的直接收益是固件復(fù)雜度大幅下降。你不需要在定時(shí)器中斷里維護(hù) 4 個(gè) MOSFET 的開關(guān)時(shí)序不需要做死區(qū)補(bǔ)償也不用天天擔(dān)心上下橋直通。只要保證 STEP 脈沖的頻率、寬度滿足數(shù)據(jù)手冊要求系統(tǒng)的行為就是可預(yù)期的。1.2 PIC18F47K42 對這份工作的匹配點(diǎn)PIC18F47K42 屬于 Microchip 的 K42 系列8 位架構(gòu)但在運(yùn)動(dòng)控制這種場景里它的定位非常合適。首先是時(shí)鐘它的內(nèi)部振蕩器最高能跑到 64MHz省掉了外部晶振同時(shí)精度對步進(jìn)脈沖來說已經(jīng)足夠。其次是外設(shè)它有多路 16 位定時(shí)器做脈沖發(fā)生器很順手還有 12 位 ADC可以用來讀 NTC 溫度、母線電壓或者做電流監(jiān)測UART、SPI、I2C 也都齊全接上位機(jī)或者接 PLC 很方便。我特別看重的一點(diǎn)是它作為 8 位機(jī)的中斷響應(yīng)確定性。做步進(jìn)控制最怕什么怕主控被別的任務(wù)卡住導(dǎo)致 STEP 脈沖突然斷了或者延遲了。PIC18F47K42 沒有復(fù)雜的操作系統(tǒng)和任務(wù)調(diào)度把所有中斷屏蔽掉之后定時(shí)器中斷的響應(yīng)時(shí)間基本穩(wěn)定這對高頻脈沖輸出非常關(guān)鍵。相比之下如果你用 Linux 加實(shí)時(shí)補(bǔ)丁的方式去發(fā)脈沖抖動(dòng)問題會讓你調(diào)到頭禿。另外工業(yè)現(xiàn)場往往有較長的線纜、變頻器等干擾源這顆單片機(jī)的工作電壓范圍寬I/O 口也相對皮實(shí)。我在實(shí)際項(xiàng)目里用了 5V 供電邏輯電平余量大直接接驅(qū)動(dòng)芯片的控制引腳心里更有底。如果你手里的驅(qū)動(dòng)芯片邏輯閾值只支持 3.3V那就要認(rèn)真查手冊做電平匹配這一步不能偷懶。1.3 明確邊界這套方案的適用與不適用任何選型都要知道邊界在哪。DRV8818PWPR PIC18F47K42 這套組合最適合的場景是24V 或 48V 供電、單軸或少量軸、電流在芯片規(guī)格覆蓋范圍內(nèi)、開環(huán)步進(jìn)控制夠用、對成本敏感、需要靈活定制 I/O 和協(xié)議的中小型工業(yè)設(shè)備和機(jī)器人輔助機(jī)構(gòu)。反過來如果你需要極致的靜音效果TMC 系列的靜音步進(jìn)芯片會更合適如果電機(jī)電流很大或者母線電壓超過 60V老老實(shí)實(shí)上外部柵極驅(qū)動(dòng)加分立功率管如果從第一天就確定要閉環(huán)控制那么主控端至少還要留出編碼器接口和強(qiáng)實(shí)時(shí)運(yùn)算的余量。把邊界想清楚才不會出現(xiàn)“芯片選小了重新畫板”這種返工事故。2. 雙極步進(jìn)電機(jī)的工作原理為什么必須靠驅(qū)動(dòng)芯片2.1 四根線、兩套繞組和磁場合成雙極步進(jìn)電機(jī)引出四根線內(nèi)部是兩套獨(dú)立繞組分別叫 A 相和 B 相。要讓電機(jī)轉(zhuǎn)起來必須給這兩套繞組按順序通入不同方向的電流產(chǎn)生旋轉(zhuǎn)的磁場牽引轉(zhuǎn)子永磁體跟著走。這里有個(gè)基本現(xiàn)實(shí)單方向的電流驅(qū)動(dòng)不了雙極電機(jī)必須在繞組上實(shí)現(xiàn)正反向電流這個(gè)能力就叫“可逆驅(qū)動(dòng)”也就是 H 橋。H 橋可以理解成四組開關(guān)圍成一個(gè)方框負(fù)載繞組接在方框中間。對角兩組開關(guān)導(dǎo)通時(shí)電流方向是正的換另一組對角導(dǎo)通電流方向就反過來。四個(gè)開關(guān)全開或者全關(guān)的狀態(tài)也要小心處理全開叫續(xù)流全關(guān)才會真正斷開電流。如果上下兩組開關(guān)同時(shí)導(dǎo)通那就叫直通會直接燒毀功率管。DRV8818 內(nèi)部集成的是帶保護(hù)邏輯的雙 H 橋這些問題芯片自己處理了不需要應(yīng)用工程師在軟件里操心。電機(jī)每收到一個(gè)換相指令定子磁場就偏轉(zhuǎn)一步轉(zhuǎn)子跟著轉(zhuǎn)一個(gè)固定角度。常見的混合式步進(jìn)電機(jī)走一個(gè)完整電氣周期需要幾十個(gè)步數(shù)具體步距角取決于轉(zhuǎn)子齒數(shù)和磁場極對數(shù)。200 步/轉(zhuǎn)的電機(jī)是全步模式下的經(jīng)典規(guī)格每個(gè)全步 1.8 度。2.2 全步、半步、微步驅(qū)動(dòng)芯片內(nèi)部的通電時(shí)序表全步驅(qū)動(dòng)有兩種常見方式單相通電即“A → B → A? → B?”循環(huán)每步磁場跳躍 90 度兩相通電即“AB → A?B → A?B? → AB?”每步也是 90 度但兩相同時(shí)通電能產(chǎn)生更大的力矩。半步模式則是在這兩種狀態(tài)之間再插入一個(gè)單相和兩相混合的過渡態(tài)使磁場每次只跳 45 度步距角減半低速運(yùn)行的平穩(wěn)性提升。微步細(xì)分是怎么來的把電流按正弦規(guī)律分配讓 A 相電流逐漸減小、B 相電流逐漸增大磁場位置就可以停在任意中間角度。比如 1/16 細(xì)分就是把原來的一個(gè)全步再切成 16 個(gè)微小增量電機(jī)每收到一個(gè) STEP 脈沖只走全步的 1/16。這一步的精髓在于主控不需要自己算正弦電流表DRV8818 內(nèi)部的譯碼器會根據(jù) MODE 引腳設(shè)置的細(xì)分檔位自動(dòng)完成電流目標(biāo)值的分配。主控依然只關(guān)心“發(fā)出多少個(gè)脈沖”。這帶來的直接好處是固件極其簡單壞處是細(xì)分越高同樣轉(zhuǎn)速下需要的脈沖頻率越高。200 步/轉(zhuǎn)的全步電機(jī)1/16 細(xì)分就是 3200 步/轉(zhuǎn)。如果你要求電機(jī)跑到 300RPMSTEP 脈沖就要到 16000Hz 左右這個(gè)頻率對 8 位機(jī)的定時(shí)器完全沒問題但設(shè)計(jì)時(shí)要把這個(gè)賬算清楚。2.3 電流斬波與衰減模式步進(jìn)電機(jī)的繞組是感性負(fù)載電流不能突變。直接給一個(gè)恒定的母線電壓電流會按“L/R 時(shí)間常數(shù)”緩慢爬升。如果母線電壓很高電流會很快沖過額定值燒電機(jī)如果母線電壓太低電流又爬不到期望值力矩不夠。驅(qū)動(dòng)芯片的做法是電流斬波通過檢流電阻實(shí)時(shí)感知繞組電流一旦電流達(dá)到目標(biāo)值就暫時(shí)關(guān)斷或反向續(xù)流等電流降下去再重新開通。DRV8818 的電流目標(biāo)值由 VREF 引腳電壓結(jié)合檢流電阻決定。繞組電流到達(dá)目標(biāo)后芯片內(nèi)部進(jìn)入所謂“衰減模式”常見的是慢衰減和混合衰減之分。慢衰減指續(xù)流時(shí)讓電流自然緩慢下降電流紋波小但關(guān)斷響應(yīng)慢混合衰減會先快速衰減再轉(zhuǎn)入慢衰減兼顧紋波和響應(yīng)速度。這個(gè)參數(shù)直接關(guān)系到電機(jī)的高速性能和噪聲水平后面調(diào)試部分我會再提到。這里要糾正一個(gè)常見誤區(qū)微步細(xì)分不會增加電機(jī)的最大扭矩它換來的是低速平順性和位置分辨率的提升。細(xì)分到中間位置時(shí)保持力矩通常還略低于全步位置。所以如果你的負(fù)載接近電機(jī)堵轉(zhuǎn)力矩不要指望開高細(xì)分就能解決丟步問題老老實(shí)實(shí)加大電流或者換更大電機(jī)才是正解。3. 硬件設(shè)計(jì)與電流設(shè)定PCB 階段的幾個(gè)關(guān)鍵點(diǎn)3.1 最小連接系統(tǒng)控制引腳一個(gè)都不能省畫板之前先把 DRV8818 的控制引腳和 PIC18F47K42 的 GPIO 對應(yīng)關(guān)系理清楚。下面是我在這套方案里用的連接表信號方向以芯片為準(zhǔn)。功能DRV8818 引腳主控/外部說明步進(jìn)脈沖STEPPIC GPIO 輸出上升沿觸發(fā)一步脈寬要滿足手冊最小值方向DIRPIC GPIO 輸出換向前必須滿足建立時(shí)間使能ENPIC GPIO 輸出低有效或高有效以手冊為準(zhǔn)懸空狀態(tài)有陷阱細(xì)分選擇MODE0/1/2PIC GPIO 輸出或硬接線不同電平組合對應(yīng)不同細(xì)分檔電流基準(zhǔn)VREF分壓電阻網(wǎng)絡(luò)直接決定相電流目標(biāo)值故障輸出nFAULTPIC 輸入接上拉過流、過溫、欠壓時(shí)拉低檢流電阻ISENA/ISENB實(shí)心電阻到地功率路徑不能用跳線替代母線輸入VMM電源 大電容24V 或 48V電容靠近引腳有一個(gè)細(xì)節(jié)經(jīng)常被忽略EN 引腳的電平極性。不同驅(qū)動(dòng)芯片的使能邏輯不一樣有的低電平使能有的高電平使能。如果你按慣性思維接反了表現(xiàn)就是電機(jī)完全不動(dòng)而且因?yàn)殡娏饕呀?jīng)被切斷你用萬用表量繞組兩端是量不出電壓的排查起來很懵。我習(xí)慣在原理圖階段就把電平極性用注釋標(biāo)在網(wǎng)絡(luò)上避免幾個(gè)月后自己看板都忘了當(dāng)初的設(shè)計(jì)意圖。3.2 電流設(shè)定的完整推導(dǎo)過程設(shè)定電機(jī)電流是整個(gè)硬件設(shè)計(jì)里最不該拍腦袋的一步。流程是這樣的第一步查電機(jī)數(shù)據(jù)手冊找到額定相電流。比如手里這個(gè) NEMA23 電機(jī)額定 1.5A那我們就以 1.5A 為工作點(diǎn)并且考慮留 10% 到 20% 的余量具體看負(fù)載工況。第二步選檢流電阻。檢流電阻的阻值決定了同樣目標(biāo)電流下檢流壓降的大小阻值太小信號分辨率不夠電流調(diào)節(jié)精度差阻值太大電阻上功耗高、發(fā)熱嚴(yán)重。第三步按手冊給出的換算公式計(jì)算 VREF 電壓。不同型號的電流檢測等效系數(shù)不一樣常見的是 VREF 與檢流電阻電壓按內(nèi)部增益折算具體公式必須以你手頭芯片的數(shù)據(jù)手冊為準(zhǔn)。第四步用兩個(gè)電阻搭分壓網(wǎng)絡(luò)把 VREF 穩(wěn)定在目標(biāo)電壓上。上電后用直流電流表串聯(lián)到電機(jī)繞組上實(shí)測相電流再做微調(diào)。我舉個(gè)實(shí)際例子。目標(biāo)相電流 1.5A檢流電阻選 0.1Ω那么檢流電阻上理論壓降就是 0.15V。如果手冊公式給出的系數(shù)是“檢流壓降 × 內(nèi)部系數(shù) VREF”你把系數(shù)代進(jìn)去算出目標(biāo) VREF再用分壓電阻確定出來。上電后實(shí)測電流如果偏了優(yōu)先懷疑電阻精度其次懷疑分壓網(wǎng)絡(luò)的值最后才是芯片自身的一致性。我遇到過一次實(shí)測電流比目標(biāo)低 20% 的情況最后發(fā)現(xiàn)是檢流電阻焊盤過大導(dǎo)致散熱過快電阻阻值漂移了。檢流電阻的功率也要算。0.1Ω、1.5A 電流理論功耗是 0.225W但是斬波電流是方波平均值會低一些。穩(wěn)妥起見選額定功率 0.5W 以上的合金電阻或者金屬膜電阻PCB 上留足散熱銅箔。這里省錢沒意義電阻燒了電流檢測就失效整個(gè)驅(qū)動(dòng)芯片都會跟著出問題。3.3 電源去耦、接地與 PowerPAD 散熱工業(yè)設(shè)備最常見的毛病是母線電壓紋波大。DRV8818 的 VMM 引腳附近必須放至少一個(gè) 10μF 到 100μF 的電解電容或者陶瓷電容組合用來吸收電機(jī)加減速時(shí)的大電流沖擊。我在這套板上用了 100μF 電解電容加 10μF 陶瓷電容并聯(lián)陶瓷電容要靠近芯片引腳電解電容可以稍微遠(yuǎn)一點(diǎn)。邏輯電源 VDD 去耦同樣重要0.1μF 陶瓷電容直接貼引腳。接地是另一個(gè)容易翻車的地方。功率地要承載電機(jī)電流回路電流瞬變非常劇烈邏輯地是 PIC 和驅(qū)動(dòng)邏輯的工作參考。如果兩點(diǎn)混在一起邏輯地電位會被瞬間抬高輕則干擾 ADC重則引起單片機(jī)復(fù)位。我的做法是在 PCB 上做單點(diǎn)星形接地功率地線和邏輯地線只在主電容負(fù)極匯合中間用一小段銅箔連接必要時(shí)可以串一個(gè) 0Ω 電阻做隔離點(diǎn)。DRV8818PWPR 封裝帶 PowerPAD 熱焊盤這不是擺設(shè)。芯片的大部分熱量要靠這個(gè)焊盤傳到 PCB 銅箔上。設(shè)計(jì)時(shí)必須把熱焊盤可靠焊接到地銅平面并且在焊盤下方打一排過孔到內(nèi)層銅皮讓熱量能垂直傳導(dǎo)。我在第一版板子沒打過孔滿載運(yùn)行 20 分鐘芯片就燙得不能摸后來補(bǔ)了過孔陣列并把底層銅皮也留成大面積鋪銅溫度直接降了十幾度。如果你的設(shè)備裝在封閉電柜里環(huán)境溫度 40~50 度散熱設(shè)計(jì)更要認(rèn)真算。4. 固件設(shè)計(jì)從“會轉(zhuǎn)”到“轉(zhuǎn)得穩(wěn)”4.1 STEP 脈沖的生成方式定時(shí)器中斷是首選PIC18F47K42 發(fā) STEP 脈沖最直接的做法是用一個(gè) 16 位定時(shí)器產(chǎn)生固定頻率的中斷在中斷里翻轉(zhuǎn) STEP 引腳。這里要理解一個(gè)關(guān)鍵計(jì)算步進(jìn)頻率是由定時(shí)器溢出周期決定的。以 64MHz 時(shí)鐘為例如果目標(biāo) 3200 步/秒那么每個(gè) STEP 脈沖的間隔是 64MHz / 3200 ≈ 20000 個(gè)時(shí)鐘周期這個(gè)數(shù)放進(jìn) 16 位定時(shí)器 PR2 寄存器里完全裝得下不需要預(yù)分頻。如果目標(biāo)步進(jìn)頻率到了 50000 步/秒那么間隔只有 1280 個(gè)時(shí)鐘周期也還在范圍里但要注意此時(shí)中斷服務(wù)程序本身的開銷占 CPU 的比重。我的建議是中斷服務(wù)程序里只做三件事拉高 STEP、做一個(gè)固定短延時(shí)或者用另一個(gè)短定時(shí)把 STEP 拉低、更新下一個(gè) PR2 值然后退出。任何通訊處理、ADC 濾波都不要放進(jìn)這個(gè)高優(yōu)先級中斷里。寫一個(gè)最小的示意void __interrupt(high_priority) step_timer_isr(void) { // 清除中斷標(biāo)志 TMR6IF 0; // 發(fā)一個(gè) STEP 脈沖 STEP_PIN 1; // 短延時(shí)保證脈寬滿足驅(qū)動(dòng)芯片要求 __delay_us(2); STEP_PIN 0; // 更新下一次溢出的周期這里 preload 由加減速邏輯計(jì)算 T6PR next_period; }注意 STEP 脈寬不要做得太寬因?yàn)槊}寬越寬定時(shí)器周期里被占掉的比例越大如果脈寬和周期接近波形就畸形了。一般 2μs 左右的脈寬對絕大多數(shù)驅(qū)動(dòng)芯片都夠用具體以手冊的最小脈寬和最小 STEP 高電平時(shí)間為準(zhǔn)。4.2 加減速曲線直接起停丟步其實(shí)是數(shù)學(xué)問題電機(jī)切相會產(chǎn)生力矩脈動(dòng)負(fù)載慣性越大直接從靜止跳到高速就越容易丟步。步進(jìn)電機(jī)開環(huán)控制里最經(jīng)典的做法是梯形加減速從低速起步逐步加速到巡航速度快到位時(shí)逐步減速到低速最后停住。加減速的數(shù)學(xué)本質(zhì)是“每兩個(gè) STEP 之間的時(shí)間間隔不斷變化”。加速階段間隔從長變短減速階段從短變長。最簡單的線性梯形加速加速時(shí)間固定加速度恒定。舉個(gè)例子目標(biāo)巡航速度 60RPM電機(jī) 1/16 細(xì)分那么就是 3200 步/秒。如果設(shè)定加速時(shí)間 0.2 秒加速度就是 3200 / 0.2 16000 步/秒2。加速階段走過的步數(shù)是 0.5 × 16000 × 0.04 320 步減速也一樣 320 步。如果目標(biāo)總位移是 3200 步正好一圈那么勻速段就是 2560 步對應(yīng) 0.8 秒整個(gè)移動(dòng)耗時(shí) 1.2 秒。這個(gè)計(jì)算告訴我們幾件事第一加速度不能亂設(shè)它受限于電機(jī)最大力矩和負(fù)載轉(zhuǎn)動(dòng)慣量第二短距離移動(dòng)時(shí)可能還沒加到巡航速度就要開始減速此時(shí)梯形會退化成三角形曲線第三固件里最好預(yù)生成一張“間隔時(shí)間表”把加速段每一步的 PR2 值算好存起來加速時(shí)逐個(gè)查表比在中斷里做浮點(diǎn)運(yùn)算快得多。我在這套項(xiàng)目里的實(shí)現(xiàn)方式是主循環(huán)里根據(jù)目標(biāo)位置、當(dāng)前速度和加速度計(jì)算出下一步的目標(biāo)頻率再換算成定時(shí)器周期寫入一個(gè)待加載變量定時(shí)器中斷只在溢出時(shí)把待加載變量拷貝到 PR2。這樣加減速邏輯在主循環(huán)里做實(shí)時(shí)性要求高的只有最后一步加載完全夠用。4.3 方向、使能與急停的時(shí)序細(xì)節(jié)方向切換的坑藏在時(shí)序里。DIR 引腳的電平變化到 STEP 引腳產(chǎn)生上升沿之間必須留出驅(qū)動(dòng)芯片要求的建立時(shí)間通常至少幾百納秒到幾微秒。如果用了光耦隔離光耦的傳播延遲可能長達(dá)幾微秒那么光耦 PIN 到驅(qū)動(dòng)芯片側(cè)的時(shí)序余量就要重新算。我的習(xí)慣是在次方向切換時(shí)先把 DIR 寫到位然后故意延時(shí)大于 1μs再去發(fā)第一個(gè) STEP 脈沖這個(gè)延時(shí)在工業(yè)場景下完全可接受。使能引腳的控制邏輯和系統(tǒng)狀態(tài)機(jī)要綁在一起。正常運(yùn)動(dòng)時(shí) EN 保持有效空閑時(shí)如果還保持使能線圈一直通電芯片和電機(jī)會持續(xù)發(fā)熱。工業(yè)設(shè)備如果要求保持位置我不能直接丟掉保持力矩所以我會在空閑時(shí)把相電流降到額定的一半以下通過 PWM 控制 VREF 或者切換工作模式實(shí)現(xiàn)既保住基本定位力又不至于燒燙。如果設(shè)備有機(jī)械剎車那么空閑時(shí)直接關(guān)閉使能、讓剎車抱死是更省電的做法。急停的處理要區(qū)分兩種需求。單純的命令行急停我建議先執(zhí)行減速停止而不是一腳剎車因?yàn)椴竭M(jìn)電機(jī)突然停機(jī)慣性沖擊會把機(jī)械結(jié)構(gòu)打壞。但是硬件的緊急停止按鈕不一樣它應(yīng)該直接切斷使能并通知上位機(jī)等人工確認(rèn)后再重新回零。這個(gè)邏輯別混在一起否則會出現(xiàn)“急停之后電機(jī)還自己減速”這種尷尬場景。5. 實(shí)測與調(diào)試筆記那些數(shù)據(jù)手冊不會告訴你的坑5.1 “電機(jī)不轉(zhuǎn)”的排查順序帶載運(yùn)行時(shí)電機(jī)紋絲不動(dòng)第一反應(yīng)別是懷疑固件按下面順序查硬件能省大量時(shí)間?,F(xiàn)象優(yōu)先檢查項(xiàng)常見根因電機(jī)完全不動(dòng)、無吸力VMM 電壓、EN 電平、VREF 電壓使能極性反了或 VREF 沒電壓電機(jī)抖動(dòng)但不連續(xù)走STEP 脈寬、脈沖頻率脈沖太窄驅(qū)動(dòng)沒識別到上升沿電機(jī)有吸力但力矩很小相電流設(shè)置檢流電阻阻值不對或 VREF 偏低轉(zhuǎn)幾圈后不再動(dòng)nFAULT 電平、芯片溫度過流或過溫保護(hù)觸發(fā)了偶發(fā)性丟步復(fù)位后能恢復(fù)供電瞬間掉壓、邏輯干擾母線電容不足或接地不良我在這套板上遇到過一個(gè)非常隱蔽的問題電機(jī)剛開始正常運(yùn)行 30 秒后突然完全失步重新上電又好了。排查發(fā)現(xiàn) nFAULT 正常芯片溫度也不高最后用示波器看 VMM 電壓發(fā)現(xiàn)每次大電流加速階段母線電壓被拉低到 16V 以下觸發(fā)了驅(qū)動(dòng)芯片的欠壓保護(hù)。根因是供電線太細(xì)加上板上的大電容離芯片引腳太遠(yuǎn)。處理方式是把線徑加粗、電容挪近問題徹底消失。5.2 發(fā)熱、噪聲與失步的現(xiàn)場處理發(fā)熱是最常見的抱怨。芯片發(fā)熱和電機(jī)發(fā)熱不是一回事芯片熱說明散熱設(shè)計(jì)弱電機(jī)熱說明電流調(diào)節(jié)有問題。如果電機(jī)在靜止保持階段燙手優(yōu)先降低保持電流如果運(yùn)行階段燙要看檢流電阻阻值和 VREF 設(shè)定是不是偏高了。還有一個(gè)容易忽略的因素電流衰減模式。衰減不對會導(dǎo)致電流紋波偏大有效值電流比設(shè)定值更高表現(xiàn)為“設(shè)定 1.2A 實(shí)測 1.5A”。調(diào)整衰減模式相關(guān)引腳的電平組合往往能把有效值電流拉回設(shè)定值。噪聲問題要從機(jī)械和電氣兩頭看。機(jī)械共振在低速段最明顯電機(jī)在某個(gè)頻率附近會劇烈振動(dòng)。開微步細(xì)分是緩解共振最簡單的辦法從全步切到 1/16 細(xì)分后共振幅度會大幅下降。電氣噪聲則主要來自斬波電流的高頻成分它還會沿著電源線向外傳導(dǎo)影響同一電源軌上的其他設(shè)備。給電機(jī)線套磁環(huán)、在驅(qū)動(dòng)輸出端加 RC 吸收網(wǎng)絡(luò)是我在工業(yè)現(xiàn)場常用的組合拳。如果出現(xiàn)丟步很多人第一反應(yīng)是加電流但丟步往往不是單因素問題。加速度太陡、相電流不足、驅(qū)動(dòng)芯片進(jìn)入過溫降額、機(jī)械導(dǎo)軌卡澀、接線端子虛接每個(gè)都可能貢獻(xiàn)一部分。正確的做法是一次只改一個(gè)變量做 A/B 對比。我從一開始就把電流、加速度、細(xì)分、母線電壓這幾個(gè)參數(shù)都做成了可以在運(yùn)行中修改的配置調(diào)參效率高很多。5.3 用示波器做一次完整的信號體檢現(xiàn)場排查離不開示波器至少要看四個(gè)信號。第一個(gè)是 STEP 引腳確認(rèn)脈沖頻率和脈寬符合預(yù)期加減速過程中頻率變化應(yīng)該平滑而不是突變。第二個(gè)是 DIR 引腳方向切換瞬間STEP 脈沖必須穩(wěn)定地停止在某個(gè)狀態(tài)確保驅(qū)動(dòng)芯片在方向建立完成前不會收到新的上升沿。第三個(gè)是檢流電阻上的電壓放大后能看到典型的斬波三角波它的包絡(luò)在微步細(xì)分模式下應(yīng)該呈正弦分布如果包絡(luò)形狀不對說明細(xì)分工作異?;蛘唠娏髡{(diào)節(jié)有問題。第四個(gè)是 nFAULT讓它接一個(gè)邏輯分析儀或者示波器第二通道堵轉(zhuǎn)觸發(fā)時(shí)能抓到它拉低的瞬間。有一個(gè)細(xì)節(jié)提醒把示波器探頭的地線夾直接夾在功率地上測 STEP 信號很容易引入噪聲。工業(yè)現(xiàn)場我習(xí)慣用差分探頭或者把探頭地線接到信號地參考點(diǎn)兩者結(jié)果可能完全不同。別高估普通示波器探頭的共模抑制能力尤其在電機(jī)運(yùn)行時(shí)。6. 從 DEMO 到工業(yè)機(jī)器人產(chǎn)線系統(tǒng)化設(shè)計(jì)還差什么6.1 與上位機(jī)的接口把運(yùn)動(dòng)控制變成一條指令做演示時(shí)可以在 PIC 里寫死一段運(yùn)動(dòng)但真到了設(shè)備上運(yùn)動(dòng)參數(shù)必須由上位機(jī)或者 PLC 下發(fā)。我在這套項(xiàng)目里用 UART 做了一條簡單的文本協(xié)議形如M100,S3200,A16000,V3200,E含義是移動(dòng)到位置 100總步數(shù) 3200加速度 16000 步/秒2巡航速度 3200 步/秒執(zhí)行。每一條命令幀帶起始符和結(jié)束符CRC 校驗(yàn)在前面做掉。如果上位機(jī)是 PLCUART 不一定好用很多 PLC 擅長的是高速脈沖輸出或者現(xiàn)場總線。這種情況下可以用光耦把 PLC 的 STEP/DIR 脈沖直接接到驅(qū)動(dòng)芯片PIC 退出來做回零、保護(hù)、狀態(tài)上報(bào)這類輔助工作。一條軸有多套驅(qū)動(dòng)接口是常態(tài)設(shè)計(jì)時(shí)接口層要抽出來別把協(xié)議處理寫死在中斷里。我給 PIC 留了 UART、I2C 和一組光耦輸入三種方式都能控制同一套運(yùn)動(dòng)邏輯本質(zhì)上是同一套命令解析函數(shù)在服務(wù)不同的通道。6.2 保護(hù)與狀態(tài)監(jiān)測過溫、過流、看門狗工業(yè)設(shè)備不能只靠驅(qū)動(dòng)芯片自己的保護(hù)系統(tǒng)級保護(hù)一定要做。我在散熱片上貼了一個(gè) NTC 熱敏電阻接到 PIC 的 12 位 ADC 上每 100ms 采一次溫度超過閾值就降速運(yùn)行超過第二閾值就停機(jī)報(bào)故障。這個(gè)成本不到兩塊錢但救了我一次設(shè)備在夏季廠房里運(yùn)行時(shí)環(huán)境溫度高芯片進(jìn)入過溫保護(hù)前我的軟件先把速度降下來了生產(chǎn)沒有中斷只是臨時(shí)慢了一點(diǎn)。nFAULT 中斷要接到 PIC 的輸入變化中斷上一旦拉低立即進(jìn)入故障狀態(tài)停止發(fā)脈沖、關(guān)閉使能、把故障碼通過 UART 發(fā)出去。這里的關(guān)鍵是別在故障恢復(fù)前自動(dòng)重啟工業(yè)現(xiàn)場的重啟必須由人工確認(rèn)否則可能造成誤動(dòng)作。還要給 PIC 配一個(gè)硬件看門狗防止主控程序跑飛后電機(jī)停在無法預(yù)知的位置??撮T狗超時(shí)后除了復(fù)位主控還應(yīng)該把驅(qū)動(dòng)芯片的使能引腳拉回安全態(tài)穩(wěn)妥的做法是用一個(gè)與門把“主控正?!毙盘柡褪鼓苄盘栕鲞壿嬇c。6.3 歸零、機(jī)械限位與閉環(huán)升級路徑任何要求可重復(fù)定位的設(shè)備開環(huán)步進(jìn)的第一件事是歸零。歸零不是簡單碰一下限位開關(guān)就結(jié)束要設(shè)計(jì)成“先低速正向找限位 → 觸發(fā)后反方向退離 → 再低速正向找一次”第二次觸發(fā)的點(diǎn)作為機(jī)械原點(diǎn)。這樣做是為了消除開關(guān)本身的回差和觸發(fā)抖動(dòng)重復(fù)精度能提高很多。限位開關(guān)的輸入要做濾波機(jī)械抖動(dòng)在電氣上會表現(xiàn)為一串毛刺光靠軟件延時(shí)消抖有時(shí)不夠我在兩版硬件上都加了 RC 濾波效果立竿見影。如果以后系統(tǒng)要求升級成閉環(huán)這套硬件不用推倒重來。PIC18F47K42 還有空閑的定時(shí)器和 I/O加一個(gè)增量編碼器讀取電路或者在電機(jī)尾部掛一個(gè)磁性編碼器就可以在軟件里做“步數(shù)計(jì)數(shù) vs 編碼器位置”的偏差監(jiān)測一旦偏差超過閾值說明發(fā)生了失步先報(bào)警再讓運(yùn)動(dòng)邏輯決定是否補(bǔ)償。對很多工業(yè)機(jī)器人輔助軸來說這種“開環(huán)執(zhí)行閉環(huán)監(jiān)測”的模式比全閉環(huán)更省成本也足夠可靠。最后分享一個(gè)我自己的調(diào)試習(xí)慣每次改版后第一件事不是跑上位機(jī)而是用示波器盯住 STEP 和 nFAULT 兩個(gè)信號空轉(zhuǎn)跑一個(gè)完整的加減速往返確認(rèn)波形干凈了再交給機(jī)械裝配。步進(jìn)控制這套東西九成的坑都出在電流和時(shí)序上而這兩樣?xùn)|西示波器一眼就能看出來。