ARTICLE DETAIL

资讯详情

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

自建步进电机驱动:DRV8818功率级+MK20微控制器实现灵活相电流控制

自建步进电机驱动:DRV8818功率级+MK20微控制器实现灵活相电流控制 电机控制这块我在产线上摸爬滚打了好几年接触过不少步进方案。说实话很多工程师一提到步进电机第一反应就是“直接上集成驱动器”外接脉冲方向信号就行简单省事。但真到了工业机器人关节、自动化夹具这类场景需求往往没那么简单既要精准的相电流控制又要能方便地调制电流波形来降噪还希望驱动级能自己处理斩波和过流保护。这时候把“功率驱动”和“控制逻辑”分开设计就很有必要了。这篇文章要聊的就是用 TI 的 DRV8818PWPR 做功率级配合 NXP 的 MK20DX128VFM5 微控制器自建一套双极步进电机驱动方案覆盖选型理由、硬件设计、固件实现和调试经验适合正在做工业运动控制或机器人小关节驱动的朋友参考。先交代一下这套组合的定位DRV8818PWPR 是一颗内置双 H 桥、支持宽压输入的双极步进驱动芯片没有集成复杂的运动轨迹解释器它更像一个“功率放大 电流斩波”的执行层MK20DX128VFM5 则是飞思卡尔现 NXPKinetis 系列的 Cortex-M4 内核 MCU带 DSP 指令、12 位 ADC/DAC用来专门合成相电流波形、跑位置闭环和状态机。于是整个系统的分工就很清楚MCU 负责“想”怎么动DRV8818 负责“用力”驱动电机。这套架构最大的好处是全部电流波形塑形权都在你自己的固件里不被芯片内部的行波索引器锁死。1. 方案选型为什么绕开集成驱动偏要自己合成相电流1.1 DRV8818PWPR 的定位与优势先说说我为什么没有选择 DRV8825、TMC2209 这种自带 STEP/DIR 接口的现成驱动。那些芯片确实方便一个脉冲进去芯片内部自动处理微步进、衰减模式用户只需要关心频率和目标位置。但它们的“内部逻辑”是固定的微步进曲线、电流插值方式都是芯片出厂写死的。对于需要特殊电流曲线比如在某些共振点做谐波注入、或者把电流轮廓修成梯形来兼顾噪声与发热的场合这种黑盒方案就非常难受。DRV8818 则不同它接收的是 MCU 给出的 PWM/相位信号内部的固定关断时间斩波器负责把瞬时电流限制在目标值以内而“目标值每时每刻是多少”由 MCU 说了算。这句话翻译成白话就是电流轮廓是你在固件里逐点写出来的芯片不跟你抢控制权。另一个很实际的理由是电源适应性和封装。DRV8818PWPR 支持约 8.2V 到 45V 的电机电压输入对 24V 工业电源是完美匹配输出峰值电流达到 2.5A额定大概 1.75A 左右驱动 NEMA17、NEMA23 这类两相电机绰绰有余。HTSSOPPowerPAD封装带底部散热焊盘在自动化设备紧凑空间里用热焊盘铺铜散热实测比 QFN 封装的驱动芯片更好处理。它还有 SPI 接口可以从 MCU 侧实时调整电流等级和衰减模式。这一点在做大扭矩起停、低速平稳运动时特别重要我经常在运行时动态把电流等级从 50% 提到 100%再用衰减模式快速切换来压住电机啸叫这些都是集成方案很难干净做到的。1.2 MK20DX128VFM5 的选择逻辑MK20DX128VFM5 属于 Kinetis K20 系列这是 NXP 面向工业和医疗市场的主力 MCU。它有 128KB Flash、16KB SRAM主频 50MHzCortex-M4 带 DSP 指令。听起来主频不花哨但选它不是因为算力是因为外设组合恰好合适片上有 FTM 定时器模块可以产生多路高分辨率 PWM有 12 位 DAC能非常平滑地调制 VREF 电压有 12 位 ADC可以把电机电流或母线电压采样回来做闭环。QFN32 封装只有 5mm×5mm板子上几乎不占地方。在机器人小关节控制板里面我可以把它和 DRV8818、一片 CAN 收发器放在一块四层板上整板尺寸控制在 40mm×40mm 以内。Kinetis 还自带 I2C、SPI、UART 和 USB通常我还要挂编码器、霍尔传感器和上位机通信一个芯片全包了。这么说吧选 MCU 的核心逻辑不是“越贵越强越好”而是“外设能不能刚好覆盖这个应用的所有 IO 需求”。MK20DX128VFM5 的定时器 PWM 精度、DAC 精度和 ADC 采样率对步进电机 20kHz 量级的电流环来说属于“刚刚好还留了一点余量”。如果换一片纯低功耗 MCUDAC 采样率跟不上如果换一片高端 MPU成本又上去了且杀鸡用牛刀。1.3 为什么不直接用闭环步进伺服很多人会问现在闭环步进电机都烂大街了还自己折腾驱动我的看法是闭环步进的核心优势是“编码器补偿丢步”但它的电流环还是在驱动器内部闭环的用户依旧不能自由修改电流波形。而且带闭环步进电机的成本普遍是“开环驱动 普通电机”的 2 到 3 倍精度提升很多时候并不需要。我做的自动化气动夹具、小行程点胶机构的场景定位精度到 0.1mm 就够。这种场景用这套开源式方案成本低、可控性强出了问题还能自己分析波形不必依赖厂商黑盒。所以在选型层面我的结论是如果你要的是“稳定省心”用集成驱动如果你要的是“完全控制相电流、灵活裁剪运动轮廓”DRV8818 MCU 是性价比很高的路线。下面的硬件电路就是基于这个思想展开的。2. 系统设计与硬件接线把功率部分和逻辑部分都摆在明面上2.1 电源架构与主回路整个控制板我用的是 24V 供电经过一个自恢复保险丝和反接保护 MOSFET 后分成两路一路直接给 DRV8818 的 VM 供电另一路经过 DC-DC 降到 5V再经 LDO 降到 3.3V 给 MK20DX128VFM5 和外设供电。为什么不让 MCU 直接吃 24V显然不行但更重要的是逻辑地与功率地最终要在单点汇合避免大电流在地线上压出尖峰干扰 MCU。DRV8818 有两个关键的电源相关引脚必须处理好一个是 VCP这是电荷泵输出给内部高侧栅极驱动供电我习惯在外面接一个 0.1uF 陶瓷电容到 VM并且尽量靠近芯片另一个是 VREG它是内部稳压器输出需要接 2.2uF 以上的电容到 GND用于逻辑电路和电流侦测模块的参考电压稳定。这两颗电容的摆放位置比不少人想象中重要得多我曾经因为 VCP 电容离芯片太远导致高侧 MOS 栅极驱动不足电机一加负载就波形畸变、电流上不去。电流采样电阻放在 ISENSE 引脚和功率地之间负责把电机相电流转换成电压送给内部斩波比较器。绝大多数 TI 步进驱动芯片的电流采样电阻典型值在 0.1Ω 到 0.22Ω 之间。我在这套 24V、额定 1.5A 的电机上用了 0.22Ω 的 1% 精度贴片电阻额定功率 0.5W 以上。它需要开尔文连接采样电阻两端用细线直接引到芯片的 ISENSE 引脚和对应地引脚不要串联任何多余过孔。否则功率地回流会在采样线上产生偏移让斩波阈值发生漂移。这个细节我建议大家在第一次打板时就严格执行否则后期用示波器看 ISENSE 波形会怀疑人生。电机端 A/A-、B/B- 分别接到驱动芯片的四路输出。我一般会在四个输出脚到地各放一个 RC 吸收网络比如 10Ω 1nF用来抑制电机绕组电感续流产生的振铃。不要小看这几个小元件它们对降低示波器测到的电压尖峰、减少对外辐射干扰有立竿见影的效果。2.2 逻辑信号连接与隔离策略MCU 与 DRV8818 之间的逻辑连线包括PWM1/PWM2 两路 PWM 输入、PH1/PH2 两路方向相位信号、SPI 片选 SCS、时钟 SCK、数据输入 SDI、数据输出 SDO还有若干使能和复位信号。在纯实验室环境可以直接 3.3V 电平对接但在工业设备里电机线、开关电源、变频器都是强干扰源我建议在 PWM、PHASE 和 SPI 总线之间加一级数字隔离器比如 ISO7741隔离器两侧分别供电 3.3V 和 5V。隔离器之后接驱动芯片的逻辑侧这能在电机旋转时把共地噪声彻底斩断。隔离方案有一个实际悖论很多人担心隔离器会增加信号延迟。数字隔离器的传输延迟通常在 10ns 到 100ns 量级对于 20kHz 的 PWM 来说一个周期是 50us几十纳秒的延迟完全可忽略。只有在非常高速的 SPI 写操作比如 10MHz 时钟才需要关注我通常把 SPI 时钟设在 1MHz 左右基本无风险。MK20 侧我习惯把所有有关电机的 IO 集中在一个 GPIOB 端口组上这样在发生 PWM 故障或电机过流时可以一条指令并行地把所有驱动信号拉低快速切断功率输出。这个设计在紧急停机逻辑里非常有用比逐个改引脚状态快得多也更不容易遗漏。2.3 PCB 布局的关键约束这类功率驱动板我最头疼的就是布局不好导致反复改版。经验总结下来有三条硬规矩功率回路面积最小化VM 经过驱动芯片内部 H 桥到电机绕组再到 ISENSE 电阻回到地这条回路上的高 dv/dt 节点尤其是 PHASE 切换的两个桥臂中点必须用尽量短的铜皮连接。理想状态是芯片正下方就是功率地铺铜和采样电阻不要拉出长线。逻辑信号不要穿过功率区下方PWM/SPI 走线一旦在功率地铺铜上方长距离平行地平面上的高频噪声会耦合进信号导致驱动误触发。我一般把信号布局在板子一侧功率器件布局在另一侧中间由地平面隔开。热焊盘大面积过孔HTSSOP 底部的 PowerPAD 一定要打多个过孔连接到背面散热铜皮数量不少于 6 个孔径 0.3mm 左右。否则极限电流下芯片表面温度能到 100 度以上虽然芯片本身耐高温但会缩短电解电容寿命。有了这些硬件基础接下来是固件层面真正开始“玩出花”的地方合成相电流和跑运动状态机。3. 控制策略与固件实现自己写微步进才叫真正掌控电机3.1 双极步进电机的相电流模型双极步进电机四线制的物理本质是两相绕组 A 和 B两相电流存在 90° 电角度相位差。当需要电机转子精确停在某个细分位置时理想做法是把 A、B 两相电流的正弦包络给出来Ia(t) Ipeak × sin(θ)Ib(t) Ipeak × cos(θ)θ 就是当前微步进电角度。θ 连续变化时合成磁场矢量在空间中旋转转子就跟着平滑运动。16 细分意味着把一个整步再切成 16 小步每个小步之间的电角度步距是 360°/(整步数×16)。对 1.8° 步距角的电机一个整步是 1.8° 机械角度对应 90° 电角度16 细分后每一步机械运动 0.1125°。这个细分能力对低速平稳运行极为关键直接决定了设备在低速进给时的振动水平。DRV8818 内部有固定关断时间 PWM 电流斩波器它会把相电流“钉”在设定值附近。所以在我的方案里MCU 做的不是直接控制 MOS 开关而是不断告诉驱动芯片“当前目标电流是 x 安培”再由驱动芯片内部环路去执行。具体到实现上我用两路通道一路是 DAC 输出给芯片的 VREF 引脚改变满量程参考电流一路是 PWM 占空比来给驱动芯片提供斩波包络。两者在片内叠加最终形成正弦电流包络。其实 VREF 调制是更干净的做法因为 DAC 输出的是真正模拟电压波形连续性更好PWM 加 RC 滤波也可以但波形的相位延迟稍微大一点。3.2 正弦表与 DAC 更新策略MK20DX128VFM5 内部有一个 12 位 DAC输出范围 0 到 3.3V完全够用。我把一个完整的 360° 电角度正弦周期离散成 256 个点预计算成 12 位整数表放在 Flash 里避免实时调用三角函数。256 个采样点听起来不多但对 16 微步来说每个微步之间跨越约 11.25° 电角度落在 256 点表上差不多是 8 个索引点已经足够平滑。如果做 1/32、1/64 细分可以把这个表做成 512 点甚至 1024 点Flash 完全撑得住。控制循环我用了一个定时器中断频率设为 20kHz。每次中断读取当前位置、根据当前速度计算出新的电角度 θ、查表得到这个角度对应的 A、B 相目标电流电压值、把值写入 DAC 数据寄存器然后根据编码器反馈更新位置环。20kHz 的更新率对听觉也有好处正好在可听范围的上边缘附近配合正确的衰减模式电机基本不会发出让人烦躁的 10kHz 以下啸叫。伪代码大致长这样// 20kHz 定时器中断服务函数示例 void FTM0_ISR(void) { float theta position_to_electrical_angle(current_pos); uint16_t sin_val sine_table256[(uint16_t)theta 0xFF]; uint16_t cos_val sine_table256[((uint16_t)theta 64) 0xFF]; // 根据当前电流等级比如满幅的 80%缩放 DAC 值 dac_write_A( (uint16_t)(sin_val * current_scale) ); dac_write_B( (uint16_t)(cos_val * current_scale) ); // 可选从 ADC 读取 ISENSE 作电流前馈或故障检测 adc_trigger_conversion(); }这个循环看起来简单真正的功夫在“怎么根据速度曲线推算 theta”上。电机运动不是匀速的必须带加减速曲线否则会失步。我把位置环周期设定在 1kHz在这个慢循环里更新目标位置、计算梯形加减速或者 S 型加减速的速度曲线然后把目标速度换算成“每个 20kHz 中断里需要步进的电角度增量”放进一个累加器里。这样位置环慢、电流环快的分层结构既能保证运动规划平滑又不会让高频中断里面做太多浮点计算。3.3 SPI 寄存器配置与动态调整DRV8818 的 SPI 接口给了我们几个可调的旋钮电流百分位、衰减模式Decay Mode、斩波关断时间TOFF和过流阈值等。初始化时我会写一次配置寄存器把衰减模式设置为混合衰减Mixed Decay这也是 TI 推荐在步进应用中使用的默认模式。混合衰减的含义是在一个斩波周期内先快衰减再慢衰减让电流下降曲线既不会太陡产生噪声也不会太慢导致电流不受控。很多工程对衰减模式不重视这是一个大坑。如果你在低速大扭矩时听到尖锐的“吱吱”声或者电流波形毛刺很多第一反应就应该是衰减模式配错了。我在这个项目里试过在运行中动态切衰减低速时候用混合衰减中高速切快衰减效果非常明显电机发热和噪音分布都会变化。这个动态切换就是通过 SPI 写一个寄存器指令完成的MK20 的 SPI 主模式完全跟得上。SPI 写寄存器时序不复杂DRV8818 的帧格式我记得是高位先出具体字段定义需要按手册查表。这里我只放一个通用 C 示例实际字段偏移各位移植时对着手册确认// 向 DRV8818 写一条配置data 是 8 位配置值 void drv8818_write(uint8_t data) { // 片选拉低 GPIO_WriteBit(CS_PORT, CS_PIN, 0); // 发送 16 位帧一般是命令/地址位 数据位顺序见手册 uint16_t frame (uint8_t)(opcode) | ((uint16_t)data 8); SPI_Write16(frame); // 片选拉高等待 tSCS 时间 GPIO_WriteBit(CS_PORT, CS_PIN, 1); delay_us(2); }这里我特别强调一个问题SPI 操作的数据位置千万不能想当然。我在第一次做驱动板时把数据位方向搞反导致配置寄存器写入的值全被移位电机一启动就过流报警。后来我养成习惯任何 SPI 写操作写完以后都回读一遍寄存器内容做校验生产代码里也会保留这个自检步骤。3.4 运动状态机与急停协同机器人应用里除了电流波形还要有一套可靠的运动状态机。我用最简单的五态模型IDLE待机、ACCEL加速、CRUISE匀速、DECEL减速、SETTLE到位稳定。每个状态维持时间由速度规划表决定。MK20 的定时器资源很多我专门开一个 1kHz 的慢速定时器来执行状态切换同时监控外部使能信号和驱动器故障信号。实战经验做自动化设备调试的时候最怕的不是丢步而是“丢步了你自己不知道”。所以我的状态机里加了一个故障联动机制每个 20kHz 中断都会读一次 DRV8818 的 SDO 寄存器只要过流、过温、欠压任何一个标志位置位立刻在下一个 PWM 周期里把所有输出拉低同时把状态机强制拉回 IDLE通过 UART 上报故障码。这套反应速度比靠主循环轮询快得多也不容易被其他任务卡顿影响。4. 调试经验与常见问题排查波形、噪声、失步逐个击破4.1 用示波器看 ISENSE 波形比任何调试工具都直观我调试这套驱动时示波器探头永远夹在 ISENSE 采样电阻两端观察斩波电流波形。正常的正弦电流包络是“中间宽两头窄”的调制波形里面充满锯齿状的斩波纹波。如果看到包络慢慢变平或者出现削顶就是电流等级不够或者 DAC 电压被拉低了如果纹波频率忽高忽低且不稳定大概率是采样电阻接触不良或地线有问题。很多工程师不舍得在 ISENSE 上直接测担心探头影响。但实际用 1:1 无源探头配合好的接地弹簧效果很好。关键是探头地线要短不要用鳄鱼夹接地长线否则 1MHz 以上的斩波噪声会把波形搞得面目全非。在下图视角里真实示波器上能看到的变化非常直观我这篇文章不放图只总结规律低速时波纹密度低、包络明显高速时波纹密度高、包络有点糊但只要包络没有明显周期性凹陷电机就没有失步。4.2 低速堵转或抖动先排查电流和衰减模式现象电机在 5RPM 以下低速运行时一卡一卡甚至能听到“哒哒哒”的换向声像在挣扎。排查步骤我一般如下先看 VREF/DAC 电压是否稳定很多 DAC 在负载过重时输出跌落导致低速电流不足。再看 ISENSE 波形如果包络在电流过零点附近有明显毛刺说明衰减模式引起的电流换向不够平滑修改 SPI 寄存器把衰减模式改成慢衰减混合比例更大。如果电机发热明显说明电流持续过大适当降低电流等级。尤其注意低速抖动和“准停不稳”是两回事。前者是电流包络畸变后者是细分分辨率不够或机械回差不要混在一起改参数否则越调越乱。4.3 高速丢步与过流报警高速上千 RPM时最容易出现“过流”问题和丢步问题同时爆发的现象。原因是电感反电动势在高转速下变大DRV8818 在限制电流时会拼命斩波如果母线电压再有点跌落斩波器会持续拉最长占空比最终导致芯片过流保护。我在这个项目里把高速段电流做了“弱磁式”的衰减超过某个电转速后目标电流从 100% 降到 85% 左右因为高速时反电动势增大需要的电流实际上比低速小。这个操作可以通过 SPI 寄存器里的电流百分位字段直接在运行中更改实测高速稳定性和发热表现都有显著改善。还有一个常见抗噪技巧给 MK20 的 DAC 输出端加一个 1nF 到 10nF 的小电容做低通滤波。DAC 每次更新时会产生一个小的阶梯阶跃如果直接接到 DRV8818 的 VREF尖峰有可能被内部比较器捕捉到导致额外的开关噪声。加了小电容以后波形平滑很多几乎没有相位延迟影响。4.4 常见问题速查表我把调试中遇到最频繁的问题整理成一张表后面我自己做新方案时也照这个查现象可能的根因处理方式电机完全不转也无电流声使能引脚没拉低或者 VM 电压缺失检查 MCU GPIO 配置测 VCP/VREG 电压电机发热严重且噪音大电流等级过高或衰减模式用错降低 DAC 缩放系数切换衰减模式低速一卡一卡电流包络畸变或细分角度表太粗检查采样电阻开尔文连接增大正弦表点数高速丢步加速度过大或高速电流过高用梯形加减速高速段自动降电流等级过流报警随即停机电机绕组短路或采样电阻偏移用示波器测 ISENSE复测采样电阻阻值SPI 配置写完没生效数据位顺序或帧格式不对写后回读校验对照手册逐位确认每一组问题我都自己踩过一遍尤其是采样电阻开尔文连接那一次让我把数据手册里的“layout recommendation”当回事了。很多时候问题不在芯片不在固件就在那一厘米的走线布局上。5. 还可以怎么扩展闭环、多轴、上位机联动这套基于 MK20DX128VFM5 的方案后续扩展空间比我一开始预想的大。DRV8818 的 SPI 电流调整接口可以联动编码器反馈升级成简易“闭环步进”MK20 的 USB 接口也能直接模拟串口让上位机通过简单协议修改速度、加减速曲线和细分。我在后来的项目里就是在同一块板子上挂了 TLV320 编码器电机的反电动势采样用 MK20 的 ADC 采样绕组反电动势来做无传感器堵转检测省了一个增量编码器。另外多轴扩展也方便。DRV8818 是独立芯片多个驱动之间不需要任何同步信号只要每片驱动各用一组 MCU 的 PWM 和 SPI 片选就行。MK20DX128VFM5 的引脚虽然不多但做四轴小车、三轴桌面型机械臂、两轴点胶平台绰绰有余。我现在手头这套板子就是两轴版本每轴一片 DRV8818共用一片 MK20固件里用两个独立的 DAC 通道和两套 20kHz 定时器中断做双轴联动插补也没有压力。最后再分享一个个人习惯任何电机控制板的固件发布前都要先做一次“长时间老化跑批”让电机在最高速度和最恶劣负载之间往复运动一整天同时记录温度、故障标志和丢步次数。只有扛得住跑批这个板子才敢上产线。做工业应用数据比自信更可靠。
返回列表