ARTICLE DETAIL

资讯详情

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

DRV8818+PIC24自研步进电机驱动板:从硬件电路到运动控制实战

DRV8818+PIC24自研步进电机驱动板:从硬件电路到运动控制实战 做步进驱动这几年我手里用过不下十种驱动方案从最便宜的 A4988 模块到成品的 EtherCAT 伺服各有各的折腾法。这次想聊的是我最近一次自研运动控制板块的经历用德州仪器的 DRV8818PWPR 做电机驱动搭配 Microchip 的 PIC24FJ64GB004 做运动控制 MCU去驱动一台双极步进电机并且是直接面向工业设备和机器人关节这种场景。整套方案做下来用一句话总结就是高集成度的驱动芯片 轻量级 16 位 MCU能把步进控制的硬件成本压得很低同时可靠性又足够应对产线上连续跑几个月不重启的要求。如果你正在做机械臂关节、直线模组、转台这类用步进电机但又不愿意被“智能驱动模块”绑死的小型控制系统这套组合非常适合静下心研究一下。DRV8818PWPR 是 TI 一颗很经典的步进电机驱动芯片HTSSOP 封装内部集成了两个 H 桥和一个完整的微步索引器。PIC24FJ64GB004 则是 Microchip 16 位 MCU64KB Flash外设带 USB做单轴运动控制绰绰有余。这两颗芯片搭起来MCU 里不需要跑什么实时电流环也不需要做微步正弦表只需要输出干净的 STEP 脉冲剩下的电流斩波、衰减模式、相序切换全部交给 DRV8818。这个架构和很多设备里那些“控制器 驱动器模块”的思路完全一致但元器件和布板成本低一个量级非常适合中等批量的自研设备。1. 项目概览为什么偏偏是 DRV8818 加 PIC241.1 这套组合解决什么问题工业现场对步进电机驱动的要求其实很朴素上电不丢步、加速不啸叫、长时间运行不烧管子、抗干扰能力不能太差。很多现成的步进驱动模块也能做到但它们普遍带有自己的协议栈和配置方式想嵌入自己的主控里总显得笨重。自研驱动板用 DRV8818 把“功率级”和“运动控制级”分离开PIC24 只负责“什么时候发脉冲、发多少个、频率怎么变化”DRV8818 负责“脉冲进来之后怎么给两相绕组产生正确的电流波形”职责边界非常清晰调试难度一下子降下来。我这次的项目目标是做一个双轴点位运动控制板带限位开关输入、紧急停止输入和 TTL 串口指令解析能驱动两个 1.8 度的标准双极步进电机单轴持续电流 1.2A 左右。最终选型就是每轴一颗 DRV8818PWPR 加一颗 PIC24FJ64GB004共用一颗 24V 工业开关电源。这里“PIC24FJ64GB004”里带个“GB”后缀意思是这颗料带 USB 模块虽然我实际没用 USB但留给后续上位机固件升级是个不错的余地。而 DRV8818 的 VM 宽压范围 8.2V 到 45V24V 的母线电压算是工业环境下最舒服的工作点。1.2 器件选型的几个理由选 DRV8818 而不是更常见的 A4988 或者 TMC 系列核心原因是 DRV8818 支持“混合衰减模式”能通过 MODE 引脚在慢衰减、快衰减和混合衰减之间切换。混合衰减 50% 档位对步进电机高转速段的电流波形特别友好电机噪音和震动能压得比纯慢衰减好很多成本却比 TMC 那种静音方案低一大截。A4988 虽然便宜但衰减模式基本固定高速段容易发烫丢步不适合工业场景。选 PIC24FJ64GB004 而不是 8 位单片机原因其实很实际16 位核心跑 32MHz 主频处理定时器中断和加减速曲线计算时余量很足。我一开始用 PIC16 做多轴同步时有明显的周期抖动换到 16 位之后两路脉冲的相位差可以控制在微秒级这对于双轴联动轨迹来说很关键。再加上 PIC24 系列的外设映射 PIN MAP 功能很灵活一个外设可以映射到多个引脚布线自由度比 8 位时代舒服多了。2. 硬件连接与关键参数计算2.1 电源架构VM、VDD 与地线处理这套系统的电源其实分三路电机母线电压 VM、逻辑电压 VDD、MCU 电压 VDD_MCU。DRV8818 的 VM 接 24V逻辑供电 VDD 和 PIC24 都用 3.3V。DRV8818 的 VDD 工作范围我到设计时查过手册完全可以兼容 3.3V 电平所以逻辑接口可以直接连 PIC24 的 IO不需要额外的电平转换芯片这里省掉了不少外围件。不管电源怎么分配有一个经验必须强调VM 端的大滤波电容不能省。DRV8818 的斩波电流峰值非常高如果 VM 引脚的旁路电容离芯片太远电压跌落会导致电流环参考值波动轻则电机声音变毛重则烧采样电阻。我通常在 VM 和 GND 之间放一个 100μF 电解电容加一个 0.1μF 陶瓷电容并且尽量靠近 DRV8818 的 VM 管脚陶瓷电容负责滤高频毛刺电解电容负责扛峰均比。逻辑电源和 VM 共地这一点没问题但采样电阻的接地点要走单独的小信号地路径然后单点汇入大电流地不要在功率地线上串联很多过孔否则采样电压里全是地弹噪声。2.2 电机电流设定ISENSE 采样电阻和 VREFDRV8818 设定的电流限流简单说就是通过片内的采样运放监测外接采样电阻两端的电压和 VREF 设置的目标值做比较超过目标就关断或衰减电流形成一个逐周期电流斩波环。这个限流公式直接决定了电机的最大扭矩和发热公式是ITRIP VREF / (8 × RISENSE)这里的 8 是 DRV8818 内部的电流检测增益RISENSE 是 ISENSE 引脚到 GND 之间的采样电阻阻值。这个公式是我实际调板时反复验证过的不过具体到不同批次芯片建议还是以 TI 官方数据手册的电气规格表为准。实际选型时先根据电机铭牌上的额定相电流确定 ITRIP再反推 VREF 电压。我这次用的电机额定相电流 1.2A选了 0.15Ω 采样电阻VREF 1.2 × 8 × 0.15 1.44V这个 1.44V 落在 VREF 引脚允许的 0.5V 到 3.6V 范围之内。VREF 我用了两个普通电阻从 3.3V 分压得到没有用可调电位器。电位器看着方便但工业设备经过长期振动容易接触不良分压电阻固定之后反而最稳定。如果你需要后期调整电流可以用 PIC24 的 PWM 通过 RC 滤波成直流电平再给 VREF 引脚这就相当于软件可调电流了待机时可以降到 50% 电流减少发热。下面这张表是我根据公式算出来的常用参数对照方便快速选电阻和分压目标峰值电流 ITRIPRISENSE 0.05ΩRISENSE 0.10ΩRISENSE 0.22Ω0.5A0.20V0.40V0.88V1.0A0.40V0.80V1.76V1.5A0.60V1.20V2.64V2.0A0.80V1.60V3.52V建议留出 10% 到 20% 的裕量不要按电机额定值顶格去设因为电流设定偏大一方面电机发热严重另一方面一旦机械卡死过流保护触发前的热积累会让电机线圈损坏。2.3 STEP/DIR 接口与 PIC24 引脚分配DRV8818 的接口是标准的 STEP 和 DIRSTEP 引脚检测上升沿每检测到一个上升沿就前进一步DIR 引脚的电平决定方向。这里有一个好多新手会忽视的点因为 DRV8818 内部自带步进索引器MCU 不需要关闭中断去实时切换 A、B 相只要保证 STEP 脉冲的时序稳定即可。我自己把 STEP 接到了 PIC24 的 RB15DIR 接到了 RB14另外 nFAULT 开漏输出接了一个 10kΩ 上拉连到 RB13 用于读取故障状态。SLEEP 引脚用 RC1 控制上电初始化为低电平让驱动芯片处于休眠状态等 MCU 初始化完成之后再拉高使能能有效避免上电瞬间电机抖动一下的问题。因为 PIC24FJ64GB004 的 IO 是 3.3V 逻辑DRV8818 的逻辑输入完全兼容所以 STEP 和 DIR 可以直接串联一个小电阻比如 100Ω 连接到驱动芯片引脚不需要光耦也不需要电平转换。但这个结论仅限于“驱动板和 MCU 在同一个 PCB 上、走线长度不超过几十厘米”的场景。如果 STEP/DIR 信号要从机箱一侧走到另一侧超过 20cm 的长线走线我强烈建议加光耦隔离或者用 RS-422 差分传输否则工业现场的干扰很容易造成多走一步、少走一步看起来随机出现的丢步问题十有八九是信号完整性和地电位差造成的。3. 衰减模式与微步进别把电流斩波想复杂3.1 斩波电流闭环的工作原理步进电机驱动本质上是两个 H 桥每个 H 桥驱动一相绕组。给绕组通电之后电流不是瞬间就达到设定值的因为绕组有电感电流上升速度等于 VM 减去反电动势再除以电感。当电流上升到达 ITRIP 之后如果继续全桥直通电流还会继续涨就会烧电机或者产生很大的噪声。所以 DRV8818 内部会在电流到达设定值后关闭一部分开关管让电流“衰减”等电流掉下去一点再次开通如此反复这就是斩波。DRV8818 这种集成了 H 桥和电流检测运放的方案对 MCU 来说是完全透明的。MCU 只负责“我踏出了一步”具体这个 H 桥怎么开关、占空比多少都是模拟电路自己完成的。这种情况下衰减模式的选择就直接影响电流波形的形状和纹波大小。慢衰减模式下关断时电流通过续流二极管继续环流电流下降缓慢纹波小但电机低速运行噪音偏大高速时跟不上电流变化。快衰减模式下关断时电流反向回馈母线电流快速下降响应快但纹波和 EMI 都更大。混合衰减则是在一个周期内先快衰减再慢衰减找到平衡点。3.2 衰减模式怎么选实际设计时我直接把 DRV8818 的 MODE 引脚配置成了混合衰减 50% 档位。这里的逻辑很简单工业场合追求的是转速范围宽、发热可接受、运行不吵人混合衰减正好卡在中间。如果你做的是低速大扭矩的转台设备电机转速基本在 60r/min 以下那慢衰减模式的低纹波优势会更明显可以选择慢衰减。如果你做的是高速点位运动比如传送带分拣机构那可能需要往快衰减方向靠保证高速下电流能快速建立不至于扭矩不足丢步。衰减模式的引脚是 MODE具体高低电平配置和微步档位是一起设置的这点我记得数据手册里有张表照着设定就行不需要动态切换的话焊死电平最省心。一个容易被忽略的现象是混合衰减和微步档位之间的配合。微步数越高每相电流变化越细腻对电流斩波纹波的要求也越高。如果芯片处于慢衰减模式同时微步档位开到 1/16电流跟踪能力跟不上实际波形会畸变表现为轴承位置的高频啸叫。我实测下来的结果是 1/8 微步配混合衰减 50%对于 1.8 度步距角的电机是最均衡的扭矩波动小高速性能也不差。3.3 微步进到底谁在干很多第一次用 DRV8818 的朋友都会问一个问题微步进的正弦电流表是不是要写在 MCU 里答案是芯片内部的索引器已经处理好了。DRV8818 接收外部的 STEP/DIR 信号内部把脉冲序号映射成两相电流的目标值再通过内部的 DAC 和电流环输出。所以 MCU 层完全不需要知道微步表的相位细节只需要知道“我发了一个脉冲轴走了一个微步”。这一点和用欧系驱动控制器的思路很像驱动器自己管理电机电流环控制器管理运动轨迹。我在这套系统里把微步档位设成了 1/8。对 1.8 度的步进电机来说1/8 微步意味着每圈 1600 个脉冲也就是 1 个脉冲对应 0.225 度。这个分辨率对大多数点到点定位都够了而且脉冲频率不至于太高导致 MCU 定时器吃紧。如果做工装台需要更细的分辨率可以考虑 1/16但那时对机械结构精度和负载刚性要求也会提高因为微步并不能消除机械背隙。它只改善电流分辨率和运行平稳度绝对定位精度还是由机械本体决定的。4. PIC24 端软件脉冲生成与加减速控制4.1 用定时器产生可控脉冲我生成 STEP 脉冲的方式是用 PIC24 的输出比较模块 OC1 搭配定时器 TMR2直接输出 50% 占空比的方波。把 PWM 频率设定为步进频率这样 MCU 不需要在中断里翻转 IO频率更新也非常灵活。PIC24 的指令周期 Fcy 是 16MHz若步进频率是 f则定时器周期寄存器 PR2 就设为 FCY 除以 f。void step_pwm_init(uint32_t freq_hz) { T2CON 0x0000; // 关闭 TMR2 TMR2 0x0000; PR2 FCY / freq_hz; // 设置定时器周期 OC1CON1 0x0000; OC1R PR2 1; // 50% 占空比 OC1RS PR2 1; OC1CON1 0x0006; // OC1 工作在 PWM 模式 T2CON 0x8000; // 启动 TMR21:1 预分频 }这里有个边界条件需要注意PR2 是 16 位寄存器最大 65535。如果步进频率太低比如 100Hz 以下FCY / f 会超过 65535这时候要加 TMR2 的预分频器。我项目里最低脉冲频率大概在 500Hz所以 1:1 预分频就够了。实际使用中更新 PR2 改变频率时最好先停止定时器、把 TMR2 清零、再写 PR2、最后重新启动。如果不这么做TMR2 可能已经计到比新 PR2 还大的值定时器会立刻产生一个溢出导致多出一个极短的异常脉冲这个异常脉冲正好会让步进电机多走一步属于非常隐蔽的丢步原因。4.2 梯形加减速的实现步进电机的失步绝大多数发生在启动和停止瞬间。如果启动时直接给最高频率转子来不及跟上磁场旋转速度就会丢失若干个脉冲。我用的是经典梯形加减速算法把整个运动过程拆成一个加速段、一个匀速段、一个减速段。在每段里脉冲频率按照预设的加速度逐步变化直到达到目标速度或者到达减速点。实际的软件实现我没法把完整工程贴出来但核心思路是可以分享的。在定时器中断里维护一个“目标步数计数器”每一次加减速的阶梯更新频率是 1ms也就是每毫秒检查一次当前应该是什么速度然后重新写入 PR2 和 OCRS。梯形加速的优点在于计算简单用 MCU 的整数运算处理完全没压力。缺点是在加速起始点和结束点加速度突变如果负载惯量比较大还是可能产生轻微顿挫感。这时可以改成 S 曲线也就是加速度本身再做一个线性渐变代价是计算量和调参难度大幅上升。volatile uint16_t cur_steps_per_sec; volatile uint16_t accel_steps_per_ms; // 每毫秒增加的脉冲频率 void __ISR(_T1Interrupt) T1_ISR(void) { // 每 1ms 触发一次更新一次脉冲频率 cur_steps_per_sec accel_steps_per_ms; step_pwm_set_freq(cur_steps_per_sec); _T1IF 0; }加减速参数我一般按“加速度不超过电机最大自启动频率的 1/2”来设置。比如电机不加速能直接启动的自启动频率是 500Hz那么每秒加速度尽量控制在 250Hz 内。加速度太大省时间但丢了步之后回头找不到原因反而浪费时间不如保守一点。4.3 状态机与保护逻辑运动控制的软件不能只有一个发脉冲的死循环必须有一个清晰的状态机。我把系统分为 IDLE、ACCEL、RUN、DECEL、STOP 五个状态外加一个 FAULT 状态。在 FAULT 状态下PIC24 会立刻停止输出 STEP 脉冲并通过 RC 引脚把 DRV8818 拉入睡眠状态同时点亮一个故障 LED。DRV8818 的 nFAULT 引脚在过流、过温时会被芯片拉低PIC24 通过 RB13 外部中断检测下降沿进入 FAULT 状态。这里有一个细节值得提nFAULT 是开漏输出必须做上拉否则电平变化检测不到。限位开关的处理也有讲究。我把两个方向的正限位和负限位分别接在 PIC24 带中断功能的引脚上进入限位区域后先停止发脉冲而不是直接反向因为机器人应用中安全第一。只有在收到上位机“回原点”指令后才会自动以低速向负方向寻找原点。这个逻辑看着简单但在实际设备上能防止很多操作事故是这类自研控制板该有的底线。5. 工业与机器人场景的可靠性设计5.1 上电时序与使能管理工业设备最怕的就是上电瞬间电机“抽风”一样动一下这在机器人上可能直接导致撞机。这个问题的根源往往不在 MCU 程序而在于 DRV8818 的使能时序。如果 MCU 的 IO 还没初始化完STEP 引脚可能处于不定状态芯片检测到上升沿就会误走一步。我的做法是在整个系统上电时把 SLEEP 引脚初始化为低电平让 DRV8818 保持睡眠输出高阻等 PIC24 的时钟、定时器、IO 映射全部配置完之后再把 SLEEP 拉高激活芯片。同时把 nRESET 引脚固定接 VDD避免上电瞬间复位逻辑不稳定。这里有个小坑有些工程师为了省一个 IO把 SLEEP 直接接 VDD省事的代价就是上电瞬间无法控制输出步进电机在 MCU 配置期间会不会误动作全靠运气这不是工业级做事的方式。5.2 PCB 集成与散热PWPR 封装的 PowerPADDRV8818PWPR 里的 PWPR 后缀表示 HTSSOP 封装带底部 PowerPAD 散热焊盘。这颗料的设计必须把 PowerPAD 焊到 PCB 的铜皮上并在焊盘区域打一排散热过孔连接到背面的覆铜层让热量能顺畅散出去。我第一次打板时偷懒PowerPAD 只上锡没打散热过孔跑 1.5A 电流二十分钟后芯片表面温度直接升到 90 多度后来补了过孔温度降到 65 度左右效果非常明显。除了散热采样电阻的布局也要讲究。ISENSE 采样电阻必须尽可能靠近 ISENSE 引脚走线要短要粗不能和其他电流路径混用。因为这个电阻上的压降就几十毫伏到几百毫伏任何走线上多出来的寄生阻抗都会直接影响电流闭环精度。另外VM 和 GND 之间的去耦电容要靠近 VM 引脚大电流的地回路要和逻辑地分开铺最后在一个点汇合。这些布局技巧对步进驱动这类功率电路来说重要性不亚于软件算法。5.3 限位、急停与通信兜底在机器人应用里光有软限位是不够的因为 MCU 程序可能跑飞。我为这套控制系统做了硬件急停回路急停按钮常闭触点串联在两个轴的使能信号上急停断开时驱动芯片掉电或者被强制睡眠电机马上失电不会继续输出力矩。这个回路不经过 MCU 判断响应时间是毫秒级的符合安全要求。实际测试中按急停后如果你立刻用手去掰电机轴能感觉到轴是可以通过外力转动的这就是失电状态。通信方面我用 UART 接收一串 ASCII 指令格式类似 MOVE X 1200内部解析出目标步数后进入执行状态。PIC24FJ64GB004 有多路 UART分一个给调试也行。工业现场如果干扰重要上 RS-485 或者 CAN把总线变成差分信号。调试端口不要省我在这块板子上了预留了一路 UART 接无线串口模块人站在机器旁边调加减速参数不用反复插拔 USB方便很多。6. 实测问题与避坑速查6.1 电机嗡嗡响但不转我调试中遇到的第一个问题是电机在低速时嗡嗡响电流明显在动但转子就是不走。排查了一圈最后发现是 STEP 脉冲频率太低单步时间长电流建立后在下一个脉冲来临之前转子已经因为机械振动退回原位了。其实更本质的原因是电流设定值和微步档位在低速区的配合不够好导致保持力矩不足。解决办法是把电流从 90% 额定提到 100%同时换回慢衰减模式问题就消失了。如果你也遇到类似现象先别怀疑芯片接线先查电流设定和衰减模式这是最常见的。6.2 高转速失步与瞬间掉电加速到 600r/min 以上后我陆续碰到过几次丢步表现为位置偏差越攒越大。最初怀疑是电压不够后来用示波器看 VM 波形发现启动瞬间开关电源电压会被拉低约 1.5V然后缓慢恢复。这导致高速时电流建立时间更长激励不足。解决办法是在 VM 端并联了一个大电容阵四个 470μF 电解电容并联并且把加速段拉长让电流环有时间响应。这里有一个非常关键的经验如果丢步是间歇性且难以复现的可以考虑在 DRV8818 的 VM 引脚旁边再叠一个陶瓷电容很多高频丢步是 PCB 走线电感造成的瞬间掉电示波器都不一定抓得住。6.3 芯片过温与持续高负载长时间跑满负荷时DRV8818 表面温度偏高。我一开始以为是芯片选型不够后来发现是 PowerPAD 焊盘散热过孔布局不够又重新优化了 PCB 的覆铜面积和过孔阵列温度降下来之后功能恢复稳定。如果你的应用需要长时间满电流运行建议在设计阶段就预估好散热面积。还要注意 DRV8818 的过热保护过温后 nFAULT 会拉低我的软件里通过捕获这个信号进入 FAULT 状态并向上位机报告故障代码而不是默默复位这样维护人员可以根据日志定位问题。下面把调试中反复遇到的几个问题整理成一个速查表给你照着排查现象可能原因处理方式电机抖动、嗡嗡响不转电流偏低 / 衰减模式不匹配提高 ITRIP切换混合或慢衰减低速正常、高速丢步加速度过大 / VM 电压跌落拉长加速段加大 VM 电容提高 VREF上电瞬间电机动一下SLEEP 未初始化为低上电后先将 SLEEP 拉低再延迟使能某一相完全无电流电机线接触不良 / 采样电阻虚焊检查接线端子补焊采样电阻芯片温度异常高PowerPAD 散热不良增加 PCB 铜皮与散热过孔STEP 信号长线受到干扰线缆过长未隔离改用光耦或差分传输6.4 上电抖动与复位竞争上电抖动的问题我在前面的时序里已经提到了但还有一种情况电机在运行过程中突然抖动一下然后继续跑其实不是程序逻辑问题而是电源在上电复位期间 MCU 的 IO 短暂处于浮动状态STEP 引脚被噪声触碰产生了一个边沿。这需要在硬件方案上加一个 10kΩ 下拉电阻到 STEP 和 DIR 引脚确保在没有驱动时是确定的低电平。下拉电阻阻值不能太大也不能太小10kΩ 比较合适太大会被干扰击穿太小又会和驱动芯片内部输入电阻分压导致识别阈值偏移。最后说说我做完这套方案的整体感受做这个项目踩过的坑不下十个但回头来看DRV8818 加 PIC24 的组合确实是 2A 以下工业级步进驱动里相当能打的。如果你对运动控制有更复杂的需求比如多轴联动插补可能还是得上专用运动控制芯片、加闭环编码器甚至换 EtherCAT 伺服这些我都试过。但针对“可靠地控制一个双极步进电机到指定位置”这个朴素需求这套方案性价比已经极高。最后再分享一个我实际开发中养成的小习惯所有加减速曲线参数和微步档位我都做成了编译期可配置的宏定义而不是写死到代码深处。这样现场调试时只需要改一个头文件就能调整电机特性不用为了换个电机重写整个工程。工业软件少一处分叉逻辑就多一分稳定。
返回列表