ARTICLE DETAIL

资讯详情

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

DRV8818+PIC18F57Q43:双极步进电机驱动控制实战方案

DRV8818+PIC18F57Q43:双极步进电机驱动控制实战方案 做工业设备和机器人项目最常打交道的就是步进电机。这东西便宜、皮实、控制简单但真要把它驱动好不是拿个模块接上就完事。我这几年做运动控制板用得比较顺手的一套组合是DRV8818PWPR 驱动芯片加 PIC18F57Q43 单片机专门驱动双极步进电机应用在直线模组、小型机械臂关节这类场景。这篇文章就以这个组合为主线把从选型、硬件电路、固件写到现场调试的整套经验完整记录下来。先说结论如果手里项目的电机是 NEMA17、NEMA23 这类中小型双极步进电机供电在 9V 到 45V 之间需要的是简单可靠的定位或平稳速度控制那么 DRV8818PWPR 加一颗几十脚的 PIC18F57Q43比去采购现成的步进驱动器模块更可控、更便宜也更容易嵌入到自己的电路板上。下面我把整套方案的细节和踩过的坑都摊开讲。1. 方案整体设计为什么是这颗驱动芯片加这颗单片机1.1 DRV8818PWPR 的定位与优势DRV8818 是 TI 的一颗集成双 H 桥步进电机驱动芯片封装是带散热焊盘的 PWP。所谓双极步进电机就是电机内部有两相绕组通常引出 A、A-、B、B- 四根线需要 H 桥来切换电流方向。DRV8818 内部正好集成了两个 H 桥外部不需要再搭分立 MOS 管桥几颗外围元件就能把电机带起来。这颗芯片我最看重的几点第一是它采用 STEP/DIR 接口MCU 只需要给脉冲就能控制步数和速度方向由电平决定控制逻辑非常干净。第二是它支持微步进通过 DA0、DA1、DA2 三个引脚组合可以配置整步、半步、1/4 步、1/8 步、1/16 步对降低低速振动和噪声帮助非常大。第三是它内部集成了电流斩波调节不需要像早期方案那样外接采样电阻。它的 VREF 引脚用于设定绕组电流阈值配合 PWM 斩波方式把电机电流限制在目标值附近占用的 PCB 面积比分立方案小得多。需要说明的是DRV8818 的工作电压官方标称范围覆盖常见工业母线电压供电端可以用 24V 或 36V 这类电源。出厂的电流能力在规格书里有明确峰值但实际持续电流一定要降额使用不能按峰值一直跑。我一般把它定位在驱动额定电流 2A 以内的中小型电机尤其 NEMA17 规格的电机额定电流一般在 1.2A 到 1.8A非常合适NEMA23 则要看具体电流和散热条件。1.2 PIC18F57Q43 在运动控制里的价值PIC18F57Q43 是 Microchip 的 PIC18 系列单片机主频可以到 64MHz这在同类 8 位机里算是相当能打的了。但真正让它适合做运动控制核心的不是主频数字而是它的 CIP 核独立外设。什么叫核独立外设简单说就是很多功能外设不靠 CPU 一条条指令去“喂”外设自己能干活。比如 NCO 数控振荡器可以独立产生精确频率的方波如果想发匀速的 STEP 脉冲可以让它直接输出到引脚CPU 在旁边睡觉都行CLC 可配置逻辑单元可以把几个信号组合成复杂时序DMA 可以在外设和内存之间搬运数据。做步进电机控制时这些外设能显著降低 CPU 占用让单片机有余力去处理通信、按键、显示、限位开关这类杂事。另外开发工具链对工程师很友好。MPLAB X IDE 和 XC8 编译器都是免费工具还有 MCC 代码生成器帮初始化外设项目上手速度比想象中快。所以就算不熟悉 PIC 平台的人花一个周末也能跑通基本脉冲控制。1.3 这套组合的边界在哪里我不建议把 DRV8818 用在所有场合。如果电机额定电流超过 2A 很多或者工作在环境温度很高的机柜里必须认真核算散热如果设备对动态响应要求很高比如要求几千转每分钟还要带大负载那应该考虑伺服或者闭环步进方案而不是开环步进加普通驱动芯片如果系统需要复杂的 S 型曲线、电子凸轮、多轴联动插补虽然这套组合也能做一部分但不如专用运动控制方案舒服。这套方案最合适的场景是小批量、中低速、定位精度要求不那么苛刻的轴控。一个典型的例子桌面型三轴机械臂的关节或者一条小传输线上的定位模组。此类需求核心是“把电机转得稳、定位准、不丢步”DRV8818 加 PIC18F57Q43 刚好是性价比很高的落地方案。2. 硬件电路设计让驱动芯片稳定工作是门手艺2.1 电源、VREF 与最小外围电路DRV8818 的外围电路并不复杂但有几个地方处理不好就会出问题。先说电源。电机电源 VM 和单片机逻辑电源必须分开布置VM 引脚旁边要有足够的储能电容通常我会放一个 47µF 到 100µF 的电解电容再并一个 0.1µF 陶瓷电容。陶瓷电容负责滤高频电解电容负责吸收电机加减速时的能量波动。如果电源线是从开关电源拉过来的线比较长时建议在电路板输入端再加一级共模电感或磁珠避免电机斩波噪声反向传导。DRV8818 内部的电荷泵需要外部接一个电容一般是一个 0.1µF 的陶瓷电容接在 CP1 和 CP2 之间。这个电容不要省也别用错容值它负责产生高侧 MOS 管的驱动电压。实际打样中我见过有人没装这个电容结果是电机完全没力矩查了半天。VREF 是设定电机电流的关键引脚。DRV8818 因为没有外部采样电阻电流阈值是由 VREF 引脚电压决定的数据手册里有 VREF 和峰值电流的对应关系。我的做法是打样阶段先别急着定电阻用一个 10k 电位器从 3.3V 分压接到 VREF现场边跑边调。把电流目标设在电机额定值的 75% 到 85% 左右听电机声音、摸芯片温度稳定了之后再把电位器换成固定电阻。这个“先电位器后固定电阻”的办法能省掉不少来回改板子的时间。VREF 引脚上要加一个 RC 低通滤波电阻 1k、电容 0.1µF 就足够防止数字噪声耦合进去影响斩波电流精度。2.2 MCU 侧最小系统与引脚分配PIC18F57Q43 我通常用 3.3V 供电DRV8818 的逻辑输入兼容 3.3V 电平所以两者可以直接相连不需要电平转换芯片。MCU 最小系统包括电源去耦、MCLR 复位引脚上拉、ICSP 烧录接口。如果只是做简单运动控制内部振荡器就够用但是一旦要涉及多轴同步或者通过串口做远程指令我建议外部接一颗精确的晶振否则长期累计的时钟偏差会让定位误差越来越明显。引脚分配上每个轴需要 STEP、DIR、ENABLE、nFAULT 四根信号外加可选的 DA0、DA1、DA2 微步配置脚。以单轴为例我常用 RC0 做 STEPRC1 做 DIRRC2 做 ENABLERC3 接 nFAULT。这里有一个细节nFAULT 是开漏输出正常工作时是高阻态必须外部接一个 10k 上拉到 3.3V否则单片机读到的电平是浮动的故障检测会失效。DA0 到 DA2 如果不需要运行时切换微步可以直接接死到高或低电平如果要在软件里动态切换就接到普通 GPIO。上电时序是很关键的一环。C1E 我习惯这样处理先把 MCU 初始化完成再把 DRV8818 的 nSLEEP 引脚拉高之后延迟几十毫秒最后再使能驱动输出。如果上电瞬间 MCU 还在跑程序GPIO 状态不确定而驱动芯片已经使能电机可能抽搐一下现场看起来非常吓人。固件里加一个延时实际上就是避免这种“不可控瞬间”。2.3 PCB 布局散热焊盘和地平面PWP 封装底部有一个裸露的散热焊盘这个焊盘必须焊接到 PCB 的铜箔上并且尽量多打过孔到背面铺铜。很多第一次用这颗芯片的人容易忽略这一点结果芯片空载没问题一带负载电流就过热保护还以为是芯片质量问题。实际上就是把热焊盘当摆设了。PCB 布局上功率回路要尽量小。电机电源进线先经过大电容再到 VM 引脚输出 A/A-/B/B- 到电机连接器之间走线要短而粗。逻辑地和功率地建议单点连接避免电机电流在逻辑地上形成电压差干扰单片机。VREF 引脚周围不要走功率线它本身是模拟参考最怕噪声。实际项目中我还习惯在电机连接器旁边加上 TVS 二极管防止现场工人带电插拔电机时把驱动芯片打坏。3. 固件实现从会转到转得稳3.1 用定时器中断产生 STEP 脉冲DRV8818 的 STEP 引脚通常是在上升沿走一步所以单片机要输出一定频率的方波。最简单的实现方式是用一个定时器中断把 STEP 引脚电平翻转翻转频率控制好电机速度就控制好了。我习惯把定时器配置成 1µs 一个 tick这样计算脉冲周期非常直观。假设目标速度是 1000 步每秒一个完整脉冲周期是 1000µs那么定时器每隔 500µs 溢出一次每溢出一次翻转一次 STEP 引脚就得到 1000Hz 的方波电机每秒走 1000 步。用 C 语言写出来大概是这样一个结构volatile uint32_t targetSteps 0; volatile uint32_t doneSteps 0; volatile uint16_t stepHalfPeriod 500; // 单位 µs void __interrupt() stepTimerISR(void) { if (PIR0bits.TMR0IF) { PIR0bits.TMR0IF 0; LATAbits.LATA0 ~LATAbits.LATA0; // 翻转 STEP if (LATAbits.LATA0 1) { // 一个完整脉冲完成 doneSteps; if (doneSteps targetSteps) { T0CON0bits.T0EN 0; // 停止定时器 LATAbits.LATA0 0; // STEP 复位 } } } }这段代码不追求工程完整性但把核心逻辑表达清楚了中断里翻转引脚同时统计已完成步数到目标后停机。实际项目中我会把 targetSteps、doneSteps 这种变量用结构体封装多个轴各维护一套但原理就是这个原理。3.2 加减速曲线不要拿电机当开关用步进电机最忌讳的一件事就是直接从一个极高的频率起步。电机转子的机械惯性跟不上脉冲频率立刻丢步。丢步的症状就是电机嗡嗡响但不走或者走到一半位置偏了。工业定位场景里丢步经常是灾难性的。所以运动控制必须加加减速。最常用也最容易调的是梯形速度曲线速度从启动速度开始线性增加到目标速度后保持匀速接近目标位置时再线性减速到停止。这里有几个工程参数要定清楚。启动速度不能太高也不能太低我的经验是 200 到 400 步/秒之间比较合适太低浪费时间太高起步瞬间容易丢步。加速步数则取决于负载惯量惯量大就多给几步加速不要抠得太紧。定时器中断方案下加减速其实就是动态改变 stepHalfPeriod 这个变量。步骤间隔 interval微秒和速度的关系是interval 1000000 / (2 × stepPerSec)比如目标速度 1000 步/秒interval 就是 500µs。加速过程就是每隔若干步把 interval 往下调一小段比如每步减 1µs速度就慢慢爬上来减速过程反过来interval 逐步增大。梯形曲线最关键的细节是减速点判断当“剩余步数”小于某个阈值时就开始减速不能等走到目标了才急刹。我常用的判断是剩余步数小于减速步数乘以 2 时进入减速区留出足够余量。3.3 方向切换、使能和故障联动方向上DIR 引脚的电平决定电机的旋转方向。这里有一个很实用的经验不要在运行中切换 DIR。虽然驱动芯片本身不禁止但运行到一半突然改变方向电流相位瞬间变化轻则丢步重则机构受力异常。软件逻辑上要做保护收到换向指令时先把运动停下来再切 DIR再启动新的运动。ENABLE 引脚用来控制驱动输出。电机需要保持位置时使能不需要时可以关闭节省功耗也降低芯片温度。有些设备为了省事一直开着使能结果电机和芯片都发热严重其实完全没必要。另外要注意驱动芯片的使能极性不同芯片定义不一样以官方数据手册为准。我调试时习惯先用手拧一下电机轴能明显感到阻力就说明使能生效了然后确认固件里的电平状态和预期相符。nFAULT 引脚接的是故障标志低电平表示芯片检测到故障。固件里最好做成硬性联动读到 nFAULT 为低立刻停止发脉冲关闭驱动同时把故障状态放到一个寄存器里供上位机查询。工业场景里“发生了故障还在继续发脉冲”是绝对不能接受的行为。还可以把这个信号接到单片机的外部中断引脚这样故障发生时 MCU 能第一时间响应而不是轮询等半天。3.4 多轴扩展的思路一台机器人往往不止一个轴。PIC18F57Q43 有多个定时器但多个轴各自的加减速曲线如果各占一个硬件定时器外设迟早不够用。更好的做法是用一个定时器做统一时基比如 1ms 中断一次每个轴维护自己的计数器、步数状态和加减速参数。中断里扫描所有轴判断哪个轴该翻转 STEP 就去翻转哪个。这种做法牺牲了一点实时性但对大多数轴控场景足够而且硬件资源占用很省三个轴五个轴都能撑住。微步配置方面如果多轴都用同一个微步分辨率DA0、DA1、DA2 可以几颗芯片并联接到同一组 GPIO或者直接硬件跳线接死省下宝贵的 IO。如果不同轴需要不同的微步那就要各自分配 GPIO按轴独立设置。后者在机器人关节这种场景有价值因为不同关节负载和速度要求不同。4. 现场调试常见问题排查实录4.1 电机不转也没锁止力矩这是最常见的问题。先不要怀疑芯片坏了按顺序排查先量 VM 电压有没有再看 nSLEEP 是不是被拉高了这个引脚如果悬空或拉低芯片整个是休眠状态然后确认 ENABLE 使能状态对不对用手拧电机轴试试有没有阻力如果都没问题再看 STEP 引脚有没有波形。我在调试时习惯把逻辑分析仪夹在 STEP 和 DIR 上单片机跑一下运动指令马上能看出来固件到底有没有输出脉冲。还有一个容易忽略的点就是 CP1 和 CP2 之间的电荷泵电容漏焊了这在前面说过症状就是完全无力矩。4.2 运行中丢步、出现异响丢步通常有三个原因加速太猛、电流不够、负载卡滞。加速太猛是最常见的解决办法就是把梯形加减速拉得更平缓。电流不够的表现是电机声音发闷、力矩不足这时候可以把 VREF 稍微调高一点但不要超过电机额定电流否则电机和芯片都容易过热。负载卡滞则要检查机械侧比如导轨有没有异物、丝杠有没有别劲。我遇到过几次“写代码查半天结果发现是联轴器螺丝松了”的情况所以先确认机械传动没问题再去改软件。异响和振动大多半和微步设置有关。整步模式下低速运行振动很厉害这是双极步进电机的固有特性不是故障。解决方法是把微步切到 1/8 或 1/16低速噪声和振动会明显改善。另外电流斩波频率和衰减模式也会影响噪声这部分参数芯片手册里都有说明现场可以对比调整。4.3 芯片过热和上电瞬间乱冲芯片发烫首先检查持续电流是否设置得过高摸一下电机温度和芯片温度作对比。如果电机不热芯片热多半是散热焊盘没有焊好或者持续电流超过了实际散热能力。遇到这种情况我一般会把 VREF 电流调低一点同时检查 PCB 背面散热铜箔面积够不够。工业环境温度高的话整机设计时要考虑风道不能指望芯片在 60 度环境里还跑满电流。上电瞬间电机乱冲是硬件和软件共同问题。硬件上电源电压建立需要时间MCU 启动也需要时间两者不同步就会产生不可控状态。软件上初始化时先让驱动处于禁用状态等系统完全稳定后再发使能信号。另外电机的电源可以用一个 MOS 管或继电器做延时上电先让逻辑先跑起来再给功率部分上电这个电路在许多工业控制板上都能看到。4.4 常见问题速查表现象可能原因处理办法电机不转、无锁止电源没通、SLEEP 拉低、使能极性错误、CP 电容漏焊按电源→SLEEP→ENABLE→STEP波形顺序排查只有一个方向转DIR 信号不变化或接反用逻辑分析仪看 DIR反转电平测试运行中丢步加速太陡、电流不足、机械卡滞调缓加减速、调高VREF、检查机械低速振动大微步分辨率不够切到1/8或1/16微步芯片烫手电流设置过高、散热焊盘虚焊降电流、补焊热焊盘、增大散热铜箔nFAULT 一直低过流、过温、VM 欠压读取故障条件断电检查负载和电源5. 在工业与机器人场景中的实际落地建议5.1 从直线模组到机械臂关节这套方案最适合的场景严格说不是高动态伺服型应用而是“位置可控、速度可控、要能锁住”的运动轴。直线模组是典型例子用一根丝杠把步进电机的旋转变成直线运动行程两端放两个限位开关MCU 负责走梯形加减速定位精度靠微步和丝杠导程保证。PIC18F57Q43 的 GPIO 资源很充足限位开关、原点开关、急停按钮都可以直接接进来不需要再外扩一堆芯片。小型机械臂的关节也适用。在关节处装一台 NEMA17 加行星减速箱用 DRV8818 驱动固件里做位置计数器机械臂末端就能完成开关门、搬运小物件这类动作。这种应用对绝对精度要求不高但对“每次走到同一个位置误差要小”有要求而这正是步进电机加微步的强项。当然开环步进有一个前提就是设备要有限位和原点校准否则累计丢步会让机器慢慢跑偏。5.2 长期运行的可靠性经验工业设备不是实验室桌面跑个十分钟而是每天连续运转可靠性是硬指标。几条比较关键的经验第一电机电缆尽量用屏蔽线屏蔽层单端接地第二驱动板放在金属机箱里接地要可靠第三电机电源入口加防反接和 TVS防止现场操作失误烧板子第四固件里开看门狗万一程序跑飞至少要能自动复位而不是让电机保持在一个未知状态。关于故障恢复我的习惯是出现 nFAULT 故障后如果要恢复运行先强制机构回一次原点重新确定位置再切入正常工作。步进电机的开环特性决定了它没有能力知道自己丢了多少步所以哪怕故障只是瞬间过流最好的策略也是回原点而不是接着跑。这个设计思路必须在需求阶段就和机械工程师对齐否则软件流程会很别扭。5.3 往下还能怎么扩展这套组合的升级路径也很清晰。如果从单轴变多轴PIC18F57Q43 的外设资源基本够用如果需要联网单片机本身有 UART、SPI、I2C配合无线模块或者工业总线收发器就可以接入整个产线系统如果需要提升定位闭环能力可以在电机后面加编码器把编码器信号接回 PIC18F57Q43利用 DMA 和 CLC 外设做半闭环补偿成本也不会增加太多。我个人在实际操作中最想提醒的是DRV8818 这颗芯片的 VREF 调节一定要耐心。很多人一上来就把电流调到最大以为这样力矩最大最稳结果电机烫、芯片烫、噪声大最后定位精度反而变差。电机在额定电流的 80% 左右配合合适的微步和加减速往往运转最安静、寿命最长。电流、速度、微步这三个参数是一个需要互调的三角形不是某一项越大越好。做步进控制这么多年这样的调整经验远比单纯把芯片连上电更重要。
返回列表