尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

四轴步进电机驱动板实战:DRV8818与PIC18F4455的选型、电路与固件设计

四轴步进电机驱动板实战:DRV8818与PIC18F4455的选型、电路与固件设计 1. 项目背景与选型逻辑DRV8818PIC18F4455 这套组合是怎么定下来的年前接了个桌面点胶机运动控制板的项目三根直线轴加一个旋转轴四台双极步进电机供电统一用 24V 工业开关电源上位机要能在线改轨迹参数。主控最后定了 PIC18F4455驱动芯片选了 TI 的 DRV8818PWPR。整套方案从选型到三块样机跑通大概用了三周中间包括两次改板。这篇文章我就按实际推进的顺序写先讲为什么是这两颗料再讲电路、固件、实测和踩坑给正在做类似多轴步进控制的同行一个直接可参考的版本。1.1 先盘需求再谈选型选驱动芯片之前我习惯先列一个硬性需求清单不然很容易被便宜大碗的模块带偏。这个项目的电机是四线双极步进NEMA17 和 NEMA23 混用额定电流分别在 1.2A 和 1.7A 附近步距角都是 1.8°也就是整步 200 步一圈。控制要求是 STEP/DIR 这种最传统的接口——不是我不想用总线型驱动器而是上位机轨迹算法在 PC 端算好单片机只需要按步进脉冲执行这种模式下 STEP/DIR 最简单、也最容易定位问题。供电是 24V这个电压对双极步进很友好驱动器工作电压范围要覆盖 24V 并留有余量电流能力要覆盖 1.7A并且不是峰值而是持续值细分至少要能到 1/8因为细分不够时低速下能明显感觉到振动和噪声还要有故障反馈脚出现过流、过温时 MCU 能第一时间知道。最后一条往往被忽略但工业设备上驱动器过热了还在硬顶是最尴尬的事故。1.2 为什么是 DRV8818PWPR而不是 A4988/DRV8825 模块市面上常见的步进驱动方案我大致分三类一是成品模块A4988、DRV8825 之类的蓝色小板便宜、接线简单、教程多二是驱动器厂家的一体化驱动器适合直接用脉冲接口、不用自己画驱动电路的场景三就是自己画板把驱动芯片直接做到主控板上。这个项目小批量、多轴、驱动器和主控需要贴在一起明显走第三条路。在驱动芯片的选择上我对比过 A4988、DRV8825 和 DRV8818。A4988 模块的问题是热设计太差小板子上给芯片散热的地方有限1A 以上长时间运行MOS 全桥温升很快而且模块批次质量参差不齐工业上我不敢批量用。DRV8825 细分能到 1/32电流也能到 2.5A但它需要在电机回路外接采样电阻PCB 上加两个精密电阻不难但采样电阻的压降和发热在小板上也是负担。DRV8818PWPR 最吸引我的是内部电流检测——电机电流直接反映到芯片内部的检测结构上不需要外接采样电阻外围一下子少了几颗料。再就是封装和供货。PWPR 后缀对应 HTSSOP-28 带散热焊盘的封装芯片底部有一个大的 PowerPAD数据手册明确要求把它焊接到 PCB 的铺铜上并配合过孔散热。也就是说只要按照手册好好画板持续 1.5A 以上是稳的。DRV8818 规格上工作电压 8V 到 35V覆盖 24V 供电余量充足驱动电流标称峰值 2.5A配合良好散热能持续 1.5A 左右项目里最大的 NEMA23 电机额定 1.7A我整定到工作电流 1.4A 左右留了余量。TI 这颗料在工业渠道里生命周期长不缺货、不轻易停产这对量产项目比什么都重要。1.3 主控为什么选 PIC18F4455主控这件事上团队内部其实争论过有人建议 STM32有人建议直接 Arduino 加快开发。我坚持用 PIC18F4455 的理由有三个。争论本身不解决任何问题关键是搞清楚这个项目到底需要主控提供什么可靠的定时器、足够的 IO、稳定的供货以及顺手到不用翻手册的工具链。基于这四条答案就很明确了。第一是电平匹配。DRV8818 的逻辑输入按 5V 电平设计PIC18F4455 的 IO 正好也是 5VSTEP、DIR、MODE、使能这些信号直接连不需要电平转换。用 3.3V 主控不是不行但要仔细确认驱动芯片逻辑输入的高电平阈值尤其是 STEP 这种高速信号电平裕量不够时在长线上很容易误触发。第二是资源够用不浪费。PIC18F4455 有 24KB Flash、2KB RAM 和 256B EEPROM四轴步进控制程序加通信协议完全放得下内置 4 个定时器我们一个 Timer 管一个轴的步进脉冲中断开销也能接受。第三是板载全速 USB虽然项目第一阶段用的是 UART 接上位机但后面想做 USB 示教器时PIC18F4455 的 USB 模块能直接派上用场不用换平台。还有一个现实因素这套工具链我们团队已经非常熟了XC8 编译器的行为、烧录器的调试手段都清楚在交期紧的时候用熟悉的东西比用更时髦的东西靠谱得多。2. 硬件电路设计把 DRV8818PWPR 正确焊到板子上选完芯片马上进入画板环节。DRV8818PWPR 是 HTSSOP-28 封装引脚间距有限样机阶段我们先做了一块转接板验证再画正式的四轴板。这里把外围电路设计的几个要点摊开讲都是数据手册里有但很多人不重视的。2.1 电源与去耦步进电机驱动是典型的脉冲负载电流变化快、瞬时幅度大。VM 脚附近必须放两个电容一个大容量的电解电容一个高频陶瓷电容。我用了 100µF/50V 电解加 0.1µF 陶瓷并排放在芯片旁边位置离 VM 引脚尽量近。道理不复杂chopper 频率通常在几十 kHz 级别开关瞬间电流可能到几安培如果电源路径上电感太大VM 电压会被拉出明显毛刺轻则影响步进精度重则触发芯片的欠压保护。多轴板子上四片 DRV8818 共享 24V我还在板子电源入口加了一个 470µF 的储能电容。实测多轴同时启动时电压跌落能控制在 0.5V 以内。逻辑供电 VDD 我单独用一个 LDO 从 24V 转 5V给 PIC18F4455 和 DRV8818 的逻辑部分使用不跟电机功率电源混用。工业上最容易出的问题就是逻辑电和功率电共用一条路径电机一加速逻辑电压跟着抖单片机自己的 ADC 和通信全乱。这一条值得任何做电机控制板的人记住。DRV8818 内部上管用自举电容驱动CP1 和 CP2 之间要接一个陶瓷电容具体容值按手册取典型值在 10nF 到 47nF我用的 22nF/50V X7R。VCP 脚还要再放一个储能电容。这两颗电容位置要尽量贴近芯片不能用长引线否则自举电压建立不起来上管导通不充分电机电流波形会很难看高速时扭矩掉得厉害。2.2 控制接口与电平DRV8818 的逻辑输入包括 STEP、DIR、MODE0、MODE1、nENABLE、nRESET全部由 PIC18F4455 的 IO 直驱。5V 对 5V电平兼容性没问题。MCU 输出高电平在 4.5V 以上驱动芯片的高电平阈值通常在 2V 左右裕量充足。要注意的是 nENABLE 和 nRESET 都是低电平有效MCU 上电到初始化完成之间存在一个不确定窗口我的做法是初始化第一件事就把这两个脚的电平固定nRESET 拉低至少 1ms 再释放nENABLE 直接拉低让驱动器输出使能不依赖芯片内部的默认状态。nFAULT 是开漏输出本质是集电极开路结构所以 MCU 端必须加上拉电阻我用 10kΩ 上拉到 5V然后接到 PIC18F4455 的外部中断脚。正常工作时 nFAULT 为高电平一旦发生过流、过温或欠压它会被拉低。MCU 端配置成下降沿中断进中断后把四个轴的使能全部拉掉也就是急停逻辑。这一步的时序很关键后面实测部分会细说。2.3 PowerPAD 散热设计这是我这次最想强调的一节。HTSSOP-28 这种封装的散热能力九成取决于 PCB 怎么处理底部焊盘。DRV8818PWPR 底面那个大焊盘不是摆设数据手册明确要求把它焊接到 PCB 上对应的铜皮区域再通过过孔连到背面铺铜。我的做法是芯片正下方放一块比封装略大的铺铜区面积大约 4mm x 4mm 以上铺铜通过过孔连到背面大片的 GND 铜皮。过孔打 9 到 12 个直径 0.3mm 左右间距 0.8mm 左右孔内电镀保证导热。这里有个细节过孔尽量分布在焊盘边缘避免正中心的孔让焊盘表面凹凸不平导致芯片底部无法平整贴合。如果工厂允许树脂塞孔那是最好的。手焊的话先给 PCB 焊盘和芯片底部镀锡用热风枪 350°C 左右、风速中档看到焊锡从四周冒出来说明吃锡到位。千万不能只用烙铁焊一圈引脚、中间焊盘悬空那样芯片散热基本靠十几根细腿等于没焊。轻则发烫重则频繁触发过温保护。我第一次搭转接板时就是中间焊盘没处理好跑 1A 电流十分钟就触发了 OTP后来补焊处理好之后同样电流跑半小时温度低了近 20°C。2.4 保护、隔离与电机接线先讲电机线的识别。双极步进电机通常引出四根线用万用表电阻档测两两导通且阻值相等的是一相。比如 42 电机常见的红绿蓝黑四色红绿一个绕组、蓝黑一个绕组但不同厂家的线色不一定一致务必实测别只信标签。DRV8818 的 AOUT1/AOUT2 接 A 相BOUT1/BOUT2 接 B 相。接反不会烧但方向会反过来在软件里对调 DIR 逻辑就能解决。这个项目用到三米左右的电机线线缆长了之后电机绕组的寄生电容和线缆分布电感会让相电流的开关边沿变差。我的处理是在驱动器输出和电机之间串一个小的磁珠并在输出端并一颗 100pF 到 1nF 的陶瓷电容做吸收。注意吸收电容不能太大太大会额外吞掉电流波形降低有效扭矩。如果现场电磁干扰更严重还有一个更稳妥的选择STEP、DIR、nENABLE 都用高速光耦隔离。STEP 频率高必须用 6N137 这类高速光耦DIR 和使能这类低频信号用 PC817 就够。但光耦会引入延迟STEP 信号穿过光耦后边沿会变缓我的建议是隔离之后加施密特整形或者把 STEP 脉宽放宽到 10µs 以上。实际情况是这个项目控制板装在电柜里MCU 板和驱动板之间距离不到 20cm我暂时没用光耦把隔离方案留给了下一个环境更恶劣的版本。3. 固件实现从点动脉冲到加减速曲线硬件画好焊好只是开始真正决定一个步进系统好不好用的是固件。PIC18F4455 上我用 XC8 编译器C 语言解决全部问题。这里讲四个核心模块STEP 脉冲生成、速度换算、加减速曲线、故障处理。3.1 定时器产生 STEP 脉冲新手最容易犯的错误是拿延时函数去凑 STEP 脉冲拉高、延时、拉低、延时。这在单轴、低速度、没有其他任务的时候勉强能用但项目里四轴联动MCU 还要同时跟上位机通信延时方案直接出局。正确做法是用定时器产生时间基准到点就给 STEP 引脚一个动作。我的实现用 Timer1 做步进周期定时。PIC18F4455 的 Timer1 是 16 位计数器时钟源用内部指令时钟 Fosc/4主频 48MHz 时定时器输入就是 12MHz。中断服务里做两件事按当前周期重装计数值然后把 STEP 引脚拉高。STEP 拉高之后要维持一个最小脉宽我直接在中断里用短延时保持 10µs 再拉低。这个宽度既能满足 DRV8818 的输入要求又不会让 ISR 占用太多时间。核心代码长这样// XC8, PIC18F4455, 主频 48MHz // STEP 引脚定义为 RB2方向和使能引脚按实际板卡分配 #define STEP_PIN LATBbits.LATB2 unsigned int step_period; // 当前步进周期单位 Timer1 计数 bit motor_dir; // 电机方向 void __interrupt() high_isr(void) { if (PIR1bits.TMR1IF) { PIR1bits.TMR1IF 0; TMR1H (unsigned char)((0xFFFF - step_period) 8); TMR1L (unsigned char)(0xFFFF - step_period); STEP_PIN 1; __delay_us(10); // 脉冲高电平宽度约 10us STEP_PIN 0; if (motor_dir) motor_pos; else motor_pos--; } }代码里要注意两个问题。一是 Timer1 重装必须一次性写完 TMR1H 和 TMR1L拆开写会造成计数器瞬间跳变、周期不准这个在数据手册的中断注意事项里专门提过。二是 ISR 里的 10µs 延迟在高步进率下会占掉周期的一部分。比如步进频率到 20kHz 时周期只有 50µs其中 10µs 是延迟开销计算实际步进率时必须把这部分算进去更稳妥的做法是 20kHz 以上时把脉宽收到 2µs或者干脆用第二个定时器负责拉低 STEP让频率定时器只管周期。3.2 细分与速度换算DRV8818 的 MODE0 和 MODE1 两个引脚组合出四档细分全步、半步、1/4 步、1/8 步。电路上我用 MCU 的两个 IO 控制运行中也能动态切换。这个项目最终固定在 1/8 细分理由后面实测部分展开。细分和速度的换算关系必须理清这个公式是所有运动参数计算的地基。电机整步 200 步转一圈1/8 细分之后每一步是 0.225°转一圈要 1600 个微步。设移动速度 Vmm/s、丝杆导程 Lmm/转、细分后每转步数 S步进频率就是步进频率 f(Hz) V / L * S举例导程 5mm 的丝杆目标速度 30mm/s转数就是 6 转/秒1/8 细分每转 1600 步得到 9600 步/秒。Timer1 在 1 分频下的计数值就是period 12,000,000 / 9600 ≈ 125016 位定时器能装到 65535所以 1 分频下最低能表示的步进频率大约就是 12M/65535 ≈ 183Hz。这意味着 100Hz 以下的超低速必须加大预分频。我在代码里做了一个速度到定时器配置的映射函数频率大于 2kHz 用 1 分频200Hz 到 2kHz 用 8 分频更低用 64 分频切换预分频时同步把计数值重新算好。目标速度步进频率1/8 细分Timer1 计数值1 分频60 mm/s19200 Hz62530 mm/s9600 Hz125010 mm/s3200 Hz37501 mm/s320 Hz需要 8 分频算好频率只是第一步代码里真正做的是把频率换算回 Timer1 的计数值因为中断只认计数值不认频率。上面这张表我在程序里写成了一张配置结构体启动时直接查表避免运行中反复做除法。3.3 梯形与 S 形加减速步进电机的输出扭矩随转速升高而下降原因是反电动势的分压转速越高绕组上用于建立电流的电压越少。所以从零直接启动到目标速度高速段必然力矩不足结果就是失步。解决手段就是加减速。最简单实用的是梯形速度曲线加速段、匀速段、减速段。加速段每个微步把速度提高一点表现在定时器上就是 step_period 从大往小改。我的做法是定义三个参数启动频率 f_start、运行频率 f_run、加速步数 accel_steps。加速段每产生一个脉冲就把当前频率增加 (f_run - f_start) / accel_steps再换算成新的 step_period。减速段反向对称。梯形曲线在大多数点到点移动场景下够用代码量小、调试直观。梯形曲线的缺点是加速度突变点存在冲击机械上表现为明显的顿挫感。机器人关节这种对运动平滑度有要求的场合我倾向 S 形曲线。S 形比梯形多的一层是加速度本身也按直线变化也就是加加速度为常数。实现上我用查表法把加速度曲线预先算成一张 64 到 128 项的表运行中的加速段按表项周期逐步改变计算量很小PIC 完全扛得住。本质上都是同一句话别让定时器的计数值猛跳要让它按预定的曲线平滑过渡。3.4 状态机与故障处理固件里每个轴都维护一个小状态机状态包括 IDLE、ACCEL、RUN、DECEL、DONE。运动指令进来后先算总微步数再按加减速分配三段步数最后启动 Timer1。位置计数器 motor_pos 在每次脉冲时更新上位机随时可以读取当前坐标。这个结构很简单但工业现场调试时非常有用因为你可以随时停下来看命令走了多少步、实际该在什么位置。故障处理上nFAULT 中断进来之后我做了三件事先把全局急停标志置位把四轴的 nENABLE 全部拉高释放电机然后向上位机报警。注意一点nFAULT 触发后 DRV8818 内部已经做了保护动作MCU 不要立刻重启驱动器先搞清楚故障类型等温度降下来或者过流源排除之后再让上位机发恢复指令。我在代码里加了一个冷却计时10 秒内不允许重新使能。这个细节虽然简单但能避免很多一恢复又立刻保护的循环问题。4. 工业与机器人场景的实测波形、温升、噪声与失步样机焊好、固件能转之后真正花时间的是上电实测。这一部分我把遇到的和最常见的几个问题串起来按调试顺序讲。4.1 示波器实测波形第一步永远是量 STEP 信号。把示波器探头接到 STEP 引脚确认脉冲宽度、频率与程序设定一致。DRV8818 这类驱动对 STEP 的最小脉宽有要求一般在 1µs 到 2µs 级别我自己把脉宽固定在 10µs既有足够裕量又不会让定时器占用率太高。如果 STEP 信号本身就不对后面电机出现什么怪毛病都可能先从这里排除。第二步量相电流。用电流探头夹在电机一相上能看到典型的 chopper 斩波波形微步过程中电流按正弦包络建立同时叠加高频斩波纹波。这个波形信息量很大如果电流包络明显变小说明 VM 供电不足或自举电容有问题如果电流建立很慢说明电机绕组电感大而供电电压不够高高速力矩会不足。用示波器看一次比对着数据手册猜半天都管用。第三步量 VM 电压。启动瞬间用双通道同时看 VM 和 STEP电压跌落超过 1V 就要检讨储能电容。有一次我把电容放在离芯片 5cm 以外的地方中间还走了一段细线启动时跌落了近 2V挪近之后立刻好转。电源路径的阻抗比电容总量更重要这是高频负载板上的老规律值得反复强调。4.2 温升与电流整定驱动器工作电流的整定原则是给额定电流留 70% 到 100% 的余量。电机额定 1.7A我整定到 1.4A 左右额定 1.2A 的整定到 1.0A。电流整太高电机和驱动芯片一起发烧整太低力矩不够容易失步。DRV8818 的电流限值通过参考电压脚设置数据手册里有参考电压和输出电流的换算关系按手册算好之后用电阻分压给出。这里必须说一句不同版本手册的系数可能不同别直接抄网上别人板子的分压电阻在自己板子上用电流探头实际确认峰值电流才是最稳的。实测温升我在 24V、1.4A、连续运行 40 分钟的条件下测过。正确做好 PowerPAD 散热的板子芯片表面温度稳定在 60°C 到 70°C 之间用手摸烫但能短时间接触。如果中间焊盘没焊好同样条件下十分钟左右就到 90°C 以上接着就会触发 OTP症状就是电机突然一停、nFAULT 拉低、过一会儿又能动。这类问题排查过程前面已经讲过焊接永远是重灾区。4.3 噪声与谐振步进电机低速抖动、中速振动是祖传问题。原理是电机在整步或低细分模式下转矩输出不是平滑的旋转而是一顿一顿的推进机械结构稍有弹性的地方就会把这种波动放大成振动特定转速下还会激起机械共振。我实测的规律是全步在 30 到 60 步/秒区间抖得最凶1/8 细分后抖动明显缓和再配合合适的电流整定1/8 细分已经是噪声和扭矩之间的良好平衡点。这也是我最终固定在 1/8 细分的原因DRV8818 本身支持到 1/8对这个项目够用而且相比 1/16、1/32 细分的方案在高速时扭矩损失更小。另外两个有效手段一是控制算法上快速通过共振转速加减速做快一点让电机不停留在共振区间机器人关节这种频繁启停的工况非常适用二是调整衰减模式DRV8818 的 DECAY 脚可以选慢衰减或混合衰减。慢衰减在低速时纹波小、发热低但高速时电流跟随性差混合衰减是折中。我最后在慢衰减下跑噪声可接受。4.4 失步与乱走的排查链路失步是步进系统最头疼的故障因为没有位置反馈丢了步你也不知道直到累积误差暴露。我总结的排查顺序是电流 → 加速度 → 电源 → 脉冲质量 → 机械。按这个顺序查大多数问题都能定位到。项目里真实碰到过一次问题Z 轴在快速下降时偶尔偏一两步复现率不高特别难抓。最后用逻辑分析仪同时录 STEP 和 nFAULT发现失步前总有 nFAULT 的一根短低脉冲而 nFAULT 拉低对应过流事件。顺着过流查发现不是电机堵转而是 Z 轴下降时带着负载再生能量回馈到 24V 电源线上让母线电压短暂上升触发了芯片的异常保护。处理方法是把加速曲线调缓并在电源入口加了一个稳压管钳位问题彻底消失。这个案例想说明的是失步的根因经常不在丢脉冲本身而在别的中间环节。排查时一定要用逻辑分析仪这类工具去录制完整的事件序列靠直觉去猜通常只是碰运气。5. 给后来者的参数整定清单与避坑建议最后把这次项目的经验压缩成可以直接抄作业的清单适合第一次做 DRV8818 PIC18F4455 方案的同行。5.1 参数整定清单参数推荐值说明VM 供电24V8-35V 范围内电压越高高速扭矩越好电机电流额定值的 70%-100%用电流探头实测确认细分1/8DRV8818 最高档噪声和扭矩的平衡点STEP 脉宽10µs远高于最小脉宽要求抗干扰启动频率200-400Hz低于此频率可直接起停加速度由负载实测以不失步为上限nFAULT 上拉10kΩ 到 5V开漏输出必须上拉储能电容100µF 0.1µF尽量靠近芯片引脚这个清单不是固定的每条都可以按实际电机和机械结构调整但调整方向要清楚电压和电流主要影响扭矩和发热细分主要影响噪声和平滑度加速度主要影响失步和冲击。改任何一项都要用示波器和电流探头确认实际效果别只看电机动不动。5.2 常见问题速查表下面这个表是把这个项目以及之前几个步进项目里遇到的现象汇总成的一张排查速查表。碰到问题先对照现象找原因再根据原因去检查比漫无目的地改参数快得多。现象可能原因处理办法上电电机不锁死nENABLE 没拉低初始化阶段拉低 nENABLE能锁死但不动STEP 脉宽太窄、DIR 悬空放宽脉冲、DIR 接上下拉高速丢步加速度太陡、电流不足改 S 形曲线、提高电流芯片频繁过热PowerPAD 虚焊、电流过大检查焊盘、降低电流偶发乱走电源尖峰、地环路加滤波、单点接地方向反了A/B 相接反软件对调 DIR 即可5.3 还想继续扩展的方向这个方案的框架搭好之后可扩展的方向不少。如果项目里需要比 1/8 更细的细分可以直接平移到 DRV8825 或 DRV8834接口同样是 STEP/DIR只是 MODE 引脚多一些固件只需要改细分表。如果想把 PC 端示教直接走 USBPIC18F4455 的全速 USB 模块配合 Microchip 的 USB CDC 库把 UART 指令原样搬过去就行这一步对后续维护很友好。更进一步的工业升级是闭环步进在电机屁股上加增量编码器比如 1000 线/转由额外的计数接口实时核对实际位置检测到偏差就补偿一步或多步。PIC18F4455 没有硬件正交编码器接口这个功能可以靠外部计数芯片或者软件计数转速不太高时可行我在实验板上已经验证过软件计数的可行性。真要上这个功能主控大概率要换带正交解码外设的型号但驱动部分 DRV8818 这套仍然可以原样保留——这也是把驱动和控制分开设计的好处。最后再说一点个人心得整套方案里最容易被低估的是电源和散热而不是芯片本身。DRV8818PWPR 和 PIC18F4455 都是成熟可靠的器件出问题的几乎都是外围电容放远了、焊盘没焊好、电源路径太细。把这几个基础功做扎实这套组合在工业和机器人应用里是很能打的。
返回列表