做工业设备和机器人运动控制的人应该都有同感:双极步进电机这东西,门槛看着低,可真正要做到“跑得稳、停得准、不丢步、不烧驱动”,背后全是细节。DRV8818PWPR 驱动芯片配合 STM32F439ZG 主控来带双极步进电机,这套组合我在传送分拣线、小型 SCARA、AGV 差速轮和实验室自动化设备上都实际用过,踩过不少坑,也沉淀了一套可以复用的做法。这篇文章不聊宣传册上的话,就按“为什么这么选、硬件怎么画、固件怎么写、现场怎么调、出问题怎么查”的顺序,把整套东西完整捋一遍。正在做工业或机器人运动控制的工程师,或者被步进电机折腾到想换伺服的同行,读完应该能少走不少弯路。
1. 方案选型背后的实际考量
1.1 这套方案到底解决什么问题
工业设备里大量运动轴并不需要伺服那种“全闭环、高带宽、大过载”的能力。很多场合要的只是低成本、高可靠性、足够定位精度,以及好维护。步进电机加细分驱动天然匹配这种需求:开环就能做到不错的重复定位精度,扭矩在低速段非常充沛,控制接口又简单。
关键是把活儿分给谁干。DRV8818PWPR 承担的是功率级那部分脏活累活:芯片内部集成了两个 H 桥、电流斩波调节电路和细分索引器,也就是说“电流环”这种高频实时控制根本不需要 MCU 操心。MCU 只需要告诉它“走多少步、什么方向”,剩下的相电流斩波和细分波形生成由驱动芯片自己完成。这等于把最麻烦的功率电路部分直接模块化了,硬件设计难度一下子降了一个量级。
STM32F439ZG 这边负责的是运动规划、位置闭环、状态监控和通信。它是 Cortex-M4F 内核,主频 180MHz,2MB Flash 加 256KB SRAM(含 64KB CCM),LQFP144 封装。用来带一个轴确实有点性能过剩,但放到多轴、带总线通信、还要做轨迹规划的机器人控制器里,这点余量很快就吃得干干净净。更关键的是它的定时器和 DMA 资源丰富,这对生成高质量步进脉冲非常重要,后面固件部分会详细说。
1.2 为什么不是别的方案
不少同行会问我,为什么不用 DRV8825,为什么不上 TMC 静音系列,甚至为什么不直接用带驱动功能的新一代 MCU。我一个个说我的真实考虑。
| 方案 | 电压/电流能力 | 接口方式 | 特点 | 适合场景 |
|---|---|---|---|---|
| DRV8818PWPR | 60V 级 / 2.5A 级 | STEP/DIR + 细分 | 皮实、工业电压余量大、发热可控 | 24V/48V 工业设备、2A 级步进轴 |
| DRV8825 | 45V / 2.5A 级 | STEP/DIR + 细分 | 便宜、资料多 | 对电压余量要求不高的低成本设备 |
| TMC2209 | 约 29V / 2A 级 | STEP/DIR 或 UART | 静音、内置电流检测 | 桌面级、低噪声场合 |
| 栅极驱动 + 分立 MOS | 看选型 | 需要自己做电流环 | 设计自由度高、开发量大 | 特种功率或成本敏感且研发能力强 |
TMC 的静音效果确实好,我用过之后也一度“回不去”。但它电压和电流的余量摆在那里,遇到 48V 母线或者 2A 以上持续电流的机器人关节,我就会回到 DRV8818。这芯片贵不了多少,胜在工业电压范围宽,VM 能扛到几十伏,又有 PowerPAD 封装辅助散热,长时间跑也不容易撒娇。至于用电机专用 MCU 的路线,比如 STM32G4 配集成栅极驱动,那确实性能更强,但开发量完全不是一回事,至少要先自己搞定 FOC 或者至少是开环电流斩波——对大部分设备厂商来说,把精力花在整机运动逻辑上更划算。
讲到 STM32F439ZG,也有朋友说“你单轴用个 F0 不就够了”。没错,只带一个轴确实够了。但一旦要做三四个轴、要挂 CANopen 跟机器人主站通信、要远程升级固件、还要在急停和故障处理上做冗余,F439 在这种环境里的优势就出来了。144 脚封装的 IO 数量也让原理图布局从容很多,不用为了省引脚把功能挤在一起。
1.3 系统总体架构
这套系统结构其实很直接,顺序是:STM32F439ZG 做运动规划和通信 → 隔离器件(光耦或数字隔离器)→ DRV8818PWPR 的 STEP/DIR/EN 引脚 → 电机相线到双极步进电机。反馈回路按需选择:要么纯开环,要么加一个增量编码器回读,用 STM32 的定时器编码器模式做位置闭环。工业现场一般还要在总线上挂 CAN 或以太网,让机器人控制器下发位置和速度指令,同时把驱动故障状态上报上去。
电源侧同样简单清晰:工业柜里常见的 24V 或 48V 直流母线直接进驱动级,经过保护器件和去耦电容后供给 DRV8818 的 VM 引脚。逻辑部分单独用 3.3V 供电,和功率地之间做好隔离或单点接地。这套架构我用了这么多年,最大的感受就是“每层职责分明”,改需求时不用牵一发动全身。
2. 硬件设计要点:从电源、隔离到 PCB 布线的实操细节
2.1 电机供电、去耦与保护
步进电机是感性负载,驱动芯片内部斩波时会在母线上拉出很大的电流脉冲。母线电压如果被拉塌,轻则丢步,重则芯片进入欠压保护频繁重启。所以 VM 引脚附近的电容不能省,而且不能只堆一颗大的。
我的习惯是:每个驱动轴在 VM 附近放一颗 47µF 到 100µF 的电解电容,耐压按母线电压留 50% 以上余量,24V 系统用 63V 规格;同时再放一颗 100nF 陶瓷电容紧贴 VM 引脚,用于吸收高频电流分量。如果一台设备里多个驱动共用一个电源,每轴都要有自己这一组电容,母线再按星型汇接到电源上,避免一个轴启停把隔壁轴搞出干扰。
输入保护这块千万别省。母线入口放一个保险丝或自恢复保险,再串联防反接器件(我常用 P-MOS 面板防反电路,压降比二极管小),VM 对地再接一个 TVS。TVS 选型按“正常工作电压 + 20% 左右”来,比如 24V 系统常用 SMBJ33A。关键点:TVS 必须尽量靠近 VM 引脚,否则引线电感会把它的钳位能力废掉大半。曾经有个项目,电机每次刹车就会把驱动芯片打坏,最后就是 TVS 离得太远,反电动势直接把芯片顶穿了。
2.2 电流采样电阻与 VREF 设定
DRV8818 是靠外部采样电阻来检测相电流并做斩波调节的。A、B 两相各需要一个低阻采样电阻。我一般用 0.1Ω 到 0.22Ω,金属合金膜工艺,低电感、低温漂,精度至少 1%。功率按 I²×R 估算:2.5A 电流、0.1Ω 电阻,峰值功率约 0.6W,选 1W 到 2W 的封装比较稳,还要留出温升余量。
相电流大小通过 VREF 引脚配合采样电阻来设定,典型关系是 I ≈ VREF / (K × RSENSE),其中 K 是芯片内部的增益系数,具体数值必须翻你手上那批芯片的数据手册。我吃过盲抄别人图纸的亏——网上流传的电路图和你的芯片批次一不一样都不知道,最后电流设得离谱,电机力矩要么不够要么发热严重。
更稳的做法是别用电位器,直接用 STM32F439ZG 的 DAC 输出作为 VREF,经过一个 RC 低通滤波(截止频率几 kHz 就够)接到 VREF 引脚。这样电流设定可以完全由软件控制,调试时不用拿螺丝刀反复拧电位器,还能在程序中做“上电后先低压保持、运动时再抬到目标电流”这种精细化控制。需要注意 DAC 带载能力,一般还要加一级运放跟随,或者至少把滤波器电阻选小一点,避免 VREF 被芯片内部电路拉偏。采样电阻到芯片感应输入之间的走线要短,并且用差分走法,避免功率地的大电流把噪声耦合进电流检测回路。
2.3 控制信号接口与隔离
工业现场的电机电缆和动力线到处都是干扰源,MCU 和驱动之间的地电位也可能不一致。STEP、DIR、EN 这些信号我不建议直连,隔离是必须的。尤其是 STEP,因为它的频率可以做得很高,要用高速光耦,比如 6N137、TLP2361,或者干脆用数字隔离器。普通 PC817 这类低速光耦,上升沿能给你拖到十几微秒,步进频率一高,脉冲直接被“展宽”成一团,电机就丢步了。DIR、EN、RST 这些低速信号用普通光耦就行,成本低。
我画这类接口电路时有个习惯:芯片输入端串一个 330Ω 到 1kΩ 的限流电阻,光耦输出端上拉到 3.3V,同时输出对地加 1nF 左右的电容滤波。需要特别注意静态电平设计——驱动芯片的电平状态在上电瞬间要处于“安全态”,也就是电机不允许意外转动的状态。比如 EN 如果是低有效,上电期间 MCU 还没初始化,光耦输出必须被拉死在高电平(即 EN 无效),中间不要出现一个毛刺把使能瞬间打开。
时序也要留意。STEP 脉宽和 DIR 建立时间都有最小要求,我通常把 STEP 高电平时间做到 5µs 以上再留余量,DIR 变化至少在 STEP 前沿之前一个脉宽完成。这些参数手册上都有,设计固件前先翻清楚,免得后面在时序上莫名踩坑。
2.4 PCB 布局与散热
DRV8818PWPR 是带 PowerPAD 的 HTSSOP 封装,底下那个大焊盘不仅仅是接地用,更主要的是散热通道。很多工程师把这个焊盘随便开个阻焊窗一焊了事,结果芯片跑到 1.5A 就热保护——根本原因就是热量散不出去。正确的做法是:PowerPAD 大面积铺铜接 GND,上面打过孔矩阵,通常中心区域内四乘四或五乘五的过孔阵列,过孔孔径 0.3mm 左右,然后焊盘上不打阻焊。这样热量才能通过铜皮和过孔导到整层地平面。
电机电流回路要短而宽。从 VM 引脚出来,经过 H 桥、电机相线输出、采样电阻,再到 GND,这整条回路尽量在同一层用宽铜皮走完,避免换层和细线。功率地和控制地最后单点汇接,不要在芯片下方交错混流。STEP 这类高频信号线要远离电机相线输出,信号源端加 22Ω 到 47Ω 的阻尼电阻,抑制振铃。
STM32F439ZG 这边的去耦别马虎,每个 VDD 引脚配一颗 100nF,另外在电源入口放一颗 4.7µF 到 10µF 的 MLCC 或钽电容。两层板不是不能做,但功率地平面和信号地共享一张铜皮时很容易出 EMI 问题。条件允许就上四层板,专门拆一层做地平面,调试时能省下大把时间。
3. 固件实现:STM32 如何生成高质量步进脉冲
3.1 时钟规划与定时器资源分配
固件做的第一件事是把时钟树理清楚。STM32F439ZG 跑 180MHz 主频,APB1 总线是 45MHz,但定时器时钟会再乘 2,也就是 90MHz;APB2 上挂的定时器能到 180MHz。我用 TIM4 挂在 APB1 上做步进脉冲生成,90MHz 时钟在 32kHz 步进频率下,每个周期有大约 2800 个定时器 tick,分辨率非常充裕。就算把步进频率拉到 200kHz,一个周期也还有 450 个 tick,做精细的加减速调整完全够用。
多轴项目里每个轴分配一个独立的定时器,互不干扰。TIM1 和 TIM8 这类高级定时器留着做其他用途也很合适。需要强调的是,给步进脉冲生成用的定时器中断,优先级在 NVIC 里要设得比较高,但不要和系统滴答、通信中断打架。这个后面讲 ISR 的时候再细说。
3.2 周期可变脉冲的生成:定时器 PWM 加更新中断
步进脉冲最简单的生成方式是 GPIO 翻转,但那样 CPU 负担重、抖动大,频率一高就没谱。我用的是定时器 PWM 输出:TIM4 的 CH1 配置成 PWM1 模式,输出 50% 占空比的脉冲序列,频率由 ARR 决定。需要改变步进速度时,在更新中断里改写 ARR 和 CCR1 就行。STM32F4 的定时器 ARR 有影子寄存器,写入后会在下一个更新事件才真正生效,所以不会出现“写到一半输出毛刺”的问题。
初始化代码大概是这样的:
static void Axis1_StepTimer_Init(void) { __HAL_RCC_TIM4_CLK_ENABLE(); TIM4->PSC = 0; // 90MHz 定时器时钟 TIM4->ARR = (90000000u / 32000u) - 1; // 默认 32kHz TIM4->CCR1 = TIM4->ARR / 2; // 50% 占空比 TIM4->CCMR1 = TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_2; // PWM1 模式 TIM4->CCER = TIM_CCER_CC1E; TIM4->DIER = TIM_DIER_UIE; // 更新中断 NVIC_SetPriority(TIM4_IRQn, 2); NVIC_EnableIRQ(TIM4_IRQn); TIM4->CR1 = TIM_CR1_CEN; }ISR 里面做三件事:查加减速表、更新 ARR、计数。核心逻辑我写成下面这样,重点在于每次更新 ARR 的同时要同步更新 CCR1,否则占空比会偏离 50%,脉冲宽度就可能不够。
void TIM4_IRQHandler(void) { if (TIM4->SR & TIM_SR_UIF) { TIM4->SR = ~TIM_SR_UIF; if (ramp.steps_done >= ramp.steps_total) { TIM4->CR1 &= ~TIM_CR1_CEN; // 到目标,关脉冲 return; } if (ramp.phase == RAMP_ACCEL) { TIM4->ARR = ramp.table[++ramp.idx]; } else if (ramp.phase == RAMP_DECEL) { TIM4->ARR = ramp.table[--ramp.idx]; } TIM4->CCR1 = TIM4->ARR / 2; ramp.steps_done++; if (ramp.phase == RAMP_CRUISE && (ramp.steps_total - ramp.steps_done) <= ramp.decel_steps) { ramp.phase = RAMP_DECEL; } } }如果单轴步进频率已经超过 100kHz,ISR 里的算术和查表还是会有压力。这时候可以把加减速表预先算好,用定时器更新事件触发 DMA,把 ARR 的序列从内存搬进定时器,CPU 完全解放。这条路我做过,稳定性和实时性都好,代码复杂度也不高,值得研究。
3.3 加减速曲线:梯形与 S 型
直接满频率发脉冲,电机十有八九会丢步。步进电机的启动频率通常远低于最高运行频率,所以加减速是必须的。最常用的是梯形速度曲线:加速段、匀速段、减速段。速度单位用 steps/s,加速度单位用 steps/s²。计算加减速所需要的步数是个高频公式:
N_acc = (f_max² - f_start²) / (2 × a) N_dec = (f_max² - f_end²) / (2 × a_dec)
如果 N_acc 加 N_dec 大于总步数,梯形就变三角形,没有匀速段,要重新计算可达的峰值频率 f_peak。当起始和结束频率都是 0 时,f_peak ≈ sqrt(a × N),这个近似在多数设备场景里够用。
加减速表的生成也有个小技巧。恒加速度下,每一步经历的时间约等于 1 / 当前频率,所以每一步频率增量近似为 a / f,递推式就是 f_{k+1} = f_k + a / f_k。把这个近似算出来的频率序列转换成定时器 ARR 值,存成一张表,运行时就查表改 ARR。表项数取 512 到 1024 之间,对 90MHz 定时器来说精度足够,内存开销也可忽略。生成表的核心代码:
uint32_t BuildRampTable(uint32_t f_start, uint32_t f_max, uint32_t accel, uint32_t timer_clk, uint32_t *table) { uint32_t idx = 0; float f = f_start; while (f < f_max && idx < RAMP_TABLE_MAX) { table[idx++] = (uint32_t)(timer_clk / f - 1u); f += accel / f; // 恒加速度下每步频率增量近似 } return idx; }S型曲线比梯形更平滑,本质是让加速度本身也按一定的“加加速度”变化。实现上不需要复杂的数学,把加减速段再分成三段:加加速、匀加速、减加速,每段用不同加速度递推即可。机器人关节在接近停止点时最容易出现微振,我换成 S 型后这个问题基本消失。代价只是多花几十行代码和一张更长的表,性价比很高。
3.4 方向、使能、故障保护与位置闭环
方向和使能的时序容易被忽略。DIR 信号必须在 STEP 前沿之前建立稳定,不能边发脉冲边切方向。我的规矩是:运动结束后至少等一个脉冲周期,先写 DIR,再延时一两个周期,然后才启动新的一轮脉冲。否则驱动芯片有可能把方向判错,机械结构就等着顶死吧。
使能时序也有讲究。上电后要等 VM 电压稳定,再延时几毫秒才解除 EN,紧接着发脉冲。急停处理更是安全第一:硬件急停回路直接断 EN 甚至断 VM,不能依赖软件里一个 GPIO 来做。软件能做的是收到故障信号后立刻封脉冲、上报状态、清运动指令,而不是指望它来保证人身安全。
DRV8818 的 FAULT 引脚接 STM32 的 EXTI,下降沿触发。一旦检测到过流或过热,立即停止发脉冲并进入故障状态。恢复时按手册要求重新初始化或者重新拉 EN,不要盲目连续重试,否则故障原因没排除,芯片可能反复打摆。
位置闭环这块我多说一句:步进电机开环加编码器回读,做的是“低频纠偏”,不是伺服那种高频扭矩闭环。最常见的做法是,STM32 定时器编码器模式实时读位置,与目标位置比较后产生一个修正脉冲,把丢的步补回来。千万别频繁反向纠正,那会加剧磨损和振荡。F439 的定时器资源足够每轴分配一个编码器接口,我目前已经把这个闭环方案跑进了机器人关节,效果比纯开环稳定不少。
整机通信上,简单项目用 UART 指令就够,工业项目建议上 CANopen 或 Modbus。指令内容无非是目标位置、速度、加速度、急停这几项,协议尽量精简,测试和排查都会轻松很多。
4. 系统联调:从点亮到稳定运行的标定流程
4.1 上电前检查清单
硬件焊完别急着上电。我有一套固定检查流程:先用万用表确认 VM 电压正确、逻辑电源正常、VREF 没有接反;再示波器看 STEP 波形的高电平幅度和脉冲宽度;接着确认 EN、DIR 的静态电平处于安全状态;最后确认电机相线没有短路到机壳。这些都过了,才敢让电机转。
第一次通电我建议在空载、低电流、低速下测试。电流先设到目标值的三分之一左右,比如打算跑 1.5A 就先设 0.5A。让电机低速正转反转各几十步,听声音是否均匀。如果电机动一下就不动,或者嗡嗡响但不转,大概率是相线接错、电流太小或者使能极性反了,按这个顺序去查。
4.2 电流与细分参数标定
电流标定我强烈建议用电流探头或者真有效值钳表去实测相电流,而不是只看 VREF 算出来的理论值。斩波电流是脉动的,普通万用表的直流档测得不准。把电流探头夹到电机任意一相线上,在电机静止保持状态下看平均电流,对照目标电流微调 VREF(如果用 DAC 就直接改软件值)。实测和理论差的往往不只是几个百分点,因为采样电阻精度、温度、电感都会影响最终电流。
细分档位的选择要结合机械需求。1/16 细分是我在工业项目里的首选:相对整步,它把振动和噪音压下去很多,定位分辨率也足够高,而扭矩损失还在可接受范围。更高细分比如 1/32 会更平滑,但微步的电流波形精度下降,有时反而引入新的低频振荡,机械刚性不足的场合尤其明显。选细分时还要注意一点:细分数越高,每个脉冲对应的角度越小,同样的机械速度下 STEP 频率就越高,MCU 和隔离器件都要跟得上。
4.3 加减速参数整定
加减速参数不能光靠算,还得靠现场试。我的流程是:固定电流和细分,空载下把目标速度逐步提高,直到电机丢步或者出现明显丢步声,记录这个临界速度,然后把实际最高运行速度定在它的 60% 到 70% 以下。加速度同理,先给一个保守值,比如 2000 到 5000 steps/s²,再逐步加大,直到出现失步或机体振荡,留出 30% 以上余量。
举个例子:电机是 200 步/转,1/16 细分就是 3200 步/转,配 5mm 螺距的丝杠,相当于每毫米 640 步。如果目标运行速度 50mm/s,折算就是 32kHz 步进频率。把最大速度设到临界速度的 70%,再选一个合适的加速度,用前文公式算一下加减速距离,运动规划基本就成型了。注意负载惯量和摩擦力会明显改变这些边界值,所以换负载后要重新整定,不能偷懒。
4.4 机器人/工业现场的其他落地细节
回零和限位是机器人轴必须处理的。我的做法是:用低速爬行方式靠近零点开关,触发后反方向退开一点,再用更低的“探测速度”第二次找零点,保证每次回零都从同一方向逼近,重复精度才稳定。限位开关接常闭触点,断线时按故障处理,避免“限位失效后轴继续往硬限位撞”的惨剧。
急停回路必须硬件化。软件急停只能作为第二道防线,真正安全的是安全继电器直接切断驱动使能和 VM 电源。恢复急停后,所有运动轴要重新回零,不能带着未知位置直接跑。
现场 EMI 问题也值得多说。电机线用双绞屏蔽线,屏蔽层单端接地,STEP 信号线尽量短。如果机柜里实在走不了短路径,就在靠近驱动端套磁环,绕两三圈,很多偶发丢步问题就是这么解决的。我在一个 AGV 项目里遇到过转向轴偶发反转,查了很久,最后是 STEP 信号线和电机线捆在一起,串扰进去的脉冲让驱动误读,分开线缆后彻底消失。
5. 常见问题与排查实录
5.1 症状、原因与排查顺序速查表
| 现象 | 常见原因 | 建议排查顺序 |
|---|---|---|
| 电机完全不动 | VM 缺失、使能极性反、STEP 无脉冲、隔离没上电 | 万用表量 VM 和逻辑电压 → 示波器看 STEP → 查 EN 电平 |
| 嗡嗡响但不转 | 电流太小、一相断线、细分档接错 | 先量 A/B 相电阻 → 加大电流实测 → 核对 MODE |
| 转过一段后丢步 | 加速度过大、母线电压跌落、电流温升下降 | 降加速度 → 查母线电容 → 实测相电流 |
| 芯片发烫严重 | 电流档过高、PowerPAD 没焊好、散热铜皮不足 | 量相电流确认设定 → 检查焊盘和过孔 → 降档位 |
| FAULT 常拉低 | 过流、过热、电机短路 | 断开电机量输出对地 → 看电流波形 → 查温度 |
| 高速失速无力 | 步进电机高频扭矩下降 | 提高 VM 电压 → 降细分 → 加 S 型曲线 |
| 偶发反向或误动 | 信号串扰、光耦速度不足 | 分线、加屏蔽、换高速光耦、源端串电阻 |
5.2 几个印象深刻的现场案例
第一个案例必须提:某条产线传送分拣机构,步进频率一超过 30kHz 就丢步,而且丢得很随机。排查到最后,发现控制板上的 STEP 光耦用的是 PC817。这个光耦在 30kHz 下上升沿和下降沿都严重展宽,脉冲宽度已经达不到驱动芯片的最小要求。换成 TLP2361 之后,问题一次解决,再也没有复发。所以控制信号用的光耦,传输速率指标绝对不能只看“能亮就行”。
第二个案例是驱动芯片频繁热保护。原理图、电流设置都没问题,芯片却跑到 80 多度就开始 OTS。最后用热像仪一看,PowerPAD 底下那片铜皮很小,也没有过孔阵列,热量全憋在封装里出不去。改版后把焊盘加大、打过孔、接地平面直接铺到芯片下方,同样电流下温度降了快 20 度。这让我养成了一个习惯:新板子回来先看 PowerPAD 的焊盘设计,不少“芯片质量差”的结论其实都是散热设计背锅。
第三个案例是多轴共母线导致邻轴丢步。一个轴加减速时,母线电压瞬间被拉低,隔壁轴跟着丢步。逐轴加上 100µF 电解电容加 1µF 陶瓷,电源采用星型汇接之后,丢步现象就消失了。这件事提醒我,多轴系统的电源设计必须把“轴间干扰”考虑进去,不能想当然认为“电源功率够就万事大吉”。
还有个机器人关节的案例也值得说。轴在接近停止位置时总有一个微振,凑近听还有高频噪音。一开始以为是机械间隙,后来把梯形曲线换成 S 型,微振就没了。轴向负载刚性不足的场合,加速度突变会激起机械谐振,这种情况靠电气曲线整形比改机械结构快得多。
5.3 测量与调试工具心得
调试步进系统,我最常用的工具是一台双通道示波器和一个电流探头。示波器看 STEP 波形要关注三点:高电平幅度、脉冲宽度、周期抖动。如果占空比不是 50%,多半是 ISR 里改 ARR 时没同步改 CCR1;如果周期有抖动,就要检查 ISR 里是不是做了耗时的事,比如 printf 或者 HAL_Delay。
电流探头看相电流波形是最直观的:斩波纹波频率是不是稳定、峰值是不是贴着设定值、有没有异常的尖峰,都一眼能看出来。如果没有电流探头,用真有效值万用表串进相线测平均电流也行,但要注意读数含义,斩波波形下平均值和有效值差不少。测母线电压纹波时,探头要用地线弹簧缩短接地回路,否则测出来全是探头自己感应到的噪声。
分享一个我坚持了多年的现场调试习惯:每次改动后,先在实验室用同一套固件和最小配置把关键波形抓一遍,确认无误再上设备。步进系统的问题,十有八九能提前从时序和电流波形上看出来,真等到了现场再查,时间和信任成本都太高了。最后再提一句,这套 DRV8818PWPR 加 STM32F439ZG 的方案,我目前还在用,后续还会往多轴总线控制、编码器闭环和更完整的故障诊断方向继续扩展。如果你正在做类似的东西,记住电流设定和加减速参数这两块最值得投入实测,数据手册给的是边界,现场给的是真相。