免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

FPGA+TB67S579FTG步进电机驱动方案:从电流环到加减速的工程实践

FPGA+TB67S579FTG步进电机驱动方案:从电流环到加减速的工程实践 前阵子给一台小型的 XY 光学平台换驱动器电机是双极 42 步进NEMA17原来的方案是 MCU 用定时器中断产生脉冲软件算加减速结果平台一旦跑起来MCU 同时还要处理传感器和通信脉冲频率就跟着抖定位精度肉眼可见地飘。后来我把方案改成 FPGA手上的型号是 R7KA8D2KFLCACAMD/Xilinx 车规级 Artix-7 平台的器件产生脉冲配一颗 TB67S579FTG 双极步进电机驱动芯片做电流闭环问题基本一次解决。这篇文章就把这套东西从选型、外围设计到实测排障完整梳理一遍给正在做步进电机位置控制的工程师一个参考。你可能会问直接用 MCU 不行吗步进电机驱动芯片那么多为什么单独挑这两颗FPGA 在这里到底比 MCU 强在哪这些问题我会在下面的章节里一个一个说清楚。文章不追求教科书式的全面只讲我在样机上实际验证过的方案以及调试时踩过的坑。1. 从电机到脉冲这套系统里每个器件到底在干什么1.1 双极步进电机的本质驱动需求先理清一个基础问题双极步进电机和常见的四线、六线电机到底需要什么样的驱动信号。双极电机内部是两组独立绕组和单极电机不一样它不能简单地用某相通电来完成换向而是要让电流能够在绕组里正反两个方向流动这样才能让磁场方向反转电机才能一步步往前走。这就是为什么双极步进电机驱动电路的核心是 H 桥。一个绕组配一个 H 桥两个绕组就是两个 H 桥四个功率开关管协同动作控制电流方向和占空比。但这里有个容易忽略的细节H 桥只解决了换向问题没有解决限流问题。步进电机的绕组电阻通常只有几欧姆如果直接把电源电压加在绕组上电流会迅速飙升步进电机的额定电流根本撑不住芯片也会很快过热甚至烧毁。所以任何实用的步进驱动方案都必须有斩波恒流机制也就是 PWM 电流控制。驱动器在电流达到设定值后关断功率管电流自然衰减到一定阈值后再开通让绕组电流稳定在目标值附近。这个环路的响应速度和稳定性直接决定了电机的噪音、发热和运行平稳度。我的建议是凡是要做正经产品不要在 MCU 里用 ADC 采样电流再软件控制 PWM那个环路带宽太低。把电流环交给专业驱动芯片你的代码只需要关心什么时候发脉冲。1.2 TB67S579FTG把电流环路交给硬件TB67S579FTG 就是负责电流环的那颗芯片。它把两个 H 桥、电流检测、PWM 斩波、衰减控制、过热保护这些东西全部集成在一起外部要做的只是给它提供逻辑电平信号、一组电流设定电阻和电源去耦电容。这颗驱动芯片最实用的地方在于它把 STEP/DIR有些手册叫 CLK/DIR这种脉冲控制方式做得非常干净。我只要在 STEP 引脚上给一个脉冲芯片内部就走一个步进DIR 引脚的电平决定方向至于绕组里电流怎么切换、怎么斩波、什么时候衰减芯片内部的模拟电路自己处理完全不占我 CPU/FPGA 的资源。用开关电源来类比你就理解了TB67S579FTG 就像一个带电流环的开关电源只不过它的输出不是固定的直流电压而是按照步进时序在两个绕组之间切换的受控电流。你给它目标电流值和换相指令它负责把电流闭环做好。有一点要注意TB67S579FTG 的电流设定通常是通过 VREF 引脚电压和检流电阻配合完成的。不同档位的芯片、不同封装的检流电阻阻值对应不同的满量程电流。具体计算公式以官方数据手册为准我在下一章会给出一个我实际验证过的配置思路。1.3 R7KA8D2KFLCAC脉冲从哪里来说完了电流环再来看脉冲源。R7KA8D2KFLCAC 从 AMD/Xilinx 的命名规则来看属于车规级 Artix-7 平台这一档的 FPGA。车规级意味着它的工作温度范围更宽、通过了更高标准的老化测试在工业设备里用起来更放心。当然选它的另一个原因是当时手头就有这颗料而且 Artix-7 这个级别的资源对步进控制来说绰绰有余。FPGA 在步进控制里的角色是精确的脉冲发生器。步进电机的角位移完全由脉冲个数决定转速完全由脉冲频率决定因此脉冲的均匀性、实时性比什么都重要。FPGA 的特点恰恰在于它所有逻辑都是硬件并行执行的脉冲输出由硬件计数器直接驱动不受中断、总线负载、操作系统调度的影响。同样一段加减速曲线MCU 软件实现可能误差几十微秒FPGA 实现可以把每个脉冲的间隔误差控制在纳秒级。这里要纠正一个常见误区很多人觉得我这个项目只需要单轴MCU 定时器够了。如果只是随手做个玩具确实够。但一旦系统里有多轴联动、有闭环编码器反馈、或者需要在线改变速度曲线MCU 的定时器资源就会捉襟见肘。FPGA 的方案扩展性好得多一个轴和八个轴的复杂度差异很小因为每增加一个轴基本就是复制一个硬件模块。R7KA8D2KFLCAC 在这套方案里的具体分工是通过 AXI-Lite 或简单的寄存器接口接收上层控制器的目标位置、速度、加速度参数内部生成带加减速的 STEP 脉冲序列同时管理 DIR、使能信号。这一层的设计我会在第 3 章详细展开。2. TB67S579FTG 外围电路设计电流设定与衰减模式是关键2.1 关键引脚和它们在板上的接法TB67S579FTG 这类驱动芯片的引脚功能不同型号之间会有差异但核心逻辑引脚基本是相通的STEP有时叫 CLK、DIR、ENBL使能、VREF电流基准、衰减模式配置引脚。我在设计首版原理图的时候习惯把所有模式配置引脚先通过 0 欧电阻接到确定的电平而不是直接焊死这样后续调试改配置不用重做板子。FPGA 连接驱动芯片时最容易忽视的是电平匹配问题。R7KA8D2KFLCAC 的 IO 工作在 3.3V 或更低而传统步进驱动芯片的逻辑输入有些是兼容 5V 的有些是 3.3V 兼容的。TB67S579FTG 的逻辑输入具体耐压范围要看手册稳妥的做法是在 FPGA 和驱动芯片之间加一级电平转换或者至少串联限流电阻防止万一配置错误把 FPGA 的 IO 打坏。我自己的板子上直接用了 33 欧串联电阻实测下来没有问题但如果你的驱动芯片逻辑高电平阈值偏高就不要学我老老实实加转换芯片。另一个常被忽略的点是 ENBL 使能引脚的默认状态。很多板的 ENBL 是低电平有效如果上电瞬间 FPGA 的 IO 处于高阻态没有外部上下拉电阻驱动芯片可能处于意外使能状态电机会在上电瞬间抖一下。解决办法是在 ENBL 引脚上加一个 10k 下拉电阻确保上电默认不使能等 FPGA 配置完成后再拉高释放。2.2 电流设定电阻的计算步进电机的相电流不是越大越好。电流太小会丢步电流太大会让电机和驱动芯片双双过热还容易让电机高速区掉扭矩。要理解电流设定首先要明确一个概念步进电机的额定相电流是指直流稳态下绕组允许的电流值但步进驱动器用的是恒流斩波实际平均电流和峰值电流之间有一个比例关系。TB67S579FTG 的典型电流设定方式是检流电阻两端的电压作为电流反馈与 VREF 引脚设定的参考电压做比较芯片通过调整 PWM 占空比让检流电压稳定在参考值附近。所以检流电阻的阻值选择非常关键。举个例子如果目标相电流是 1.5A检流电阻选 0.1 欧那么检流电阻上的满量程压降就是 0.15V如果 VREF 被设定为 0.75V那么芯片内部可能需要通过增益网络做匹配最终的实际电流是 VREF 除以检流电阻 × 增益系数。不同档位的增益系数不同这个必须以数据手册的公式为准不要套别的芯片的公式。我实际调板时用过一个很实用的方法先把 VREF 设到数据手册推荐的典型值不接电机在电机接线端子处用万用表量不到电流所以我会接一个额定电流相同的功率电阻假负载然后测检流电阻上的模拟电压反推实际电流。确认电流值正确后再接真实电机。这样能防止接电机时因为电流设定错误导致烧线圈。2.3 衰减模式的选型逻辑衰减模式这个参数很多第一次用步进驱动芯片的人会忽略但它对电机的高频噪音、发热、高速性能影响极大。简单说PWM 电流环在斩波关断阶段绕组电流需要泄放泄放的方式就决定了电流下降的速度慢衰减关断后绕组两端短路电流靠绕组内阻和续流二极管缓慢衰减。电流纹波小低速平稳但高速时电流跟不上容易丢步。快衰减关断后绕组两端接反向电源电压电流快速下降。高速性能好但电流纹波大电机会有尖锐的噪音。混合衰减先快后慢兼顾高低速性能和噪音水平。TB67S579FTG 如果提供可配置的衰减模式我建议默认选择混合衰减然后在实测中根据电机的噪音情况微调。千万不要迷信快衰减就一定能跑高速因为快衰减虽然让电流下降快但平均电流也会被拉低在同样设定电流下高速扭矩反而可能下降。我遇到过一台 57 步进电机同样的加减速参数慢衰减模式跑到 600rpm 就开始异响切到混合衰减后 900rpm 都能平稳运行而且表面温度还降了几度。这就是衰减模式选型带来的直观差异。3. FPGA 侧脉冲发生从计数器到加减速曲线3.1 为什么脉冲要由 FPGA 而不是主控 CPU 产生很多人觉得FPGA 写逻辑麻烦MCU 一个定时器就搞定脉冲但在这个方案里我要说脉冲产生这件事恰恰是 MCU 最容易被挑战的任务。首先是频率精度的连续性问题。MCU 用定时器产生方波频率切换的瞬间往往会出现一个拉长或缩短的周期这在需要平滑加减速的场景里会让电机产生顿挫。FPGA 用硬件比较器产生脉冲频率切换可以做到下一拍就生效每个周期的误差只取决于系统时钟抖动。其次是多轴同步。如果你只有单轴MCU 的优势还说得过去一旦做双轴甚至三轴联动插补MCU 做插补运算和脉冲输出之间会有延迟可能造成轴与轴之间不同步。FPGA 的办法是所有轴的脉冲发生器共享同一个时钟和同一个加减速查表几何上可以做到严格同步。R7KA8D2KFLCAC 这块 FPGA 在我的项目里除了产生脉冲还顺带完成了编码器计数、原点开关去抖、限位信号锁存这些杂活。这些任务在 MCU 里会抢占定时器中断但在 FPGA 里只是几张表、几个寄存器的事。3.2 最小系统一个带加减速的 Step 脉冲发生器我在 FPGA 里实现的最小可运行脉冲发生器包含几个模块目标速度寄存器、当前速度计数器、加减速状态机、周期比较器、STEP 输出触发。整个逻辑用 Verilog 实现大约两百行核心思路是每个系统时钟周期比较一次计数器是否达到目标周期值。关键代码逻辑如下module step_gen #( parameter CLK_FREQ 100_000_000 )( input wire clk, input wire rst_n, input wire start, input wire [31:0] target_period, // 目标脉冲周期单位时钟周期数 input wire [31:0] accel_step, // 每个脉冲周期的变化步长 output reg step_pulse ); reg [31:0] period_cnt; reg [31:0] current_period; always (posedge clk or negedge rst_n) begin if (!rst_n) begin period_cnt 32d0; current_period 32d0; step_pulse 1b0; end else begin if (period_cnt current_period) begin period_cnt 32d1; step_pulse 1b1; // 这里按加减速状态更新 current_period if (start (current_period target_period)) begin current_period current_period - accel_step; end end else begin period_cnt period_cnt 1b1; step_pulse 1b0; end end end endmodule这段代码是示意性质真正工程化还需要加加减速完成判断停止时输出最后一个脉冲的收尾逻辑。我把它贴出来的目的是让你感受 FPGA 实现的思路它不用操作系统、不用中断只是在每个时钟周期做一次数值比较。从周期到速度的换算关系是这样如果系统时钟是 100MHzcurrent_period 是 1000那么脉冲频率就是 100MHz / 1000 100kHz。步进电机步距角 1.8°芯片细分数为 16则每脉冲对应 1.8 / 16 0.1125°。所以 100kHz 脉冲频率对应转速为 100000 × 0.1125 11250°/s即 31.25 转/秒换算成转速大约是 1875rpm。这个例子只是为了说明换算逻辑实际步进电机到这个转速扭矩已经衰减得差不多了真正常用的转速在 300rpm 到 900rpm 之间。3.3 加减速曲线怎么选步进电机的扭矩会随着转速升高而下降所以它不能像伺服电机那样直接一步到位给定高速。如果不做加减速直接从静止跳到 100kHz 脉冲频率第一个脉冲周期的扭矩可能不足以带动负载就会丢步。丢步的本质不是电机没收到脉冲而是脉冲来得太快转子机械响应跟不上电磁转矩变化。梯形加减速是最容易实现、也够大多数场景使用的方案。它的思路是加速阶段按固定斜率提升脉冲频率达到目标速度后匀速停止前按同样斜率减速。问题是梯形曲线的加加速度jerk在拐点处是无穷大电机在拐点处会有一个冲击高速或大惯量负载下容易丢步。S 形加减速的加速度本身按照某种平滑曲线变化加加速度有界。同样的加速时间内S 形的峰值速度比梯形略低但机械冲击小很多适合负载惯量比较大的应用。在 FPGA 里实现 S 形加减速最简单的方式是查表预先算好一张从 0 加速到目标速度的周期表FPGA 只需要顺序查表更新 current_period不需要在线做浮点运算。我个人的选型建议是轻载的 XY 平台、3D 打印机这类梯形加减速加一个合适的加速度上限就够转台、龙门架这类惯量较大的优先上 S 形如果有共振噪音问题还可以考虑在曲线拐点处加一个短暂的低速停留牺牲一点节拍换取平稳性。4. 电源与 Layout 实践步进系统翻车重灾区4.1 VM 电源电容不是越大越好步进驱动系统的电源设计是新手最容易翻车的地方。一开始我也以为电源电容越大越好结果在 VM 引脚附近堆了一堆大电解电容反而出现了低频振荡。原因是步进电机的负载是脉冲式的开关频率通常在 20kHz 到 80kHz 之间这个频率下的电流脉动需要低 ESR 的电容来吸收而大电解电容的 ESR 偏高高频响应反而不够。我最终验证的配置是电源输入端放一个 100µF 电解电容做储能靠近 TB67S579FTG 的 VM 和 GND 引脚放一个 0.1µF 陶瓷电容加一个 10µF 陶瓷电容并联。陶瓷电容的低 ESR 特性可以把高频纹波压住电解电容负责提供较长时间的电流支撑。注意陶瓷电容要选 X7R 或者更好温度特性的材质不要用 Y5V 的否则温度一上来容量就掉得厉害。如果电源离驱动板比较远还有一个非常容易被忽略的问题长引线的寄生电感会在电机换相瞬间产生很大的电压尖峰。这个尖峰如果超过芯片的绝对最大额定值一次就可能把驱动芯片打坏。解决办法是在电源输入端加入 TVS 管或者至少慢恢复二极管做钳位同时让电源线尽可能双绞。4.2 电机绕组接线与线序验证双极步进电机的线序接错是最常见的低级错误但接错之后的故障现象非常具有迷惑性不一定是完全不动更可能是振动但转不起来或者某个方向力矩明显不足。四线双极电机的情况最简单用万用表通断档可以量出两组独立的绕组同组的两根线之间导通不同组之间不通。只要两组绕组分别接到驱动器的 A/A- 和 B/B- 即可。六线电机多出两个中心抽头如果不使用中心抽头只需要忽略它们用万用表找出两组绕组后把每组的两个端线接驱动输出如果使用中心抽头说明你想利用半步或不同电压特性那就要确认中心抽头的位置避免把端线接到中心抽头上导致只激励了半个绕组。八线电机的接法最灵活可以串联、并联或单极性。接线时的原则是串联接法适用于低电压高电流驱动器并联适用于高电压低电流驱动器。但两种接法对驱动器电流设定要求不一样改动接法后必须重新计算电流设定电阻。我在第一次给 57 电机接线时犯了一个错误只量了绕组通断没确认同名端极性结果 A 相接反了。电机表现为正转指令走了几步后卡死当时我以为是加速度太大反复调曲线浪费时间。后来用示波器同时测两个绕组的电流波形才意识到是线序问题。所以要提醒你出现方向异常或运行不畅时先排除线序再去动算法参数。4.3 散热设计与热阻TB67S579FTG 如果要连续输出 2A 以上的相电流散热设计不能省。芯片结到环境的热阻在数据手册里会给但更重要的是 PCB 铜箔面积和过孔。芯片底部的裸露焊盘必须可靠焊接到 PCB 地平面并且地平面要尽量延展通过过孔阵列把热量引导到背面铜皮。判断散热是否足够的实用标准满载连续运行 30 分钟后芯片表面温度保持在 85°C 以下比较安全超过 100°C 就要警惕。我有一个土办法用手指背碰芯片表面如果能持续按压超过 5 秒不觉得烫得难受大概在 60°C 上下如果 1 秒都碰不住通常已经超过 80°C 了。当然这只是一个粗略判断量化还是要用红外测温枪。如果你的结构空间不允许做大面积散热铜皮另一个选择是降低电流设定值但不要降过头丢步或者修改细分和衰减模式来降低有效发热。需要明确的是PWM 斩波频率越高开关损耗越大芯片越热但斩波频率太低电流纹波大电机噪音大。这是一个需要在实测中找平衡的点。5. 实测调试记录丢步、异响、发热问题逐个定位5.1 丢步排查先看电流再看曲线第一版固件跑起来后我最先遇到的问题是快速定位时丢步。现象是从 A 点到 B 点快速移动到达位置后断电重新上电电机回零位置明显偏了。一开始我怀疑是 FPGA 脉冲计数出错于是用逻辑分析仪抓 STEP 引脚波形数完脉冲数量发现完全正确说明丢步发生在机械侧。第二步怀疑电流不够。我检查了两件事一是 VREF 电压是否被分压电阻拉低二是检流电阻焊接是否正常。测量后发现 VREF 电压正常但检流电阻端电压在高速时明显偏低。这说明高速状态下电流环跟不上实际相电流没有达到设定值。问题锁定在加减速曲线上我把加速时间设得太短等效加加速度过大电机在此过程中的实际扭矩不足以克服负载惯量。解决办法不是盲目加大电流而是把 S 形加减速的总时间从 300ms 延长到 600ms丢步问题立刻消失。所以丢步排查顺序应该固定为先验证脉冲没丢再验证电流达到设定值最后调加减速。这个顺序反过来很容易浪费时间。5.2 电机异响衰减模式重新选丢步解决后又出现一个新问题电机在 300rpm 到 500rpm 之间运行时噪音特别尖锐整个平台都在震。用耳朵听频率不是均匀的机械轴转频而是类似滋滋的高频声。我用示波器看了电机绕组的电流波形发现电流纹波很大电感续流阶段的衰减很剧烈。这是因为默认衰减模式可能选得偏向快衰减。我把衰减模式配置位改成混合衰减后纹波明显变小尖锐噪音也基本消失只剩下正常的电磁噪音。这里也验证了第 2 章说的衰减模式对高速运行的平稳性影响非常大。如果板子上没有配置衰减模式的硬件开关就得靠软件控制芯片寄存器去改。如果你的驱动芯片衰减模式是引脚固定的那就只能在原理图阶段做好设计这又是一个我建议把配置引脚引出来做成跳线的原因。5.3 芯片烫手电流降额和斩波参数连续跑了几分钟后我发现 TB67S579FTG 表面的温度比预期高。用红外测温枪量了一下外壳温度 92°C虽然没到数据手册的绝对上限但我总觉得有点危险。排查过程是这样的先量实际相电流发现设定 2.0A 的电流在示波器峰值测到接近 2.3A。这是因为检流电阻的温漂导致反馈值偏低芯片为了让检流电阻上达到参考电压会输出更大的电流形成正反馈。解决办法是把额定电流从 2.0A 降到 1.7A留出余量同时把检流电阻换成了温漂更低的合金电阻。另外还有一个贡献发热的因素是 VM 电压偏高。当时电源用的是 36V而电机的额定电流对应的工作电压其实可以更低。电压越高电流上升越快斩波频率内开关损耗越大。我把 VM 降到 24V 之后芯片温度降了接近 10°C而且运行平稳度没有明显变化。一个经验是VM 电压选在电机额定电压的 4 到 8 倍之间都可以但要结合驱动芯片的热设计和电机的高速需求来折中。低电压省热高电压提高速扭矩具体要实测。5.4 下一步扩展方向这套 FPGA 加专用驱动芯片的方案跑通之后后续可扩展的方向很清楚多轴同步加减速、编码器闭环、位置触发输出这些功能都能在 FPGA 里方便地叠加。R7KA8D2KFLCAC 的资源应付这些绰绰有余而你在 MCU 方案里为多轴同步做的各种软件补偿在 FPGA 里不过是多例化几个模块而已。我个人的体会是步进电机控制这个看似老掉牙的领域真正把稳定性和精度做好牵扯到的是电流环路、机械负载、加减速策略和电源设计几个维度的系统工程。用 FPGA 做脉冲源只是解决了其中一个环节但正是这个环节决定了定位系统的上限。如果你正好手里也有类似的车规级 FPGA 和步进驱动芯片不妨按这个思路搭一版最小系统用逻辑分析仪先验证脉冲再逐步加上电流和负载整个过程会比想象中顺利得多。
返回列表