ARTICLE DETAIL

资讯详情

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

DRV8818+PIC18F86J11步进电机驱动方案详解

DRV8818+PIC18F86J11步进电机驱动方案详解 做工业设备和机器人项目电机驱动这块始终是绕不开的坎。几年前做一台三轴桌面点胶机客户要求成本低、开发周期短、控制逻辑一眼能看懂我最后选了DRV8818PWPR加PIC18F86J11的组合。这套方案不算“网红”配置却非常稳DRV8818PWPR负责把双极步进电机的电流环、功率桥、保护逻辑全部收进去PIC18F86J11则用简单的定时器中断生成步进脉冲两者直接对接不需要额外电平转换也不依赖复杂的伺服算法。这篇文章想把当时从选型、画板、调固件到最后量产遇到的问题完整记录下来给正在做工业机器人、桌面设备、点胶机、小型数控滑台这类项目的人一个可以直接抄作业的参考。1. 方案思路为什么是 DRV8818 PIC18F86J111.1 双极步进电机带来的控制收益与被忽视的门槛双极步进电机在工业设备里之所以常见是因为它绕组的利用率比单极电机高相同体积和重量下能输出更大的扭矩。它的四根引出线组成了两个独立绕组要实现正反转和精确位置控制必须让电流能沿两个方向流过线圈。这种“电流换向”的需求决定了它不能像普通直流电机那样用单管驱动而是要依赖H桥结构。很多人第一次接双极电机时会觉得简单四根线按颜色接上不就行了实际上问题都藏在电流控制上。绕组是电感电流不能突变如果直接用固定电压硬灌低速时电流会飙得很大电机发热严重高速时又因为电感限制电流上不去扭矩掉得快。要解决这个问题必须对电流做斩波控制也就是常说的“恒流驱动”。如果只用分立器件搭H桥例如用两个L298或者几对MOS管虽然也能转但电流检测、续流路径、过流保护这些全要自己设计PCB面积和调试工作量都不小量产一致性也难保证。这时候集成驱动芯片的优势就体现出来了——它把两路H桥、电流斩波、逻辑控制、保护电路全部封装在一个芯片里外部只需要少量元件就能把电机跑起来。1.2 DRV8818 能解决什么从 H 桥到电流环的集成DRV8818PWPR 是德州仪器的一颗双极步进电机驱动芯片TSSOP封装芯片内部集成了两路H桥、电流调节比较器、微步进索引器和故障保护逻辑。对于大多数中小功率步进电机额定电流1A到2.5A左右一颗芯片加一个采样电阻就能构成完整的驱动单元。这颗芯片在实际项目里最让我满意的地方是它的电流调节方式。它通过外部检流电阻感知绕组电流然后用PWM斩波把电流限制在设定值。设定电流只需要调整一个VREF引脚的电压不用改PCB这对于现场调试非常友好。调机时如果觉得电机力矩不够拿螺丝刀拧一下电位器就能加大电流不需要重新换电阻这在小批量设备调试中能省大量时间。另一个实用功能是微步进索引器。双极步进电机本身靠电流方向换相每换一次相走一个步距角。芯片内部把每一步再切成更小的子步让电流按阶梯正弦波变化电机运行时的振动和噪音会明显下降。DRV8818支持整步、半步、1/4步、1/8步通过MS1和MS2两个引脚的电平组合就能切换非常直接。1.3 PIC18F86J11 作为主控的理由主控这边为什么选PIC18F86J11而不是用烂大街的单片机开发板主要原因是量产可靠性和开发效率的平衡。PIC18F86J11是Microchip 8位MCU属于PIC18F J系列内部资源和引脚规模对步进电机控制来说很合适。步进电机控制最核心的需求是能产生稳定可变的脉冲频率有足够I/O管理方向、使能、细分等信号还要能跑加减速逻辑。PIC18F系列的内置定时器多配合中断可以非常精准地翻转STEP引脚。它的3.3V逻辑电平与DRV8818的VDD引脚完全兼容不需要做电平转换精简了板子。另外PIC18F的XC8编译器和MPLAB X IDE生态成熟代码写起来直白不像有些片子要配复杂的外设库。对于维护周期长、需要工程师反复改动的工业设备来说这种“一眼能看懂”的固件结构比追求花哨功能更实际。开发时我还要考虑采购周期和芯片价格这颗料生命周期长替代货源也多供应链风险小这也是工业项目选型时很关键的因素。2. 硬件电路设计把 DRV8818 和 PIC18F86J11 真正搭起来2.1 DRV8818 外围电路与电流设定计算硬件设计首先要确定电机的工作电流这是整个电路设计的起点。电机铭牌上通常标有“相电流”或“额定电流”这个值就是设定目标。DRV8818的电流设定公式是I_trip VREF / (8 × R_sense)其中I_trip是峰值相电流VREF是电流设定引脚的电压R_sense是检流电阻的阻值。举个例子如果电机额定电流是1.5AR_sense选用0.1Ω则VREF应设为1.2V。计算过程是VREF 1.5A × 8 × 0.1Ω 1.2V检流电阻的功率也要算一下。电流有效值按峰值计算1.5A电流在0.1Ω电阻上产生的功耗是P I² × R 1.5² × 0.1 0.225W实际选型至少要留50%以上余量用0.5W或1W的电阻才靠谱否则长时间运行后电阻发热阻值漂移会导致电流设定不准。VREF引脚不建议直接用单片机引脚驱动因为普通GPIO无法输出精确的模拟电压。常见做法有三种用精密电位器分压、用DAC芯片输出、用MCU的PWM加RC滤波。考虑到现场调试需要经常调整力矩我推荐在PCB上预留一个电位器位置电位器滑臂接VREF引脚两端分别接VDD和GND。如果怕操作工乱调也可以把电位器换成固定电阻分压然后用跳线选择不同电流档位。提示检流电阻的位置一定要靠近DRV8818的电流检测引脚走线要短而粗不能有过孔穿过。这个电阻上的信号非常小任何寄生电感和额外电阻都会直接折算成电流误差导致实际电流和计算值不一致。2.2 PIC18F86J11 引脚分配与接线主控和驱动芯片之间的信号连接看起来只是几根线但引脚分配直接影响固件写起来顺不顺手。我常用的分配方式如下表信号功能主控引脚方向说明STEPRB0输出步进脉冲输入一次高电平或低电平变化前进一个子步DIRRB1输出电平决定电机旋转方向MS1RB2输出微步进模式选择位1MS2RB3输出微步进模式选择位2DEC0RB4输出衰减模式选择位0DEC1RB5输出衰减模式选择位1nSLEEPRB6输出睡眠控制高电平正常工作nFAULTRA0输入故障指示低电平表示发生过流或过温这个分配方案有几层考量。STEP信号是高速翻转引脚放在RB0很多PIC单片机能用端口位的原子操作快速翻转比读改写整个端口速度快。DIR信号虽然只在高电平跳变前后有效但也要远离STEP避免布线耦合产生误触发。微步进和衰减模式这些“配置类”引脚放在一起方便固件一次性赋值。电机绕组连接也不能马虎。双极步进电机的四根线通常分成两相用万用表测量绕组电阻就能区分同一组的两根线之间电阻很小不同组之间的电阻为无穷大。把两组线分别接到OUT1A/OUT1B和OUT2A/OUT2B即可。如果电机反转只需要交换同一组的两根线或在固件里把DIR极性反转没必要改PCB。2.3 电源设计与EMC处理的现场心得电源部分是整个方案最容易出问题的地方。步进电机运行时电流是脉动的这会让电机电源线上的电压出现塌陷和尖峰。工业现场的24V开关电源响应速度有限如果不加储能电容电机加速瞬间电压可能掉到驱动芯片的欠压保护阈值以下直接导致复位或丢步。我在每个驱动板上都坚持放100µF以上的电解电容和0.1µF瓷片电容尽量靠近VM引脚。电解电容负责提供瞬态能量它要能承受电机电流的纹波有效值不只是电压值。小容量瓷片电容用来滤除高频噪声两者缺一不可。如果系统里有多个电机每个驱动芯片都要有独立的储能电容不能指望一个电容管所有电机否则相互干扰会让电流波形变得很难看。地线布局也得很讲究。电机电源的地、芯片逻辑地、主控地最终要接到同一个点但电机大电流返回路径不能经过PIC的模拟地和数字地。很多工程师遇到“单片机偶尔死机”的问题查到最后都是地线环路把电机噪声灌进了MCU复位脚。简单有效的办法是主控和驱动芯片分别铺地平面两者之间通过一个磁珠或直接单点连接让大电流走自己的回路。提示在强电柜或长线传输场景下我建议STEP、DIR信号通过光耦隔离后再进驱动芯片。光耦选用带有施密特触发的型号例如6N137之类抗干扰能力强得多。但在小体积机器人控制器上直接连接也完全可以只要把线距控制在几厘米以内、地参考稳定即可。3. 固件实现从点个灯到让电机按曲线跑起来3.1 初始化振荡器、GPIO与定时器固件编写的第一步是搞定时钟。PIC18F86J11可以用内部振荡器也能外接晶振再通过PLL倍频。如果只求功能正常内部振荡器最省事省去两个晶振电容和一个振荡器芯片PCB也干净。步进电机的绝对速度精度如果要求不高内部振荡器的误差可以接受。但如果设备需要对不同工位的动作时间做精确控制我建议用外部晶振加PLL把主频提上去因为步进脉冲频率和定时器计数精度直接相关。更高的主频意味着定时器重载值的分辨率更高加减速曲线能做得更平滑。GPIO初始化要把STEP、DIR、MS1、MS2、DEC0、DEC1、nSLEEP全部设为数字输出nFAULT设为输入并且建议把nFAULT配置为下降沿中断这样故障发生时MCU能立即响应不需要在主循环里轮询。轮询的问题在于响应时间不稳定如果主循环恰好在处理慢速任务驱动芯片早就过流烧掉了。3.2 步进脉冲生成定时器中断的时机与计算步进电机控制的核心是产生频率可变的脉冲串。很多人刚上手时会想用PWM模块输出一个固定频率的方波不就行了实际上这样做很难调速。PWM模块的输出频率一旦设定想平滑改变频率就需要不断修改周期寄存器同时又要把占空比保持在50%这在8位MCU上非常别扭。所以更合理的做法是用定时器中断翻转STEP引脚。这里有一个关键换算是新手最容易搞错的。STEP引脚每来一个上升沿或者下降沿电机都只会前进一个子步也就是说一个完整的电机步进对应STEP引脚输出一个完整的高低电平周期。假设我们想要10kHz的步进频率STEP引脚翻转的频率实际上是20kHz因为一个周期里有两个沿。定时器中断每次执行时翻转STEP引脚所以中断频率应该是步进频率的两倍。以48MHz主频为例PIC18的指令周期是主频除以4也就是12MHz。定时器不分频时每计数一次的时间是T_timer 1 / 12MHz ≈ 83.3ns要得到10kHz步进也就是20kHz翻转定时器单次计数溢出周期应为P 12MHz / 20000 600如果使用16位定时器重载值就是65536减600。这个值放在中断里更新每次中断到来时重载定时器继续跑精度完全够用。以下是初始化定时器中断的关键代码// Timer1 初始化假设主频配置为48MHz void Timer1_Init(void) { T1CON 0x01; // 8位读/写模式预分频1:1内部时钟启动 TMR1H 0xF5; // 重载值高8位对应65536-600 TMR1L 0x58; // 重载值低8位 PIE1bits.TMR1IE 1; // 使能Timer1中断 INTCONbits.PEIE 1; // 使能外设中断 INTCONbits.GIE 1; // 使能全局中断 }中断函数里做的事情要尽量少只做两件事翻转STEP引脚、读取下一个重载值。其他像位置计数、方向判断、加减速状态更新之类的逻辑能挪到主循环判断的就别塞进中断里否则中断服务时间过长会直接限制最高步进频率。3.3 方向、使能与微步进切换DIR方向引脚必须在STEP脉冲来临之前稳定下来通常提前至少5微秒。这个时间看起来很短但如果用GPIO直接写DIR后紧接着产生STEP脉冲中间没有延时某些DRV8818会检测到不确定电平导致电机偶尔走错方向。更稳妥的做法是先把DIR设置为目标方向再产生一系列STEP脉冲如果中途需要换向先停止脉冲等电机停稳再修改DIR最后恢复脉冲输出。微步进模式切换更要小心。MS1、MS2引脚电平决定的是索引器的模式如果电机还在运行中突然切换1/4步到1/8步电流波形会发生突变不只是噪音变大还可能导致丢步。所以我只在电机停机状态下做微步进切换。通过MCU的GPIO直接控制MS1/MS2有个好处就是上位机或触摸屏随时可以通过串口改变细分模式不用停机改跳线。nSLEEP引脚也有值得注意的地方。如果不小心把它拉低DRV8818会进入低功耗睡眠模式所有输出关闭电机失去所有扭矩。程序初始化时务必要把nSLEEP置为高电平。3.4 加减速曲线梯形与S曲线查表法步进电机开环控制最大的敌人是失步。如果启动瞬间就要求几十kHz的步进频率转子的机械惯性跟不上定子磁场的变化就会丢步甚至完全堵转。所以固件里必须做加减速。最简单的加减速是梯形曲线先匀加速到目标速度然后恒速运行最后匀减速停止。这种曲线在大多数工况下都够用。关键是减速段要在到达目标位置之前开始否则电机到了位置还停不下来会冲过目标。实际项目里我更推荐查表的S曲线加减速。S曲线在起止点的加速度为零机械冲击小尤其对机器人这种定位精度要求高的设备能明显减少末端抖动。实现方法不复杂预先算好一张延时表表中每个元素代表对应步序的定时器重载值或翻转周期。加速时从表头往后查恒速时保持固定值减速时从表尾往回想。表格的计算可以用脚本离线生成也可以在MCU启动时计算。我习惯离线生成后固化为const数组既省RAM又保证运行速度。大致代码如下// 假设已经生成加速阶段的重载值数组例如20个台阶 const uint16_t accel_table[] {5800, 5200, 4800, 4400, 4000, 3600, 3300, 3000, 2800, 2600}; // 当前处于加速状态时 uint16_t current_period accel_table[accel_index]; if (accel_index accel_steps - 1) { accel_index; } else { motion_state RUNNING; }这里的关键因果逻辑是重载值越大步进频率越低随着加速重载值逐渐减小频率逐渐升高。设计表格时要注意相邻两个重载值的差值不能过大否则相当于加速度突变就失去了S曲线的意义。3.5 位置计数与故障反馈逻辑步进电机虽然开环运行但位置计数器一定要有。在定时器中断里每产生一个STEP沿根据当前DIR状态对位置变量加一或减一。这个位置值可以在调试时通过串口上报也能用于判断运动是否执行完成。没有位置计数器的程序一旦中途触发故障停机重新接管时根本不知道轴在哪儿这是现场调试时非常被动的局面。故障处理逻辑建议这样安排nFAULT下降沿触发中断后立即停止输出脉冲把驱动芯片置于禁用状态然后向串口发送故障码并点亮故障指示灯。这里要特别强调的是不能在中断里直接执行长时间串口打印应该只置一个故障标志位主循环检测到标志后再做具体处理。DRV8818的故障状态往往是瞬时的比如电机堵转瞬间电流尖峰触发了过流保护。如果立即恢复使能电机可能还能正常工作。我的处理方式是记录故障次数连续故障超过三次就锁死停机需要人工复位防止反复重启毁坏机械结构。4. 现场调试与常见问题排查4.1 上电后电机只有嗡嗡声不动这个现象我遇到过不止一次每天都在帮不同客户排查。本质是电机通电了但没有按照正确的换相顺序走转子在两个位置之间来回抖动听起来就像“嗡——”的连续电流声。可能的原因有STEP脉冲没有正常到达、脉冲频率太低、电机绕组接反、电流设定太低。排查顺序很重要。先用示波器或逻辑分析仪看STEP引脚确认是否有脉冲波形。如果STEP根本没有脉冲问题在主控侧检查固件里定时器是否启动、中断是否使能。如果脉冲正常下一步量电流设定电压VREF确认电流值是否达到电机额定值。最后检查绕组接线交换同一相的A、B两根线试试看。4.2 运行中丢步与失步丢步是最容易让人抓狂的问题因为它不是每次都发生往往在运行一段时间或特定速度下才出现。造成丢步的原因可以归纳成几类电流不足、加速度过大、电源电压跌落、信号干扰。排查时我建议先把加速度参数调低如果丢步消失说明根本原因是加速太猛。然后在电机轴上加一点柔性负载再逐步提高电流设定值找到临界点。如果电流已经接近芯片上限仍然丢步要考虑换更大扭矩的电机或者用更高VM电压供电。高电压能让电流上升更快在高速区间扭矩更大。4.3 芯片发热与热关断DRV8818的TSSOP封装本身散热能力有限芯片底部有散热焊盘PCB上一定要对应铺铜。很多打样回来的板子芯片发热严重打开Layout一看散热焊盘只连了一根细线这种板子满载跑几分钟热关断是必然的。芯片发热本身不是故障驱动芯片内部MOS管导通电阻产生功耗电机电流越大、VM电压越高发热就越明显。要降低温度最有效的办法是优化衰减模式。DRV8818可以通过DEC0、DEC1引脚选择慢衰减、快衰减或混合衰减。低速运行时慢衰减的电流纹波小但高侧和低侧MOS管导通时间分布不同发热集中在少数MOS管上高速运行时则要换成快衰减或混合衰减让电流过零点更清晰。具体取舍需要用热像仪或示波器实测我一般以芯片表面温度不超过85℃为安全线。4.4 微步进模式下的噪声与振纹微步进的初衷是让运行更平滑但实际使用中发现如果电源纹波大、衰减模式不对微步进反而比整步更容易出现刺耳的高频噪音。原因是微步进要求电流按台阶变化每一台阶的电流误差都会转化为力矩波动进而激发机械共振。处理思路有两个方向一是从源头上看电流波形是否平整用电流探头测绕组电流看台阶处有没有明显过冲二是调整衰减模式混合衰减在降低电流纹波方面通常比单纯慢衰减或快衰减要平衡。另外电机负载的机械共振常常是噪音放大器可以换一个运行速度区间来验证是不是共振引起的如果是加减速曲线或速度规划就要避开共振频率带。4.5 nFAULT 反复触发nFAULT引脚一旦被拉低说明芯片内部检测到了过流、过温或欠压之类的异常。反复触发时要重点检查电机绕组是否对地短路、绕组间是否绝缘不良、VM电压是否波动过大。我遇到过一个很隐蔽的案例电机引线经过设备的活动关节长时间弯折后内部绝缘皮破损运动到某个角度就短路nFAULT随机触发。后来把驱动部分加装了故障记录功能才从日志里发现故障集中在某一段往复运动区间最终定位到线缆磨损。这里给一个实用的调试技巧不要把nFAULT只当成“亮红灯”用应该用MCU记录每次故障发生时的位置信息和运行状态事后通过串口或SD卡查看。没有日志的电机系统排查故障全靠猜效率太低。5. 一个可参考的最小实现示例5.1 硬件清单与参数选择下面给出一套24V工业滑台项目的具体配置可以直接作为参考。项目选型或参数说明主控PIC18F86J11TQFP封装3.3V供电驱动DRV8818PWPR逻辑VDD 3.3V电机VM 24V电机两相双极步进电机额定1.2A/相57系列或42系列均可检流电阻0.1Ω1W温度系数低对应每相峰值电流1.2A附近VREF电压0.96V通过电位器分压得到步进模式1/8微步进MS11MS21这段配置里的VREF计算1.2A × 8 × 0.1Ω 0.96V。如果现场感觉力矩偏大或偏小只需要微调电位器范围最好限定在0.8V到1.1V之间防止电流设定超过芯片最大能力。5.2 从零开始调试的流程调试流程要按从简单到复杂的顺序来千万不要一上来就跑S曲线加减速。我每次给新板子上电都会遵守以下步骤先把微步进模式设为整步通过程序产生一个固定频率例如先用100Hz的慢速STEP脉冲确认电机能在低转速下平稳转动。这一步只验证接线和驱动芯片是否工作不涉及任何算法。100Hz确认没问题后提高到1kHz观察电机是否有噪音、发热或丢步现象。如果1kHz都跑不好先别急着调算法回头查电源、电流和机械装配。确认固定频率运行稳定后再切入加减速曲线程序。把目标速度设得低一点验证梯形曲线的加速、恒速、减速三个过程是否连贯。最后再测高速段和微步进模式。注意带电状态下插拔电机线是大忌。步进电机的绕组感应电压很高插拔瞬间会产生电压尖峰轻则损坏驱动芯片重则损坏MCU。所有接线操作都要在断电状态下进行这是一条安全红线。6. 最后分享一点个人体会这套方案我已经在不同项目里反复用过几轮整体感受就是设计和调试都很“直给”没有太多弯弯绕绕。DRV8818的电流设定、微步进切换和故障输出这几个功能基本覆盖了工业设备对步进电机驱动90%的需求PIC18F86J11的定时器中断配合查表加减速在8位平台上也能做出不错的运动平滑度。如果后续要往更高性能走可以在硬件不变的前提下把PIC18F的单片机换成带更多定时器的型号或者把DRV8818换成带PWM/SPI接口的驱动芯片但对大多数中小负载的定位场景这套组合已经能交出让人满意的答卷。项目中对这块板子做的最值得的一项投资就是在PCB上预留了VREF测试点和电流波形测试点后面任何一次调试和维护都省下了不少探头乱戳的时间。
返回列表