電機(jī)驅(qū)動(dòng)與控制實(shí)踐)
雙極步進(jìn)電機(jī)在工業(yè)和機(jī)器人項(xiàng)目里出現(xiàn)頻率極高但真正把“能轉(zhuǎn)”做成“轉(zhuǎn)得穩(wěn)、轉(zhuǎn)得準(zhǔn)”很多初學(xué)者卡在了驅(qū)動(dòng)芯片和主控的配合上。我最近一直在用 DRV8818PWPR 搭配 TM4C1294KCPDT 這套組合做機(jī)器人關(guān)節(jié)和傳送機(jī)構(gòu)的樣機(jī)從硬件連線到微步進(jìn)算法都踩了一遍這里把完整思路和可復(fù)現(xiàn)的細(xì)節(jié)整理出來給同樣在做機(jī)器人和工業(yè)設(shè)備的朋友做個(gè)參考。開頭我先說清楚這套東西是干什么的DRV8818PWPR 是德州儀器的雙極步進(jìn)電機(jī)驅(qū)動(dòng)芯片負(fù)責(zé)把邏輯信號(hào)變成驅(qū)動(dòng)線圈的功率電流TM4C1294KCPDT 是帶浮點(diǎn)運(yùn)算單元的 Cortex-M4 主控負(fù)責(zé)產(chǎn)生步進(jìn)脈沖、方向邏輯和運(yùn)動(dòng)規(guī)劃。兩者配合后可以驅(qū)動(dòng)一臺(tái)帶減速箱或直連的雙極步進(jìn)電機(jī)實(shí)現(xiàn)位置精確可控、速度可調(diào)、帶電流限制的機(jī)械運(yùn)動(dòng)。適合做小型機(jī)械臂關(guān)節(jié)、物料推送機(jī)構(gòu)、升降平臺(tái)、分度轉(zhuǎn)臺(tái)以及一些教學(xué)機(jī)器人的底盤輪軸驅(qū)動(dòng)。在這個(gè)方案之前我試過直接用現(xiàn)成的步進(jìn)驅(qū)動(dòng)器加 PLC 脈沖口也試過用 Arduino 加 A4988前者成本高、調(diào)試參數(shù)封閉后者電流和可靠性在工業(yè)現(xiàn)場(chǎng)不夠看。DRV8818PWPR 的優(yōu)勢(shì)在于它把電流斬波調(diào)節(jié)、微步進(jìn)解碼和過熱保護(hù)全部集成在芯片內(nèi)部外部只需要幾個(gè)電阻電容就能設(shè)定電流和衰減模式TM4C1294KCPDT 則提供了足夠多的定時(shí)器、PWM 和中斷資源可以在一個(gè)芯片上同時(shí)管理多臺(tái)電機(jī)并且實(shí)時(shí)反饋位置這是機(jī)器人控制器很看重的能力。1. 項(xiàng)目需求拆解這套組合解決什么實(shí)際問題1.1 為什么是雙極步進(jìn)電機(jī)而不是伺服或直流有刷接觸過機(jī)器人項(xiàng)目的朋友都知道關(guān)節(jié)驅(qū)動(dòng)可以選擇的技術(shù)路線很多。直流有刷電機(jī)簡單便宜但沒有位置反饋時(shí)無法保證精確轉(zhuǎn)角加編碼器之后又變成閉環(huán)控制成本和控制復(fù)雜度都上去了伺服電機(jī)性能好可驅(qū)動(dòng)器、電機(jī)、減速機(jī)和調(diào)試軟件加起來單軸成本輕松破千做樣機(jī)和中小批量設(shè)備不一定劃算。雙極步進(jìn)電機(jī)的價(jià)值在于“開環(huán)就能做定位控制”。轉(zhuǎn)子是永磁體定子有兩組獨(dú)立線圈通過按特定時(shí)序切換電流方向轉(zhuǎn)子就按固定步距角轉(zhuǎn)動(dòng)。配合減速箱之后分辨率可以做得很高而控制模型非常簡單每給一個(gè)步進(jìn)脈沖電機(jī)走一個(gè)固定的角度。對(duì)很多機(jī)器人應(yīng)用來說這已經(jīng)足夠了。我做過一個(gè)三軸桌面機(jī)器人負(fù)載不到 500 克重復(fù)定位精度在機(jī)械允許范圍內(nèi)做到 ±0.1mm 左右成本控制在幾百塊這要是全換伺服方案預(yù)算要翻好幾倍。雙極和單極的差別在于線圈利用率。單極步進(jìn)電機(jī)每相繞組中間有抽頭同一時(shí)刻只用一半線圈扭矩偏小雙極電機(jī)沒有抽頭兩個(gè)方向都能用上整套線圈低速扭矩更大適合需要保持力矩的機(jī)械臂關(guān)節(jié)和夾持機(jī)構(gòu)。DRV8818PWPR 內(nèi)部是兩個(gè) H 橋正好用于切換雙極線圈的電流方向。1.2 主控和驅(qū)動(dòng)芯片的選型邏輯選擇 TM4C1294KCPDT不是隨便抓一塊開發(fā)板就用。它屬于 TI 的 Tiva C 系列核是 ARM Cortex-M4F120MHz 主頻帶硬件單精度浮點(diǎn)單元跑運(yùn)動(dòng)規(guī)劃里的三角函數(shù)、梯形速度曲線計(jì)算都很快。芯片內(nèi)部有兩個(gè) 12 位 ADC、多達(dá) 8 個(gè) UART、CAN 總線控制器、USB、以太網(wǎng) MAC這些外設(shè)對(duì)機(jī)器人系統(tǒng)極重要——你要和上位機(jī)通信、采集限位開關(guān)、讀取電位計(jì)或編碼器一個(gè)芯片全包了不用再外掛單片機(jī)。拿 DRV8818PWPR 和它對(duì)接還有一個(gè)使用上很順暢的原因引腳電平邏輯。TM4C1294KCPDT 的 GPIO 輸出是 3.3V 邏輯DRV8818 的邏輯輸入端也是 3.3V 兼容的不需要額外做電平轉(zhuǎn)換。舊款好些驅(qū)動(dòng)器要求 5V 邏輯輸入那就必須加電平移位芯片或三極管又增加一級(jí)故障點(diǎn)。DRV8818PWPR 本身支持最高 45V 的電機(jī)供電電壓峰值電流能力大約 2.5A實(shí)際連續(xù)電流根據(jù)散熱和感應(yīng)電阻決定內(nèi)部集成固定關(guān)斷時(shí)間的 PWM 電流斬波支持全步、半微步、1/4、1/8、1/16 微步進(jìn)。微步進(jìn)功能對(duì)機(jī)器人低速運(yùn)行尤其關(guān)鍵整步驅(qū)動(dòng)在低速時(shí)容易產(chǎn)生明顯的振動(dòng)和噪音微步進(jìn)能把電流波形切成細(xì)碎的階梯接近正弦驅(qū)動(dòng)轉(zhuǎn)動(dòng)平穩(wěn)很多。這些特性決定了它很適合做 42 型號(hào)和 57 型號(hào)雙極步進(jìn)電機(jī)的前級(jí)驅(qū)動(dòng)級(jí)正好覆蓋機(jī)器人常用的小型執(zhí)行機(jī)構(gòu)。2. 硬件連接與外圍電路設(shè)計(jì)2.1 引腳功能劃分和接線表剛開始設(shè)計(jì)驅(qū)動(dòng)板時(shí)我犯過一個(gè)低級(jí)錯(cuò)誤只想著把 STEP、DIR 兩個(gè)信號(hào)接上就完事結(jié)果忽略了 MODE 引腳配置和電流參考電阻導(dǎo)致電機(jī)動(dòng)起來一抖一抖的。這里給出完整的引腳分配建議。DRV8818PWPR 的關(guān)鍵引腳包括邏輯電源 VDD、電機(jī)電源 VM、兩個(gè) H 橋輸出 OUT1/-、OUT2/-步進(jìn)輸入 STEP、方向輸入 DIR、模式選擇 MODE0、MODE1、使能輸入 ENBL、電流參考 VREF、故障輸出 nFAULT以及用于電流檢測(cè)的感應(yīng)電阻引腳 ISEN1、ISEN2。建議接到 TM4C1294KCPDT 的連接見下表信號(hào)DRV8818 引腳TM4C1294KCPDT 引腳說明步進(jìn)脈沖STEPPF0定時(shí)器輸出比較/普通 GPIO上升沿有效頻率決定電機(jī)速度方向DIRPA6高電平正轉(zhuǎn)低電平反轉(zhuǎn)使能nENBLPE2低電平使能高電平釋放軸模式選擇 AMODE0PA4與 MODE1 組合選擇微步進(jìn)檔位模式選擇 BMODE1PA5與 MODE0 組合選擇微步進(jìn)檔位故障輸出nFAULTPE3下降沿中斷低電平表示欠壓、過流或過熱注意Tiva C 系列 GPIO 大部分引腳帶復(fù)用功能建議先在數(shù)據(jù)手冊(cè)里查 PinMux 表避免把 PWM 或串口引腳占用。上面選用的 PA6、PE2、PA4、PA5、PE3 都不帶高沖突外設(shè)用在通用 IO 上很穩(wěn)妥。2.2 電源與感應(yīng)電阻設(shè)計(jì)雙極步進(jìn)電機(jī)的功率電源和邏輯電源必須分開處理。電機(jī)端 VM 通常是 12V 或 24V我用的 42 步進(jìn)電機(jī)額定電壓 3V、額定電流 1.5A但步進(jìn)電機(jī)是電感負(fù)載驅(qū)動(dòng)電壓高一些有利于高速時(shí)維持電流。DRV8818PWPR 的 VM 輸入范圍到 45V我用 24V 供電通過在 DRV8818 內(nèi)部定電流斬波把繞組電流穩(wěn)定在 1.2A 左右效果比直接用額定低電壓驅(qū)動(dòng)好很多高速扭矩提升明顯。電流設(shè)定靠 VREF 引腳電壓和 ISEN 感應(yīng)電阻協(xié)同決定。DRV8818 數(shù)據(jù)手冊(cè)給的公式是I_Trip VREF / (R_SENSE × 5)其中 VREF 是電流參考電壓R_SENSE 是感應(yīng)電阻阻值。如果我想把電流限制在 1.2AR_SENSE 選 0.1 歐姆那 VREF 1.2 × 0.1 × 5 0.6V。VREF 可以通過分壓電阻從 3.3V 或者參考電壓取比如 3.3V 分壓到 0.6V用一個(gè) 10k 可調(diào)電阻加 2k 串聯(lián)電阻調(diào)起來就行。感應(yīng)電阻的功率要算一下。繞組電流如果是 1.2A有效值大約 85%那電阻功耗 P I2 × R 1.22 × 0.1 ≈ 0.144W選 0.25W 或 0.5W 的貼片電阻比較保險(xiǎn)。更關(guān)鍵的是這個(gè)電阻要盡量靠近芯片 ISEN 引腳走線短而粗否則寄生電感會(huì)影響電流采樣導(dǎo)致斬波閾值不穩(wěn)。2.3 保護(hù)電路和 PCB 布局經(jīng)驗(yàn)這部分是我在工業(yè)樣機(jī)上吃過大虧的地方。剛開始直接拿面包板飛線測(cè)試電機(jī)動(dòng)一下電腦就死機(jī)原因是步進(jìn)電機(jī)線纜很長時(shí)會(huì)產(chǎn)生較強(qiáng)的反向電動(dòng)勢(shì)還會(huì)引入共模干擾。后來正規(guī)化設(shè)計(jì)才解決。電機(jī)接口處必須加續(xù)流二極管或者使用芯片內(nèi)置的續(xù)流功能。DRV8818 內(nèi)部 H 橋的 MOSFET 自帶體二極管一般不需要外部續(xù)流但如果你用的是外置電源最好在芯片 VM 引腳旁邊放一個(gè)大容量電解電容容量建議 100μF/50V 以上再加一個(gè) 0.1μF 陶瓷電容。這個(gè)電容負(fù)責(zé)吸收電機(jī)在減速時(shí)回饋的能量防止母線電壓瞬間沖高擊穿芯片。ENBL 信號(hào)不能空接。多塊驅(qū)動(dòng)板并聯(lián)或者上下電順序不一致時(shí)如果 ENBL 懸空芯片可能處于隨機(jī)狀態(tài)電機(jī)通電瞬間容易自己動(dòng)一下。我習(xí)慣在 ENBL 線路上加一個(gè) 10kΩ 上拉電阻同時(shí)用 TM4C1294KCPDT 的 GPIO 輸出明確控制上電初始化時(shí)先把 ENBL 拉高等所有外圍配置完成再拉低使能電機(jī)。接插件方面工業(yè)環(huán)境我強(qiáng)烈建議用帶鎖扣的接線端子連接電機(jī)線不要用排針尤其是設(shè)備里有震動(dòng)時(shí)排針?biāo)蓜?dòng)會(huì)導(dǎo)致缺相電機(jī)出現(xiàn)異響和失步排查起來相當(dāng)折磨人。3. 軟件和固件實(shí)現(xiàn)細(xì)節(jié)3.1 初始化流程和 GPIO 配置拿到 TM4C1294KCPDT 之后的第一個(gè)任務(wù)是把它跑起來并完成引腳配置。我用的是 TI 的 TivaWare 庫也可以用寄存器直接操作但 TivaWare 的函數(shù)封裝讓代碼更易讀。初始化順序有講究先配置系統(tǒng)時(shí)鐘再配 GPIO最后開中斷。工程里我通常這樣配置時(shí)鐘主時(shí)鐘用 120MHz外設(shè)總線時(shí)鐘也走 120MHz因?yàn)椴竭M(jìn)脈沖用定時(shí)器翻轉(zhuǎn) GPIO越快越準(zhǔn)。核心代碼邏輯如下#include tm4c1294ncpdt.h #include driverlib/sysctl.h #include driverlib/gpio.h void SystemClockInit(void) { // 使用外部 25MHz 晶振PLL 倍頻到 120MHz SysCtlClockFreqSet((SYSCTL_XTAL_25MHZ | SYSCTL_OSC_MAIN | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480), 120000000); } void StepMotorGPIOInit(void) { // 使能 GPIO 端口 A、E、F SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOE); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); GPIOPinTypeGPIOOutput(GPIO_PORTA_BASE, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); // MODE0 MODE1 DIR GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE, GPIO_PIN_2); // ENBL GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_0); // STEP GPIOPinTypeGPIOInput(GPIO_PORTE_BASE, GPIO_PIN_3); // nFAULT GPIOPadConfigSet(GPIO_PORTE_BASE, GPIO_PIN_3, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD_WPU); }在配置 GPIO 為輸入時(shí)我建議把 nFAULT 設(shè)置成標(biāo)準(zhǔn)上拉輸入避免浮空誤觸發(fā)。使能信號(hào)在初始化階段設(shè)置為高電平也就是禁用驅(qū)動(dòng)等系統(tǒng)準(zhǔn)備好再使能這樣電機(jī)不會(huì)在上電瞬間自主動(dòng)作。3.2 步進(jìn)脈沖生成定時(shí)器中斷優(yōu)于延時(shí)函數(shù)很多教程里用得最多的步進(jìn)脈沖生成方式是用 delay 函數(shù)翻轉(zhuǎn)引腳這對(duì)低速測(cè)試可以但速度一高或者需要多軸聯(lián)動(dòng)時(shí)就亂了。機(jī)器人的運(yùn)動(dòng)控制要求脈沖之間的時(shí)間間隔具備確定性延時(shí)函數(shù)的誤差在高頻時(shí)會(huì)惡化影響速度穩(wěn)定性。更可靠的辦法是用硬件定時(shí)器產(chǎn)生周期中斷在中斷服務(wù)函數(shù)里翻轉(zhuǎn) STEP 引腳。例如目標(biāo)速度是每分鐘 240 轉(zhuǎn)電機(jī)步距角 1.8°細(xì)分?jǐn)?shù) 1/16那每轉(zhuǎn)需要 3200 個(gè)脈沖240 轉(zhuǎn)對(duì)應(yīng)脈沖頻率 12800Hz定時(shí)器周期就是約 78.125μs。使用 TM4C1294KCPDT 的定時(shí)器來生成定時(shí)器時(shí)鐘 120MHz分頻后很容易得到精確周期。核心代碼大致如下#include driverlib/timer.h volatile uint32_t stepToggle 0; void Timer0Init(uint32_t periodMicros) { SysCtlPeripheralEnable(SYSCTL_PERIPH_TIMER0); TimerConfigure(TIMER0_BASE, TIMER_CFG_PERIODIC); TimerLoadSet(TIMER0_BASE, TIMER_A, (120000000 / 1000000) * periodMicros); IntRegister(INT_TIMER0A, Timer0IntHandler); IntEnable(INT_TIMER0A); TimerIntEnable(TIMER0_BASE, TIMER_TIMA_TIMEOUT); TimerEnable(TIMER0_BASE, TIMER_A); } void Timer0IntHandler(void) { TimerIntClear(TIMER0_BASE, TIMER_TIMA_TIMEOUT); GPIOPinWrite(GPIO_PORTF_BASE, GPIO_PIN_0, stepToggle); stepToggle ^ GPIO_PIN_0; }定時(shí)器中斷產(chǎn)生的是固定頻率的脈沖對(duì)應(yīng)恒定速度。機(jī)器人運(yùn)動(dòng)過程中需要加減速如果把周期固定啟停瞬間電機(jī)會(huì)失步。所以實(shí)際控制邏輯里要?jiǎng)討B(tài)更新 TimerLoadSet 的值——每次中斷都讀取當(dāng)前希望輸出的速度重新裝載定時(shí)器周期。我在速度曲線規(guī)劃器里把梯形加減速的每一小段時(shí)間分得很細(xì)每 1ms 調(diào)整一次頻率這樣既能保持硬件定時(shí)器的高精度又能讓速度曲線平滑。3.3 微步進(jìn)模式選擇和電流控制DRV8818PWPR 的 MODE0、MODE1 引腳組合決定步進(jìn)細(xì)分具體對(duì)應(yīng)關(guān)系參考數(shù)據(jù)手冊(cè)。常用配置如下MODE1MODE0細(xì)分模式00全步兩相同時(shí)導(dǎo)通011/2 微步進(jìn)101/4 微步進(jìn)111/16 微步進(jìn)我實(shí)際用得最多的是 1/16 微步進(jìn)因?yàn)榧?xì)分越高低速轉(zhuǎn)動(dòng)越平滑噪音和振動(dòng)都明顯下降。注意微步進(jìn)并不能真正提高絕對(duì)定位精度——步進(jìn)電機(jī)的根本精度由機(jī)械步距角決定但微步進(jìn)讓定位過程更接近無級(jí)運(yùn)動(dòng)終端定位時(shí)的過沖和震蕩會(huì)小很多。電流控制方面前面已經(jīng)提到 VREF 決定峰值電流。一個(gè)常見的誤區(qū)是把 VREF 調(diào)到最大值以為能獲得最大扭矩。電流過高會(huì)帶來嚴(yán)重的發(fā)熱而且電機(jī)的電感會(huì)限制電流上升率電流再高也是浪費(fèi)。我建議根據(jù)電機(jī)的額定電流按 80% 到 100% 調(diào)整比如額定 1.5A 的電機(jī)設(shè)定到 1.2A既夠用也發(fā)熱可控。3.4 實(shí)現(xiàn)基本的運(yùn)動(dòng)控制函數(shù)把上述功能封裝成幾個(gè)接口方便后續(xù)寫機(jī)器人邏輯。這里給出我項(xiàng)目里實(shí)際用到的簡化版本void Stepper_SetDir(uint8_t dir) { GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_6, dir ? GPIO_PIN_6 : 0); } void Stepper_SetMicrostep(uint8_t mode) { // mode 0~3 對(duì)應(yīng) MODE1/MODE0 的四種組合 if (mode 0x02) GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, GPIO_PIN_5); else GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_5, 0); if (mode 0x01) GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, GPIO_PIN_4); else GPIOPinWrite(GPIO_PORTA_BASE, GPIO_PIN_4, 0); } void Stepper_Enable(uint8_t en) { // en1 使能電機(jī)通電保持扭矩 if (en) GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, 0); // ENBL 低電平有效 else GPIOPinWrite(GPIO_PORTE_BASE, GPIO_PIN_2, GPIO_PIN_2); }使用這套接口上層邏輯只需要告訴“方向”和“開啟定時(shí)器”不會(huì)再和底層寄存器糾纏。4. 機(jī)器人系統(tǒng)中的運(yùn)動(dòng)控制與集成4.1 梯形加減速曲線的落地實(shí)現(xiàn)機(jī)器人關(guān)節(jié)只要啟停頻繁就必須做好加減速否則低速步進(jìn)電機(jī)會(huì)失步機(jī)械上還會(huì)產(chǎn)生沖擊。梯形速度曲線是最容易實(shí)現(xiàn)又能大幅改善效果的方案速度先線性升到目標(biāo)值維持一段再線性降到停止。關(guān)鍵是每一步更新定時(shí)器周期時(shí)要確保脈沖頻率和期望速度一致。我用一個(gè)定時(shí)器中斷作為 1ms 的時(shí)間基準(zhǔn)此中斷里計(jì)算當(dāng)前應(yīng)處的速度然后更新 78μs 級(jí)別的步進(jìn)脈沖定時(shí)器。相當(dāng)于做了兩層定時(shí)一層負(fù)責(zé)速度規(guī)劃一層負(fù)責(zé)具體脈沖生成。這里貼出速度規(guī)劃的偽代碼uint32_t currentFreq; uint32_t targetFreq; int32_t accelStep; // 每毫秒的頻率增量 void SpeedPlanner1ms(void) { if (currentFreq targetFreq) { currentFreq accelStep; if (currentFreq targetFreq) currentFreq targetFreq; } else if (currentFreq targetFreq) { if (currentFreq accelStep) currentFreq - accelStep; else currentFreq accelStep; // 保持最低步進(jìn)頻率 } // 將頻率換算成定時(shí)器周期單位是微秒 uint32_t period 1000000 / currentFreq; TimerLoadSet(TIMER0_BASE, TIMER_A, (120000000 / 1000000) * period); }這個(gè)方案里有個(gè)容易被忽視的點(diǎn)accelStep 不能設(shè)得太大。電機(jī)能承受的最大加速度受到負(fù)載慣量和扭矩限制盲目設(shè)大只會(huì)讓電機(jī)嗡一聲然后失步。我在項(xiàng)目里是通過實(shí)測(cè)出的經(jīng)驗(yàn)值42 電機(jī)帶 300g 負(fù)載從零加速到 2000Hz用了 300ms加速度大約是 6.6Hz/ms。你可以以此為初值按負(fù)載輕重調(diào)整。4.2 多軸聯(lián)動(dòng)每個(gè)電機(jī)獨(dú)立定時(shí)器三軸桌面機(jī)器人需要同時(shí)控制三個(gè)電機(jī)。TM4C1294KCPDT 有足夠多的定時(shí)器模塊我把定時(shí)器 0 用于 X 軸定時(shí)器 1 用于 Y 軸定時(shí)器 2 用于 Z 軸三套脈沖生成彼此獨(dú)立不會(huì)互相堵塞。每軸的運(yùn)動(dòng)規(guī)劃各自在內(nèi)存中維護(hù)一份當(dāng)前速度、目標(biāo)速度、剩余脈沖數(shù)然后在同一個(gè)速度規(guī)劃時(shí)間基準(zhǔn)里依次更新這樣三軸就能保持同步啟停。如果要做更復(fù)雜的聯(lián)動(dòng)插補(bǔ)比如直線插補(bǔ)需要在每一毫秒內(nèi)算好三軸各自應(yīng)該走的增量然后把脈沖定時(shí)器頻率分別設(shè)置。這里會(huì)遇到浮點(diǎn)數(shù)運(yùn)算幸好 TM4C1294KCPDT 有 FPU在 120MHz 下跑這類軌跡計(jì)算壓力不大。4.3 與上位機(jī)或總線的通信接口機(jī)器人控制器的上位機(jī)可能是 PC、樹莓派或者工業(yè) PLC。TM4C1294KCPDT 的優(yōu)勢(shì)在于 UART、CAN、USB、以太網(wǎng)都齊了可以根據(jù)需要選一種。我在做樣機(jī)時(shí)用 UART 和上位機(jī)通信協(xié)議長度很短每 10ms 發(fā)送一次目標(biāo)位置和目標(biāo)速度格式大致如下字段幀頭(0xAA)、軸號(hào)、位置(4字節(jié))、速度(2字節(jié))、校驗(yàn)、幀尾(0x55)下位機(jī)收到之后只更新目標(biāo)值具體加減速由自身運(yùn)動(dòng)規(guī)劃處理。這樣做最大的好處是通信延遲不會(huì)直接影響電機(jī)的實(shí)時(shí)控制哪怕上位機(jī)偶發(fā)卡頓電機(jī)仍然按照既定曲線走完當(dāng)前計(jì)劃最多是終點(diǎn)偏離一點(diǎn)而不會(huì)劇烈抖動(dòng)。如果你擔(dān)心通信可靠性可以用 CAN 總線。TM4C1294KCPDT 內(nèi)部有 CAN 控制器配合一個(gè) CAN 收發(fā)器芯片就能接入工業(yè)總線網(wǎng)絡(luò)。驅(qū)動(dòng)器節(jié)點(diǎn)化之后幾臺(tái)電機(jī)掛一根雙絞線擴(kuò)展維護(hù)方便得多。4.4 位置反饋和閉環(huán)的取舍開環(huán)步進(jìn)系統(tǒng)在負(fù)載變化大或者堵轉(zhuǎn)時(shí)有丟步風(fēng)險(xiǎn)如果定位要求較高可以加編碼器做閉環(huán)。這里我分享一個(gè)可落地的折衷方案在電機(jī)輸出軸安裝一個(gè) 600 線增量編碼器接到 TM4C1294KCPDT 的 QEI (正交編碼器接口) 引腳上系統(tǒng)實(shí)時(shí)比較“指令位置”和“實(shí)際位置”位置偏差超過設(shè)定閾值時(shí)報(bào)警或補(bǔ)發(fā)補(bǔ)償脈沖。這個(gè)方法實(shí)現(xiàn)不了像伺服那樣高帶寬的閉環(huán)但它能在丟步之后及時(shí)知道并補(bǔ)救成本增加很少。TM4C1294KCPDT 的某些型號(hào)包含 QEI 模塊或者用兩個(gè) GPIO 中斷配合外部計(jì)數(shù)器也可以實(shí)現(xiàn)編碼器讀取。我在項(xiàng)目里把編碼器脈沖通過 ECAP 模塊捕獲效果穩(wěn)定。代碼層面用一個(gè)結(jié)構(gòu)體記錄累計(jì)偏差typedef struct { int32_t cmdPos; // 指令位置微步計(jì)數(shù) int32_t actualPos;// 編碼器反饋位置 int32_t err; // 累計(jì)偏差 } AxisPos;每 10ms 更新一次比較如果 err 超過 100 個(gè)微步就停止運(yùn)動(dòng)并點(diǎn)亮故障燈。這套機(jī)制讓開環(huán)系統(tǒng)的可靠性提升了一個(gè)臺(tái)階。5. 常見問題與排查技巧實(shí)錄5.1 電機(jī)完全不動(dòng)從哪里查起碰到電機(jī)不轉(zhuǎn)我的排查順序固定為“電源—使能—方向—脈沖”的四步檢查法。先用萬用表測(cè) VM 和 GND 之間電壓是否正常再測(cè) VDD 邏輯電源是否在 3.3V 或 5V 范圍內(nèi)。接著看 nENBL 引腳的邏輯電平很多情況下是因?yàn)?ENBL 一直為高芯片處于禁用狀態(tài)電機(jī)自然一動(dòng)不動(dòng)。如果使能沒問題再用示波器看 STEP 引腳是否有脈沖波形。沒有波形就去查定時(shí)器有沒有啟動(dòng)、中斷有沒有觸發(fā)。一步步排除下來90% 的不動(dòng)作問題都能定位到電源或接線這層。一個(gè)高頻細(xì)節(jié)TM4C1294KCPDT 的 GPIO 默認(rèn)可能是模擬引腳或復(fù)位后輸出狀態(tài)不定。如果上電后 DIR 引腳亂變電機(jī)可能朝一個(gè)方向悶轉(zhuǎn)減速時(shí)又失步。我在初始化代碼里會(huì)先明確所有控制引腳的方向和初值再使能電機(jī)這在上文初始化函數(shù)里已經(jīng)體現(xiàn)。5.2 電機(jī)發(fā)熱嚴(yán)重但有扭矩發(fā)熱通常有兩種原因電流設(shè)得過高或者微步進(jìn)設(shè)置不當(dāng)導(dǎo)致電流波形直流分量過多。用公式算過 VREF 和感應(yīng)電阻匹配之后再復(fù)查一遍很多人是把 VREF 接到 3.3V 忘了分壓那電流限制形同虛設(shè)芯片會(huì)拼命往電機(jī)里灌電流發(fā)燙是一定的。另一個(gè)原因是電機(jī)在靜止時(shí)持續(xù)保持電流。機(jī)器人關(guān)節(jié)需要維持位置時(shí)會(huì)這樣做但長時(shí)間靜止沒必要保持滿電流。我實(shí)現(xiàn)了一個(gè)簡單的“待機(jī)降流”邏輯位置到位后延時(shí) 1 秒通過降低 VREF 或者切換方向使 DRV8818 進(jìn)入低電流狀態(tài)。降電流之后機(jī)械上可能會(huì)有一點(diǎn)點(diǎn)松動(dòng)的感覺只要不是外力特別大對(duì)普通桌面機(jī)器人影響不大但發(fā)熱和電源功率消耗顯著下降。5.3 電機(jī)嘯叫或運(yùn)行抖動(dòng)明顯步進(jìn)電機(jī)嘯叫來源有兩個(gè)脈沖頻率落入人耳可聽范圍1-20kHz時(shí)繞組的磁滯震動(dòng)以及機(jī)械共振頻率被激勵(lì)。前者可以用更高的微步進(jìn)細(xì)分緩解因?yàn)橥瑯拥霓D(zhuǎn)速下脈沖頻率更高更多脈沖分布在音頻范圍內(nèi)的能量更分散后者需要改變運(yùn)行速度區(qū)間避開共振點(diǎn)多數(shù) 42 電機(jī)的共振點(diǎn)集中在 100-300 RPM測(cè)試時(shí)可以做個(gè)掃頻測(cè)試找出轉(zhuǎn)速-噪音的尖峰區(qū)間規(guī)劃時(shí)避開。有時(shí)抖動(dòng)不是電機(jī)本身而是步進(jìn)脈沖信號(hào)有毛刺或占空比不對(duì)稱。DRV8818 對(duì) STEP 的上升沿敏感如果信號(hào)邊緣過緩或者疊加了噪聲內(nèi)部可能誤判產(chǎn)生額外步驟。在 STEP 引腳加一個(gè) RC 低通濾波器比如 1kΩ 電阻串聯(lián)、1nF 電容到地能有效濾掉高頻干擾。注意 RC 值不能太大否則邊沿變緩反而影響高速性能。5.4 使用示波器觀察電流波形調(diào)試微步進(jìn)最有效的工具是示波器電流探頭沒有電流探頭時(shí)可以測(cè)感應(yīng)電阻兩端的電壓波形間接觀察電流包絡(luò)。正常微步進(jìn)波形應(yīng)該呈現(xiàn)出近似正弦的階梯狀如果看到波形變平、缺口或者毛刺說明斬波電流設(shè)置或衰減模式不對(duì)。DRV8818 支持慢衰減和快衰減兩種電流調(diào)節(jié)模式。在低速段慢衰減效率高繞組電流紋波較小高速時(shí)電感反電動(dòng)勢(shì)高想要電流建立起來快衰減更好。你可以通過芯片寄存器或?qū)?yīng)引腳配置來控制衰減模式實(shí)際調(diào)試中我把低速目標(biāo)速度低于 500Hz 脈沖頻率時(shí)設(shè)為慢衰減高于 1000Hz 時(shí)切為快衰減可以顯著改善速度切換時(shí)的平滑度。5.5 軟件層容易踩的坑第一個(gè)坑是中斷服務(wù)函數(shù)做得太重。如果步進(jìn)脈沖中斷里做太多計(jì)算比如浮點(diǎn)除法、串口發(fā)送中斷響應(yīng)不及時(shí)脈沖時(shí)序就亂了。我后來把脈沖中斷里只做 GPIO 翻轉(zhuǎn)和一個(gè) 32 位計(jì)數(shù)器累加所有運(yùn)動(dòng)計(jì)算都放到較慢的速度規(guī)劃中斷里。第二個(gè)坑是編譯器優(yōu)化等級(jí)不同導(dǎo)致時(shí)序差異尤其是開了高優(yōu)化后代碼執(zhí)行順序可能改變和硬件寄存器沒有直接關(guān)系的 volatile 變量要聲明好。第三個(gè)坑和微步進(jìn)配置有關(guān)MODE 引腳的切換要在電機(jī)停止時(shí)進(jìn)行。如果在運(yùn)行中突然從全步切到 1/16 微步相位關(guān)系會(huì)打亂電機(jī)可能會(huì)猛地抽動(dòng)一下這個(gè)動(dòng)作在機(jī)器人關(guān)節(jié)上會(huì)造成撞擊。我在代碼里保證只在使能信號(hào)無效的時(shí)候修改微步進(jìn)模式。6. 這份方案在工業(yè)和機(jī)器人現(xiàn)場(chǎng)的適用邊界6.1 適合的應(yīng)用場(chǎng)景我做過的設(shè)備里這套 DRV8818PWPR TM4C1294KCPDT 方案最適合的是那些單軸功率不大、需要多軸協(xié)調(diào)、成本敏感的設(shè)備。比如自動(dòng)點(diǎn)膠機(jī)的三軸工作臺(tái)、小型旋轉(zhuǎn)檢測(cè)臺(tái)、機(jī)器人底盤輪組、教學(xué)用關(guān)節(jié)臂。這些場(chǎng)景的共性是低中速、負(fù)載相對(duì)穩(wěn)定、定位精度要求較高但不需要伺服那樣的大慣量匹配能力。工業(yè)機(jī)器人六軸關(guān)節(jié)在高速重載下通常會(huì)選用伺服電機(jī)因?yàn)椴竭M(jìn)電機(jī)的開環(huán)特性在負(fù)載擾動(dòng)下容易丟步。但在協(xié)作機(jī)械臂的末端小關(guān)節(jié)或者外部直線模組上步進(jìn)電機(jī)加驅(qū)動(dòng)器的組合還是很有競(jìng)爭力。體積上DRV8818 和 MCU 都足夠小巧可以做到一個(gè)手掌面積的驅(qū)動(dòng)板直接安裝在機(jī)構(gòu)上省去了驅(qū)動(dòng)柜布線。6.2 不適合的場(chǎng)景高速高動(dòng)態(tài)、頻繁正反轉(zhuǎn)且要求點(diǎn)位時(shí)間極短的應(yīng)用步進(jìn)電機(jī)會(huì)比較吃力。因?yàn)槲⒉竭M(jìn)精度和速度是一對(duì)矛盾步進(jìn)脈沖頻率到一定值后電流建立時(shí)間跟不上轉(zhuǎn)矩急劇下降。我曾試過讓這套系統(tǒng)跑到超過 3000 RPM結(jié)果電機(jī)沒力而且嚴(yán)重發(fā)熱。后來把最高運(yùn)行速度限制在 1500 RPM 附近扭矩才夠用。另一個(gè)需要注意的點(diǎn)是供電穩(wěn)定性。VM 電源如果出現(xiàn)瞬態(tài)跌落DRV8818 會(huì)觸發(fā)欠壓保護(hù)電機(jī)立刻失步。工業(yè)現(xiàn)場(chǎng)的電網(wǎng)波動(dòng)大我通常會(huì)在電源輸入端加一個(gè) 24V 穩(wěn)壓模塊或者用電池組供電避免直接從開關(guān)電源引出不穩(wěn)定電壓。6.3 后續(xù)擴(kuò)展從單機(jī)到總線化如果項(xiàng)目從小樣機(jī)走向量產(chǎn)控制架構(gòu)可以升級(jí)為“主控 多個(gè)驅(qū)動(dòng)節(jié)點(diǎn)”的模式。TM4C1294KCPDT 作為主站通過 CAN 總線連接多個(gè)基于 DRV8818 的驅(qū)動(dòng)子板子板可以是簡單的從站 MCU負(fù)責(zé)接收主站下發(fā)的目標(biāo)速度并產(chǎn)生脈沖。這樣主站只做運(yùn)動(dòng)和軌跡規(guī)劃不再直接管理每根電機(jī)線的具體 IO可靠性更高。我下一輪改造就準(zhǔn)備把這個(gè)方案做成 CAN 節(jié)點(diǎn)因?yàn)楝F(xiàn)場(chǎng)布線明顯減少而且能實(shí)時(shí)讀取每軸的故障狀態(tài)。如果想把步進(jìn)電機(jī)整成一個(gè)“準(zhǔn)伺服”系統(tǒng)還可以結(jié)合第六章提到的編碼器閉環(huán)做法把位置誤差控制在閉環(huán)系統(tǒng)的容許范圍內(nèi)。用 TM4C1294KCPDT 的浮點(diǎn)能力和中斷資源在 10kHz 的控制周期內(nèi)完成 PID 計(jì)算沒有問題關(guān)鍵是機(jī)械上要留出編碼器安裝位。7. 實(shí)操心得收尾這套 DRV8818PWPR 配 TM4C1294KCPDT 的組合我自己從零搭建過三輪第一次失敗在電源沒分開第二次是微步進(jìn)模式再運(yùn)行中切換導(dǎo)致異響第三輪才把加減速和電流限制這些細(xì)節(jié)全部整明白。給我的感覺是步進(jìn)電機(jī)控制的難不在于寄存器多難寫而在于電流、時(shí)序、機(jī)械負(fù)載之間互相牽連只靠理論很容易踩坑。如果你按我上面的硬件連接和軟件流程搭一套大概率第一次就能穩(wěn)定運(yùn)行剩下再花點(diǎn)時(shí)間調(diào)電流和加減速參數(shù)就能收尾。還有一個(gè)我覺得特別值錢的小技巧調(diào)試時(shí)可以先用小電機(jī)空載把整個(gè)控制鏈路跑通再掛負(fù)載??蛰d時(shí)如果脈沖定時(shí)器配置有誤現(xiàn)象就是電機(jī)轉(zhuǎn)但速度不準(zhǔn)掛載之后現(xiàn)象會(huì)變成失步和異響干擾判斷。小電機(jī)空載排除時(shí)鐘和脈沖問題再掛大負(fù)載單獨(dú)調(diào)電流這樣問題可以拆開來解決。以后遇到步進(jìn)電機(jī)控制相關(guān)的機(jī)器人項(xiàng)目這套方案可以作為低成本高性能的起點(diǎn)一直留底等系統(tǒng)復(fù)雜了再往總線驅(qū)動(dòng)或閉環(huán)方向演進(jìn)也不遲。