首页 / 资讯中心 / 文章详情

基于DRV8818与PIC24F的步进电机控制系统设计与实现

基于DRV8818与PIC24F的步进电机控制系统设计与实现 ★ FEATURED ARTICLE
干了十几年嵌入式绕过不少弯路之后我得先说句实话步进电机控制这事儿看起来是“给脉冲就转”真正做进工业现场和机器人系统里难点全在电流调节、加减速规划、电源抗干扰和热设计上。最近我在给协作机器人的外部轴做了一套辅助旋转台控制核心方案是 DRV8818PWPR 步进驱动器和 PIC24FJ256GB210 微控制器驱动一台额定 1.8A 的双极步进电机。整套系统从搭电路、写固件到排查干扰我前前后后折腾了好几轮今天把能直接复用的设计思路和踩坑记录完整写出来。这套链路并不复杂PIC24F 负责接收上位机/机器人控制器的运动指令解算成方向和步进脉冲DRV8818 内部集成的双 H 桥把脉冲转成线圈电流的换相电机的角度和转速就由脉冲数和频率精确决定。DRV8818 支持最高 1/8 微步、峰值电流 2.5A电源范围 8.2V 到 45V配合 PowerPAD 封装做好散热非常适合 24V 工业供电场景。PIC24FJ256GB210 则有 16 位内核、256KB Flash、丰富的外设映射拿来当运动控制主控完全能打。下面我把方案选型、硬件参数、固件实现、调试经验四块内容完整展开。不管你是自己画板子、调试步进驱动器固件还是正准备给机器人的附加轴选控制方案这篇都能给你省不少时间。1. 整体方案与选型逻辑1.1 这个项目到底要解决什么问题实际场景是这样的机器人本体旁边需要加一段外部直线轴或旋转台用于扩展工作站的工作范围。这类外部轴不追求伺服级别的高动态响应但对定位的重复性、低速平稳性、成本有硬要求。步进电机开环控制天然适合这种负载扭矩足够、结构简单、脉冲位置关系明确只要不丢步定位就可靠。我这次的项目需求并不复杂但必须严谨24V 直流供电电机额定电流 1.8A要求支持 1/8 微步进通过串口接收基于增量脉冲数的方式下发运动指令。驱动器要具备过流、过温保护电机低速运行时不能有明显共振噪声。还有一点很关键必须留出硬件和固件扩展接口因为后续可能要接绝对编码器做闭环校准也可能会作为主机器人控制柜的一个外部轴。这个需求下我最终放弃现成模块方案选择用分立芯片自己画板。不是现成模块不好而是工业机器人现场对可靠性要求高散热、接线端子、抗干扰、长线传输、防护等级都要可控。自研方案虽然要多花些设计时间但后期维护和现场适配的主动权完全在自己手里。1.2 为什么是 DRV8818PWPR 和 PIC24FJ256GB210先说驱动器。DRV8818PWPR 是 TI 的一款双通道全桥步进驱动芯片PWPR 后缀代表 HTSSOP-28 PowerPAD 封装焊盘在芯片底部焊接和散热都比普通 SOIC 强不少。它吸引我的点有几个一是内置双 H 桥外部基本不需要额外的灌流驱动电路抗振铃和续流处理都集成好了二是 PWM 电流斩波调节通过采样电阻就能设定峰值电流免去复杂的线性限流电路三是微步进、衰减配置简单用几个引脚就能切换四是逻辑输入兼容 3.3V和现代 MCU 直接对接。相比用分立 MOSFET 搭 H 桥DRV8818 省掉了驱动死区管理、短路保护、衰减续流这些烧脑环节研发周期直接缩短一半。PIC24FJ256GB210 的选择则更多从系统层面考虑。它有 256KB 程序存储器和较宽的外设引脚映射可以把 STEP、DIR、使能信号分配到任意数字引脚布线灵活。它的中断控制器支持多级优先级很利于我把“步进脉冲生成”做成最高优先级把通信和命令解析放低一级。这个芯片还自带 USB以后调试时可以直接虚拟串口在实验室连上位机看运动曲线非常方便。还有一个现实原因现场已有的几个控制系统里用了 Microchip 方案固件复用、烧录工具、产线工艺都成熟选同一个家族的芯片后期维护压力小。工业项目里这种隐性成本往往比性能和价格更关键。1.3 系统架构从上位机指令到电机旋转整个控制的信号流可以分成六层上位机/机器人控制器通过 UART 发送运动命令例如目标步数、运行速度、方向、加速时间。PIC24F 的串口中断收到命令后先做校验和解析写入运动控制队列。运动控制模块根据当前速度和目标速度实时计算梯形加减速曲线决定下一个 STEP 脉冲的时间周期。定时器中断按计算出来的周期翻转 GPIO 引脚产生 STEP 脉冲DIR 引脚在运动开始前设置到位。DRV8818 接收 STEP、DIR、MODE、ENBL 等信号通过内部译码和微步状态机控制两个 H 桥输出电流流经电机线圈。电机根据电压换相转动位置取决于累计的 STEP 数配合原点开关和限位开关MCU 就能确认绝对位置。这个架构的关键点在于把“实时性要求高”的部分和“非实时性要求高”的部分分开。脉冲翻转必须在微秒级精确而命令解析、状态上报毫秒级就够了。如果混在一个循环里做极容易在通信繁忙时出现丢步或周期抖动。后面固件章节我会详细讲怎么用中断优先级解决这个问题。2. 硬件设计核心引脚、参数计算与电路布局2.1 DRV8818 的电源处理与外围器件摆放硬件设计里最容易出问题的地方恰恰是看起来最“不重要”的电源和滤波。步进电机的线圈是感性负载H 桥斩波时VM 电源线上的电流是脉冲状的尖峰频率和斩波频率相同。如果电源去耦不足MCU 和驱动芯片之间就会互相串扰轻则波形畸变重则复位重启。我从最终定型板上总结出几个布局原则VM 引脚附近要放至少三颗电容一颗大容量电解电容吸收低频纹波一颗 10µF/50V 的陶瓷电容处理中等频率的突变再放一颗 100nF 高频瓷片电容贴近芯片引脚。VCP 电荷泵电容要严格按照数据表推荐值选择一般用 10nF/25V 或类似规格位置尽量靠近 VCP 引脚这一颗电容直接影响高边 MOSFET 的栅极驱动能力电容放远了或者选错材质高转速下会出现驱动不足导致波形塌陷。逻辑电源单独从 LDO 隔离出来。我这里使用 3.3V 供电给 MCU 和逻辑电平引脚和功率地之间通过磁珠做一级隔离。注意逻辑地和功率地最终要在电源输入端子处单点汇合不要铺成一大片混合地否则电机工作时的大电流会在地平面上产生压差把逻辑电平拖下水。2.2 电流采样电阻的计算与选型DRV8818 用电流采样电阻把电机电流转换成电压信号和内部参考电压比较实现 PWM 斩波限流。这类芯片的公式通常写作I_TRIP V_TRIP ÷ (8 × R_SENSE)其中 8 倍是芯片内部感测放大系数V_TRIP 是数据表给出的斩波比较阈值。不同批次和型号之间可能有差异所以一定要以手里芯片的数据表为准。以我选用的电机为例目标峰值电流设为 2A这是给电机额定值留了 10% 余量避免绕组内阻随温度升高后电流不足。如果 V_TRIP 按典型值 0.376V、放大倍数按 8 计算那么 R_SENSE 0.376 ÷ (8 × 2) 23.5mΩ我实际选用 25mΩ 的标准阻值。这里要强调两件事一是采样电阻要选低电感类型最好用 2512 封装的合金采样电阻普通贴片电阻的电感在高频斩波下会产生额外压降导致电流实际值和设定值偏移二是电阻的额定功率要留余量。2A 电流在 25mΩ 电阻上平均功耗约 100mW但斩波电流尖峰远高于平均值所以我选的是 1W 规格实测温度完全正常。如果后续要调整力矩不需要改硬件只要换一颗采样电阻即可。这也是我保留这个参数不通过数字电位器设定的原因工业现场更看重稳定机械式跳线和换件比任何数字调参都直观可靠。2.3 PIC24FJ256GB210 的引脚分配与最小系统PIC24 系列支持外设引脚选择也就是 PPS 重映射几乎可以把 UART、定时器、外设功能分配到任意引脚上。这个特性在画板时非常舒服因为我不用为了凑引脚而把布局绕得乱七八糟。我最终固定的引脚分配如下信号引脚路径说明STEPRP1定时器中断控制输出脉冲DIRRP2运动前预先设定方向电平MODE0/MODE1RP3/RP4微步进模式选择全步/半步/1/4/1/8ENBLRP5输出使能常高有效或常低有效看芯片定义FAULTRA0错误输入中断方式处理UART1 TX/RXRP6/RP7与上位机通信原点/限位RA1/RA2/RA3带内部弱上拉输入检测最小系统我只画了 3.3V 供电、外部 8MHz 晶振、复位电路和下载口。外部晶振选 8MHzPIC24F 内部有 PLL把它倍频到 16MIPS 以上定时器精度会非常充裕。另外PIC24 支持内部 RC 振荡器但步进脉冲对时间精度要求高实验室用内部振荡几秒没问题连续跑一小时后频率漂移就会让速度曲线变形。所以我强烈建议用外部晶振并且晶振负载电容按手册标称值来选不要临时用 22pF 一律对付。MCU 侧还要注意 STEP 和 DIR 引脚在芯片上电期间的默认状态。上电瞬间如果 STEP 线悬空或者被拉高DRV8818 可能收到杂散脉冲导致电机在上电瞬间跳动一下。最简单的处理是加 10kΩ 下拉电阻并且在 MCU 初始化代码里先把 STEP 对应引脚设为低电平再配置复用功能。3. 固件实现稳定生成 STEP 脉冲与运动控制3.1 定时器中断架构把脉冲让给最高优先级固件设计的第一步是决定 STEP 脉冲怎么产生。最容易想到的做法是在主循环里延时控制电平翻转但主循环一旦被通信阻塞脉冲周期就会抖动严重的直接把加减速曲线破坏。我的方案是把脉冲生成放到高优先级定时器中断里完整处理。考虑一个简单实现Timer1 产生周期性中断每次中断翻转 STEP 引脚。如果溢出周期设为 T则生成的脉冲频率是 1/(2T)。因为每次中断只做一次引脚翻转CPU 开销很低。运动速度变化时我只需要修改后续定时器的周期寄存器。具体在 PIC24 里我配置 Timer1 工作在内部时钟16 位周期模式中断优先级设到最高。中断服务函数的逻辑是volatile uint16_t step_period; // 定时器周期半周期 volatile uint8_t step_state; void __attribute__((interrupt, auto_psv)) _T1Interrupt(void) { _T1IF 0; STEP_IO ^ 1; // 翻转 STEP PR1 step_period; // 更新为下一拍周期 step_state STEP_IO; if (motion_in_progress) { if (step_state 1) { // 在上升沿完成一次步进计数 step_done; update_motion(); // 梯形曲线频率计算更新 step_period } } }这段代码的核心思想是“当前频率决定下一拍该等多长时间”。每次上升沿都调用 update_motion在里面计算新的周期值写进 PR1。这样整个加减速过程完全不需要主循环参与主循环只负责解析串口指令和状态上报。3.2 梯形加减速实现步进电机不带减速直接高速启动电机力矩曲线跟不上必然丢步。加速瞬间尤其严重因为电机的启动频率往往只有几百赫兹而运行频率需要达到几千赫兹。工程项目里最稳的加速曲线是梯形从起步速度线性加速到目标速度平稳运行后线性减速到停止。我把速度曲线分解成两个阶段参数加速段和减速段。每次中断里根据当前速度和剩余步数判断是应该加速、匀速还是减速。减速的开始点通过计算“剩余步数刚好等于从当前速度减速到零所需的步数”来决定并不会是一个固定位置。这样无论命令里的步数是多是少都能准确停在目标位置。update_motion 的伪代码如下void update_motion(void) { if (dir_position target_position) { motion_in_progress 0; step_period STOP_PERIOD; return; } if (is_accelerating) { current_speed speed_inc; if (current_speed target_speed) current_speed target_speed; } if (is_decelerating) { current_speed - speed_dec; if (current_speed min_speed) current_speed min_speed; } // 频率 当前速度 / 2 拍转换成定时器周期 step_period (uint16_t)(PIC_CLOCK / (2 * current_speed)); }这里要特别留意减速段的计算减速开始点的判断我是用当前速度和已知的减速度换算出“减速所需步数”再和剩余步数比较。比固定百分比可靠得多。实际调参中加速度我一般取 200Hz/ms 起步现场再根据负载惯性微调。工业环境里宁可加速慢一点也不愿意频繁丢步。3.3 微步进、衰减模式与速度的配合DRV8818 的 MODE 引脚可以切换全步、半步、1/4 步和 1/8 步。我这里直接用硬件跳线固定到 1/8 微步原因是1/8 步下电机低速运行更平稳振动更小和机械负载的共振速度也不容易重合。但微步进不是万能的必须配合正确的电流衰减模式。DRV8818 支持固定关断时间斩波斩波关断阶段可以选择慢衰减或者快衰减具体模式通过引脚或者寄存器配置视芯片版本而定。慢衰减效率高、电机发热小但电流过冲明显快衰减对负载惯量大、电感量大的电机更友好但噪声偏大。我最终在 1/8 微步模式下选用了混合/快衰减模式组合实测下来低速噪音明显降低电流波形也更干净。这里想提醒一个容易踩的坑微步进数越高H 桥开关频率越快芯片和电机发热都会上升。如果你的项目是长时间连续运行不要盲目追求高微步。对大多数机器人外部轴1/8 步已经足够顺滑1/4 步在发热和性能之间更均衡。我是因为负载对低速稳态要求高才用 1/8 步。3.4 串口通信与命令解析MCU 的角色是“从站”需要自己能独立处理运动指令。我定义了一个简单的命令帧协议帧头 命令字 方向 步数 目标速度 加速时间 CRC8。一次完整运动指令里步数是 int32 类型确保单次长距离运动不溢出。UART 接收使用环形缓冲区 状态机解析。主循环每毫秒检查一次缓冲区里是否有完整帧收到后立刻入运动队列。这里有个细节如果当前运动还没结束新的运动指令应该如何处理我实现了一个简单的优先级策略如果运动还在进行新指令先放入队列一旦当前位置到达目标立即执行队列里的下一条。这样上位机可以连续下发多段路径电机不需要每段都停下现场看起来是一条连续的轨迹。在机器人外部轴场景下这种“连续下发自动衔接”的协议非常关键因为机器人主控往往按规划周期的形式下发路径点而非一次性发一大段距离。我用这个协议已经验证过在 1kHz 指令下发频率下不丢帧。4. 常见问题与排查技巧实录4.1 电机一动就丢步先从电源和采样电阻查起我调试时踩的最大的坑是电机刚起步就发出“咔咔”的声音明显是输出力矩不足。排查了一圈最终定位到采样电阻选择的偏差我最初用的是一颗 20mΩ 的普通厚膜贴片电阻实际工作时号线电感大斩波电流尖峰导致采样电压偏高内部斩波提前触发实际输出电流只有预期的七成。换回 25mΩ 的采样电阻后问题消失。另外如果现场供电线很长电源线上的压降会让 VM 电压在加速瞬间下跌导致电流建立时间不足。这种情况要在电源输入端加足够容量的母线电容而不是只靠驱动板上的小电解电容。我最后在端子旁边并联了三颗 1000µF/35V 电解电容才彻底解决长线带来的压降问题。4.2 芯片过热PowerPAD 焊接和散热过孔不能少DRV8818 的 PowerPAD 是底部的大焊盘主要热量从这里传导到 PCB。很多只看原理图不看封装的朋友画板时容易忽略焊盘开窗和过孔阵列。我第一版 PCB 就没做底部过孔连续运行二十分钟芯片就开始保护性关断。正确做法是PowerPAD 对应位置的 PCB 露铜开窗并在焊盘上打至少 4-6 个热过孔连接到背面的大面积铜箔。过孔孔径要稍大一点焊锡能灌入形成导热通道。同时功率地和逻辑地不要通过单一细线连接尽量用星形拓扑在电源输入处汇合。这样处理后芯片表面温度从 95℃ 降到 70℃ 左右连续满载运行没有问题。4.3 低速共振与噪声考虑微步进和负载惯量匹配步进电机低速共振是机械结构决定的1.8° 步距角的电机在全步模式下低速时会产生明显的振动和噪音。我这次通过两个手段解决一是把模式固定到 1/8 微步二是调整驱动器的衰减模式。单纯用微步进还不够如果负载惯量和电机轴惯量比过大电流波形的过冲会激发共振这种情况下要适当降低斩波电流或者增加柔性连接来阻尼。还有一个经验不要用固定的“低频段速度”来长期运行。步进电机在几十到几百赫兹区间通常存在共振区现场联动调试时最好用示波器测一下实际输入频率和机械振动的关系在软件里设置一个最小运行速度让电机快速越过共振区。4.4 STEP/DIR 长线传输干扰要滤波但要保证波形边沿工业现场控制柜到电机之间的距离往往有几米STEP/DIR 信号走线长了波形边沿会变缓甚至被电机线上的耦合噪声淹没。我最后在驱动板输入端加了一级 RC 滤波R 取 330ΩC 取 1nF实测在 5 米线长下波形依然稳定。不过这里必须警告一句滤波电容不能太大否则正常脉冲会被削成三角波导致高频段丢步。纯 RC 滤波解决不了严重干扰如果现场干扰源很强正确做法是用差分线传输入或者用光耦隔离。步进脉冲频率不高光耦延迟完全可接受成本比差分芯片低得多。4.5 上电瞬间电机抖动问题这个现象非常常见原因也简单MCU 和驱动器逻辑电源各自上电如果驱动器先完成复位而 MCU 引脚还处于高阻态STEP 线路的杂散电平就可能被当成有效脉冲。解决手段是在硬件上加几个下拉电阻在固件里把 STEP、DIR、ENBL 三条线上电初始状态都置为确定的低电平。千万不要图省事不处理现场调试时上电冲一下如果恰好带着机械负载轻则撞限位重则损坏传动结构。写在最后几条实操经验这套 DRV8818PWPR 和 PIC24FJ256GB210 的方案从原理图到稳定运转前后调了两周其中一半时间浪费在采样电阻、散热和电源干扰上。如果让我重新做一遍最开始就会把电源和地平面设计得保守一些把电流采样电阻直接按计算值定做而不是随手用常规阻值试。另外一点感受很深步进电机控制的难点不在“怎么会转”而在“怎么可靠地转”。把加减速曲线算好、把中断优先级安排好、把采样电阻和散热算透这个系统才能真正搬去工业现场干活。后面我还计划给这套板子加上绝对编码器接口和闭环补偿让它在机器人外部轴场景下连失步报警都能自我诊断。这套硬件留的外设余量足够扩展会比较顺利到时候再分享新版本的效果。
阅读完成 · 觉得有帮助?
咨询建站