ARTICLE DETAIL

资讯详情

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

PIC18F46K40+DRV8818双极步进电机控制方案设计与实战解析

PIC18F46K40+DRV8818双极步进电机控制方案设计与实战解析 最近改一台老设备需要同时驱动三个双极步进电机一个做平移台一个做旋转转台还有一个管夹爪开合。原来的方案是PLC加成品步进驱动器但客户这回提出要嵌入式小控制板运动逻辑还得能自定义。手头正好有PIC18F46K40样片和DRV8818PWPR驱动芯片索性就用这个组合自己搭了一套控制板。断断续续调了两周从电路到固件到现场安装整个过程踩了些坑也把两颗芯片的特性摸得比较透。这篇文章就是把这次实战从头到尾梳理一遍为什么选这两颗芯片、双极步进电机驱动的基本原理、硬件电路怎么搭、固件怎么写、实测阶段哪些地方最容易翻车。如果你也在做工业设备改造、机器人关节或者小型自动化装置正好考虑用步进电机可以直接照着这个思路做能少走不少弯路。1. 为什么拿这两颗芯片组步进控制链路1.1 在整条链路上DRV8818到底替你干了多少活先明确一下芯片分工。单片机输出的只是3.3V或5V的逻辑电平驱动能力最多几十毫安而步进电机需要的是十几伏到几十伏电压、安培级电流并且相位要不断换流。你不可能用MCU引脚直接推电机绕组中间必须有一级功率驱动。DRV8818内部集成了两套完整的H桥功率级每套H桥由四个功率MOSFET组成A、B两相各一套。MCU只需要给它STEP和DIR信号剩下的换流、电流检测、过流保护、热关断全部在驱动芯片内部完成。这个分工就是典型的“逻辑和功率分离”MCU只负责“算”驱动芯片负责“推”。真正让它适合工业现场的是内置的电流调节功能。步进电机电源母线通常是24V甚至36V而电机额定电流往往只有1A到2A绕组直流电阻有时连1Ω都不到。如果直接通电电流会直接冲到好几安培电机和驱动都扛不住。DRV8818通过内部电流斩波把线圈电流限制在设定值MCU端只需要设置好目标电流剩下的开开关关都由硬件自动完成。还有个细节容易被忽略DRV8818的功耗主要不在逻辑部分而在功率管的导通损耗和开关损耗。它用的是TSSOP带散热焊盘的封装PCB设计时散热焊盘底下必须铺足够大的铜皮并打过孔到地层不然长时间满载跑芯片温度能到八九十字热保护一触发机器就莫名其妙停了。1.2 PIC18F46K40的优势不是算力而是外设与确定性问题很多人一听到8位单片机就摇头觉得做运动控制至少得来个ARM Cortex-M。但这个项目里我对算力的需求其实很低真正的核心需求是脉冲输出的时间确定性。PIC18F46K40最高跑40MHz处理能力确实和主流ARM没法比但步进脉冲的产生根本不依赖主频跑循环而是靠硬件外设自动输出。一个定时器加一个PWM模块脉冲流就稳定生成了哪怕MCU正在处理通信中断或者其他任务脉冲周期也不会抖动。这一点在工业控制里比什么都重要。如果你用中断里翻转IO脚的方式来发脉冲中断一多脉冲间隔就乱了电机立刻会出现异响和丢步。K40系列还有个很实用的东西是MCC图形化配置工具外设初始化代码自动生成。以前配置PIC的定时器、PWM、ADC全靠翻数据手册一个个算寄存器现在拖拖拽拽就出来了。从实验板到能做正事省了很多时间。做步进控制实际用到的外设其实很少一个定时器做脉冲周期一个PWM做动态电流控制加若干普通IO。K40的CIP内核独立外设对这类对实时性要求高的场景特别合适运动控制程序跑在中断优先级之外主循环还能安心处理通信和状态机。2. 双极步进电机的驱动基础别把H桥当开关用2.1 双极和单极的本质差异步进电机按绕组结构分单极和双极。单极电机每相绕组有中心抽头电流始终朝一个方向流四颗晶体管就能驱动电路简单但绕组利用率低同体积下扭矩一般。双极电机没有中心抽头每相线圈需要电流正反向交替流动所以必须用H桥。这就是DRV8818这类双H桥驱动芯片存在的根本原因。实际接线时4线、6线、8线的步进电机都可以接成双极模式。4线最简单A相两根线接OUT_A和OUT_A-B相两根线接OUT_B和OUT_B-。6线和8线的电机需要先把线圈串联或并联组合好再接到驱动输出。双极接法每相绕组在任意时刻都是整段线圈通电所以低速扭矩比单极同体积电机大这也是工业设备偏爱双极步进电机的原因。还有一个连接细节电机两相线序反了电机方向就反了但实际表现是“该正转的时候反转”。别急着改程序先把A相两根线对调试试往往比改代码快得多。2.2 为什么要“斩波”而不是直接限流这一步是新手最容易想不明白的地方。既然步进电机有额定电流为什么不能直接加个限流电阻因为步进电机绕组是感性负载电流上升速度受电感限制。转速变化时绕组的感抗也在变化同样电压下低速和高速的电流差异非常大。所以工业上通用的做法是PWM斩波功率管导通时母线电压加到绕组上电流快速上升一旦电流达到设定值驱动芯片就关断功率管电流通过续流回路衰减隔一小段时间再重新导通。整个过程用电子开关控制平均电流就像给浴缸放水的同时开着排水口通过调整进出水量把水位稳定在目标值。DRV8818内部的电流调节用的就是这种机制。采样电阻上的电压经过内部比较器和VREF引脚设定的基准电压比较电流超过阈值就进入关断状态固定关断时间结束再重新开通。这个固定关断时间的长度直接影响斩波频率而斩波频率又影响电机噪音和电流纹波实测中是需要调整的参数。2.3 半步/微步的本质是电流插值关于微步进很多人有个误解以为微步就是把脉冲频率分得更细让电机转得更慢更精细。其实微步的本质是电流插值让磁场方向不是90度跳变而是平滑旋转。整步状态只有四个A相满电流B相零、A相零B相满电流两个状态切换时磁场方向是90度直接跳变转子会带着惯性冲过去再停住这就是低速共振和噪音的来源。半步是在这两个状态之间插入A、B两相同时通电的状态磁场方向变成45度一步。微步进则是把两相电流按正弦和余弦的比例分成多个梯度比如1/8微步就是每四分之一电气周期里插7个中间状态每次电流只改变一点磁场几乎是连续旋转的。DRV8818的USM0到USM2引脚就是干这个的三个引脚组合选择从整步到1/8微步的模式。需要提醒的是微步模式下相同转速需要的脉冲频率会成倍增加比如电机本体200步/圈8微步就是1600步/圈600rpm转速对应16000个脉冲每秒。这个频率对PIC18F46K40的硬件PWM来说毫无压力但如果用中断翻转IO的方案主循环基本就废了。所以从设计之初就要决定用硬件外设发脉冲。3. 硬件连接与电路设计最少外围元件跑通系统3.1 DRV8818周边电路要点DRV8818的外围电路不算复杂但有几个点在实物调试中很容易出问题我按优先级列一下。VM和GND是电机电源输入端工业上常用24V母线。靠近VM引脚要放去耦电容我习惯用100nF陶瓷电容加10uF电解电容并联高频低频一起滤。VREF引脚是电流基准用电阻分压从逻辑电源取电压就行如果需要动态改电流就接到MCU的DAC输出或PWM滤波后的电压。SLEEP和RESET是功能控制引脚低电平有效上电后程序要立刻把它们拉高否则芯片一直处于待机状态。USM0到USM2是微步模式选择三个引脚接高或接低注意不要悬空悬空会有不确定电平。STEP和DIR是控制输入STEP上升沿触发一步DIR电平决定方向。OUT_A、OUT_A-、OUT_B、OUT_B-接电机两相接反了就是方向反。电流采样电阻接在ISEN引脚和地之间它的阻值决定了最大电流。典型公式是I_trip VREF / (A × R_sense)其中A是芯片的固定增益常数具体数值要查数据手册选型时先按这个公式倒推电阻阻值。采样电阻要用低电感的功率电阻而且走线要短粗否则电流尖峰会在电阻上产生额外压降导致电流设定不准确。3.2 与PIC18F46K40的接口设计K40这一侧的接口设计其实非常直接。原理上就是几个普通IO但具体选哪个引脚有讲究。STEP信号要接到支持PWM输出的引脚上这样后续可以用硬件PWM模式自动产生脉冲流而不占用CPU。DIR信号接一个普通IO即可。USM0到USM2如果不需要运行中切换微步模式直接接固定的VCC或GND平面最省事。VREF信号在这块板上我用的是K40内置DAC输出正好省掉一颗外部DAC芯片。K40的DAC模块精度完全够用动态调整限流值只需要改一个寄存器。电平匹配这里有一个非常容易踩的坑。DRV8818逻辑电源可以接3.3V或5VPIC的IO输出如果一边是5V逻辑一边是3.3V逻辑的驱动芯片可能有损坏风险。最简单稳妥的做法是把两者的逻辑电源统一成同一个电压比如都跑5V或者都跑3.3V。K40工作电压范围是2.3V到5.5VDRV8818的逻辑部分也支持宽范围完全有条件统一。另外MCU和驱动芯片之间的信号线在PCB上要短而直最好是串一个小电阻比如100Ω靠近驱动芯片端放置。这个电阻能抑制信号过冲还能在走线过长时稍微减少振铃。3.3 电源和地的处理工业环境重点工业环境里步进电机控制的很多古怪问题根源都不是逻辑错误而是电源和地处理不当。电机线圈电流是安培级开关瞬间会产生非常陡的di/dt如果功率地和逻辑地混在一起PIC的ADC读数会跳IO会被干扰严重时整个芯片复位。这块板上我做了三个决定实测下来非常有效。第一功率地单独铺一块逻辑地单独铺一块两块地只在电源输入端通过一个0Ω电阻单点相连。这样电机大电流的回流路径不会经过MCU的地平面。第二VM走线尽量粗短电感和电阻越小越好。第三STEP和DIR信号线跟电机输出线拉开距离不要平行走线避免磁场耦合进控制信号。还有一个工业现场的硬问题如果设备附近有变频器或者大功率接触器电源线上会耦合大量共模干扰。我后来在24V电源入口加了共模电感问题立刻缓解。这里有个教训一开始没加现场一开旁边的大功率设备步进电机就像丢了魂一样乱走。4. 固件实现从方波时序到电流设定4.1 用定时器和PWM生成STEP脉冲固件这一关的关键就是用硬件外设代替人工翻转IO。我最开始也图省事在定时器中断里翻转STEP引脚。功能的确能跑通但中断里加了几行保护逻辑之后脉冲间隔就出现了肉眼可见的抖动电机噪音变大高速时还会丢步。后来改成PWM输出模式。原理是把PWM的周期寄存器设为目标脉冲周期占空比设为50%让PWM模块自动在STEP引脚上输出连续方波。MCU不需要进中断只在需要改变转速的时候先算好新的周期寄存器值等当前周期结束再更新避免脉宽突变。用MCC配置的时候选一个定时器作为PWM时基PWM输出映射到STEP引脚。运行中改转速的实际公式是PWM周期值 系统时钟 / (4 × 预分频 × 目标频率)。有了这个公式加减速曲线就好算了直接按梯形曲线逐级更新周期寄存器即可。4.2 方向控制与使能逻辑方向控制看似简单实际有个很容易忽略的时序要求DIR引脚的电平必须比STEP上升沿提前建立一般要提前几个微秒。DRV8818在STEP边沿读到的DIR才是有效方向如果DIR刚变化就立刻给STEP脉冲驱动芯片可能读到旧值甚至出现多走一步的诡异现象。我的代码里统一做了一件事方向改变后先延时5微秒再使能脉冲输出。这个延时开销可以忽略但彻底杜绝了方向翻转瞬间的误动作。使能逻辑分两级。SLEEP引脚控制的是驱动芯片的睡眠状态低电平时整个芯片待机电机线圈无电流转子可以自由转动。这一点对夹爪机构是刚需因为断电后要能手动掰开夹爪。另一个是运行中的使能控制不应该直接绑普通IO因为在设备运行中误触SLEEP会导致丢步甚至结构损坏。我后来加了确认机制收到停机指令后先确认电机确实到位、速度确实为零延时200ms再拉低SLEEP。4.3 电流设定值与VREF换算电流设定是调试中最先要做的事公式不复杂但实测验证这一步很多人跳过后面问题一堆。先查电机铭牌上的额定电流比如2A按实际应用留10%到20%余量设定到2.2A。然后用公式算出VREF电压配置DAC输出。上电后用万用表量VREF对地电压确认和程序设定一致。再把电机轴堵住用万用表量母线电流对比是否接近设定值。这一步能同时验证采样电阻选型、DAC输出和驱动芯片电流调节是否正常。还有个现象值得注意电机发热严重但扭矩又不够大概率不是电机质量问题而是电流设定不对。步进电机发热主要来自绕组铜损电流设得太高温度自然上去扭矩不够则可能是电流设太低或者驱动芯片的斩波频率、衰减模式没调好。DRV8818的衰减模式会影响电流波纹和噪音慢衰减下电流波动更平滑但响应慢快衰减波纹大但动态好。这个没有绝对最优只能带着实际负载去试。5. 实测与调参步进电机控制里最容易翻车的三个环节5.1 加减速曲线直接给高速脉冲会丢步这是我在这个项目里摔得最重的一跤。程序写完后我直接在代码里给定一个恒定的1500pps频率觉得电机应该转。结果电机原地发出尖锐的啸叫转子几乎不动偶尔抽搐一下。原因很好理解步进电机的转矩随着转速上升而下降启动瞬间从静止跳到1500pps转子惯性根本跟不上旋转磁场的变化自然就丢步了。解决办法是梯形加减速。起始速度给得低一些比如500pps然后按固定斜率逐级加速到目标速度。每级之间加一个小延时让转子跟上磁场。到了目标位置附近再逐级减速最后低速入位。这里有个参数调法值得分享加速斜率不要拍脑袋先根据负载重量估计所需转矩再用转矩除以负载惯量得到加速度上限。实测中大惯量负载最容易犯的错误是加速度给得太猛结果电机不丢步但机械结构发出“咔哒”一声那是联轴器在打滑。梯形加减速的代码不复杂核心是一个查找表或者一个增量计算。我的实现里定义了一段加速步数、匀速步数和减速步数每步更新一次周期寄存器值。实际运行下来稳定性比恒定频率好得多。5.2 电流调节发热与转矩的平衡工业设备24小时连续运行电机温度是必须盯着的指标。步进电机静止时如果在保持满电流线圈一直处于通电状态热量持续积累。DRV8818本身支持降低待机电流的功能关键是MCU端要配合起来。我的做法是运动状态下VREF给满值维持最大转矩停止后0.5秒如果状态机确认到位且无新指令就把DAC输出降到满值的50%。这样设备静止时定位力矩依然存在但发热大幅下降。实测中这个差异很明显满电流持续静止半小时电机外壳就很烫降流之后再过半小时只是温热状态。这里有个需要注意的逻辑降流不能一刀切。如果工艺要求静止期间保持强大力矩防止外力推动比如垂直方向的重负载那么降流会导致负载滑落。这种情况下应该保留满电流通过外部散热措施解决发热问题。做工业项目参数永远服务于实际工况没有绝对正确的默认值。5.3 地弹、干扰与长线驱动工业现场的硬核问题实验室里跑得好好的板子一到工业现场就可能出各种幺蛾子最常见的罪魁祸首是长线干扰和地电位差。现场设备布局里控制器放在控制柜电机在设备本体距离往往好几米。STEP和DIR信号是单端脉冲长线传输时很容易感应到周围环境噪声表现为脉冲乱走、电机无故多走一步。我第一次做完现场测试就遇到这个问题后来给STEP和DIR都加了高速光耦隔离。我用的是6N137速度完全够隔离之后信号干净了电机乱走的情况再没出现。地弹问题则更隐蔽。采样电阻上的电流尖峰如果耦合进逻辑地会导致PIC误判IO电平。我排查时用示波器测量逻辑地和功率地之间的电位差发现存在几十毫伏的瞬态尖峰这在干扰严重时完全能触发电平翻转。后来严格做了单点接地尖峰明显降低问题才算真正解决。6. 后续可以怎么扩展6.1 加编码器做闭环开环步进控制最大的隐患是丢步后控制器不知道。工业机器人应用里丢步往往意味着撞机。给电机尾部加一个ABZ编码器就可以把系统从开环升级成闭环。具体做法不复杂编码器Z信号做机械原点归零A/B信号反馈到MCU的捕捉模块或者外部计数器换算成实际位置。控制策略从“发多少个脉冲”变成“目标位置与当前位置的误差”通过PID输出转矩方向调整。由于DRV8818的VREF能动态改变电流限制闭环中其实是用VREF控制力矩上限再用STEP脉冲数控制位置两层配合。我在这套板子上预留了编码器接口后续项目可以直接扩展。6.2 通信接口和状态机工业设备很少是单机工作K40自带USART外设通过Modbus RTU协议和上位机组态软件交互是最省事的做法。协议栈开销不算大K40能轻松跑起来。实际项目中我定义了读位置、写目标位置、设置速度、设置电流、读取驱动状态这几个寄存器地址整个通信逻辑一张表就讲清楚了。状态机层面有一点特别提醒报警和急停信号必须走最高优先级。DRV8818的nFAULT引脚是漏极开路输出过流、过温时拉低。这个信号不要只接到普通IO最好接到MCU的外部中断引脚配合K40的硬件中断触发一旦驱动报错立即停脉冲。机器人运行中急停时光靠切断VM电源会使电机失去保持力机械结构会因为重力下坠。如果应用是垂直关节设计上要预留制动器控制这是安全层面的硬需求。6.3 固件升级和参数化K40系列支持自写Flash意味着可以自己做简易Bootloader。工业设备安装后不方便拆机通过串口升级固件能省掉大量现场维护成本。博文里不展开Bootloader的实现细节但我的体会是K40的自编程Flash方案比传统需要外部烧录器的方式灵活太多正式产品必须考虑进去。参数化存储也是必需的。每台电机绕组特性不同现场负载也不同加工时不可能每次都用编译器重新烧录。我把电机额定电流、微步模式、加减速曲线参数、脉冲速度上限这些做成参数表存在Flash的指定页。校准一次之后存进去设备重启自动加载。批量生产时只需要在产线上跑一遍参数标定产品一致性就好控制很多。最后再分享一个小技巧调试步进控制的时候不要一上来就接电机。先用示波器看STEP和DIR信号是否符合预期再接一个LED指示灯串在STEP线上通过灯的明暗粗略判断脉冲频率。确认控制逻辑无误后再空载转电机最后才接实际负载。这个顺序能帮你把问题快速定位在控制逻辑还是功率驱动。这次做下来最大的体会是两颗看起来不算热门的芯片搭在一起效果完全够用关键还是想清楚系统架构和每个芯片该承担什么责任。
返回列表