ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

工业步进电机驱动板设计:DRV8818+STM32L031方案全解析

工业步进电机驱动板设计:DRV8818+STM32L031方案全解析 前阵子给一台小型工业送料机构做驱动板电机是42系双极步进额定24V/1.5A左右。翻了一圈驱动芯片方案最后落在了DRV8818PWPR加STM32L031C6这个组合上。说实话刚开始也犹豫过毕竟L031这颗Cortex-M0在很多人眼里就是做做传感器采集的低功耗小芯片拿来控制步进电机是不是有点寒酸。但真正把硬件搭起来、固件写进去之后我发现这对组合在工业机器人和自动化设备里相当能打。这篇文章就把从选型、画板、写代码到现场调试的完整过程拆开讲给准备用双极步进电机做设备的朋友一个可以直接抄的参考。1. 选型复盘DRV8818PWPR和STM32L031C6各自解决什么问题1.1 先讲清楚电机侧需求控制双极步进电机这件事看起来谁都会接四根线上电发脉冲转。但放到工业机器人和自动化设备里需求就完全变味了。我那个送料机构的要求是电机为42系双极步进额定24V/1.2A峰值短时1.5A传动结构是同步带加丝杠需要1/16细分来兼顾运行平稳和定位手感控制接口要兼容PLC和上位机脉冲方式也就是STEP/DIR接口控制板面积限制在60mm乘60mm以内高度还不能太高环境温度可能到50℃左右必须有可靠的过流、过温保护成本敏感不能用TMC系列那种高价位芯片这些条件摆在面前选型方向就很清晰了一颗带固定电流斩波和微步进译码器的步进驱动芯片配一颗尽量便宜但外设够用的MCU。DRV8818PWPR和STM32L031C6就是在这个框架下筛出来的组合。1.2 DRV8818PWPR是什么定位DRV8818PWPR是TI的双极步进电机驱动芯片HTSSOP-16封装带PowerPAD散热焊盘。它的核心参数VM电源范围8.2V到45V覆盖24V和36V工业电机常用电压输出相电流峰值最高2.5A实际要结合散热和电源能力看内置步进译码器支持全步、半步以及1/8、1/16微步进STEP/DIR脉冲控制接口外部控制器只发脉冲和方向内部做恒流斩波MCU完全不用管电流环集成过流、过温、欠压保护故障时FAULT引脚拉低这颗芯片最省心的地方就是把电流控制环固化在硬件里。用过L298N或者分离MOSFET方案的人都知道搭电流检测、比较器、PWM斩波那一堆模拟电路有多折腾。到了DRV8818这里你只需要给电、给脉冲芯片自己把电流调好。这也是为什么它适合MCU比较弱小的场合CPU根本不需要参与电流环计算。在选型对比上我也简单列过几个常见芯片。A4988价格低但耐压低、微步进能力一般DRV8825电流能力相近但市场上翻新片太多货源不稳定TMC2209静音效果确实好但价格贵不少而且工业场景对静音要求没那么高。DRV8818在供货渠道、价格和性能之间比较均衡TI正品渠道相对好控制。芯片供电范围峰值电流微步进主要优势A49888-35V2A1/16便宜资料多DRV88258-45V2.5A1/32电流大微步进高DRV88188.2-45V2.5A1/16TI正品渠道稳逻辑3.3V兼容TMC22094.75-29V2A1/256静音平滑度极高1.3 STM32L031C6为什么够用很多人认为步进电机控制至少得上F103。这个观点在MCU要自己算S曲线、要跑多轴插补的场景下成立但在用DRV8818这种带译码器的芯片的场景下真不需要。STM32L031C6的配置是Cortex-M0内核48MHz、64KB Flash、8KB SRAM拉出来做脉冲驱动绰绰有余。它需要的资源其实特别简单一个能输出PWM的定时器几个普通GPIO控制方向和使能一个外部中断接故障信号。正好L031全都有。TIM2还是32位定时器用来做步进脉冲发生器非常舒服频率范围可以做得非常宽。整个系统跑下来CPU占用率我实测不到10%剩下的算力完全可以用来处理通信、按键、LED指示这些杂活。低功耗这件事在工业场合也是个加分项。有些设备要求整体发热小、能靠小功率电源供电L031的L系列低功耗设计让整板功耗很低。就算不考虑功耗L031在价格上也比F103便宜不少对小批量设备来说每一块钱成本都值得抠。2. 驱动芯片的最小外部电路和关键引脚决策2.1 引脚分组和每个引脚的职责DRV8818PWPR虽然是16脚封装但引脚逻辑很清晰可以分三组看。功率侧引脚VM接电机电源AOUT1/AOUT2接电机A相绕组两端BOUT1/BOUT2接B相绕组两端剩下的是GND。双极步进电机的四根线就是两个绕组不分公共端接法比单极电机直观很多。逻辑侧引脚VCC是逻辑电源接3.3V或5VSTEP是脉冲输入每个上升沿走一步DIR是方向电平MODE0、MODE1、MODE2三根引脚组合决定微步进模式SLEEP是睡眠控制拉低芯片进入低功耗待机。FAULT是开漏输出故障时拉低。还有一个VCP引脚这是内部高侧MOSFET驱动用的电荷泵输出。按数据手册在VCP和VM之间接一颗小电容就行容值通常取10nF到100nF这个范围。如果这个电容不焊或者参数不对高侧MOSFET驱动不足相电流波形会变得很难看电机高速时力矩掉得特别厉害。2.2 电流设定采样电阻的选择DRV8818的电流调节原理是恒流斩波芯片通过采样电阻检测功率桥电流当电流到达设定阈值时关断输出等电流下降后再重新打开如此反复维持平均电流接近目标值。这个机制最大的好处是不管电机是静止还是高速转动电流都能被限制在安全范围内。采样电阻的阻值决定了电流上限。以我那个1.5A的应用为例如果驱动芯片内部比较器参考电压在0.5V附近理论阻值大概是0.5V除以峰值电流。这个公式本身不复杂但实际选型时我建议留一点余量把电流设定在1.3到1.5倍额定值之间给瞬态电流留空间而不是卡得刚刚好。采样电阻的功率千万不能忽略。1.5A电流流过0.33欧电阻发热功率大概是0.74W这个量级如果放普通0603电阻当场就能烧糊。我用的是2512封装电阻PCB上还特意留了通风对流空间。另外采样电阻的精度和温漂也影响电流稳定工业场景建议选1%甚至0.5%精度的合金电阻。2.3 电源和散热布局电机驱动板的电源设计比MCU板讲究得多。电机在启动和急停瞬间会从母线上拉走很大电流如果VM入口只放一个几十微法的电容电压跌落会非常明显严重的会让驱动芯片误判过流或者欠压。我在VM入口的做法是1000μF电解电容加0.1μF陶瓷电容并联电解电容管低频储能陶瓷电容管高频噪声。容量大小按经验估算每安培电流留200到500μF。如果电机是频繁正反转的场合容量还要往大了选否则示波器上看电流波形全是毛刺。散热是DRV8818最容易翻车的地方。PowerPAD必须焊接到PCB地铜皮上焊盘下方打阵列过孔把热量导到背面大铜皮。我第一版板子图省事PowerPAD只是象征性开几个孔结果连续跑1.5A电流半小时后芯片外壳温度冲到90℃以上已经明显烫手了。后来重新铺铜放宽了底部和四周的铜皮面积温度才回到能接受的范围。2.4 信号隔离设计STEP和DIR信号需要从PLC或者上位机控制器过来时走线长度往往超过半米。驱动板和PLC之间共地不可靠电机母线的噪声会顺着地线串进脉冲信号造成误触发或者丢步。我的做法是在STEP和DIR上各加一个高速光耦输入端接PLC信号输出端接DRV8818。光耦的输出侧电源最好和逻辑侧隔离至少也不要和电机母线直接共地。STEP脉冲在高速模式下可能到几十kHz光耦选择要注意传输延迟别选那种大功率低速光耦脉冲稍微快一点波形就畸变了。如果STEP信号只是MCU板上直连不经过长线和外部设备那就可以省掉光耦直接接。DRV8818的逻辑输入兼容3.3V和5VL031的GPIO推挽输出能直接驱动不需要额外加电平转换芯片。这一步在很多教程里没讲清楚导致新手平白加了多余的转换电路。3. STM32L031C6外设配置把定时器变成步进脉冲源3.1 时钟树48MHz从哪里来STM32L031复位后的默认时钟是MSI频率不高直接拿来做高精度PWM会受限。我习惯先把系统时钟配到48MHz让定时器的分辨率更细。L031的时钟树和F1系列差别不小不能直接拿着F103的SystemClock_Config代码抄。它内部有HSI16高速内部时钟和MSI多速率时钟要上48MHz需要走PLL。在STM32CubeMX里的配置非常简单选择HSI16作为PLL输入倍频系数按参考手册配置好确保系统时钟48MHz、APB外设时钟48MHz。这里有一点要特别留意TIM2的时钟源挂在APB1定时器时钟上CubeMX里要确认TIM2 Kernel Clock确实显示48MHz否则PWM频率会跟预想差一截。3.2 TIM2做步进脉冲发生器的配置为什么用PWM输出而不是在GPIO中断里翻转电平这是很多人的疑问。答案很简单PWM由硬件定时器直接驱动引脚频率和占空比由寄存器决定不依赖CPU响应。工业脉冲频率到了几十kHz以后如果每一步都在中断里翻转GPIO一旦中断里多跑几行代码脉冲间隔就会抖动电机声音会变得很难听严重时还会诱发丢步。我用TIM2的CH1输出STEP脉冲。初始化时把预分频设为0让计数时钟等于48MHz。ARR寄存器决定了PWM频率CCR1决定占空比。代码大概是这个样子void STEP_Timer_Init(void) { // 启用TIM2时钟 RCC-APB1ENR | RCC_APB1ENR_TIM2EN; TIM2-PSC 0; // 预分频为0计数时钟48MHz TIM2-ARR 4800 - 1; // 初始10kHz TIM2-CCR1 2400; // 50%占空比稳定触发沿 TIM2-CCER | TIM_CCER_CC1E; // 使能CH1输出 TIM2-CR1 | TIM_CR1_CEN; // 启动定时器 }改变速度时只需要更新ARR和CCR1。这套结构非常简单但足够可靠。需要注意初始化时ARR先设置成一个较低的频率比如1kHz别让电机上电就疯转。等SLEEP引脚拉高、系统确认就绪后再调到目标速度。3.3 GPIO分配和逻辑电平等STM32L031的GPIO资源足够把电机控制相关的信号全部分配到一组端口上方便布线。我这里用了PB0到PB6PB0 STEP复用TIM2_CH1推挽输出速度设为HighPB1 DIR推挽输出PB2 SLEEP推挽输出PB3、PB4、PB5 MODE0、MODE1、MODE2推挽输出PB6 FAULT上拉输入配外部中断下降沿触发有两个细节很容易忽视。第一STEP引脚作为复用功能输出时GPIO速度寄存器要设置到High。如果保持默认的低速模式引脚上升沿会偏缓在高速脉冲下波形圆角严重DRV8818对STEP沿的采样可能出错。第二MODE0到MODE2和SLEEP引脚不能悬空。即使MCU没初始化完这几个引脚也必须被电阻固定到确定电平否则芯片会进入非预期的微步进模式或者驱动状态。我习惯在PCB上给这三个引脚加10k下拉电阻出厂默认就是全步模式不会因为固件没跑起来而出意外。4. 固件里的速度规划和故障处理逻辑4.1 状态机和主循环真正写固件时我发现电机转起来和电机按预期转是两回事。工业设备不能只是发脉冲它需要明确知道电机当前处于什么状态出了故障该做什么。我维护了一个简单的状态机四个状态IDLE待机、ACCEL加速、RUN匀速、DECEL减速。SysTick每1毫秒触发一次更新在这个中断里修改目标频率并更新定时器。主循环只负责接收指令和读取FAULT状态不参与速度计算避免阻塞。状态机的设计原则很简单任何时刻只有一个状态在运行状态跳转只发生在明确的事件上。比如收到停止指令后无论当前是RUN还是ACCEL都先进入DECEL减速到起始频率以下再切回IDLE。这样电机不会因为直接停脉冲而失步。4.2 梯形加减速代码步进电机最忌讳毫无过渡地把频率从0瞬间拉到目标值。50kHz的脉冲频率对应电机转速很高如果一开始就按这个频率发脉冲转子根本跟不上升频节奏直接丢步或者堵转。梯形加减速是最基础、也是我实际项目里最常用的处理方式。核心逻辑是每毫秒调整一次当前频率朝目标频率逐步逼近。我写了一个典型的更新函数static uint32_t cur_freq 1000; // 步进脉冲当前频率 static uint32_t target_freq 20000; // 步进脉冲目标频率 static int32_t accel_step 200; // 每毫秒调整量 void Motor_FreqUpdate(void) // 由1ms定时中断调用 { if (cur_freq target_freq) { cur_freq accel_step; if (cur_freq target_freq) { cur_freq target_freq; } } else if (cur_freq target_freq) { cur_freq - accel_step; if (cur_freq target_freq) { cur_freq target_freq; } } STEP_Timer_SetFreq(cur_freq); }实际使用中参数也有讲究。加速步长根据电机和负载的总惯量决定太大容易失步太小会让动作显得拖沓。我那个机构上起步频率800到1000Hz目标频率20kHz加速过程大概需要100到200ms跑完运行很平顺。如果换成大惯量负载加速度还要再降一些。另一个重要点是减速阶段的距离预测当剩余步数小于当前减速距离时就必须提前进入减速阶段否则到了目标位置速度还没降下来刹车会冲过头。4.3 故障处理FAULT不是摆设DRV8818的FAULT引脚在过流、过温、欠压时都会拉低。MCU这边配一个下降沿外部中断中断里做的事情尽量少把故障标志置位把当前状态改为FAULT关闭PWM输出SLEEP拉低让芯片进入睡眠。这里有个很容易忽略的点FAULT处理必须做成可复位的锁定状态不能自动恢复。工业现场如果发生过流自动恢复故障状态意味着电机可能在没有任何预兆的情况下重新启动这是很危险的事情。我的做法是FAULT中断只负责标记故障设备端必须收到明确的复位命令才能重新初始化驱动芯片。另外FAULT引脚是开漏输出必须要有外部上拉电阻才能读到高电平。我在硬件上给PB6接了10k上拉到3.3VFAULT拉低时MCU能可靠检测到下降沿。5. 工业现场实测发热、干扰和微步进精度问题5.1 脉冲抖动和EMC现场与实验室不一样实验室调试时一切正常一到工业现场就出问题这是驱动类项目最常见的翻车方式。我遇到过一次随机丢步和电机异响排查到最后发现是STEP信号被电机母线的噪声干扰了。现场的干扰路径主要是长线耦合和共地阻抗。STEP和DIR从PLC过来时走线经过电机线束旁边电机高速斩波产生的电磁耦合直接叠加在脉冲信号上导致DRV8818误采样。处理办法有几条按优先级排列STEP、DIR走线远离电机线和电源线能隔5mm以上就隔5mm光耦输入端串100到220欧电阻并一个小电容到地滤掉高频毛刺电机母线加共模磁环让斩波噪声走在它该走的路径上确保控制系统和驱动板之间是单点接地不要形成大环路现场环境千变万化但干扰排查的原则不变用示波器抓STEP引脚看毛刺从哪里进来再沿路径一步步隔离。不要上来就盲目换光耦或者加电容先定位再动手。5.2 电流设太高芯片发热会教你做人DRV8818标称2.5A峰值但这数字是有前提的良好的散热、合理的占空比、低于45V的供电电压。实际工业设备里连续运行电流最好控制在额定的八成左右不然PowerPAD那点热阻扛不住。我第一版PCB散热设计做得不够在1.5A连续运行下芯片温度一路走高最后触发过温保护。后来做了两个整改第一把PowerPAD下方的PCB铜皮加大底部和芯片PCB层之间打十几颗过孔把热量导到背面大面积铺铜第二把运行电流从1.5A降到了1.2A确保力矩够用的前提下尽量少发热。还有个经验电流波形不好也可能是发热的隐性原因。如果MOSFET驱动不足管子处于线性区的时间变长开关损耗飙升芯片温度会比正常高很多。所以发热异常时也要检查VCP电容和供电电压是否正常不能一味认为是散热问题。5.3 微步进能提高精度但不是万能的把MODE引脚按数据手册的真值表配置到1/16细分理论步距角从1.8度变成0.1125度听起来精度提高了16倍。但实际机构上定位精度还取决于同步带的弹性、丝杠的背隙、负载的扰动。开环情况下微步进最大的收益其实是运行平稳和噪声降低而不是绝对的定位精度。我在送料机构上实际对比过全步运行噪音明显、低速抖动大1/16细分之后几乎安静了很多高速时也顺畅不少。但定位到目标位置后如果要求零点零几毫米级别的重复精度我仍然建议加原点传感器或者末端编码器。微步进只是提高了步进的分辨率机械回差和负载扰动造成的误差它消除不了。细分等级也不是越大越好。有些芯片支持到1/32甚至1/256高频时电流建立时间不够实际力矩反而下降。对DRV8818来说1/16在我这个应用里已经是一个能兼顾性能的甜点档位。5.4 用示波器快速判断问题调试驱动板时我习惯先看两个波形能快速定位大多数问题。一个是AOUT1或BOUT1对地的电压波形。正常恒流斩波时会看到规则的PWM方波斩波占空比随着电流设定和反电动势变化。如果这个方波的幅度明显跌落大概率是VM电压不足电源电容不够或者电源功率不够。如果波形不稳定、占空比乱跳要怀疑采样电阻虚焊或者FAULT误触发。另一个是电机相电流波形这个需要电流探头如果设备预算有限也可以用采样电阻两端电压来间接观察。正常情况下电流波形能明显看到电流被限制在设定值附近高速段如果电流跟不上设定曲线要么降低参考频率、要么调高供电电压、要么降低细分等级。波形是驱动板最好的体检报告。多花几分钟抓波形比反复改固件参数管用得多。5.5 上电时序细节最后说一个经常被忽略的细节上电时序。工业柜里24V电机电源和3.3V逻辑电源通常不是同时建立的。如果逻辑电源先到、电机电源后到DRV8818在电机电源还没稳定时就被MODE和SLEEP引脚拉到了某个工作状态上电瞬间可能出现意外的短脉冲。如果电机电源先到、逻辑后到芯片的逻辑部分又处于未初始化状态引脚电平可能是随机的。我的处理很老套但很有效MCU上电后第一件事就是把SLEEP引脚拉低强制芯片处于睡眠状态。等SystemClock配置完成、GPIO全部初始化完毕、FAULT中断就绪之后再延迟200毫秒左右把SLEEP拉高让芯片正式进入工作模式。这个习惯帮我在现场少踩了很多坑尤其是那种为什么上电偶发抖动一下的诡异问题。整个系统跑到现在已经有小半年送料机构的定位一致性、发热和抗干扰表现都稳定在可接受范围。DRV8818PWPR加STM32L031C6这套组合不需要昂贵DSP也不需要复杂调试工具理解了驱动芯片和MCU的分工之后你会发现工业机器人里很多看似复杂的运动控制本质就是一颗定时器加一份速度曲线的事。
返回列表