ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

基于MK20DX128与DRV8818的工业步进电机驱动板设计与实现

基于MK20DX128与DRV8818的工业步进电机驱动板设计与实现 前阵子给一个机器人底盘项目做驱动板要同时控制三台双极步进电机主控和驱动器型号我纠结了很久最后定了 NXP 的 MK20DX128VFM5 加上 TI 的 DRV8818PWPR。这套组合在工业和机器人控制里算是一对很务实的搭配一颗 32 位 Cortex-M4 负责运动规划、通信和状态管理一颗集成双全桥的步进电机驱动芯片负责功率变换CPU 这边只需要给 STEP/DIR 脉冲电流斩波和微步进译码全部由 DRV8818 自己搞定。这篇文章把我从选型、硬件、固件到现场调试的完整过程整理出来给正在做运动控制板、CNC 改装配或者机器人控制器的人一个参考尤其是那些准备自己画板子、不想用现成模块的朋友。1. 项目整体设计与选型思路1.1 需求拆解工业应用到底要什么工业设备和机器人上的步进电机控制和桌面级 3D 打印机的需求差得挺远。我的项目预设条件是供电电压 24V电机绕组额定电流大概 1.5A 到 2A需要支持微步进来降低振动控制接口希望是标准的 STEP/DIR这样后续换不同驱动芯片固件不用大改。另外因为整机要做 EMC 认证板上不能堆太多飞线模块最好是集成化的驱动方案。还有一个容易被忽略的点机器人在运行时主控要同时处理编码器反馈、限位开关、CAN 或者 RS485 通信、以及多轴的联动插补所以驱动不能一直占着 CPU 去死等。换句话说电机控制部分必须有硬件定时器做脉冲生成主 CPU 只在加减速节点上干预一下。这也是最后选 MK20DX128VFM5 的核心原因之一。1.2 为什么选 DRV8818PWPR而不是 A4988 模块很多入门项目喜欢直接用 A4988 或 DRV8825 的成品小板成本低、接线简单。但工业项目里我基本不用那种小板原因有三个第一小板散热差电流稍微拉高就热保护第二接线端子可靠性一般振动环境下容易接触不良第三维修替换的一致性不好同一型号不同批次之间,参数漂移明显。DRV8818PWPR 属于 TI 的集成双 H 桥步进驱动系列工作电压范围宽典型支持 8.2V 到 45V 的电机电源电压输出峰值电流在 2A 以上足够覆盖中小型 NEMA17、NEMA23 步进电机。芯片内部集成了翻译逻辑和 PWM 电流斩波电路外部只需要一个采样电阻来设置电流MCU 端不需要复杂的模拟控制。PWPR 后缀是带热增强焊盘的 TSSOP 封装焊接时把底部焊盘大面积铺铜接地散热比普通 SOIC 封装好很多。我当时也考虑过用单独的 MOSFET 搭 H 桥但那样至少要多十来个分立器件占面积不说死区控制、电流采样、过流保护全都要自己设计开发周期至少多两周。DRV8818 把 H 桥、续流二极管、固定关断时间 PWM、过流保护、热关断都集成进去了对我来说更像是“功率外设”而不是“功率电路”。1.3 为什么选 MK20DX128VFM5而不是 Arduino 或者 STM32MK20DX128VFM5 是 NXP Kinetis K20 家族里很小的一颗料32 脚 QFN 封装只有 5mm x 5mmCortex-M4 内核最高 72MHz内置 128KB Flash 和 32KB SRAM。这个芯片带 USB FS 控制器这在调试和上位机通信时很舒服不需要外接转串口芯片就能拉一根 USB 线到 PC。另外它有好几路 FTM 定时器、PIT 定时器和 12 位 ADC对于运动控制板来说资源刚好够用。选它而不是 STM32F103一方面是因为当时这颗料供货和价格都稳定另一方面是因为它的引脚在 QFN32 封装下已经足够紧凑适合做成巴掌大的多轴驱动板。Arduino 板卡当然也能跑但你要做多轴联动、实时响应、低功耗、宽温板级方案还是要选真正的 MCU。还有一点Kinetis 的时钟系统虽然配置起来比想象中复杂但一旦跑顺了定时器、ADC、DMA 的配合比普通 8 位机强太多。2. 双极步进电机驱动原理与硬件设计要点2.1 双极步进电机的绕组和换相逻辑双极步进电机最常见的是四线制内部两相绕组分别是 A 相和 B 相。每一相通电方向决定转子停留位置所以控制本质就是控制两组线圈中的电流方向和大小。全步模式下通电顺序为“A 正向 - B 正向 - A 反向 - B 反向”转子每一步转过一个基本步距角常见的是 1.8 度。半步和微步进则是对电流波形做插值。微步进听起来很玄其实原理很简单不是让电流一下子从 0 切换到最大而是让两个绕组中的电流按正弦和余弦的阶梯状比例变化让定子磁场连续转动而不是跳跃。DRV8818 内部集成了解码器用户不需要自己在 MCU 里做正弦表只要给 STEP 脉冲芯片会按照 MODE 引脚设定的细分数去控制 H 桥的斩波占空比。我调试时习惯先用全步模式确认电机和绕组接线正确再用微步进跑实际运动这样可以避免接线错误被细分逻辑掩盖掉。2.2 DRV8818 的关键引脚和外围电路拿到 DRV8818 先看数据手册引脚定义重点不是看清楚每一个引脚而是理解几个关键节点。电机电源 VM 和逻辑电源 VDD 要分开滤波AOUT1/AOUT2、BOUT1/BOUT2 分别接电机的两个绕组STEP 和 DIR 是 MCU 侧的控制输入ENBL 是输出使能nFAULT 是故障输出VREF 和 SENSE 引脚用于设置电流CP1、CP2 之间要接电荷泵电容。电荷泵电容的位置很讲究它产生内部栅极驱动电压如果放得离芯片太远或者电容量不对高电压下芯片可能无法正常工作。我习惯在 CP1、CP2 引脚旁边直接放一个 0.1uF 到 1uF 的 X7R 电容走线尽量短。VM 和 VDD 引脚旁边要有 0.1uF 高频去耦电容同时 VM 端还要再放一个 10uF 到 47uF 的电解电容来吸收电机回灌的动能。nFAULT 引脚一般建议接一个 10k 欧姆上拉到逻辑电源因为它是开漏输出MCU 侧用 GPIO 读取。故障触发后固件要能立刻停止发送 STEP 脉冲并关断使能否则芯片处于异常状态下反复尝试启动很容易越搞越热。2.3 电流限制计算公式和 VREF 设置步进电机的相电流不是越大越好设置过高会导致电机严重发热、失步设置过低会导致力矩不够。DRV8818 通过外部采样电阻上的电压和 VREF 电压做比较实现固定关断时间的 PWM 电流调节。常见的关系式大致是I_peak VREF / (Gain * R_SENSE)其中 Gain 是芯片内部电流放大倍数R_SENSE 是外部采样电阻阻值。不同版本的数据手册也许在写法上有差异所以我的建议是每次拿到芯片后先翻最新手册确认增益值不要直接照搬网上的板子参数。举个例子电机额定电流 1.5A我取峰值电流 2A采样电阻用 0.1Ω。如果手册给出的内部增益是 8那么 VREF 大约要设置到 1.6V。实际装机时我还会用电流钳同时测一相绕组的波形确认峰值电流没有超出预期。VREF 电压可以用 MCU 的 DAC 或者 PWM 滤波来动态调节也可以用精密电阻分压固定。固定分压最省事但动态调节会让你在调试加减速时更方便。2.4 微步进和衰减模式怎么选DRV8818 有专门的 MODE 引脚组来设置微步进细分数有低速下要平滑、高速下要力矩的场合我会选择混合衰减模式。简单来说慢衰减模式下电流下降慢、续流时间长适合低速低振动混合衰减则是让电流在开始阶段快速衰减快到目标值时切回慢衰减兼顾了高速性能和噪声。我实际使用中步进电机在极低速时很容易出现周期性的“咔咔”声和振动这通常是电机和负载的固有共振频率被激发。把细分数提高以后共振频率会往更高的速度区移动但不会消失所以光靠细分并不能彻底解决。后面调试部分我再说怎么配合软件处理。3. MK20DX128VFM5 固件实现从 GPIO 到加减速3.1 引脚分配和底层初始化MK20DX128VFM5 有足够的 GPIO 来管理 DRV8818。我这边分配比较简单STEP 用在中断里翻转所以先当普通 GPIO 用DIR 和 ENBL 也先用 GPIOENBL 默认拉低让芯片使能MODE 引脚用 GPIO 输出固定电平上电初始化时就选好细分数。如果有多个轴最好给每个轴准备一组独立引脚。初始化时记得先使能 PORT 模块时钟再配置引脚的 MUX 选择为 GPIO 模式。很多人用惯了 Arduino 的 pinMode第一次上手 Kinetis 会觉得寄存器多但只要理清楚“时钟 - 引脚功能 - 数据方向”这个顺序就不难。调试时最好在板上留几个测试点直接用示波器看 STEP 引脚有没有脉冲挺重要。3.2 用 PIT 定时器产生可变频率脉冲产生 STEP 脉冲最笨的办法是延时翻转 GPIO但机器人运动控制里主控还要干别的事延时会让整个程序卡死。MK20DX128VFM5 自带的 PIT 定时器非常适合做这件事它就是一个周期中断定时器不占用 FTM 资源。我定义一个中断处理函数每次 PIT 中断到来就翻转 STEP 引脚同时维护一个步数计数器。有人会问为什么不用 FTM 硬件 PWM 直接输出脉冲因为梯形加减速过程中频率要实时变化FTM 的 MOD 寄存器更新时机没处理好可能产生一个异常长的脉宽反而让电机顿一下。PIT 的优势是频率修改特别直接只要更新 LDVAL 寄存器下一个周期就生效非常适合做动态变速。下面是简化版初始化代码void pit_init(uint32_t period_ticks) { SIM-SCGC6 | SIM_SCGC6_PIT_MASK; PIT-MCR ~PIT_MCR_MDIS_MASK; PIT-CHANNEL[0].LDVAL period_ticks - 1; PIT-CHANNEL[0].TCTRL PIT_TCTRL_TIE_MASK | PIT_TCTRL_TEN_MASK; NVIC_EnableIRQ(PIT0_IRQn); } void PIT0_IRQHandler(void) { PIT-CHANNEL[0].TFLG PIT_TFLG_TIF_MASK; GPIOB-PTOD (1u 2); // 翻转 STEP 引脚 running_steps; }这里 period_ticks 是两次中断之间的计数周期STEP 引脚每中断一次翻转一次所以输出脉冲频率是计数频率的一半。比如定时器时钟 24MHz想要每秒 1000 个脉冲那 period_ticks 就是 24000000 / 1000 / 2 12000。方向通过 DIR 引脚单独控制STEP 脉冲只是步进命令。3.3 梯形加减速的关键实现步进电机响应脉冲的能力有限频率突升会直接丢步。我一般把整个运动过程拆成加速段、匀速段、减速段。加速段里频率按一定的步幅增加每一步的脉冲间隔逐渐缩短减速段反过来。最容易让电机跑飞的是“最后一步刹不住”所以减速点必须提前算好。我的做法是维护一个运动结构体里面记录目标步数、当前所处阶段、当前频率、加速步数阈值等。PIT 中断里只负责机械地翻转 STEP 和累加计数主循环或者另一个低速调度里根据步数计数器调整频率。简单示意如下void motion_update_step(void) { if (motion.phase ACCEL) { if (motion.steps_done motion.accel_switch) { motion.speed_hz motion.speed_inc; if (motion.speed_hz motion.max_speed_hz) { motion.speed_hz motion.max_speed_hz; motion.phase CRUISE; } uint32_t ticks mck_clock / (motion.speed_hz * 2); PIT-CHANNEL[0].LDVAL ticks - 1; motion.accel_switch motion.accel_step_span; } } if (motion.phase DECEL motion.steps_remaining motion.decel_step_span) { if (motion.speed_hz motion.min_speed_hz) { motion.speed_hz - motion.speed_dec; uint32_t ticks mck_clock / (motion.speed_hz * 2); PIT-CHANNEL[0].LDVAL ticks - 1; } } }这个代码是简化版真实项目里要对边界条件做更多保护比如中途遇到限位开关要立即减速停车不能再继续按原计划走。机器人应用里回零和限位逻辑一定要放在比运动更新更高的优先级上。3.4 方向控制、微步进模式和故障反馈DIR 引脚的电平决定电机正反转。我建议把所有轴的方向信号集中在一个字节里管理这样多轴插补时改方向只做一次端口写操作。DRV8818 的 MODE 引脚组合要在上电初始化时配好运动过程如果需要临时切换细分数最好先停稳再切换因为芯片内部译码器在切换瞬间可能会重新复位输出状态高速运转时切换容易产生一个意外步进。故障处理方面nFAULT 连接到 MCU 的 GPIO 中断引脚下降沿触发。每次检查到故障先停止发脉冲、撤掉使能然后读驱动芯片状态和板上指示灯再决定是重启还是完全停机。这里有个很关键的细节nFAULT 触发后不一定代表芯片损坏过流、欠压、过热都会拉低这个信号。如果只是简单记录一次故障就继续跑设备可能在很恶劣的工况下反复重启对机械结构非常不友好。4. 工业与机器人场景实战调优、问题排查与避坑4.1 电流设置与发热平衡步进电机驱动器最常见的调试错误就是把 VREF 调得特别高觉得电流大力矩就一定大。实际上一旦电流超过电机额定值多出来的部分主要变成热量力矩提升非常有限还会让电机外壳烫得不能摸。我一般是先按电机铭牌额定电流的 80% 设置峰值电流然后带着实际负载跑加减速看是否在需要高力矩的位置丢步有丢步再逐步调高。DRV8818 的散热也要注意输入电压高、电流大时驱动芯片自身功耗可能到一两瓦。PCB 上芯片底部焊盘必须可靠焊接到大面积覆铜区最好在覆铜上打一些过孔到背面散热层。之前遇到过一块板子一直热保护拆开检查才发现底部焊盘根本没焊上等于全靠引脚散热那肯定扛不住。4.2 噪声、共振和振动抑制步进电机在中低速时容易发生共振典型表现是整个机架轰轰响电机轴有明显周期性抖动。提高细分数和调整速度都有用但治标不治本。我做了三件事一是把加速区拉长让电机快速越过共振区间二是选用低阻尼的弹性联轴器把电机和丝杠之间的刚性连接断开一部分三是调整衰减模式把慢衰减改成混合衰减后噪声频谱会有明显变化。如果你在调试时发现特定速度点噪声特别大可以试着用微调速度的方法找共振点。比如目标速度是 120mm/s你可以先设成 115、125、130 跑一遍看哪个速度点最响然后把运动速度略微避开那个区间。这种方法在演示设备上非常实用也是最容易被忽视的“软件机械调校”。4.3 多轴联动中的丢步与位置追踪机器人项目里经常需要两三个电机同步运动我的做法是给每个轴独立分配一组 PIT 或使用同一个时基下不同的步数计数器。每一拍更新时根据运动命令计算本轴该走过的步数然后对比实际步数偏差过大就报错停机。这个闭环不是电机电流闭环而是位置误差监控对于开环步进系统已经能提前发现大部分故障。如果应用负载变化较大我还是建议在电机后端加编码器和磁环让 MCU 实时读取实际位置。开环步进在高速超载时丢步你原以为已经走到位了其实机械位置差一大截。有了编码器反馈控制器在加减速结束后核对位置误差及时纠偏。DRV8818 本身不带编码器接口但 MK20DX128VFM5 的定时器输入捕获正好可以做正交解码两边搭配起来很自然。4.4 常见问题速查表故障现象可能原因排查方向电机完全不动芯片温热ENBL 没拉低VREF 过低STEP 无脉冲示波器测 STEP、DIR量 ENBL 电平检查 VREF 电压电机嗡嗡响但不转同一相绕组接反或电流太小交换 AOUT1/AOUT2 试验调高 VREF核对步进顺序高速运行时丢步加速太急、电源电压不足、电流不够拉长加速段提高 VM 电压用电流钳测相电流芯片很快进入热保护散热焊盘虚焊、电流设置过高检查 PCB 焊盘调低 VREF加大散热铜皮上电后 MCU 复位电机电源冲击干扰逻辑电源VM 端加大电解电容逻辑电源和功率电源分路偶尔出现位置偏移机械间隙、负载突变、限位开关抖动加编码器闭环设置软限位检查联轴器紧固排查时我建议按“先功率后控制”的顺序来先确认 VM 电压正常、DRV8818 输出电流能力足够再查 STEP/DIR 时序。很多时候不是芯片坏了而是 VREF 被旋钮误调低或者采样电阻虚焊。4.5 一点实战心得这套方案做下来最大的体会是“分工明确”比“单一芯片能干”更重要。MK20DX128VFM5 只做自己擅长的事跑协议、跑算法、发脉冲DRV8818 也只做自己擅长的事换流、斩波、保护。两者之间只隔三根信号线调试时逻辑非常清楚。最后分享一个小技巧第一次画板子时建议在 DRV8818 的 VM、VDD、VREF 和 nFAULT 上预留测试点尺寸不用大能怼上示波器探头就行。我后来排查问题有一半时间花在拿万用表戳引脚上有测试点之后效率明显高很多。步进电机驱动这行硬件设计和固件调试从来不是两条平行线一个合理的测试点布局往往能救回一个下午的调试时间。
返回列表