動42步進電機:從PWM配置到加減速排障)
42步進電機大概是創(chuàng)客和工控場景里最沒存在感的設(shè)備。一片幾十塊的DRV8825驅(qū)動板、兩根信號線網(wǎng)上教程鋪天蓋地——“接上就轉(zhuǎn)給脈沖就走”??烧姘阉MXY平臺、轉(zhuǎn)臺或者貼標機里事情就沒那么浪漫了低速時機身嗡嗡共振高速時“咔噠”一聲丟步模塊燙到不敢摸一加負載直接停在原地……這些坑我?guī)缀跞冗^。這篇把“STM32 HAL庫驅(qū)動42步進電機”這件事從頭到尾完整過一遍從CubeMX工程配置、PWM參數(shù)推導講到加減速實現(xiàn)和實測排障給準備做類似項目的朋友一條可復現(xiàn)的路線。內(nèi)容以我實際調(diào)過的STM32F103C8T6 DRV8825 42BYGH這套組合為主但原理對A4988、TMC2209同樣適用。1. 42步進電機選型與驅(qū)動方案的底層邏輯1.1 先搞清楚你手上這顆電機的實際參數(shù)42步進電機光看外形差不多實際參數(shù)差異非常大。我手里這顆是42BYGH系列兩相四線步距角1.8°也就是全步時每圈200步。額定相電流印在銘牌上常見的是1.5A和2.0A兩種規(guī)格保持轉(zhuǎn)矩大約0.4~0.5N·m。這些參數(shù)直接決定了驅(qū)動芯片的選型和限流設(shè)置不能只看“反正都是42”就大意。先做一個最基本但很多人忽略的操作把電機銘牌拍照確認相電流和相電阻。相電流是驅(qū)動板限流的依據(jù)。我見過有人拿1.5A的電機配0.4A的電流設(shè)置結(jié)果一上負載就失步也有人反過來把電流調(diào)到2A電機燙到能煎雞蛋還能聞到糊味。接線方面四線電機一般分成A、A-、B、B-兩個繞組用萬用表電阻檔可以量出來——同一繞組的兩根線之間阻值很小跨繞組之間是斷開的。接錯繞組雖然不一定會立刻燒但電機會出現(xiàn)異常的抖動和卡頓這是新手最常見的接線錯誤。還有個容易被忽略的點42步進電機的電感值。電機銘牌上有時會標注相電感比如幾mH。電感越大繞組電流建立越慢高速性能就越差。如果項目對轉(zhuǎn)速要求比較高盡量選相電感小一點的電機。不過大多數(shù)情況下我們手里的42電機用在低中速場景足夠真正高速場合直接上閉環(huán)步進或者伺服是更合理的選擇。1.2 驅(qū)動芯片怎么選我實測過的三種方案市面上驅(qū)動42步進電機的主流芯片方案有三類A4988、DRV8825和TMC2209。我都在項目中用過性能差異非常直觀。芯片最大電流細分范圍驅(qū)動電壓特點適合場景A49882A1/1~1/168~35V便宜發(fā)熱大小負載桌面原型DRV88252.5A1/1~1/328.2~45V散熱更好性價比高大多數(shù)42電機項目TMC22092.8A最高1/2564.75~29V靜音硬件簡單家用設(shè)備、辦公環(huán)境最開始我做測試臺時用的A4988。當時負載不大但連續(xù)跑了一個小時芯片表面溫度已經(jīng)超過80℃。這一方面和芯片自身散熱設(shè)計有關(guān)A4988內(nèi)部MOSFET的導通阻抗相對高另一方面也和我當時電流調(diào)得偏高有關(guān)。后來換成DRV8825同樣的電機、同樣的電流設(shè)置溫度至少降了一個檔次。如果對噪音很敏感比如設(shè)備放在辦公桌上TMC2209值得一試。它集成了StealthChop2靜音算法低速區(qū)電機電磁噪聲會小很多代價是成本貴一倍而且它更偏向低壓應(yīng)用供電電壓超過29V就不能用了。我的建議是初學老老實實用DRV8825踩坑成本低、資料多做產(chǎn)品或者改善體驗再考慮TMC2209。1.3 恒流斬波為什么不能像直流電機那樣直接通電步進電機本質(zhì)上是電流型設(shè)備。轉(zhuǎn)矩近似正比于相電流繞組電感又大如果直接把繞組接到直流電源上電流會一路飆升直到燒毀。所以驅(qū)動芯片內(nèi)部做的叫恒流斬波——通過H橋在導通和續(xù)流之間快速切換讓相電流穩(wěn)定在設(shè)定值附近。打個比方就像給水桶加水不是一直開大水龍頭而是加到接近刻度就關(guān)小低了再補讓水位始終在目標線附近。DRV8825內(nèi)部斬波頻率大概在30~50kHz量級配合外部采樣電阻檢測電流達到設(shè)定閾值就關(guān)斷低于閾值再打開周而復始。這也是為什么我不建議自己用分立MOS管搭H橋來驅(qū)動步進電機。除了電流采樣還涉及死區(qū)時間、續(xù)流路徑、斬波時序調(diào)試成本極高。一片驅(qū)動板幾十塊錢沒有必要為了省這個錢把時間搭進去。理解了恒流斬波后面調(diào)節(jié)電流、排查丟步時就不容易犯方向性錯誤。2. CubeMX工程配置引腳分配與PWM參數(shù)推導2.1 引腳規(guī)劃先畫一張分配表再動手以STM32F103C8T6Blue Pill最小系統(tǒng)板為例我的引腳分配是這樣的功能引腳說明STEPPA8TIM1_CH1定時器PWM輸出產(chǎn)生步進脈沖DIRPB1方向控制電平高低決定正反轉(zhuǎn)ENABLEPB10驅(qū)動使能低電平有效TX/RXPA9/PA10串口打印調(diào)試信息有一個非常隱蔽但致命的問題驅(qū)動板和單片機必須共地否則方向信號和脈沖信號的電平參考點不一樣會出現(xiàn)隨機的失步和抖動。另外驅(qū)動板供電建議單獨一路12V或24V電源不要和單片機共用一個電源。電機啟動瞬間的電流沖擊會把單片機供電電壓拉低嚴重時會直接復位表現(xiàn)就是設(shè)備一啟動就重啟。IO口和驅(qū)動板之間的連接最好在STEP、DIR、ENABLE上串一個1kΩ左右的電阻。原因很簡單防止調(diào)試時接錯線把單片機IO口電流灌壞。雖然驅(qū)動板輸入端一般有內(nèi)部處理但串電阻是零成本高收益的習慣。如果信號線比較長超過20cm建議把PWM頻率降低一些否則線上的寄生電容會讓波形變圓脈沖邊緣不陡驅(qū)動芯片可能檢不到。2.2 PWM頻率的計算邏輯很多人看到CubeMX里的PSC、ARR就直接照抄別人的參數(shù)其實只要理解一個公式就全通了PWM頻率 定時器時鐘 / (PSC1) / (ARR1)STM32F103默認主頻72MHz。如果把PSC設(shè)為71計數(shù)時鐘就是72MHz / 72 1MHz。此時ARR999時PWM頻率 1MHz / 1000 1kHz。這個1kHz就是步進脈沖頻率。在全步下電機每收到200個脈沖轉(zhuǎn)一圈每秒1000步就是5轉(zhuǎn)/秒也就是300rpm。換算公式是轉(zhuǎn)速(rpm) 脈沖頻率(Hz) / (200 × 細分倍數(shù)) × 60舉個例子1/16細分下每圈需要200×163200個脈沖。想讓電機以60rpm旋轉(zhuǎn)脈沖頻率就是3200×13200Hz。反過來調(diào)試時用邏輯分析儀抓到某個頻率的數(shù)字也能立刻推算出實際轉(zhuǎn)速。這一步是整個工程參數(shù)設(shè)計的地基算不清楚后面全是猜。CubeMX的定時器配置界面上Pulse參數(shù)設(shè)置的是占空比比較值。對步進電機來說STEP輸入對頻率敏感對占空比不那么敏感只要保證高電平時間足夠脈沖邊沿就能被可靠檢測。我把比較值設(shè)成ARR的一半占空比50%這樣波形最規(guī)整排查時序問題時不至于多一個變量。2.3 CubeMX配置的注意細節(jié)打開STM32CubeMX新建工程選擇STM32F103C8Tx在時鐘樹里把HCLK配到72MHz。左側(cè)欄找到TIM1Channel1選擇PWM Generation CH1。Parameter Settings里Prescaler填71Counter Period根據(jù)目標頻率填對應(yīng)的ARR減1Pulse填Counter Period的一半。如果不知道目標頻率對應(yīng)多少ARR可以直接在Counter Period輸入框里試數(shù)CubeMX會自動在下方顯示最終PWM頻率非常方便。有幾個細節(jié)值得注意。第一TIM1屬于高級定時器產(chǎn)生PWM需要調(diào)用HAL_TIM_PWM_Start但和普通定時器不同高級定時器如果要用到主輸出還需要調(diào)用HAL_TIM_PWM_Start對應(yīng)的主輸出使能函數(shù)——實際上HAL庫新版本里HAL_TIM_PWM_Start已經(jīng)包含了主輸出使能邏輯用標準例程即可。第二要使能TIM1的更新中斷方便后面做加減速。第三GPIO配置里TIM1_CH1引腳會自動復用方向和控制引腳設(shè)為普通的推挽輸出模式即可。初始化完成后生成工程。有一個很多人不問但值得說的事CubeMX生成的代碼里MX_TIM1_Init之后并不是已經(jīng)輸出PWM只是把寄存器配好了。真正讓PWM跑起來的是運行時調(diào)用HAL_TIM_PWM_Start。新手往往以為初始化完引腳就有波形結(jié)果示波器探上去什么都沒有卡老半天。3. HAL庫驅(qū)動代碼從翻轉(zhuǎn)GPIO到PWM連續(xù)運動3.1 為什么別用GPIO翻轉(zhuǎn)做長時間運動我先說一個反面教材。最早我也圖省事直接在main循環(huán)里寫while (1) { HAL_GPIO_TogglePin(STEP_GPIO_Port, STEP_Pin); HAL_Delay(1); }這段代碼看起來沒有問題實測卻非常糟糕。HAL_Delay的精度在毫秒級但循環(huán)體內(nèi)除了翻轉(zhuǎn)GPIO之外還有函數(shù)調(diào)用和寫寄存器開銷導致實際脈沖間隔抖動很大。步進電機的低速性能對脈沖間隔均勻性非常敏感稍微不均勻就會出現(xiàn)頓挫和共振噪音也大。更要命的是CPU全程被占用。你沒法同時處理按鍵、顯示、串口通訊。哪怕只是臨時測試也得不償失。后來我改用定時器PWMCPU徹底解放脈沖頻率也極其精確這才是步進電機驅(qū)動的正確姿勢??梢赃@么說只要項目里的運動是持續(xù)性的超過幾秒鐘就不該用軟件翻轉(zhuǎn)GPIO來發(fā)脈沖只有極低速、極短距離的點動運動軟件翻轉(zhuǎn)才勉強可行。3.2 最小可運行代碼PWM一開脈沖自己走HAL庫下啟動PWM輸出非常簡潔int main(void) { HAL_Init(); SystemClock_Config(); MX_GPIO_Init(); MX_TIM1_Init(); // 默認方向 HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, GPIO_PIN_SET); // 使能驅(qū)動模塊低電平有效 HAL_GPIO_WritePin(EN_GPIO_Port, EN_Pin, GPIO_PIN_RESET); // 啟動PWM輸出 HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); while (1) { // 主循環(huán)做別的事情脈沖由硬件發(fā)出 } }只要ARR不為零HAL_TIM_PWM_Start之后定時器就會持續(xù)輸出頻率穩(wěn)定的方波。想要改變速度只需要修改ARR或者PSC不需要停掉定時器。我當時用邏輯分析儀量過PWM輸出頻率和設(shè)定值之間的誤差在萬分之幾量級這就是硬件定時器的優(yōu)勢。需要說明的是MODE引腳也就是細分設(shè)置引腳有時候是三個引腳需要根據(jù)想要的分辨率硬接線。DRV8825的MODE0、MODE1、MODE2三個引腳對應(yīng)不同的細分倍數(shù)全部接低就是全步接高組合則對應(yīng)1/2、1/4、1/8、1/16、1/32。這些引腳可以直接接到單片機的GPIO或者直接接VCC/GND。如果只是固定用某個細分推薦直接接電源或者地省得每次上電還要軟件配置。3.3 方向與使能信號的處理順序方向轉(zhuǎn)換是一個經(jīng)常被忽略的細節(jié)。改變方向時正確順序是先停止脈沖再切換方向延時幾百微秒再重新發(fā)脈沖。DRV8825數(shù)據(jù)手冊里方向信號的建立時間是ns級別看起來很短實際應(yīng)用中我還是習慣放寬到幾百微秒。如果一邊發(fā)脈沖一邊翻轉(zhuǎn)方向驅(qū)動芯片的橋臂在切換瞬間會出現(xiàn)不可控的電流狀態(tài)有時候表現(xiàn)為電機輕微抖動嚴重時會損壞驅(qū)動芯片。另一個經(jīng)驗是不做運動時把ENABLE拉高關(guān)斷輸出讓電機處于自由狀態(tài)。這樣不僅可以減少發(fā)熱也方便手搖對位。但要注意如果設(shè)備掉電后需要保持當前位置就不能這樣操作應(yīng)該讓使能一直有效利用電機的保持轉(zhuǎn)矩鎖住位置。還有一個和方向相關(guān)的細節(jié)DIR信號的電平極性是固定的但不同品牌驅(qū)動板對“高電平正轉(zhuǎn)”還是“低電平正轉(zhuǎn)”的定義可能不同。遇到電機轉(zhuǎn)向和預期相反不要急著改程序先交換驅(qū)動板上A/A-或者B/B-的接線或者直接翻轉(zhuǎn)DIR的電平邏輯都比改機械結(jié)構(gòu)方便。4. 梯形加減速實現(xiàn)直接滿速啟動是丟步的最常見原因4.1 失步的物理本質(zhì)為什么電機跟不上命令步進電機的失步聽起來像是“電機沒跟上命令”本質(zhì)上是轉(zhuǎn)矩不夠。電機有一個參數(shù)叫最大自啟動頻率在這個頻率以下電機可以從靜止直接同步到給定脈沖頻率而不丟步一旦超過這個頻率轉(zhuǎn)子機械位置追不上定子旋轉(zhuǎn)磁場就會丟掉一個或多個脈沖對應(yīng)的步數(shù)。這個頻率不是固定的它和負載慣量、電流、電源電壓、驅(qū)動芯片特性都有關(guān)。拿我們常見的42電機帶一個絲桿滑臺來說如果直接上2000Hz的脈沖頻率也許剛開始還能轉(zhuǎn)但稍微碰一下、加一點負載就會咔噠咔噠地空轉(zhuǎn)位置全丟。這就是啟動轉(zhuǎn)矩不夠的直接表現(xiàn)。所以工程上才需要加減速曲線。啟動時慢慢加上去讓電機有足夠時間建立轉(zhuǎn)子位置高速運行時的轉(zhuǎn)矩雖然會下降但維持勻速轉(zhuǎn)動所需的轉(zhuǎn)矩也相對較低。換句話說梯形加減速的本質(zhì)是用時間換轉(zhuǎn)矩讓電機在低速段完成加速避免在高速段挑戰(zhàn)啟動極限。4.2 梯形加減速的數(shù)學推導與參數(shù)計算梯形加減速是最常用也是最實用的速度規(guī)劃方式。啟動時頻率低以固定加速度升高到達目標速度后保持勻速停止前再降下來。加速階段每個脈沖的時間間隔并不是固定的而是越來越短。如果從f_start200Hz線性加速到f_end2000Hz用500ms加速時間那么頻率每毫秒增加(2000-200)/5003.6Hz。對應(yīng)到定時器的ARR值就是從1000000/2005000逐步變成1000000/2000500。實際工程里我并不是每個脈沖都去改一次ARR那樣中斷頻率太高、計算量太大。我更常用的是固定時基方式讓定時器以1kHz的頻率產(chǎn)生更新中斷每次中斷里以指定的步長遞增或遞減目標頻率然后重裝ARR。這樣加減速也足夠平滑代碼也簡單可控。參數(shù)調(diào)試時啟動頻率我習慣設(shè)在250Hz到400Hz之間加速時間從200ms開始試不夠再加。加速度也不是越大越好。加速度太大電機在高速段的轉(zhuǎn)矩不足以維持照樣會失步加速度太小運動效率又太低。我的做法是先按大致的經(jīng)驗公式估算一個加速度上限再實測微調(diào)。公式可以這樣算加速時間t (f_end - f_start) / a其中a代表每秒頻率變化量。比如目標頻率2000Hz啟動300Hz加速時間500ms那a3400Hz/s。這個數(shù)值不是拍腦袋定的而是通過多次測試找出來的——先用大加速時間比如800ms跑確認全程不丟步再逐步縮短加速時間看什么時候開始丟步最后留出至少20%的余量。4.3 用定時器更新中斷重裝ARR參數(shù)修改的核心API是__HAL_TIM_SET_AUTORELOAD。但有一個坑修改ARR之后比較值CCR不會自動跟著變。如果ARR從5000改成4000而CCR還停在5000那實際輸出會一直是高電平?jīng)]有PWM波形了。所以正確的做法是在更新中斷里成對修改void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { if (htim-Instance TIM1) { // 用1MHz計數(shù)時鐘根據(jù)當前目標頻率計算ARR uint32_t arr (uint32_t)(1000000.0f / current_speed); __HAL_TIM_SET_AUTORELOAD(htim1, arr - 1); __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, (arr - 1) / 2); } }這么做的另一個好處是ARR在PWM周期的結(jié)束時刻更新不會在一個周期中間截斷輸出波形不會出現(xiàn)毛刺。我最初把這兩行寫反了先改比較值再改自動重載值結(jié)果在一個周期內(nèi)出現(xiàn)了半個窄脈沖電機在低速區(qū)能聽出明顯的“噠噠”聲。把更新順序調(diào)整后聲音立刻干凈了。加減速狀態(tài)機也要放在同一個回調(diào)里。我習慣定義一個簡單的結(jié)構(gòu)體當前速度、目標速度、加速度、狀態(tài)加速/勻速/減速。定時器中斷里只需做速度比較和遞增遞減主循環(huán)里只要設(shè)定目標速度剩下的交給中斷處理。這個方法簡單可靠已經(jīng)用了很多年。5. 實測問題排查抖動、丟步、發(fā)燙的完整鏈路5.1 電機抖動但不轉(zhuǎn)四個排查步驟這個故障出現(xiàn)頻率極高我?guī)缀趺看螏腿苏{(diào)試都會遇到上電后發(fā)脈沖電機轉(zhuǎn)子在某個位置來回振動無法連續(xù)旋轉(zhuǎn)好像被什么東西卡住一樣。遇到這種情況我建議按順序排查不要跳步。第一步確認繞組接線是否配對。用萬用表量一下A和A-、B和B-之間的阻值正常在幾歐姆到十幾歐姆。如果接成了“交叉繞法”比如A接B-就會抖動但不轉(zhuǎn)。第二步確認電流設(shè)置。如果驅(qū)動板電位器擰到最低電流只有0.2A電機連完成一個步進所需要的轉(zhuǎn)矩都不夠也會抖。第三步用邏輯分析儀看STEP引腳的波形。如果脈沖頻率只有幾十赫茲電機會一卡一卡看起來像是在抖動。第四步確認細分設(shè)置引腳的接線沒接錯。有人MODE0接VCC、MODE1接GND結(jié)果是1/4細分但程序里按1/8細分來算速度位置就會對不上。我印象最深的一次排查是最后發(fā)現(xiàn)驅(qū)動板上STEP信號和DIR信號接反了。脈沖從DIR引腳進去方向信號從STEP引腳進芯片的邏輯自然全亂。這類小問題單看代碼看不出來拿邏輯分析儀一支幾分鐘就能定位。5.2 DRV8825發(fā)燙電流限制與Vref的調(diào)節(jié)DRV8825模塊跑幾分鐘就燙手這是很多人來問的問題。首先明確一個觀點正常的恒流斬波驅(qū)動芯片工作起來有熱量是正常的因為MOSFET有導通阻抗?jié)M載電流下模塊表面溫度達到80~90℃并不稀奇只要不超過芯片的結(jié)溫上限就行。但如果燙到無法觸碰而且電機轉(zhuǎn)矩并沒有明顯提升那就是電流設(shè)置太高了。正確做法是測量Vref電壓。不同模塊的采樣電阻阻值不同按照DRV8825的數(shù)據(jù)手冊公式ITRIP VREF / (8 × R_SENSE)比如我手上這塊模塊采樣電阻是0.1Ω想要電機工作在1.5A那么Vref 1.5 × 8 × 0.1 1.2V。用萬用表量驅(qū)動板上電位器的中間引腳和GND之間的電壓調(diào)到1.2V左右。如果你買的模塊采樣電阻不是0.1Ω需要先查看模塊絲印或者賣家資料確認阻值套公式算不要盲目照搬。這里必須抱怨一句網(wǎng)上很多教程說“電位器擰到一半大概就是1A”這種說法極其害人。不同模塊的電位器阻值和采樣電阻不一樣擰到一半對應(yīng)的電流完全沒法確定。我踩過這個坑的實物教訓是某個模塊擰到一半實測Vref才0.3V電機轉(zhuǎn)矩嚴重不足另一個模塊擰到一半電流已經(jīng)超過2.5A芯片燙到冒煙。所以別憑手感萬用表測電壓才是唯一可靠的方式。5.3 高速丟步軟件時序和加減速參數(shù)的配合高速丟步的現(xiàn)象是目標頻率超過某個閾值后電機偶爾丟步丟多丟少隨機位置也因此失準。第一次遇到時我第一反應(yīng)是電流不夠把電流從1.2A一路上調(diào)到2A發(fā)現(xiàn)改善很小。后來用邏輯分析儀抓STEP引腳才發(fā)現(xiàn)問題根本不在驅(qū)動端而是我的軟件“加速”壓根沒有生效。細節(jié)是這樣的定時器更新中斷里用了浮點運算計算量大加上打印調(diào)試信息的串口輸出阻塞整個時基被拖亂導致頻率跳變毫無規(guī)律。電機一會兒收到高頻脈沖一會兒又遇到長停頓自然亂套。這個問題的排查鏈路很有代表性先把軟件產(chǎn)生的波形本身調(diào)干凈再懷疑硬件。后來我做了兩件事。第一把加減速計算全部改為整數(shù)運算避免浮點庫帶來的時間開銷。第二把串口打印改為DMA方式或者只在調(diào)試模式下使用。再把啟動頻率從300Hz降到200Hz加速時間從200ms延長到500ms。同樣的目標速度再也沒有丟過步。這個案例說明一個道理步進電機丟步絕大多數(shù)情況下不是“電機壞了”而是軟件給它的脈沖序列本身就不健康。6. 進階方向與我在項目里的習慣做法6.1 從能用走向好用靜音、S形曲線與閉環(huán)如果你想把這套東西做得更接近商用設(shè)備有幾個方向值得投入時間。第一個方向是S形加減速。梯形曲線的加速度是突變的啟動和停止瞬間有一個沖擊力。S形曲線在拐角處做圓弧過渡加速度不是突變而是斜坡變化能明顯減少設(shè)備的頓挫感。實現(xiàn)方式是在梯形加減速基礎(chǔ)上對加速度本身再做一次斜坡規(guī)劃。代碼量不大但調(diào)試參數(shù)比梯形復雜不少建議先把梯形調(diào)明白再碰。第二個方向是換TMC2209并打開StealthChop模式。這個芯片的靜音效果不是一點點在低速區(qū)間幾乎聽不到電機聲對家用設(shè)備體驗提升非常明顯。硬件上TMC2209是UART或者Step/Dir接口代碼部分改動不算大驅(qū)動板的引腳定義和DRV8825差異也不多。第三個方向是閉環(huán)步進。在電機尾部加磁編碼器實時讀取轉(zhuǎn)子位置和期望位置比較如果偏差超過設(shè)定的脈沖數(shù)就自動補償。這就是目前流行的閉環(huán)步進概念它能在高速高負載場景下找回可靠性。STM32獲取編碼器數(shù)據(jù)通常用硬件SPI或者定時器編碼器模式HAL庫都有現(xiàn)成接口只要處理好中斷優(yōu)先級延遲完全足夠。6.2 串口畫速度曲線、邏輯分析儀看時序調(diào)試加減速時串口打印速度曲線非常好用。我習慣在每次更新頻率后把current_speed通過DMA發(fā)出去串口助手里帶繪圖功能的軟件列表接收可以直觀看到加速階段是否平滑、有沒有突然跳變。這個操作幾乎不需要額外硬件一個USB轉(zhuǎn)串口模塊就夠了。邏輯分析儀也是必須的工具。抓STEP和DIR兩路信號重點看兩件事一是脈沖周期是否穩(wěn)定二是DIR切換時是否發(fā)生在脈沖的中間。如果方向切換發(fā)生在脈沖中間電機會多走半步長期累積就會出現(xiàn)位置誤差。用邏輯分析儀確認時序之后再談加減速算法調(diào)整否則都是在猜。模塊散熱方面DRV8825雖然比A4988強但連續(xù)工作一小時后依然很熱。我給模塊貼了散熱片并保證驅(qū)動板周圍有通風路徑。不用風扇一個幾塊錢的鋁散熱片就能讓溫度降十幾度效果相當明顯。另外如果設(shè)備長期運行建議把電流設(shè)置在電機額定電流的70%到90%之間留出余量同時兼顧發(fā)熱和轉(zhuǎn)矩這是一個很劃算的取舍。