電機(jī)控制方案:工業(yè)級設(shè)計與調(diào)試)
前陣子接了個讓我印象挺深的活兒一個機(jī)器人第七軸和一條龍門兩軸機(jī)構(gòu)原來用的脈沖控制卡加分立MOS管橋客戶那邊鬧過好幾次MOS管發(fā)熱燒毀的問題。換方案時我沒走“高大全”路線選了TI的DRV8818PWPR來做功率級NXP的MKV42F128VLH16做運動控制核心結(jié)果這套組合在中低端工業(yè)步進(jìn)控制場景里相當(dāng)能打。今天把整套方案的選型邏輯、驅(qū)動配置、固件實現(xiàn)和現(xiàn)場調(diào)試經(jīng)驗完整拆開。如果你正在做機(jī)器人外部軸、視覺引導(dǎo)移動軸、AGV頂升機(jī)構(gòu)或者只是想把現(xiàn)有步進(jìn)控制方案做得更可靠可以直接照這份思路落地。1. 系統(tǒng)架構(gòu)與選型思路先講清楚這兩顆芯片在我系統(tǒng)里各自干了什么。MKV42F128VLH16是NXP Kinetis KV4x系列的Cortex-M4F單片機(jī)168MHz主頻128KB Flash16KB RAMLQFP-64封裝工作溫度等級可以滿足工業(yè)控制柜內(nèi)通常的-40到105°C要求。它在NXP產(chǎn)品線里的定位本來就是電機(jī)控制專用MCU帶了一堆針對電機(jī)控制的FlexTimerFTM、ADC、比較器等外設(shè)硬件上天然適合生成步進(jìn)脈沖和處理故障邏輯。DRV8818PWPR則是TI一顆比較老但很穩(wěn)的雙H橋步進(jìn)驅(qū)動芯片HTSSOP-16封裝帶散熱焊盤。它內(nèi)部集成兩路H橋、電流斬波調(diào)節(jié)和微步進(jìn)分度器輸入側(cè)只認(rèn)STEP/DIR這類標(biāo)準(zhǔn)控制信號輸出側(cè)直接驅(qū)動雙極步進(jìn)電機(jī)的A、B兩相繞組。對工業(yè)應(yīng)用來說這種“MCU出邏輯、驅(qū)動芯片出功率”的架構(gòu)把高壓大電流和低壓邏輯隔離開調(diào)試和安全上都省心很多。1.1 為什么是DRV8818PWPR而不是別的我先把這個問題說透因為選型決定了后面的工作量。最容易被拿來對比的是DRV8825、A4988這類模塊它們便宜、資料多、3D打印機(jī)圈子用得多。但我在工業(yè)設(shè)備里不太敢直接用原因有三個一是這些模塊大多沒有系統(tǒng)級的FAULT保護(hù)過流、過溫全靠驅(qū)動“自求多?!倍呛芏嗄K的PCB布局和散熱是為桌面機(jī)設(shè)計的放控制柜里長期帶載溫度很容易頂?shù)教旎ò迦枪┴浐头庋b一致性在項目量產(chǎn)階段是個坑你可能買了十片板子十批芯片的行為細(xì)節(jié)都不一樣。DRV8818PWPR不一樣的地方在于它就是按工業(yè)步進(jìn)執(zhí)行器來做的工作電壓范圍支持到8.2V到45V我常用24V母線峰值電流能到2.5A實際連續(xù)使用控制在1.5A到1.8A左右足夠帶動常見的NEMA17、NEMA23雙極電機(jī)內(nèi)部做斬波恒流每一相電流都能通過ISENSE檢流電阻設(shè)定不需要自己搭電流反饋環(huán)路。芯片還有FAULT輸出、SLEEP待機(jī)模式、多種衰減模式過溫、過流、欠壓這些異常能直接上報給MCU這對現(xiàn)場維護(hù)特別有價值。有人會說既然要可靠干嘛不上TMC靜音系列不是否定TMC它的靜音和細(xì)分確實好但在很多工業(yè)機(jī)器人項目里我們并不需要極致的低噪聲更需要的是“簡單、可預(yù)測、壞了知道怎么換”。DRV8818PWPR的十六細(xì)分對一些低速場合已經(jīng)夠平滑加上功耗低、封裝小集成到我們自己設(shè)計的控制板上整體BOM和調(diào)試復(fù)雜度都更可控。1.2 為什么是MKV42F128VLH16MCU選擇這里很多人會慣性用STM32。但KV42有一點對步進(jìn)控制特別關(guān)鍵它的FTM定時器模塊配置非常靈活預(yù)分頻、模數(shù)、中斷和輸出比較可以做得很細(xì)。不是STM32做不到而是KV4x系列在設(shè)計上把電機(jī)控制外設(shè)的優(yōu)先級放得很高你不需要為生成一路精確的步進(jìn)脈沖去折騰復(fù)雜的定時器路由。我用的這顆MKV42F128VLH16型號里16對應(yīng)168MHz主頻VLH表示LQFP-64封裝和-40到105°C溫度檔特別適合控制柜環(huán)境。Flash雖然只有128KB但運行運動控制代碼和Modbus/CANopen這類通信協(xié)議完全夠用不會像某些小容量芯片那樣寫完運動邏輯就塞不下通訊協(xié)議棧。KV42還帶CAN控制器。這件事在做“機(jī)器人外部軸”時很重要因為很多機(jī)器人控制器或PLC都支持CANopen或Modbus去掛接外圍軸MCU有CAN口硬件上就不用外擴(kuò)一顆獨立CAN協(xié)議芯片直接通過收發(fā)器就能和機(jī)器人控制系統(tǒng)對話。現(xiàn)場調(diào)參、導(dǎo)入位置表、同步啟停都方便很多。另外一點是它內(nèi)部有不少模擬外設(shè)如果后面想把DC母線電壓檢測、電機(jī)繞組溫度檢測這些功能加進(jìn)來可以少繞很多彎路。整體上手難度比STM32略高一點但NXP的MCUXpresso SDK已經(jīng)把FTM例程封裝好了參考demo改起來并不慢。1.3 控制信號鏈路和任務(wù)劃分把系統(tǒng)拆成一條鏈路就很好理解了MCU算出下一拍的速度和位置把STEP脈沖、DIR方向、ENABLE使能這三路信號送給DRV8818PWPRDRV8818內(nèi)部根據(jù)STEP脈沖的個數(shù)和周期決定讓哪一相繞組通電、通多大電流、換相順序如何電機(jī)編碼器或者限位開關(guān)反饋回MCUMCU再做閉環(huán)修正和狀態(tài)管理。這種劃分最核心的好處是“邏輯和功率解耦”。MCU里的運動算法用的是3.3V邏輯電平即使程序?qū)戝e最多也只會給驅(qū)動芯片一個錯誤的指令不會把高壓直接引到單片機(jī)上。DRV8818的輸出側(cè)則是完全獨立的H橋拓?fù)潆姍C(jī)繞組的反電動勢、開關(guān)尖峰都被限制在功率級內(nèi)部故障等級也能擋在功率側(cè)。我在實際布板時還會在MCU和DRV8818之間放一排串聯(lián)電阻STEP、DIR、ENABLE、SLEEP、RESET各串100Ω到220Ω。一是減小接口振鈴二是防止板上靜電或錯誤接線直接從IO口打進(jìn)去。這個細(xì)節(jié)看起來簡單卻讓整板在機(jī)器人現(xiàn)場的返修率低了不少。2. DRV8818PWPR核心參數(shù)與硬件配置芯片選好只是第一步真正決定項目能不能跑起來的是驅(qū)動這一側(cè)的硬件配置。DRV8818PWPR的很多細(xì)節(jié)數(shù)據(jù)手冊寫得不算厚但它每一個引腳和參數(shù)背后都是工程問題。我按電源、電流、細(xì)分、保護(hù)四個維度逐個講。2.1 電源架構(gòu)VM、VCC與電荷泵DRV8818需要兩種電源功率級的VM一般接24V邏輯部分的VCC一般接3.3V或者5V。我做工業(yè)控制板通常會把24V直接從電源端子進(jìn)經(jīng)過一個防反接二極管和一個大容量電解電容再分流給驅(qū)動芯片邏輯VCC則由板上的3.3V LDO供給。這里有個很多人忽略的點功率電源和邏輯電源的地不要搞成一坨。驅(qū)動芯片的大電流開關(guān)會讓地平面電位波動如果邏輯地和功率地之間沒有分離開STEP信號很容易在地彈噪聲里跳變輕則多走一步重則方向都判斷錯。我在布局時會做一個單點接地或者用0Ω電阻把功率地和邏輯地連接信號回流路徑盡量遠(yuǎn)離H橋的功率回路。資料上特別強調(diào)的電荷泵/自舉電容也不能省。DRV8818內(nèi)部要用電荷泵產(chǎn)生高側(cè)柵極驅(qū)動電壓這個電容必須緊挨芯片放置而且容值和材質(zhì)要按手冊來。很多調(diào)試現(xiàn)場“芯片有點燙、電機(jī)無力、輸出波形難看”的問題查到最后都是這顆電容放得太遠(yuǎn)或者用了劣質(zhì)電容。上電順序也要注意。我的經(jīng)驗是先確保VM已經(jīng)穩(wěn)定再讓MCU去拉高ENABLE。如果在VM沒穩(wěn)定的時候就把電機(jī)使能驅(qū)動芯片容易在欠壓保護(hù)和不完全導(dǎo)通之間來回橫跳可能一上電就FAULT。所以軟件上要讓ENABLE引腳由MCU主動控制而不是上電默認(rèn)拉高。2.2 電流調(diào)節(jié)和檢流電阻選型這顆芯片的電流怎么設(shè)是我在外面被問得最多的問題。DRV8818用ISENSE引腳外接檢流電阻內(nèi)部比較器把檢流電阻上的電壓和一個參考值做比較一旦電流超過閾值就關(guān)斷該相H橋等到電流降下來再重新打開形成斬波恒流。等效的限流值基本由電阻阻值和內(nèi)部參考一起決定數(shù)據(jù)手冊會給出對應(yīng)公式。我實際計算時從不閉門造車先查電機(jī)銘牌上的額定相電流。比如一個NEMA23電機(jī)寫著2.0A/相那我就會把限流設(shè)定在電機(jī)額定附近。假如檢流電阻選0.2Ω而芯片手冊里對應(yīng)的內(nèi)部電流參考閾值是0.4V檔位那么限流就是0.4V除以0.2Ω約2A。具體數(shù)值要對著手冊查但思路就是這樣。上電前先算一算別靠猜。不過公式算出來的只是理論值檢流電阻的功率損耗也不能忽視。如果相電流2A、電阻0.2Ω那么電阻上的熱量就是I2R大約0.8W。一顆常規(guī)的1206貼片電阻根本扛不住我用的是2512封裝金屬膜電阻或者兩顆并聯(lián)單顆額定功率不小于1W。這個熱耗會導(dǎo)致板子局部溫度升高嚴(yán)重時甚至把檢流電阻燒到開路步進(jìn)電機(jī)當(dāng)場斷相。檢流電阻的走線路徑也要短而粗。因為ISENSE引腳對微小壓差敏感任何雜散電阻都會讓限流值發(fā)生偏移。我都是把檢流電阻盡量貼近芯片的ISENSE引腳用開爾文接法把反饋走線單獨引出來不讓大電流直接流過反饋網(wǎng)絡(luò)。這個細(xì)節(jié)對電流一致性幫助很大。2.3 細(xì)分、衰減模式和發(fā)熱的權(quán)衡步進(jìn)電機(jī)在整步驅(qū)動時低頻振動和共振問題非常明顯。哪怕是在工業(yè)龍門上沒細(xì)分的時候跑到800步到1000步每秒附近整臺設(shè)備都跟著抖。DRV8818內(nèi)部做了分度器支持半步、四細(xì)分、八細(xì)分和十六細(xì)分實際項目中我一般選八細(xì)分或十六細(xì)分。細(xì)分越高每步對應(yīng)的角度越小電流波形越接近正弦中低頻振動會明顯改善。但細(xì)分不是白給的。十六細(xì)分意味著同樣的機(jī)械轉(zhuǎn)速下STEP脈沖頻率變成整步的十六倍MCU中斷負(fù)擔(dān)變重脈沖周期也會變短。對FTM這顆定時器來說168MHz主頻跑一兩百kHz的脈沖頻率完全沒壓力但在那種超高速、超細(xì)分、超低占空比的邊界工況下要注意定時器周期分辨率是否夠用。衰減模式是和音質(zhì)、發(fā)熱強相關(guān)的設(shè)置。DRV8818支持快衰減、慢衰減以及混合衰減這決定了當(dāng)相電流超過限流值時要怎么泄放。用錯了輕則電流波形毛刺多、電機(jī)噪聲大重則電流過沖把電機(jī)和驅(qū)動都搞得不穩(wěn)定。我的經(jīng)驗是中低速場景用慢衰減或者混合衰減聽起來更柔和高速大負(fù)載場景用快衰減保證電流能跟得上方向切換。沒有通用最優(yōu)解現(xiàn)場用示波器看電流波形再微調(diào)。還有一點別忘了發(fā)熱主要來自導(dǎo)通損耗和開關(guān)損耗。24V供電、2A電流、斬波頻率幾十kHz芯片的功率損耗會積少成多。我一般會在24V輸入和芯片VM引腳之間串一顆小阻值功率電阻或者磁珠把一部分壓降損耗轉(zhuǎn)移到無源器件上但要注意這會影響高速時的電流上升率。如果你對熱比較敏感可以適當(dāng)降低限流值或者在低速段用低電流保持模式效果立竿見影。2.4 ENABLE、SLEEP、FAULT與復(fù)位邏輯控制類信號別看它簡單處理不好能讓你排查三天三夜。先看ENABLE大多數(shù)驅(qū)動芯片是低電平有效MCU初始化時把引腳拉到無效電平防止上電瞬間電機(jī)亂動。真正開始運動時我習(xí)慣先延時幾十毫秒再使能驅(qū)動等電源穩(wěn)定。SLEEP引腳是低功耗總開關(guān)。機(jī)器人設(shè)備待機(jī)時如果還讓驅(qū)動全速斬波24V下的靜態(tài)功耗很可觀。我設(shè)計了兩種狀態(tài)運動結(jié)束后進(jìn)入HOLD模式保持小電流鎖軸如果客戶要求徹底省電就拉低SLEEP進(jìn)入低功耗但要清楚SLEEP會關(guān)斷H橋電機(jī)失去保持力矩外部軸可能會受重力滑動。有重力負(fù)載的地方別這么干。FAULT是開漏輸出平時應(yīng)該是高阻或由外部上拉拉高一旦驅(qū)動檢測到過流、過溫、欠壓就會拉低。MCU這邊接成下降沿中斷配合狀態(tài)機(jī)處理比如過流時先關(guān)斷ENABLE再讀FAULT成功上報而不是反復(fù)自動復(fù)位否則現(xiàn)場會出現(xiàn)“電機(jī)抖了一下又停又抖又?!钡某轱L(fēng)現(xiàn)象。復(fù)位邏輯上DRV8818的RESET拉低會清掉分度器狀態(tài)我的做法是在電機(jī)方向切換或初始化時不要亂動RESET只在需要回到零位時才觸發(fā)一次。3. MKV42F128VLH16側(cè)軟件實現(xiàn)硬件只是骨架真正讓電機(jī)“聽話”的是MCU里的固件。這套系統(tǒng)的軟件部分我拆成四塊脈沖生成、方向使能管理、加減速位置跟蹤、通信聯(lián)動。每一塊都要按工業(yè)級別來做不能拿demo湊合。3.1 FTM定時器與步進(jìn)脈沖生成我先明確一點步進(jìn)脈沖不是靠GPIO翻轉(zhuǎn)速度堆出來的而是靠定時器周期精確控制的。主循環(huán)里寫個delay翻轉(zhuǎn)GPIO實驗室轉(zhuǎn)得動工業(yè)現(xiàn)場一加負(fù)載和中斷就露餡了。KV42的FlexTimer在這里承擔(dān)核心角色我把FTM配置成自由運行模式溢出中斷里固定脈寬地輸出STEP脈沖定時的基準(zhǔn)來自外設(shè)時鐘的分頻完全不受其他代碼影響。下面這段是我在實際項目里改進(jìn)后的最小實現(xiàn)。條件是我先把FTM預(yù)分頻配到計數(shù)時鐘1MHz左右這樣100kHz以內(nèi)的脈沖頻率都能用16位MOD自然表達(dá)不用頻繁調(diào)整預(yù)分頻。#define STEP_PULSE_TICKS 50u static volatile uint32_t step_period_ticks 0u; void FTM0_IRQHandler(void) { /* 清除中斷標(biāo)志 */ FTM0_SC | FTM_SC_TOF_MASK; if (GPIO_ReadPin(STEP_PORT, STEP_PIN)) { GPIO_WritePin(STEP_PORT, STEP_PIN, 0u); FTM0_MOD step_period_ticks - STEP_PULSE_TICKS; } else { GPIO_WritePin(STEP_PORT, STEP_PIN, 1u); FTM0_MOD STEP_PULSE_TICKS; } }這段邏輯的含義是每次定時器溢出時如果STEP當(dāng)前為高就把它拉低并把下一個溢出時間設(shè)成“剩余周期”如果STEP當(dāng)前為低就把STEP拉高并把下一個溢出時間設(shè)成固定脈寬。周而復(fù)始STEP輸出的就是一個高電平寬度固定、周期等于step_period_ticks的脈沖序列。步進(jìn)頻率就是FTM計數(shù)時鐘除以step_period_ticks。使用時只需要在運動開始時設(shè)置初始周期然后在加減速過程中更新step_period_ticks脈沖精度就有保障。要提醒一下FTM_MOD的更新最好在中斷里做而且新值必須在下次溢出之前生效。KV42的FTM一般支持寫緩沖寫入的MOD會在下一個周期被采用這恰好避免了人為設(shè)置的周期被截斷。實際上這地方不用太緊張把MOD的更新放在ISR開頭就能避開大部分競爭條件。3.2 方向切換、使能與狀態(tài)管理方向信號DIR需要在STEP脈沖上升沿之前準(zhǔn)備好。雖然DRV8818內(nèi)部會有建立時間但外部切換時最好留出幾個微秒余量。我在固件里寫了一個APIvoid motor_set_direction(bool forward) { GPIO_WritePin(DIR_PORT, DIR_PIN, forward ? 1u : 0u); /* 等待方向建立時間確保下一個STEP上升沿之前信號穩(wěn)定 */ for (volatile uint32_t i 0; i 1000u; i) { ; } }這個延時看著很笨但能杜絕一個經(jīng)典現(xiàn)場問題設(shè)備正在運行上位機(jī)發(fā)來一個反向指令MCU立刻翻轉(zhuǎn)DIR結(jié)果產(chǎn)生了一個多余脈沖或者半脈沖位置就錯了。ENABLE的狀態(tài)管理我放在一個小狀態(tài)機(jī)里初始化時處于IDLE驅(qū)動未使能收到運動指令后進(jìn)入RUNNING先使能再發(fā)脈沖運動結(jié)束進(jìn)入HOLD保持電流鎖軸限位或者故障觸發(fā)后進(jìn)入FAULT直接斷使能并上報。狀態(tài)機(jī)的遷移條件統(tǒng)一放在一個函數(shù)里處理不要讓主循環(huán)到處改ENABLE否則很容易在某個角落漏掉一個狀態(tài)。3.3 加減速曲線和位置跟蹤步進(jìn)電機(jī)最怕的就是速度突變。電機(jī)在靜止時轉(zhuǎn)子還停在穩(wěn)定位置突然來一串高速脈沖轉(zhuǎn)子跟不上就丟步。丟步意味著位置丟失這是開環(huán)步進(jìn)最致命的缺點。所以一套好的加減速曲線必不可少。我做的是經(jīng)典梯形加減速在啟動階段速度從很小開始以恒定加速度增加到最高速后保持巡航快到目標(biāo)位置時再以相同加速度減速到零。實現(xiàn)上加速度以“每秒增加多少步”來定義速度單位是“步/s”而速度反過來對應(yīng)step_period_ticks。每次運動前先算好減速點在中斷里根據(jù)當(dāng)前位置和目標(biāo)位置的差來決定是繼續(xù)加速還是開始減速。一段簡化邏輯是這樣的假設(shè)目標(biāo)位置target、當(dāng)前位置pos如果剩余距離小于減速距離就把速度往下降否則如果當(dāng)前速度小于最高速就繼續(xù)往上加。每次更新速度都會重新計算新的step_period_ticksuint32_t speed 0u; /* 單位: 步/s */ int32_t pos 0; /* 當(dāng)前位置 */ void motion_tick(void) { int32_t remaining target_position - pos; int32_t abs_rem (remaining 0) ? remaining : -remaining; uint32_t target_speed; if (abs_rem decel_distance) { target_speed speed_decrease(); } else if (speed max_speed) { target_speed speed acceleration; } else { target_speed max_speed; } if (target_speed max_speed) { target_speed max_speed; } if (target_speed min_speed) { target_speed min_speed; } speed target_speed; step_period_ticks FTM_CLOCK_HZ / speed; pos (current_direction ? 1 : -1); }這個函數(shù)不要放在每一個脈沖的ISR里而是放在一個固定頻率的中斷里比如1kHz到10kHz每tick更新一次速度。否則如果你在脈沖級中斷里做加減速速度越高中斷越頻繁參數(shù)調(diào)整起來非常難受。位置跟蹤要注意計數(shù)器溢出的問題。float和int32在長期運行里都會到極限我的做法是用一個有符號的64位變量保存總位置配合一個32位快速鏡像做前端的比較只在需要上報給上位機(jī)時才轉(zhuǎn)成64位。如果只靠開環(huán)脈沖丟步無法被及時察覺。我建議在有條件的場合加一個便宜的編碼器在運動結(jié)束后比對計數(shù)是否一致不一致就觸發(fā)重新回零或者重新定位。3.4 通信接口和機(jī)器人外部軸聯(lián)動機(jī)器人應(yīng)用里這塊MCU板大多數(shù)時候不是獨立運動而是被主控制器帶著走。常見的對接方式有兩種一是上位機(jī)把脈沖方向信號直接送給驅(qū)動MCU只做方向、原點、保護(hù)的輔助邏輯二是更高級的做法MCU直接跑Modbus-RTU或者CANopen協(xié)議上位機(jī)通過位置模式或速度模式發(fā)指令。我做第七軸項目時用的是第二種方案因為上位機(jī)是機(jī)器人主控機(jī)器人每10ms發(fā)送一次期望位置我要在收到指令后立刻判斷目標(biāo)位置合法性再進(jìn)入加減速。KV42的UART或者CAN外設(shè)都夠用關(guān)鍵是通訊中斷和運動中斷不要互相打架。我的經(jīng)驗是CAN接收中斷只負(fù)責(zé)把數(shù)據(jù)放進(jìn)一個環(huán)形緩沖區(qū)真正的位置解算在主循環(huán)里做不讓通訊延遲影響步進(jìn)脈沖的實時性。另外當(dāng)多個外部軸同時動作時各軸的“運動完成”信號要匯總到PLC。我在DRV8818的FAULT之外用一根GPIO輸出一個運動完成信號主機(jī)收到這個信號再發(fā)下一個命令這樣多軸聯(lián)動就不會因為一兩軸的脈沖處理慢而產(chǎn)生錯位。這個小功能看著簡單卻是機(jī)器人外部軸穩(wěn)定運行的重要細(xì)節(jié)。4. 工業(yè)與機(jī)器人應(yīng)用中的工程難點MCU和驅(qū)動芯片本身都挺可靠真正出問題的大多是外圍工程。這一節(jié)我把現(xiàn)場遇到最多的供電、EMC、安全保護(hù)三個問題拿出來聊一聊。4.1 供電、退耦與散熱設(shè)計驅(qū)動板在機(jī)器人柜子里的供電環(huán)境算不上友好同一個母線上往往還有伺服、開關(guān)電源、繼電器。步進(jìn)驅(qū)動每換相一次都要從母線抽一坨電流如果母線電容不足VM電壓會像心電圖一樣抖。我的經(jīng)驗是24V入口放兩個電解電容總?cè)萘恐辽?70μF再在VM引腳附近放一個10μF到22μF的X7R陶瓷電容。陶瓷電容負(fù)責(zé)吸收高頻電流電解電容負(fù)責(zé)維持母線能量。退耦不只是“多放電容”位置比數(shù)量更重要。陶瓷電容必須緊貼VM引腳走線越短越好最好放在芯片同一面、引腳正對面。如果你把大電容放在板子另一側(cè)且過孔很遠(yuǎn)高頻電流還是會被走線電感擋住波形照樣毛刺飛起。散熱焊盤是另一個重點。HTSSOP-16封裝的散熱焊盤不是擺設(shè)底部焊盤要開金屬化過孔到地平面過孔陣列越密越好。我用的是9個0.3mm過孔做陣列把熱量引到背面一整塊鋪銅。如果沒有這塊散熱銅皮芯片連續(xù)跑2A電流表面溫度能到90度以上現(xiàn)場很容易觸發(fā)過溫FAULT。焊接的時候散熱焊盤千萬不能虛焊不然你會發(fā)現(xiàn)不接電機(jī)芯片都正常一接電機(jī)FAULT不斷。4.2 線纜屏蔽與EMC現(xiàn)場處理機(jī)器人本體里電機(jī)線和功率線的距離有時候躲不開步進(jìn)驅(qū)動斬波產(chǎn)生的干擾會順著電機(jī)線往外輻射。我一般把電機(jī)線用屏蔽雙絞線屏蔽層在靠近驅(qū)動端單端接地盡量遠(yuǎn)離編碼器線和通訊線。如果結(jié)構(gòu)上沒法遠(yuǎn)離就在通訊線、STEP線附近加磁環(huán)效果立竿見影。FAULT信號和限位信號屬于慢速電平我習(xí)慣在MCU入口加一個RC低通比如10kΩ電阻加100nF電容時間常數(shù)約1ms可以濾掉大部分脈沖干擾。STEP這種快速信號不能這么干否則波形會被拉圓我用100Ω串聯(lián)電阻加一個1nF到4.7nF電容既防止過長線纜的振鈴也不會把脈沖邊沿完全毀掉。還有一次現(xiàn)場調(diào)試外部軸一動相鄰的觸摸屏就閃爍。查了半天最后發(fā)現(xiàn)是驅(qū)動板到電機(jī)的線纜和設(shè)備框架形成了大回路地線處理得亂。后來把電機(jī)線的屏蔽層在驅(qū)動端單端接地并把驅(qū)動板的地和機(jī)柜系統(tǒng)地短接干擾就沒了。這種EMC問題往往不是芯片選得不好而是布線、屏蔽、接地三個環(huán)節(jié)的任何一個掉鏈子。4.3 安全保護(hù)、限位和掉電處理工業(yè)設(shè)備跑起來之后安全是最后一道防線。我在軟件里把硬限位接成中斷優(yōu)先觸發(fā)之后立即把ENABLE關(guān)斷速度再快也不能越過限位。軟限位在運動控制層會提前減速但如果軟限位失效硬限位是物理層面的兜底。因為KV42的中斷優(yōu)先級足夠高硬限位觸發(fā)到ENABLE拉低大概只有幾個微秒這個響應(yīng)速度對步進(jìn)系統(tǒng)來說足夠安全。掉電順序也值得設(shè)計。如果突然掉電MCU的3.3V會先掉DRV8818的VM可能還殘留一點電壓這時如果ENABLE引腳上的電平不管驅(qū)動可能還保持電流以不完整的邏輯電平運作非常危險。我用一個掉電監(jiān)測電路檢測到5V下跌到閾值以下就立刻給MCU一個外部中斷MCU在掉電保護(hù)時間內(nèi)把ENABLE拉低、SLEEP拉低、記錄當(dāng)前位置。這樣復(fù)位上電后可以恢復(fù)到掉電前位置不需要重新回零。機(jī)器人外部軸的機(jī)械抱閘也要考慮步進(jìn)電機(jī)的保持力矩雖然能鎖住小負(fù)載但大負(fù)載或者突然急停時最好并聯(lián)一個制動繼電器FAULT觸發(fā)時同時閉合抱閘。這個電氣上不難難的是軟件時序必須確保抱閘先鎖住、再釋放電流避免機(jī)械沖擊。我吃過這個虧后面一直這么設(shè)計。5. 調(diào)試記錄與快速排查就算方案再成熟調(diào)試時依然會碰到一堆奇怪問題。我把現(xiàn)場最常見的三類坑和排查表格整理如下希望能幫你省下幾個下午。5.1 最常見的三個坑第一個坑是“電機(jī)完全不轉(zhuǎn)”。那回我在調(diào)試臺上接好線、寫好程序電機(jī)紋絲不動。示波器一看STEP有脈沖再一量DRV8818上面的SLEEP引腳居然被板上的下拉電阻拉低了。原因是我把一個本該默認(rèn)高電平的引腳用0Ω跳線接到了地雖然看著是同一個net實際電平全反了??打?qū)動的控制邏輯ENABLE、SLEEP、RESET這幾個引腳最好仔細(xì)讀數(shù)據(jù)手冊確認(rèn)有效電平不要憑感覺接上下拉電阻。第二個坑是“轉(zhuǎn)起來像拖拉機(jī)”。電機(jī)一轉(zhuǎn)就發(fā)出咔咔咔的聲音還會丟步。我本來以為是細(xì)分不夠調(diào)高細(xì)分后依然沒改善。后來用示波器看電流波形發(fā)現(xiàn)斬波紋波超大衰減模式?jīng)]有配置好。我把衰減模式調(diào)到混合衰減噪音立刻降下去電機(jī)高速段也順了。有時候拖動不暢不是電流不夠而是斬波模式不匹配。第三個坑更隱蔽是“上位機(jī)收到錯誤位置”。機(jī)器人走了一大段距離之后位置報告差了整整1600步。排查到最后發(fā)現(xiàn)是STEP線纜在機(jī)柜里和一根繼電器電源線綁在了一起繼電器每次吸合都會在STEP線上感應(yīng)出一個小尖峰驅(qū)動芯片把這個尖峰當(dāng)成一個步進(jìn)脈沖。雖然每一步很短但累計下來就是差了整圈。解決方法是給STEP線獨立走線并在MCU輸出端加RC濾波。程序里再把方向切換和脈沖沿控制在兩個相鄰周期基本根治。5.2 現(xiàn)場問題排查速查表我把平時調(diào)試中經(jīng)常對照的一張表寫在這可以打印出來貼在調(diào)試臺邊上。表格里的檢測思路都經(jīng)過現(xiàn)場驗證能幫你快速收斂問題范圍。癥狀優(yōu)先排查方向具體操作電機(jī)完全不轉(zhuǎn)電源和使能邏輯確認(rèn)VM、VCC電壓測量SLEEP、ENABLE、RESET的電平是否滿足芯片要求看FAULT是否已拉低電機(jī)單相發(fā)熱檢流電阻和繞組用萬用表測兩相繞組的電阻是否對稱用電流探頭分別看A、B相電流確認(rèn)是否只有一相恒定導(dǎo)通運行抖動、噪聲大細(xì)分和衰減提高細(xì)分檔位修改衰減模式檢查電源紋波和母線電容高速丟步供電和加速度提高限流值加大母線電容降低加速度確認(rèn)電機(jī)電壓是否在高速時跌破閾值FAULT反復(fù)誤報干擾和溫度去掉引發(fā)干擾的線纜單獨帶電機(jī)測試觸摸芯片溫度加強RC濾波和屏蔽位置隨運行漂移軟件計數(shù)和干擾檢查是否丟步加編碼器校驗檢查STEP線抗干擾設(shè)計確認(rèn)DIR建立時間5.3 調(diào)試工具和技巧我做這個項目時身邊的工具很樸素一臺100MHz示波器、一個鉗形電流探頭、一個24V可調(diào)電源、一臺筆記本。示波器主要抓三處STEP輸入、VM電壓、電機(jī)繞組電流。把這三路波形對照起來看幾乎所有問題都能定位。比如STEP有脈沖但電機(jī)不動看VM電壓是否在脈沖期間塌陷看電流波形就知道斬波限流有沒有正常工作。調(diào)試電流時我先用可調(diào)電源把VM拉低到12V把電流限制在比較低的水平等確認(rèn)邏輯和換相反饋對了再升到24V滿載。這樣即使接線錯也不會一上電就燒驅(qū)動。另外我強烈建議準(zhǔn)備一個小的手動“點動脈沖”功能在MCU程序里做一個軟復(fù)位到原點然后手動發(fā)單個STEP觀察電機(jī)是否按預(yù)期走一個步距角。這個功能在查方向和相序問題時非常好用。我個人還有一個習(xí)慣把每塊驅(qū)動板的固件版本、電流配置、細(xì)分配置做成一張EEPROM參數(shù)表上電時由MCU統(tǒng)一讀出來再配置DRV8818。這樣做的好處是現(xiàn)場更換板卡時不用重新燒錄固件直接改參數(shù)就能適應(yīng)不同電機(jī)對設(shè)備維護(hù)和客戶售后都省了很多事。最后說點實際體會。步進(jìn)電機(jī)控制這行芯片選型占三分外圍工程占七分。DRV8818PWPR和MKV42F128VLH16這對組合給我最大的幫助是把“功率”和“邏輯”徹底分開了調(diào)試的時候心里有底出了故障也知道往哪找。再分享一個小技巧如果你想在硬件不改的情況下快速驗證不同電機(jī)的適配性可以給每個電機(jī)品牌建一個參數(shù)表把額定電流、繞組電感、推薦細(xì)分、推薦衰減模式都記進(jìn)去換電機(jī)時MCU只改配置ID就行。這個動作能讓你少燒至少三片驅(qū)動芯片。