ARTICLE DETAIL

资讯详情

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

DRV8818+STM32F767ZG工业步进电机驱动方案全解析

DRV8818+STM32F767ZG工业步进电机驱动方案全解析 先说结论DRV8818PWPR搭STM32F767ZG这套组合做工业级双极步进电机控制是完全够用且性价比很高的方案。DRV8818负责功率驱动和电流调节STM32F767ZG负责运动规划和逻辑控制两者分工明确在机器人关节、分度台、自动贴装头这些场景里都非常常见。这篇文章我会从方案选型、芯片细节、硬件连接、固件实现到调试排障一条线梳理清楚适合正在做电机控制的工程师也适合准备入门运动控制的学生。1. 整体设计思路与方案选型1.1 为什么是DRV8818PWPR STM32F767ZG而不是集成式驱动现在市面上步进电机的驱动方案五花八门有把驱动、控制、协议栈全部集成在一颗芯片里的比如TMC2209、DRV8825这种带串口和自适应算法的也有用MCU直接搭分立H桥的。DRV8818属于中间路线它是一颗纯模拟功率驱动芯片内部集成了双H桥、电流感测放大器和固定关断时间Fixed Off-Time电流调节器但不含协议逻辑、不含步进/方向解析器所有运动控制逻辑都由外部MCU完成。这样选型有几个很现实的原因DRV8818PWPR的最大驱动峰值电流2.5A供电范围8V到45V覆盖24V和36V工业电机的主流工作区间。这个功率等级是工业传感器、小型机器人手臂、桌面级数控设备的黄金区间再往上就该上伺服或者更大功率的步进驱动器了。逻辑接口极简。DRV8818只需要STEP、DIR、ENBL、M0、M1、nSLEEP、DECAY这几个引脚不像TMC系列那样需要配置寄存器。对STM32F767ZG这种高性能MCU来说控制DRV8818几乎不占CPU资源纯粹用定时器输出脉冲即可。STM32F767ZG的主频是216MHz带硬件浮点单元跑速度环、加速度规划、S曲线加减速算法都绰绰有余。这个算力配DRV8818这种哑巴驱动正好合适MCU把精力放在轨迹规划上不需要去管电流斩波的琐事。1.2 这套方案能解决什么问题工业机器人或者自动化设备里步进电机控制的核心难点并不是转起来而是转得准、转得稳、不丢步。DRV8818提供了稳定的电流斩波控制配合STM32F767ZG的高精度定时器脉冲输出可以在开环条件下实现相当好的定位重复性。我举一个实际场景来说明。某个小型三轴点胶机上X轴用57步进电机带同步带DRV8818设定电流1.8A1/8细分STM32输出20kHz脉冲。在这样的配置下点胶头的重复定位精度能稳定在±0.03mm以内。这个精度来自两方面的配合DRV8818的电流调节抑制了低速时的电流波动STM32F767ZG定时器的脉冲相位抖动非常低。两者缺一不可如果换一个廉价MCU产生脉冲即使驱动芯片再好定位精度也会因为脉冲间隔不均匀而恶化。1.3 选型时需要避开的坑这里要特别提醒的是DRV8818和DRV8825虽然引脚兼容但不是可以直接替换的关系。DRV8825内置了step/dir译码逻辑和3种微步细分模式而DRV8818的细分是通过M0/M1引脚配置的没有内部译码器。很多从DRV8825迁移过来的工程师第一版固件就直接踩坑了。另外DRV8818的电流调节是靠外部采样电阻R_SENSE和VREF引脚配合实现的不像TMC系列那样可以通过UART直接写电流寄存器。这意味着硬件定型后调整电流上限需要改板子上的电阻或者通过DAC输出VREF电压。好在我们可以用STM32F767ZG内置的DAC来动态控制VREF从而实现软件调速电流。这个技巧我在后面的章节详细展开。2. 核心芯片细节DRV8818PWPR的关键参数与引脚功能2.1 DRV8818的引脚功能拓扑DRV8818PWPR是HTSSOP-16封装体积不大但是引脚功能非常紧凑。我先按功能分组梳理一下功率部分VM电机电源、GND、OUT1/OUT2A相输出、OUT3/OUT4B相输出。A相和B相各自是一个完整的H桥可以独立控制方向。逻辑部分STEP步进脉冲输入上升沿触发DIR方向电平输入高/低电平对应正/反转、ENBL使能低电平有效、M0/M1微步细分选择、nSLEEP休眠控制低电平进入低功耗模式、DECAY衰减模式选择、VREF电流基准电压输入、FAULT开路/过温故障输出低电平有效、I_SENSE-采样电阻接入引脚。这一步分清楚之后硬件设计时就不会把逻辑电源和功率电源搞混。需要注意DRV8818的逻辑部分供电是通过VREG引脚内部稳压器输出的不需要为逻辑单独供电这个引脚通常接一个1µF左右的陶瓷电容到地。2.2 电流调节的工程计算方法DRV8818的电流上限由VREF电压和采样电阻R_SENSE共同决定。芯片内部把VREF作为比较器的参考采样电阻上的压降一旦超过VREF内部逻辑就关断H桥输出直到固定关断时间结束。峰值电流的计算公式是I_TRIP VREF / (5 × R_SENSE)具体推导过程芯片内部有一个1/5比例的电流放大器把采样电阻上的电压按比例放大后与VREF比较。你可以把采样电阻想象成高速公路上的一道地磅每辆电流卡车开过去都要称重超过VREF设定的吨位就截停一段时间。举个例子我希望电机峰值电流1.5A采样电阻用0.1Ω/1W的精密电阻I_TRIP VREF / (5 × 0.1) VREF / 0.5要让I_TRIP 1.5AVREF就要等于0.75V。这个电压可以用STM32F767ZG内置DAC直接输出。DAC参考电压是3.3V12位分辨率输出精度可以达到0.8mV左右用来设定电流完全够用。工程上有一个重要提示采样电阻的功率额定值至少要按I²R的2倍来选。1.5A峰值电流、0.1Ω电阻持续导通时的功耗是1.5²×0.10.225W理论上是1W电阻就够了但是如果电机长时间堵转H桥恒定导通情况就不一样了。堵转时如果电流调节失效电阻承受的功率可能会翻好几倍。我在实际项目中选的是0.1Ω/1W金属膜电阻并且确保电阻两侧的铜箔足够宽否则会发热漂移。2.3 微步细分和衰减模式M0和M1两个引脚组合控制细分模式这是DRV8818比较容易让人困惑的地方。四个档位分别是M1M0微步模式00全步2相激励01半步101/4步111/8步注意1/8步是最高细分。这比DRV8825的1/32细分要低不少。在1/8细分下一个标准的1.8°步距角电机每个微步的角度是0.225°对于大多数工业定位应用来说足够了。如果确实需要更高细分只能换驱动芯片或者用外部微步插补算法但这个成本一般不值得。衰减模式同样需要注意。DECAY引脚接低电平时选择慢衰减接高电平时选择混合衰减。低速运行时电流变化率小慢衰减可以让电流更平稳但这时候H桥续流时间变长如果电机噪声偏大可以切到混合衰减试一下。我个人的默认配置是DECAY接高电平混合衰减在中低速场景下表现最好。如果电机发出刺耳的高频啸叫优先检查的其实是PWM频率和斩波频率而不一定是衰减模式。2.4 FAULT引脚和电源保护DRV8818的FAULT引脚是开漏输出低电平有效。触发条件包括VM引脚欠压低于8V左右、过温关断、H桥输出对地或对VM短路。FAULT引脚必须上拉到3.3V或5V逻辑电平否则无法读取故障状态。我的做法是把FAULT接到STM32F767ZG的一个外部中断引脚上配置上升沿和下降沿都触发。这样一旦FAULT拉低MCU立即响应停止脉冲输出并记录故障代码。如果只是在主循环里轮询FAULT电平在某些高速运动中可能错过瞬时的过温信号导致电机烧毁。另外VM引脚上务必加一个大容量电解电容推荐100µF/50V以上并且在靠近VM引脚的地方并联一个100nF陶瓷电容。这个电容的作用是吸收电机反电动势和电源纹波。如果你的应用里DRV8818和电机之间的距离超过20cm这个电容就更加重要否则连线电感产生的尖峰电压很容易击穿H桥MOSFET。3. STM32F767ZG侧的关键模块配置3.1 定时器资源分配与脉冲生成STM32F767ZG生成步进脉冲最优雅的方式是利用高级定时器TIM1或者通用定时器TIM2/TIM3/TIM4的PWM输出模式。我实际项目里的分配是这样的TIM1_CH1用于脉冲输出PA8引脚工作在PWM模式1TIM1_CH1N用于方向控制PB13引脚作为普通GPIO推挽输出一个基本定时器TIM6作为速度定时器用于产生定时中断在中断里更新运动状态这样分配的理由是TIM1是高级定时器带互补输出和刹车功能虽然这里不用互补输出但它的计数器时钟源和预分频精度都是最优的。PWM频率就是步进脉冲频率这意味着我只需要改变定时器的自动重载值ARR就能实现步进电机加减速。计算公式如下脉冲频率 定时器时钟 / (预分频 × (ARR 1))STM32F767ZG的APB2定时器时钟在系统主频216MHz下可以到216MHz。假设预分频设为1除以2定时器时钟就是108MHzF_pulse 108MHz / (2 × (ARR 1))如果要输出20kHz脉冲ARR 108M / 40000 - 1 2699。这个数字对应的步进速度是多少呢假设电机步距角1.8°、驱动器细分1/8那么电机转一圈需要3200个脉冲。20kHz的脉冲频率对应转速RPM 20000 × 60 / 3200 375转/分钟这个转速区间正好是大多数步进电机高效率工作区间的下限附近不会出现高速扭矩骤降。如果需要更高转速直接提高脉冲频率就行比如40kHz对应750转/分钟。3.2 GPIO初始化与逻辑电平匹配DRV8818的逻辑输入STEP、DIR、ENBL、M0、M1、nSLEEP、DECAY都是5V兼容的但STM32F767ZG的GPIO是3.3V供电所以理论上可以直接连接。不过工程上用5V逻辑供电的场合最好加一个简单的电阻分压或者用74LVC245之类的电平转换芯片避免长期运行后STM32引脚损伤。我的推荐连接方式如下PA8 - STEPTIM1_CH1复用功能输出PB13 - DIR推挽输出默认低电平PB14 - ENBL推挽输出默认高电平拉到低才能激活芯片PB15 - nSLEEP推勇输出默认高电平PC6 - M0推挽输出默认低电平PC7 - M1推挽输出默认低电平PC8 - DECAY推挽输出默认高电平PD2 - FAULT外部中断输入开漏上拉这里有一个小经验STEP走线要尽量短且远离高电流的电机线缆否则驱动脉冲容易被耦合噪声干扰。在PCB布局时STEP引脚走线两侧要有地铜皮保护。如果不得不长距离走线建议在靠近单片机引脚处串联一个33Ω的电阻。3.3 用DAC实现软件调速电流前面提到DRV8818的VREF可以用STM32F767ZG的DAC来驱动。具体做法是DAC1_OUT1PA4引脚配置为12位右对齐模式输出电压范围0到2.1V参考电压VREF接2.1V高精度基准。更简单的做法是直接使用内置3.3V参考然后在软件里限制输出值避免超过2.5V导致电流过大。DAC输出经过一级RC低通滤波1kΩ 100nF再接到DRV8818的VREF引脚。这样可以起到缓冲作用同时滤除DAC的阶梯噪声。如果要求更高的电流稳定度可以用运算放大器跟随一下但在大多数场合没必要。软件层面我封装了一个函数void DRV8818_SetCurrent(uint16_t current_mA) { float vref current_mA * 5.0f * 0.1f / 1000.0f; // 假设R_sense 0.1Ω uint32_t dac_value (uint32_t)(vref * 4095.0f / 3.3f); if (dac_value 4095) dac_value 4095; HAL_DAC_SetValue(hdac1, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_value); }这样在电机启动时可以降低电流实现柔性启动运行中根据负载情况动态提高电流。这个特性在低惯量应用中特别好用能明显降低电机发热。4. 完整实操流程从Cubemx配置到脉冲输出4.1 第一步STM32CubeMX中的初始配置打开STM32CubeMX选择STM32F767ZG芯片进入Pinout界面。按照下表配置引脚PA8 - TIM1_CH1Alternate Function 1AF1PB13 - GPIO_Output标签DIRPB14 - GPIO_Output标签ENBLPB15 - GPIO_Output标签nSLEEPPC6 - GPIO_Output标签M0PC7 - GPIO_Output标签M1PC8 - GPIO_Output标签DECAYPD2 - GPIO_EXTI标签FAULTPA4 - DAC1_OUT1用于VREF输出时钟树保持默认配置确保APB2定时器时钟是108MHzSysClk 216MHzAPB2 prescaler /1。TIM1参数设置为Prescaler: 1192分频去除这里预分频值写1即二分频Counter Mode: UpAuto Reload Value: 2699这里先按20kHz填后面程序里动态改PWM Pulse: 134950%占空比不过驱动芯片只看上升沿占空比不太重要Trigger OutputTRGO不需要DAC参数设置为Output Buffer: EnableTrigger: None软件触发4.2 第二步编写核心驱动控制函数HAL库生成代码之后需要补充几个关键函数。首先是PWM启动函数void StepMotor_StartPWM(uint32_t pulse_freq_hz) { uint32_t arr (108000000U / (2U * pulse_freq_hz)) - 1U; __HAL_TIM_SET_AUTORELOAD(htim1, arr); __HAL_TIM_SET_COMPARE(htim1, TIM_CHANNEL_1, arr / 2); HAL_TIM_PWM_Start(htim1, TIM_CHANNEL_1); }这个函数可以实时修改ARR值来改变速度。在加减速过程中我建议每次更新ARR的间隔不小于100µs否则电机会因为加速度突变产生顿挫感。方向切换和使能控制void StepMotor_SetDirection(uint8_t dir) { HAL_GPIO_WritePin(DIR_GPIO_Port, DIR_Pin, dir ? GPIO_PIN_SET : GPIO_PIN_RESET); } void StepMotor_Enable(uint8_t enable) { HAL_GPIO_WritePin(ENBL_GPIO_Port, ENBL_Pin, enable ? GPIO_PIN_RESET : GPIO_PIN_SET); }注意ENBL是低电平有效所以使能时引脚输出低电平。如果你在这里把逻辑搞反了现象是电机完全没有保持力矩手能直接转动电机轴这是最常见的新手错误。4.3 第三步加减速曲线实现步进电机最怕的就是高速突停或突启。如果脉冲频率从0瞬间跳变到20kHz电机的转子跟不上磁场旋转速度就会丢步甚至啸叫。所以必须实现梯形加减速或者S型加减速。我的做法是使用TIM6定时器中断每1ms触发一次在中断服务函数里做速度规划void TIM6_DAC_IRQHandler(void) { if (__HAL_TIM_GET_FLAG(htim6, TIM_FLAG_UPDATE) ! RESET) { __HAL_TIM_CLEAR_FLAG(htim6, TIM_FLAG_UPDATE); Motor_SpeedProfile_Update(); } }Motor_SpeedProfile_Update函数根据当前速度目标和加速度值计算下一步的脉冲频率然后调用StepMotor_StartPWM更新ARR。梯形加减速的公式很简单V_next V_current ± A × Δt其中A的单位是Hz/s每秒脉冲频率的变化。举个例子目标转速是20kHz加速度设为50kHz/s那么从0加速到20kHz需要400ms。这个加速度是否合适取决于电机负载惯量。负载越大加速度就要越小。一个经验值是带减速箱或同步带的应用加速度不超过目标频率的一半除以加速时间也就是每秒频率增量控制在目标频率的25%到50%之间。4.4 第四步与位置计数器联动实际应用通常需要知道电机当前走了多少步。我的建议是用TIM1的重复计数功能来产生步进脉冲计数然后通过定时器更新事件触发一次外部中断每次增加一个步数计数器。不过更简单的方案是用STM32F767ZG的硬件正交编码器接口分别接在电机轴端的编码器信号上。但那样要额外接线。其实开环步进系统里脉冲计数本身就是位置反馈。使用TIM1的PWM输出脉冲数可以通过读取TIM1的计数器自动重载次数得到。具体做法是使能TIM1的更新中断在更新中断里累加脉冲数void TIM1_UP_TIM10_IRQHandler(void) { if (__HAL_TIM_GET_FLAG(htim1, TIM_FLAG_UPDATE) ! RESET) { __HAL_TIM_CLEAR_FLAG(htim1, TIM_FLAG_UPDATE); step_count (dir ? 1 : -1); } }注意TIM1每重载一次就产生一次更新事件对应一个步进脉冲。这样软件里的step_count就是绝对的电机位置。这个方法在1/8细分下能达到3200步/圈的定位精度长期运行也不会累积误差除非丢步。4.5 硬件连线与检查清单PCB或者洞洞板焊接完成后上电前一定要按照以下清单逐项检查电源极性VM是否有反接保护DRV8818没有内置防反接需要自己加保险丝或者二极管R_SENSE电阻阻值是否正确焊盘是否短路VREF电压是否在0到2V之间用万用表测量STEP、DIR逻辑是否接反尤其是DIR接VCC还是GND的判断ENBL和nSLEEP是否在默认状态下满足工作条件ENBL低有效nSLEEP高有效电机相序A相接OUT1/OUT2B相接OUT3/OUT4不要交叉上电后先不使能电机用手转动电机轴这时应该能感觉到轻微的齿槽转矩。如果电机轴完全自由或者特别沉重检查相线是否短路。5. 常见故障与排查实录5.1 电机嗡嗡叫但不转这个现象非常典型尤其在刚焊完板子时。原因通常是单相电流没有建立另一个相没有导通。排查步骤先测量两相绕组的电压。正常工作时用万用表AC档测OUT1-OUT2应该有斩波后的交流电压测OUT3-OUT4同样有。如果只有一相有电压检查对应H桥的供电是否正常或者该相的上管栅极驱动是否受控。还有一种可能是STEP脉冲根本没有输入。用示波器探针夹在STEP引脚上看是否能看到方波信号。如果看不到排查STM32的定时器配置。我遇到过TIM1_CCR和ARR设置反了的情况输出的PWM周期正确但占空比几乎为0DRV8818需要上升沿触发如果PWM信号一直处于高电平就不会产生动作。5.2 芯片发热严重甚至冒烟芯片发热绝大部分原因不是芯片本身的功耗而是电流设定过大。举个例子如果你计算了VREF应该0.75V但DAC实际输出因为软件配置错误变成了1.8V那么电流调节阈值等于1.8/(5×0.1)3.6A超过了DRV8818的绝对最大额定值。这时芯片必热无疑还会连带电机发热。排查方法直接把VREF引脚的电压用万用表测一下同时空载运行时测量VM电流。正常情况下24V供电、1.5A设定电流时电机锁定状态下的平均电流应该在0.8A左右考虑到斩波占空比。如果电流超过2A立即断电查设定参数。另外注意DRV8818的底部有散热焊盘PowerPAD必须焊接到PCB上的大面积铜皮上才能有效散热。在商业项目中我会在PowerPAD正下方的PCB底层也铺一块接地铜皮并打上多个过孔导热。如果你只是用洞洞板飞线测试芯片散热面积不够即使参数正确也会过热。5.3 高速运行时丢步丢步的宏观表现是电机在高速阶段发出明显的咔咔声最终位置和预期位置偏差很大。原因多半不是驱动芯片问题而是加减速曲线不合理或者电流不够。排查思路是这样的先确认低速比如1kHz脉冲时是否准确。低速准确、高速丢步就是加速过程太急促了。把加速度参数减小到原来的三分之一再试。如果还是丢步检查高速时的电流设定步进电机的反电动势会随着转速升高而增大导致有效电压加在绕组电感上的时间变短电流下降。这时需要适当提高VREF或者降低电源内阻换更粗的电源线。另一个容易忽略的因素是STEP脉冲最短宽度。DRV8818要求STEP引脚的高电平或低电平持续时间不低于1µs。如果你的PWM频率达到40kHz脉冲周期25µs占空比50%时高电平12.5µs完全满足要求。但如果用了timer输出引脚配置错误导致脉冲高电平时间只有几百纳秒驱动芯片接收不到有效边沿就会丢步。用示波器测一下脉冲高电平时间是最直接的办法。5.4 FAULT引脚一直拉低上电后发现FAULT就是低电平电机无法使能。这种情况先断开电机电源单独给逻辑部分供电看FAULT是否恢复。如果不恢复说明芯片可能已经损坏通常是过流或过压导致的。如果恢复高电平再接上VM电源FAULT又拉低检查VM电压是否低于欠压锁定阈值。DRV8818的UVLO阈值大约是8V低于这个值就报故障。如果电源电压在边缘波动比如从9V掉到7.9V再恢复也会反复触发故障。还有一个工程经验FAULT引脚上拉电阻的阻值。如果上拉电阻是10kΩ而FAULT引脚挂载的电容较大低电平脉冲可能被拉不上去导致MCU检测到持续的低电平。建议上拉电阻用4.7kΩ并且不要在FAULT线上加滤波电容。5.5 电机噪声与振动偏大步进电机在低速时天然有振动这是步进电机的工作原理决定的不是故障。但如果你发现振动异常大有高频啸叫通常和电流调节频率以及衰减模式有关。先尝试把DECAY引脚拉低慢衰减这个方法能有效降低振动但也可能加剧温热。再做一下电流波形检查用示波器电流探头或者串一个小电阻看看绕组电流波形是否平直。如果电流波纹严重说明R_SENSE的滤波电容如果有的话或者VREF的滤波电容取值不当会在电流反馈环路上产生相位延迟引发振荡。实际项目中电源的直流母线电容对噪声影响也很大VM引脚上100µF电解电容旁边一定要并100nF高频陶瓷电容否则斩波产生的高频分量会通过电源线辐射出去表现为无线电频段的噪声。6. 实操心得与这个方案的扩展空间做这套系统时我最深的一点体会是DRV8818这种简单粗暴的驱动芯片适合你希望完全掌控控制逻辑的场合。它的调优过程就是一遍遍用示波器看电流波形、听电机噪声、调衰减模式直到找到一个最稳的工作点。这个过程虽然繁琐但是会让你对步进电机的物理特性有很直观的理解。最后分享一个扩展技巧DRV8818的VREF如果不用DAC而是用一个电位器手动调节在做原型测试时会更方便。我第一版测试板就是这样做的0.1Ω采样电阻配合一个10kΩ电位器加一个1kΩ串联电阻从3.3V分压得到可调VREF。调整电机电流时我只需要转电位器不需要改固件重烧录。等功能确定需要软件控制电流时再切换到DAC方案。这个技巧我建议每个做电机驱动的朋友在早期原型阶段都试一试能省下大量反复编译烧录的时间。
返回列表