電機(jī)驅(qū)動(dòng)方案詳解)
做機(jī)器人的朋友應(yīng)該都有過這種經(jīng)歷上電一看電機(jī)嗡嗡響軸卻一動(dòng)不動(dòng)要么換了個(gè)負(fù)載扭矩就不夠電機(jī)燙得能煎蛋。我這次做的工業(yè)/機(jī)器人步進(jìn)電機(jī)驅(qū)動(dòng)方案用的是一顆很多人覺得“老氣”的 8 位單片機(jī) PIC18LF47K42和 TI 的 DRV8818PWPR 雙 H 橋驅(qū)動(dòng)器目標(biāo)是把雙極步進(jìn)電機(jī)的速度、位置和力矩控制做到穩(wěn)定可靠。這套組合看起來簡單實(shí)際把硬件參數(shù)、電流斬波、加減速算法、異常保護(hù)全部理順之后跑工業(yè)定位平臺(tái)和機(jī)器人關(guān)節(jié)都足夠穩(wěn)。下面把我整個(gè)設(shè)計(jì)和調(diào)試過程完整拆開講從硬件選型到軟件實(shí)現(xiàn)再到常見坑位全部記錄在案。1. 項(xiàng)目概覽與控制方案怎么定1.1 先搞清楚要控制的是什么雙極步進(jìn)電機(jī)和普通直流電機(jī)不一樣us that 雙極步進(jìn)電機(jī)通常是四根線分成 A 相和 B 相每一相都是一組線圈。想讓轉(zhuǎn)子轉(zhuǎn)起來必須讓電流按順序在 A、B 兩個(gè)線圈里換相形成旋轉(zhuǎn)磁場。所以不能簡單地把電源往電機(jī)上一懟而是要有一對(duì) H 橋至少四個(gè)功率開關(guān)管按順序打開關(guān)閉。這個(gè)項(xiàng)目里用到的 DRV8818PWPR其實(shí)就把兩個(gè) H 橋和電流斬波、限流比較器、各種保護(hù)邏輯集成到了一顆芯片里。PIC18LF47K42 只負(fù)責(zé)出邏輯信號(hào)不需要自己干功率放大的活。這種“MCU 出邏輯 驅(qū)動(dòng)芯片出功率”的分工在工業(yè)板和機(jī)器人控制板里是最常見也最不容易出錯(cuò)的方案。因?yàn)槟惆迅唠妷?、大電流和邏輯電源隔開了出問題的時(shí)候排查范圍一下就縮小了。如果把“步進(jìn)電機(jī)控制”簡單理解成“給個(gè)脈沖轉(zhuǎn)多少角度”那很多項(xiàng)目都能跑但跑得穩(wěn)不穩(wěn)是另一回事。真正的控制目標(biāo)有三個(gè)一是位置精確說走 100 步就真的走 100 步二是速度曲線可控加速、勻速、減速都不會(huì)丟步三是電流受控電機(jī)不白發(fā)熱力矩不僅夠還要穩(wěn)。這些目標(biāo)同時(shí)滿足需要從驅(qū)動(dòng)芯片的參數(shù)設(shè)置、MCU 的定時(shí)器用法、運(yùn)動(dòng)曲線的軟件算法三個(gè)層面一起下手。1.2 為什么是 PIC18LF47K42 而不是一顆“更現(xiàn)代”的 MCU選 PIC18LF47K42一開始團(tuán)隊(duì)里也有人質(zhì)疑現(xiàn)在隨便一顆 ARM Cortex-M0 都八九十個(gè)引腳性能比 8 位機(jī)強(qiáng)為什么還要選它但實(shí)際做下來這顆 K42 系列芯片還真挺適合步進(jìn)電機(jī)控制。理由很樸素它自帶不少 Core Independent Peripherals也就是所謂 CIP 外設(shè)很多實(shí)時(shí)性要求高的活可以在硬件層面完成CPU 只需要在關(guān)鍵節(jié)點(diǎn)處理邏輯。比如產(chǎn)生 STEP 脈沖這件事如果用 GPIO 翻轉(zhuǎn)加延時(shí)來做中斷一多、任務(wù)一復(fù)雜脈沖間隔就不均勻速度曲線會(huì)抖最終表現(xiàn)就是電機(jī)噪音大、丟步。而 K42 的定時(shí)器配合 PWM/CCP 模塊可以由硬件連續(xù)輸出占空比 50% 的方波脈沖頻率只由定時(shí)器周期寄存器決定。CPU 不用每一步都參與只要在運(yùn)動(dòng)過程中調(diào)整目標(biāo)頻率就能產(chǎn)生非常平滑的步進(jìn)脈沖序列。還有就是成本、庫存、可靠性的考量。工業(yè)設(shè)備不追求最新最酷的芯片而是講究生命周期長、文檔齊全、供應(yīng)鏈穩(wěn)定。PIC 系列在傳統(tǒng)工控里應(yīng)用很廣汽車電子、醫(yī)療設(shè)備里也能看到它的影子。8 位 MCU 算力確實(shí)不強(qiáng)但步進(jìn)電機(jī)控制本身不是一個(gè) CPU 密集型的活真正吃性能的往往是通訊協(xié)議、故障診斷、數(shù)據(jù)記錄這些“外圍工作”。K42 把這些外圍工作分給硬件外設(shè)去跑CPU 性能反而是夠的。1.3 DRV8818PWPR 在系統(tǒng)里承擔(dān)什么角色DRV8818PWPR 這顆芯片后綴 PWPR 代表 PowerPAD HTSSOP 封裝。這種封裝的底部有一塊大焊盤焊接到 PCB 的銅皮上可以顯著改善散熱。工業(yè)環(huán)境經(jīng)常連續(xù)工作一整天驅(qū)動(dòng) IC 的結(jié)溫如果壓不住一不穩(wěn)定就會(huì)觸發(fā)過熱保護(hù)機(jī)器停在那里等你重啟。所以選這種帶 PowerPAD 的封裝不是隨便定的就是為了把熱阻降下來讓持續(xù)大電流工況下的余量更充足。芯片內(nèi)部集成的兩個(gè) H 橋足以驅(qū)動(dòng)一臺(tái)雙極步進(jìn)電機(jī)。同時(shí)它還有電流斬波功能意思是我設(shè)定一個(gè)目標(biāo)電流比如 1.5A當(dāng)相電流上升到這個(gè)值芯片內(nèi)部就會(huì)通過 PWM 關(guān)斷功率管讓電流降下來然后再導(dǎo)通如此循環(huán)把電流限制在目標(biāo)值附近。這個(gè)功能叫電流限制也叫斬波恒流。沒有它步進(jìn)電機(jī)相電流可能直接沖到電源允許的極限電機(jī)和驅(qū)動(dòng)器都會(huì)燒掉。MCU 和 DRV8818 的分工也很直觀MCU 給出 STEP 脈沖、DIR 方向、SLEEP 休眠、EN 使能這些邏輯信號(hào)DRV8818 再把邏輯信號(hào)放大成功率開關(guān)動(dòng)作同時(shí)通過內(nèi)部電流比較器實(shí)現(xiàn)限流還提供 FAULT 故障輸出讓 MCU 知道當(dāng)前出了什么狀況。這樣 MCU 完全沒有觸碰高電壓功率級(jí)安全性高很多。后續(xù)調(diào)試時(shí)只要軟件邏輯看著沒問題就可以用萬用表去量 DRV8818 的 VM、VREF、ISENSE 這些引腳兩步之內(nèi)就能定位故障在驅(qū)動(dòng)側(cè)還是控制側(cè)。2. DRV8818PWPR 硬件設(shè)計(jì)與電流參數(shù)計(jì)算2.1 供電與功率電路的基本盤這個(gè)項(xiàng)目里我給電機(jī)側(cè)的 VM 供的是 24VMCU 邏輯部分用 3.3V兩套地最終在整板電源入口附近單點(diǎn)匯接。24V 的電源進(jìn)來之后先經(jīng)過一個(gè)防反接二極管然后是一顆 100μF 電解電容加一顆 1μF 陶瓷電容兩個(gè)電容盡量靠近 DRV8818 的 VM 引腳。很多步進(jìn)驅(qū)動(dòng)板的問題不是芯片燒了而是電源電容放得太遠(yuǎn)MOS 開關(guān)瞬間產(chǎn)生的高 dV/dt 把芯片旁邊的邏輯電路干擾得亂七八糟。要注意的是 VM 不要和 MCU 的電源共用一個(gè) LDO。DRV8818 工作的時(shí)候VM 上的電流變化非常劇烈如果 3.3V 是從同一個(gè)電源軌拉出來的步進(jìn)脈沖一來邏輯電壓就會(huì)跳。我一開始圖省事用一塊 DC-DC 輸出 24V然后從 24V 再拉一個(gè) LDO 出來做 3.3V結(jié)果電機(jī)一轉(zhuǎn)MCU 時(shí)不時(shí)復(fù)位。后來改成獨(dú)立的 5V 轉(zhuǎn) 3.3V 電源軌問題就消失了。VM 電壓的選擇要結(jié)合電機(jī)的額定電壓來理解。步進(jìn)電機(jī)相電壓一般有個(gè)標(biāo)稱值但實(shí)際運(yùn)行時(shí)線圈是電感PWM 恒流驅(qū)動(dòng)下電源電壓高于電機(jī)額定電壓反而能更快地建立電流。所以 12V 的電機(jī)用 24V 驅(qū)動(dòng)很常見只要限流值沒超過電機(jī)額定電流就不會(huì)燒。但也要注意電壓太高會(huì)讓電流紋波變大開關(guān)損耗和 EMI 跟著增加。24V 在這個(gè)項(xiàng)目里是一個(gè)均衡點(diǎn)。2.2 峰值電流怎么算VREF 和采樣電阻是關(guān)鍵電流限制的原理是相電流流過采樣電阻在電阻上產(chǎn)生壓降這個(gè)電壓和 VREF 引腳設(shè)定的參考電壓比較。當(dāng)采樣電壓超過參考內(nèi)部比較器翻轉(zhuǎn)關(guān)斷當(dāng)前導(dǎo)通管進(jìn)入衰減階段。所以在 DRV8818 上目標(biāo)電流主要由 VREF 和 ISENSE 處的采樣電阻共同決定。不同廠牌、不同絲印版本的公式可能略有差異但思路一樣就是I_trip VREF / (Gain × R_sense)Gain 是芯片內(nèi)部的電流增益倍數(shù)不同芯片差異很大我這邊用到的實(shí)際配置是 VREF 1.5V、R_sense 0.1Ω目標(biāo)峰值電流 1.5A。算出來之后還要留出裕量。尤其機(jī)器人關(guān)節(jié)在加速的時(shí)候電流瞬時(shí)值會(huì)明顯超過勻速電流如果 VREF 卡得太死加速過程中限流提前觸法力矩不夠直接丟步。經(jīng)驗(yàn)值是目標(biāo)電流不要超過電機(jī)額定電流的 80% 到 90%同時(shí)驅(qū)動(dòng)芯片的峰值電流能力再留 30% 左右的余量。比如這臺(tái)電機(jī)額定相電流 1.7A我就把限流設(shè)成 1.5A驅(qū)動(dòng)器宣稱峰值能力 2.5A余量足夠。再把 VREF 的電壓接到一個(gè)可調(diào)的 DAC 上后續(xù)如果需要降低靜止保持電流我可以通過軟件調(diào)節(jié) VREF讓電機(jī)在停頓狀態(tài)時(shí)少發(fā)熱。VREF 引腳不能懸空采樣電阻要用低感抗的低阻值大功率電阻我用的 0.1Ω/1W 金屬膜電阻布局上要盡量靠近 ISENSE 引腳。采樣電阻的走線要短、寬因?yàn)楣β驶芈防锏娜魏渭纳娮瓒紩?huì)分掉采樣信號(hào)導(dǎo)致電流不準(zhǔn)。如果采樣點(diǎn)離芯片太遠(yuǎn)線路壓降疊加進(jìn)去可能還沒到閾值芯片就提前關(guān)斷了實(shí)際力矩會(huì)比預(yù)期小。2.3 衰減模式容易被忽略但影響很大的參數(shù)步進(jìn)電機(jī)是電感負(fù)載電感有個(gè)特性電流不能突變。當(dāng)限流比較器觸發(fā)、功率管關(guān)斷時(shí)相電流不可能瞬間歸零必須給電流一個(gè)“泄放回路”。衰減模式?jīng)Q定的就是這個(gè)泄放過程怎么做。慢衰減模式下關(guān)斷時(shí)電流在 H 橋的下管續(xù)流回路里自然衰減電流紋波比較小電機(jī)運(yùn)行更“安靜”但電流下降速度慢跟不上快節(jié)奏的換相??焖p模式則是把功率管全部反向驅(qū)動(dòng)迫使電流快速下降響應(yīng)快但紋波大在高電源電壓下會(huì)顯得電機(jī)和驅(qū)動(dòng)板更熱?;旌纤p則是折中先快衰減一段再切換到慢衰減兼顧響應(yīng)速度和紋波。DRV8818 上通常有配置引腳來選擇衰減模式。我這里最終選的是混合衰減。原因很簡單機(jī)器人關(guān)節(jié)經(jīng)常要在低速下反復(fù)啟停低速段最容易出現(xiàn)共振和噪音純慢衰減雖然安靜但位置跟隨性差純快衰減又會(huì)讓電流噪聲偏大。調(diào)衰減模式的時(shí)候最好拿鉗流表或者采樣電阻上的電壓波形來看不要只憑耳朵感受耳朵會(huì)騙人波形不會(huì)。2.4 與 PIC18LF47K42 的接線和引腳功能劃分我實(shí)際用的引腳映射如下給各位一個(gè)參考PIC18LF47K42 引腳DRV8818 引腳信號(hào)作用RA0DIR方向控制高/低電平切換RC5 / PWM 輸出STEP步進(jìn)脈沖輸入上升沿有效RB0FAULT故障輸出低電平有效接 MCU 中斷RD1SLEEP休眠控制低電平進(jìn)入休眠RD2EN使能控制低電平關(guān)閉輸出DAC 輸出VREF設(shè)定電流運(yùn)行/保持時(shí)調(diào)節(jié)STEP 和 DIR 是核心的兩根信號(hào)線。STEP 脈沖的寬度要注意不能太窄。如果 MCU 的 PWM 輸出脈寬小于 DRV8818 的最小步進(jìn)脈寬要求芯片可能漏掉脈沖造成位置漂移。所以我在軟件里把 STEP 設(shè)為占空比 50% 的方波頻率可變脈寬永遠(yuǎn)夠。FAULT 引腳接到了 RB0 的外部中斷上。一旦 FAULT 變低MCU 立即進(jìn)入保護(hù)流程把運(yùn)動(dòng)狀態(tài)凍結(jié)記錄故障代碼然后通過通訊口上報(bào)給上位機(jī)。這個(gè)處理在工業(yè)現(xiàn)場特別重要因?yàn)闄C(jī)械卡住、電機(jī)過流、驅(qū)動(dòng)過熱時(shí)有時(shí)候電機(jī)會(huì)劇烈抖動(dòng)如果不快速響應(yīng)下一步就可能打壞減速機(jī)。3. PIC18LF47K42 端軟件實(shí)現(xiàn)3.1 用硬件定時(shí)器生成精準(zhǔn) STEP 脈沖軟件里第一個(gè)關(guān)鍵點(diǎn)STEP 脈沖絕對(duì)不能用軟件延時(shí)去翻轉(zhuǎn) IO。延時(shí)函數(shù)的誤差會(huì)隨中斷、任務(wù)調(diào)度疊加脈沖間隔可能忽長忽短步進(jìn)電機(jī)對(duì)這種抖動(dòng)非常敏感輕則噪音變大重則直接丟步。正確做法是把定時(shí)器配置成自由運(yùn)行的時(shí)基讓 PWM 模塊在硬件層面連續(xù)輸出方波。大概的配置思路是這樣的選擇 TMR2 作為 PWM 的時(shí)基周期寄存器 PR2 決定頻率占空比寄存器決定高電平寬度。我要輸出的是固定占空比 50% 的方波一個(gè)完整 PWM 周期就對(duì)應(yīng)一個(gè) STEP 脈沖。那么頻率和 PR2 的關(guān)系是PWM_Frequency Fosc / (4 × Prescaler × (PR2 1))反過來已知目標(biāo)速度 S單位是 steps/s那么PR2 Fosc / (4 × Prescaler × S) - 1PIC18LF47K42 是 4 倍時(shí)鐘分頻架構(gòu)這里的 4 就是指令周期除法系數(shù)。Prescaler 我設(shè)成 1這樣低速和高速范圍都能覆蓋。代碼實(shí)現(xiàn)上我寫了個(gè)接口函數(shù)// 目標(biāo)速度 S 單位steps/s void stepper_set_speed(uint32_t steps_per_sec) { uint32_t pr2 (_XTAL_FREQ / (4UL * 1UL * steps_per_sec)) - 1; if (pr2 65535UL) pr2 65535UL; // 限速下限 PR2 (uint16_t)pr2; }修改 PR2 的時(shí)機(jī)也很講究。不能隨便在一個(gè) PWM 周期的中間改否則這個(gè)周期的長度會(huì)突然被拉長產(chǎn)生一個(gè)毛刺脈沖。我是在 TMR2 周期匹配中斷里更新 PR2 的也就是每個(gè) PWM 周期結(jié)束之后再改這樣脈沖序列始終平滑。這個(gè)細(xì)節(jié)直接影響電機(jī)噪音尤其在低速段表現(xiàn)差異很大。3.2 梯形加減速和 S 型曲線的落地步進(jìn)電機(jī)開環(huán)控制最大的敵人不是扭矩不夠而是加速度太猛。電機(jī)本身有慣性如果速度瞬間跳變轉(zhuǎn)子跟不上磁場就會(huì)丟步。所以任何正經(jīng)應(yīng)用都不會(huì)直接一步到位給最高速度而是先低速啟動(dòng)再逐步加速最后減速停止。最基礎(chǔ)的是梯形加減速速度曲線像一個(gè)梯形軟件實(shí)現(xiàn)也最簡單。梯形曲線的邏輯是每個(gè)控制周期更新一次“目標(biāo)速度”。我用的控制周期是 1ms也就是每隔 1ms 算一次當(dāng)前應(yīng)該跑多少 speed。加速段每次加一個(gè)固定增量直到達(dá)到設(shè)定最大速度減速段同理每次減一個(gè)固定增量。這樣做的好處是加速度恒定力矩需求可預(yù)估。但梯形曲線在加速起點(diǎn)和減速終點(diǎn)會(huì)有加速度突變機(jī)械上會(huì)有沖擊。機(jī)器人關(guān)節(jié)如果帶著負(fù)載來回?cái)[這種沖擊會(huì)被放大顯得動(dòng)作“愣”。所以這個(gè)項(xiàng)目里我改用了 S 型曲線加速速率的斜率不是恒定的而是從 0 慢慢升到最大值最后再慢慢回落到 0。實(shí)現(xiàn)也不復(fù)雜維護(hù)一個(gè)“當(dāng)前速度”和一個(gè)“當(dāng)前加速度”每 1ms 更新一次加速度然后再用這個(gè)加速度更新速度。S 型曲線看起來有點(diǎn)復(fù)雜實(shí)際上代碼就是狀態(tài)機(jī)// 加速階段加速度從 a_min 按斜率遞增到 a_max accel jerk * dt; if (accel accel_max) accel accel_max; speed accel * dt; if (speed target_speed) speed target_speed;減速階段反向跑同樣的邏輯。整個(gè)運(yùn)動(dòng)過程中位置計(jì)數(shù)器在每個(gè) STEP 中斷里遞增或遞減方向由 DIR 引腳控制。實(shí)際測試下來S 型曲線后電機(jī)嘯叫明顯降低機(jī)械末端也穩(wěn)了很多。3.3 位置閉環(huán)、堵轉(zhuǎn)檢測和故障聯(lián)動(dòng)純開環(huán)步進(jìn)控制的問題在于丟步了 MCU 不知道。工業(yè)應(yīng)用里位置錯(cuò)了是很大的事所以我在這個(gè)項(xiàng)目里加了一個(gè)增量編碼器裝在電機(jī)后端用來做位置閉環(huán)。做法很簡單MCU 用輪詢或者外部中斷讀取編碼器的 A、B 相維護(hù)一個(gè)實(shí)際位置計(jì)數(shù)同時(shí)指令位置由 STEP 脈沖計(jì)數(shù)得到。兩者誤差超過一定閾值就認(rèn)為丟步了觸發(fā)報(bào)警。堵轉(zhuǎn)檢測也可以不裝編碼器用電流特征來猜。電機(jī)堵轉(zhuǎn)時(shí)相電流變化率、反電動(dòng)勢都會(huì)異常但這樣精度有限做安全保護(hù)可以做精確糾偏不行。我建議在機(jī)器人關(guān)節(jié)這種場景還是老老實(shí)實(shí)加編碼器或者磁編碼器成本不高可靠性大幅提升。FAULT 引腳和編碼器信號(hào)都接在 MCU 的中斷/輸入捕獲上。FAULT 一旦變低我立刻把 PWM 輸出關(guān)掉同時(shí)把 STEP 引腳拉低防止芯片在異常狀態(tài)下繼續(xù)收脈沖。然后記錄一個(gè)故障碼通過串口送到上位機(jī)。實(shí)際調(diào)試中最常觸發(fā) FAULT 的原因不是過流而是電源跌落導(dǎo)致的欠壓保護(hù)這一點(diǎn)后面在調(diào)試部分詳細(xì)講。4. 步進(jìn)電機(jī) FOC 控制原理以及什么時(shí)候該升級(jí)4.1 為什么現(xiàn)在到處都在聊“步進(jìn)電機(jī) FOC”最近搜索“步進(jìn)電機(jī) FOC 控制原理”的人很多其實(shí)大家關(guān)注的不是理論本身而是實(shí)際問題傳統(tǒng)步進(jìn)電機(jī)用全步進(jìn)或微步驅(qū)動(dòng)電流是方波或者近似正弦的階梯波扭矩有波動(dòng)噪音大高速段扭矩掉得快。FOC 也就是磁場定向控制能讓電流保持理想的正弦波形轉(zhuǎn)子的磁場和定子磁場始終處在最佳矢量關(guān)系上效率、噪音、高速性能都得到改善。很多新的機(jī)器人關(guān)節(jié)和 3D 打印機(jī)開始用“閉環(huán)步進(jìn)”或者“伺服步進(jìn)”本質(zhì)上就是在步進(jìn)電機(jī)上做 FOC再加一個(gè)編碼器做位置環(huán)。這套方案對(duì)比傳統(tǒng)開環(huán)步進(jìn)的優(yōu)勢很明顯同樣的電機(jī)能輸出更大的有效扭矩發(fā)熱變低噪音顯著下降高速不丟步。代價(jià)是硬件復(fù)雜度和成本上去了。4.2 FOC 的核心原理用大白話講清楚先解釋一個(gè)基礎(chǔ)概念三相電機(jī)的電流不是一個(gè)標(biāo)量而是一個(gè)空間矢量。FOC 的思路是把這個(gè)電流矢量分解成兩個(gè)直角分量一個(gè)叫 d 軸分量直軸電流對(duì)應(yīng)勵(lì)磁一個(gè)叫 q 軸分量交軸電流對(duì)應(yīng)力矩。理想控制就是讓 d 軸電流控制磁通讓 q 軸電流控制扭矩兩者互不干擾。想提速就加大 q 軸電流想省電就把 d 軸電流控制到零。實(shí)現(xiàn)這個(gè)目標(biāo)需要三步坐標(biāo)變換。第一步把檢測到的三相電流通過 Clark 變換轉(zhuǎn)換到靜止兩相坐標(biāo)系得到 α 軸和 β 軸分量。第二步把靜止兩相坐標(biāo)系通過 Park 變換投影到轉(zhuǎn)子旋轉(zhuǎn)坐標(biāo)系得到 d 軸和 q 軸分量。這一步必須知道轉(zhuǎn)子的實(shí)時(shí)角度所以需要編碼器或者無感觀測器。第三步對(duì) d、q 軸電流分別做 PI 調(diào)節(jié)輸出 d、q 軸電壓指令然后再做逆 Park 變換和 SVPWM得到實(shí)際要施加到電機(jī)上的三相電壓占空比。雙極步進(jìn)電機(jī)本質(zhì)上就是兩相電機(jī)FOC 實(shí)現(xiàn)時(shí)只需要采樣兩相電流第三相可以用基爾霍夫定律算出來。很多步進(jìn)驅(qū)動(dòng)芯片已經(jīng)把電流采樣和 PWM 斬波集成好了但 FOC 需要實(shí)時(shí)控制每一相的電流波形所以驅(qū)動(dòng)方式和傳統(tǒng) STEP/DIR 芯片完全不一樣。DRV8818 這類芯片工作在恒定頻率的 PWM 斬波模式下輸出的是“電壓型方波占空比”用來實(shí)現(xiàn)電流限制是可以的但要做 FOC 矢量控制就力不從心了。4.3 這個(gè)項(xiàng)目要不要上 FOC我的判斷回到這個(gè)項(xiàng)目如果只是做一個(gè)工業(yè)定位平臺(tái)、小型機(jī)器人關(guān)節(jié)用 DRV8818 微步 S 型曲線開環(huán)跑大部分場景都?jí)蛴?。微步模式已?jīng)能把電流階梯細(xì)分配合 1/8、1/16 甚至更高細(xì)分噪音和共振已經(jīng)壓得不錯(cuò)。再加上編碼器位置閉環(huán)和真正的 FOC 相比實(shí)現(xiàn)成本低很多軟件調(diào)試驗(yàn)證周期也短很多。但如果負(fù)載變化大、經(jīng)常需要高速啟停、或者外發(fā)噪音有嚴(yán)格要求那就應(yīng)該考慮 FOC。具體升級(jí)路徑也簡單一種是把 DRV8818 換成帶 FOC 算法的集成驅(qū)動(dòng)芯片MCU 只管位置和通訊另一種是保留功率 H 橋在 MCU 里自己跑 FOC 算法和控制定時(shí)器電流采樣用 ADC 完成。后者對(duì) MCU 的 ADC 采樣速度和 PWM 同步要求很高PIC18LF47K42 可以做簡單的低速實(shí)驗(yàn)但真正量產(chǎn)我更推薦用更高性能的處理器。4.4 FOC 控制的硬件采樣和軟件骨架如果非要在這顆 K42 上跑 FOC首先要把兩塊 ADC 配置成和 PWM 同步觸發(fā)這樣才能在 PWM 的特定點(diǎn)采樣相電流避免開關(guān)噪聲。電流采樣通過兩個(gè)低電阻采樣電阻放大后接入 ADC 引腳采樣點(diǎn)要避開功率管開關(guān)瞬間。位置角度如果是無感的還需要用滑模觀測器或者磁鏈觀測器估計(jì)轉(zhuǎn)子位置和速度低速時(shí)無感觀測效果會(huì)變差通常會(huì)用開環(huán) I/f 啟動(dòng)速度上來后再切到閉環(huán)。代碼框架大概是這樣// PWM 周期中斷里執(zhí)行 FOC 控制環(huán) void foc_current_loop(void) { ia adc_read(ADC_A); ib adc_read(ADC_B); alpha clarke_alpha(ia, ib); beta clarke_beta(ia, ib); id park_d(alpha, beta, theta); iq park_q(alpha, beta, theta); vd PI_controller(id - id_ref); vq PI_controller(iq - iq_ref); alpha_v inverse_park(vd, vq, theta); beta_v inverse_park_q(vd, vq, theta); svpwm_update(alpha_v, beta_v, mcpwm_comparator); }這一段的核心是一個(gè) 10kHz 到 20kHz 的電流環(huán)中斷所有坐標(biāo)變換和 PI 運(yùn)算必須在中斷周期內(nèi)完成。實(shí)際上 8 位 MCU 跑浮點(diǎn)會(huì)很吃力一般用定點(diǎn)數(shù)或者查表法。所以還是那句不是說不行而是你要算清楚時(shí)間余量。5. 調(diào)試實(shí)錄與常見問題速查5.1 上電沒力矩先把三個(gè)點(diǎn)查了我調(diào)試這個(gè)板子的第一天就遇到過上電之后電機(jī)紋絲不動(dòng)一點(diǎn)保持力都沒有。這種情況下先不要懷疑代碼那是最后一步。第一步拿萬用表量 DRV8818 的 VM確認(rèn) 24V 真的到了。第二步量 VREF確實(shí)有電壓。第三步量 nSLEEP 引腳如果它被拉低了芯片整個(gè)處于休眠狀態(tài)所有 H 橋輸出都是高阻電機(jī)自然一點(diǎn)力都沒有。后來排查發(fā)現(xiàn)是 MCU 上電默認(rèn)狀態(tài)下RD1 輸出的是低電平而 nSLEEP 是低有效等于一上電就被按進(jìn)休眠。解決辦法很簡單把 SLEEP 初始化函數(shù)放在最前面上電立即拉高。這個(gè)坑很典型尤其從其他平臺(tái)轉(zhuǎn)到 PIC 平臺(tái)容易遇到因?yàn)椴煌?MCU 上電后的默認(rèn) GPIO 電平不一樣。5.2 電機(jī)噪音大和共振查電流波形步進(jìn)電機(jī)低速噪音大幾乎所有人都遇到過。噪音的來源是電流波形的諧波分量和機(jī)械結(jié)構(gòu)的共振疊加。調(diào)試時(shí)我建議先不要開 S 型曲線把速度固定在一個(gè)比較慢的值然后逐檔切換細(xì)分聽聲音、看電流波形。細(xì)分越高相電流越接近正弦噪音越低。但細(xì)分也不是越高越好太高的細(xì)分對(duì) STEP 脈沖頻率要求很高PIC 的定時(shí)器能輸出但機(jī)械響應(yīng)不一定需要那么細(xì)。電流波形怎么看在采樣電阻兩端接一個(gè)差分探頭或者直接在 VREF 和 GND 之間看斬波頻率都可以看到斬波痕跡。如果你看到電流波形在某一段出現(xiàn)了明顯的失真說明衰減模式?jīng)]設(shè)置好或者電源電壓不夠電流建立速率跟不上換相節(jié)奏。我調(diào)衰減模式時(shí)的判斷標(biāo)準(zhǔn)很簡單電流紋波小且加速過程不出現(xiàn)明顯的“撞齒聲”。5.3 芯片過熱先降保持電流DRV8818 的 PowerPAD 焊接到大面積銅皮后熱設(shè)計(jì)通常不會(huì)有太大問題。我遇到的過熱案例仔細(xì)查下來是靜止保持電流設(shè)置太高。電機(jī)停下來的時(shí)候只是要保持位置不需要額定力矩但驅(qū)動(dòng)芯片如果沒有單獨(dú)調(diào)整電流會(huì)持續(xù)輸出額定電流時(shí)間一長整塊板子都熱。解決辦法是在運(yùn)動(dòng)完成之后通過 DAC 把 VREF 降一半或者控制 nSLEEP 進(jìn)入半流保持狀態(tài)。PCB 布局上還有一個(gè)細(xì)節(jié)PowerPAD 底下的過孔要打足最好是大孔徑過孔熱阻才低。只用一兩個(gè)小過孔導(dǎo)熱等于把整塊銅皮的熱量憋在芯片底下功率一大必然掉鏈子。5.4 丟步和位置漂移的排查順序丟步是最難排查的問題之一因?yàn)樗赡苁菣C(jī)械、硬件、軟件三方共同作用的結(jié)果。我自己的排查順序是先看機(jī)械負(fù)載有沒有卡滯然后看加速曲線是不是太陡再看供電電壓在加速瞬間有沒有跌落最后才是看代碼邏輯。供電電壓跌落是最容易忽略的。加速時(shí)電流峰值很高如果電源是穩(wěn)壓電源電壓可能從 24V 掉到 22V步進(jìn)驅(qū)動(dòng)芯片的限流點(diǎn)會(huì)跟著下降力矩不足就丟步。我處理過一次換了一個(gè)功率更足的電源適配器問題直接消失。后來我在 VM 引腳附近加了一顆大容量儲(chǔ)能電容抗瞬間跌落的能力好了很多。再補(bǔ)一個(gè)細(xì)節(jié)STEP 信號(hào)線上如果走線太長建議串聯(lián)一個(gè) 100Ω 左右的小電阻同時(shí)在 STEP 引腳對(duì)地加一個(gè)小電容濾掉振鈴。如果脈沖沿有毛刺DRV8818 可能在一個(gè)脈沖周期內(nèi)誤觸發(fā)多次位置瞬間偏掉好幾個(gè)步距角。5.5 常見問題速查表問題現(xiàn)象可能原因排查與解決上電電機(jī)無力nSLEEP 引腳電平錯(cuò)誤上電初始化時(shí)拉高 SLEEP電機(jī)抖動(dòng)但不動(dòng)電流限幅太小調(diào)高 VREF確認(rèn) R_sense 阻值電機(jī)嘯叫明顯衰減模式不對(duì)或細(xì)分過低調(diào)成混合衰減提高細(xì)分運(yùn)行一段時(shí)間停機(jī)芯片過熱保護(hù)降保持電流優(yōu)化散熱焊盤高速時(shí)丟步加速曲線過陡或電源跌落用 S 型曲線、加大儲(chǔ)能電容STEP 脈沖被漏掉脈寬過窄或信號(hào)振鈴用 50% 占空比方波加 RC 濾波6. 最后分享一些我踩過的小坑這套系統(tǒng)調(diào)試到最后最大的體會(huì)就是步進(jìn)電機(jī)控制難的不是原理而是把所有看似不起眼的細(xì)節(jié)都管住。DRV8818 和 PIC18LF47K42 的組合既不像專用運(yùn)動(dòng)控制芯片那樣黑盒也不像完全用分立器件搭 H 橋那樣費(fèi)勁是一個(gè)比較理想的折中。只要電流限制、衰減模式、STEP 脈沖質(zhì)量和加減速曲線這四個(gè)維度都控制好工業(yè)定位和機(jī)器人關(guān)節(jié)應(yīng)用都能跑得很穩(wěn)。最后再分享一個(gè)小技巧電機(jī)和驅(qū)動(dòng)器之間最好用短而粗的線直接連接不要用細(xì)長線更不要用那種帶接插口的“延長線”到處飛來飛去。雙極步進(jìn)電機(jī)相電流在換相瞬間變化率很高線纜的電感會(huì)造成很大的尖峰幾十伏的尖峰很容易把 VM 電容充爆甚至灌到邏輯電路里。我后來給電機(jī)線加了磁環(huán)尖峰明顯小了很多板子也安靜了不少。希望在調(diào)試步進(jìn)電機(jī)的各位能少走兩條彎路。