资讯动态

基于TB67S531FTG与PIC18F86J16的步进电机驱动控制系统设计

发布时间:2026/9/18 3:01:55 来源:尧图企业网站定制
1. 方案选型与整体设计思路1.1 为什么是“MCU 专用驱动芯片”的组合先把这个项目的定位说清楚这不是一个用开发板点个灯、转个风扇的小实验而是面向工业设备和机器人执行机构的电机控制系统。核心器件是一颗东芝的步进电机驱动芯片 TB67S531FTG和一颗 Microchip 的 8 位单片机 PIC18F86J16控制对象是两相双极步进电机。很多刚接触步进电机的人第一反应是直接用单片机 GPIO 搭 H 桥或者买一块现成的步进驱动板不就行了吗搭 H 桥确实能转但工业环境下你很快会遇到几个绕不开的问题电机电流怎么精确限制、如何避免芯片过热烧毁、怎么实现低噪声的细分驱动、堵转或者过流时怎么保护。这些问题如果全部用分立元件解决电路复杂度会非常高而且可靠性很难保证。用专用驱动芯片等于把最难的功率级和模拟控制部分封装好MCU 只负责逻辑和算法这是工业产品里最常见的分工方式。TB67S531FTG 这个型号在国内讨论不算多但它在东芝的步进驱动产品线里很有代表性。它内部集成了双 H 桥驱动、电流检测和 PWM 恒流控制支持 1/32 微步细分耐压 50V峰值电流能到 3A 左右。PIC18F86J16 则是一颗 64 引脚、自带 64KB 闪存和 4KB RAM 的 8 位单片机主频最高 48MHz带有多个 CCP/ECCP 模块、定时器、SPI/I2C 和 UART可以说它的外设资源就是为这种电机控制场景准备的。如果你问为什么不用 STM32我只能说这是产品线选择问题。在很多工业存量项目里PIC18 系列有长期供货保证开发工具链成熟而且这颗 J16 型号的引脚和功能足够覆盖“脉冲 方向”或者“并行控制”这两种主流驱动方式。对于一台只需要完成固定流程的工业设备8 位机完全够用没必要上 32 位平台增加成本和调试复杂度。1.2 两相双极步进电机的控制本质要理解整个系统先得把控制对象说清楚。两相双极步进电机内部有 A、B 两组线圈每个线圈需要双向通电才能换向所以驱动器必须用 H 桥结构。和单极电机相比双极电机的绕组利用率更高同样体积下能输出更大扭矩这也是工业场合更常用双极电机的原因。步进电机的控制本质就是按照一定顺序改变两个绕组的电流方向让转子一步一步地旋转。每给一个换相脉冲转子就转过一个固定的步距角这个“开环也能定位”的特性是步进电机最大的优势。常见步距角是 1.8°也就是整步模式下转一圈需要 200 个脉冲。但实际工业应用中很少用整步驱动因为整步运行时振动大、噪声大、低速不平顺。于是就有了细分驱动把每一步细分成多个微步让电流按阶梯状变化转子就能平滑地停在中间位置。TB67S531FTG 支持 1/32 细分也就是说 1.8° 的步距角可以被切分成 1/32转一圈需要 6400 个微步。细分不只是为了减小振动它直接提高了定位分辨率和低速平稳性这在机器人关节和精密定位平台上是刚需。这里有一个容易混淆的概念细分不等于提高精度而是提高分辨率。电机本身还是那台电机齿槽转矩和机械误差不会因为细分而消失但平滑度和低速特性会明显改善。这一点在做系统设计时要想清楚别把细分的分辨率当成真实定位精度去写进技术协议里。1.3 TB67S531FTG 与 PIC18F86J16 的分工整个系统的分工很清晰。PIC18F86J16 负责“想”接收上位机指令、规划运动参数、计算加速曲线、输出步进脉冲和方向信号、监测故障状态。TB67S531FTG 负责“做”把逻辑信号变成功率级的电流输出同时内部完成电流斩波、过流保护、热关断这些模拟域的工作。这种分工带来的直接好处是软件和硬件可以并行开发。硬件工程师只需要保证供电、信号完整性、散热和 EMC 达标软件工程师不用关心功率级的细节只需要按照数据手册的时序要求产生脉冲就行。对于项目周期紧的团队这种解耦非常实用。TB67S531FTG 提供了两种控制接口模式。一种是标准的 STEP/DIR 模式CLOCK 引脚接收步进脉冲CW/CCW 引脚决定方向MCU 只需要两个 GPIO 就能驱动电机。另一种是并行模式通过 A0、A1、B0、B1 四个引脚直接控制 H 桥的通断顺序这种方式适合不需要细分、只需要简单正反转的场景。我在实际项目中基本都选 STEP/DIR 模式因为细分和加减速控制都更容易实现而且后续需要换更大扭矩的电机时只需要调整驱动芯片和电流设定软件侧几乎不用动。2. 硬件电路设计与关键参数计算2.1 电源设计与电流设定硬件设计的第一步是确定供电电压和电机电流。这两者直接决定整个功率级的方案。供电电压的选择有一个基本原则电压越高电流建立越快高速性能越好。步进电机绕组是电感性的电流上升速度与电压成正比。如果电压太低电机在高速时扭矩会急剧下降。但电压也不是越高越好因为 TB67S531FTG 的绝对最大额定值是 50V还要考虑母线电压纹波和反电动势尖峰所以实际使用时建议留出 20% 以上的余量。我通常把 24V 作为中小型工业步进电机的标准选择这个电压下大部分 NEMA17 和 NEMA23 电机都能跑出不错的性能曲线。电流设定是另一个关键参数。TB67S531FTG 通过外部分流电阻检测电流然后与 VREF 引脚输入的参考电压比较实现恒流斩波控制。输出电流和参考电压的关系由数据手册的公式决定。以我的经验设定公式可以按实际使用的检测电阻阻值反推大多数应用里检测电阻取 0.22ΩVREF 在 0.5V 到 2.0V 之间都能获得合理的工作点。需要特别注意的一个问题是电机的额定电流并不等于驱动器的设定电流。两相双极步进电机的额定电流通常指单相导通时的最大电流但在实际运行中电机发热量取决于电流有效值。如果你把驱动器设定电流直接拉到电机额定值长时间运行时电机温度很容易超过 80℃导致退磁和寿命缩短。我在一般场合会按额定值的 90% 来设定只有在需要短时大扭矩输出时才给到 100%。2.2 衰减模式的选择与配置衰减模式是步进驱动里最容易被忽略、但影响最大的一个配置项。TB67S531FTG 支持多种电流衰减模式比如快衰减、慢衰减和混合衰减。简单说衰减模式决定的是 PWM 关断期间绕组电流是如何下降的快衰减时电流通过二极管和电源回流下降速度快但电流纹波大慢衰减时电流在 H 桥内部续流下降慢但纹波小。不同衰减模式对电机运行的影响非常明显。快衰减适合高速运行因为电流能快速跟上换相步序慢衰减适合低速运行噪声和发热都更小。混合衰减则是两者的折中先快衰减一段时间再切到慢衰减让电流下降曲线更平滑。实际调试中我一般先用手持示波器看电流波形把衰减模式从默认值开始逐个切换对比电机的噪声和温升。没有示波器的话可以用“听噪声 摸温度”的方式大概判断电机啸叫明显通常是衰减模式不合适或者斩波频率不合适电机温升异常快就要考虑衰减太快导致电流纹波过大。有一个经验值可以参考24V 供电、电机额定电流 1.5A 左右、运行速度在 300 RPM 以下时混合衰减是最稳妥的起点配置。等系统跑起来之后再根据实际工况细调。2.3 MCU 与驱动器的接口设计PIC18F86J16 和 TB67S531FTG 之间的接口电路看起来简单但有很多细节决定系统稳不稳定。下面是我画原理图时的一组标准连接方式有很强的复用性。基本信号分配如下RD0 输出步进脉冲接到 TB67S531FTG 的 CLOCK 引脚RD1 输出方向信号接到 CW/CCW 引脚RC2 输出使能信号接到 ENABLE 引脚驱动器的 VREF 由 MCU 的 PWM 输出经过 RC 滤波后提供这样可以在线调节电流故障输出 TQ/ALERT 反馈到 MCU 的外部中断引脚这里有一个容易踩的坑TB67S531FTG 的逻辑输入不是 5V 直接兼容的具体要以数据手册的 VIH/VIL 电平为准。PIC18F86J16 工作在 5V 时输出高电平接近 5V而驱动芯片的逻辑电源 VM 如果设定为 3.3V则输入高电平不能超过 3.6V 左右直接连上去就可能损坏逻辑端口长时间运行还会出现偶发的不触发、误触发。我的建议是无论 MCU 工作在 5V 还是 3.3V在 STEP/DIR 信号线上都加一个 100Ω 到 220Ω 的串联电阻。这有两个作用一是限制 GPIO 口在芯片切换瞬间的电流冲击二是配合输入端的小电容构成低通滤波器抑制来自电机线缆的辐射干扰。只要不是高速脉冲超过几百 kHz这种简单处理完全够用。另外ENABLE 引脚一定要加一个默认状态设置。很多设计把使能引脚悬空结果上电瞬间电机锁死或者程序跑飞时电机一直保持励磁这在设备调试时非常危险。我的做法是硬件上用 10kΩ 电阻把 ENABLE 下拉到无效电平这样 MCU 没有接管之前驱动器默认不输出软件初始化完成后再主动拉高使能引脚。2.4 PCB 布局与散热经验硬件设计的成败有一半在 PCB 布局上。步进电机驱动属于典型的功率 模拟混合电路布板时如果不注意就会出现“电路原理图完全正确一跑就出问题”的情况。核心原则只有一条大电流回路要短、要粗、要远离信号线。TB67S531FTG 的电源输入、H 桥输出、电流检测电阻构成了最大的脉冲电流回路这个回路的面积越小环路电感越小产生的电压尖峰和电磁辐射就越低。我在布板时会把 VM 的滤波电容尽量靠近芯片的电源引脚检测电阻的正下方就是芯片的地焊盘这样回流路径几乎不经过其它区域。敏感信号线也要保护。STEP 脉冲信号是高速边沿容易成为干扰源也容易被干扰。它必须远离输出端子和电源走线最好用地线包住。时钟引脚旁边的走线在遇到强电流输出切换时如果能看到示波器上出现毛刺说明耦合已经比较严重了这时候可以在 STEP 引脚附近加一个 100pF 到 470pF 的对地电容。散热方面TB67S531FTG 底部有散热焊盘必须焊接到 PCB 的铜箔上并且打过孔连接到背面地层。单靠芯片本体散热远远不够尤其是连续运行电流超过 1.5A 的场合。我的一个项目里最初没有给散热焊盘打过孔表面温度直接上到 110℃芯片进入热关断后来在焊盘区域均匀打了 9 个 0.3mm 的过孔温度降了约 25℃。3. 固件实现从点动到加减速控制3.1 基本步进脉冲与方向控制固件层面的第一步是实现最基本的“给脉冲就转”。用 PIC18F86J16 产生步进脉冲最直接的方式是定时器中断翻转 GPIO。比如要产生 1kHz 的脉冲频率就用定时器设定 0.5ms 中断一次每次中断把 RD0 取反这样输出到驱动器的就是 1kHz 的方波电机每秒走 1000 步。代码结构大致如下// 假设定时器 TMR1 已配置为 0.5ms 中断 void __interrupt() TMR1_ISR(void) { PIR1bits.TMR1IF 0; STEP_PIN !STEP_PIN; // 翻转步进引脚 step_count; }但实际工程里我不会用这种方式作为最终的调速方案原因在于定时器固定周期的脉冲只能产生固定速度不能平滑变速。如果需要变速就得在每次中断里根据当前速度重新装载定时器初值这时代码就复杂起来了。更实用的方案是使用 CCP 模块的 PWM 输出作为脉冲源。PIC18F86J16 的 ECCP 模块可以产生非常精确的方波频率由周期寄存器决定MCU 只需要修改周期值就能改变速度而且不占用额外的中断资源。虽然脉冲计数需要额外软件处理但对于大多数应用来说完全够用。方向控制就简单多了只需要在改变方向信号后让驱动器完成一个方向的换相时序即可。注意一点不要在电机运行途中直接翻转方向信号这相当于让电机瞬间反向加速必然失步甚至堵转。必须先减速到停止再换向再加速。这个逻辑在后面的状态机里会提到。3.2 细分模式下的脉冲计数与位置映射TB67S531FTG 的 1/32 细分模式下物理步距角被切成 32 等份每一个步进脉冲对应 1/32 步。这意味着你发给驱动器的脉冲频率决定了电机转速脉冲总数决定了电机转过的角度。这里有一个实用的换算关系。以 1.8° 电机、1/32 细分、驱动器细分数设为 32 为例转一圈需要的脉冲数 360° / (1.8° / 32) 6400每个脉冲对应的角度 360° / 6400 0.05625°如果你的负载是丝杆导程 5mm那么每个脉冲对应的直线位移 5mm / 6400 0.00078125mm约 0.78 微米。这个数值可以直接写进上位机的位置标定表非常实用。在固件里我通常会维护一个 32 位的有符号位置计数器。每次产生一个步进脉冲就根据方向加一或减一。这样 MCU 随时能知道当前执行机构所在的绝对位置还可以结合限位开关做原点回零和软限位。位置计数器的溢出问题很容易被忽略32 位有符号数足够跑几百万圈不溢出但如果只用 16 位计数器几圈就溢出了所以这点要提前想好。volatile int32_t position 0; // 在步进脉冲中断里调用 void on_step_pulse(void) { if (direction FORWARD) { position; } else { position--; } }3.3 加减速曲线为什么直接启停会失步直接给电机发送恒定频率脉冲电机能转但在启停瞬间非常容易失步。原因是步进电机的输出扭矩随着转速升高而下降而加速过程需要额外的扭矩来克服转子惯量。如果起始频率太高电机在第一个脉冲周期内跟不上定子磁场的变化转子就会落后于磁场最终失步。解决方法是加减速曲线。一个简单的梯形加减速流程如下加速阶段从较低的启动频率开始按固定步长逐步提高脉冲频率匀速阶段保持目标速度运行减速阶段按固定步长逐步降低脉冲频率直到停止启动频率的选择可以参考电机的自启动频率。大部分 NEMA17 电机在空载时能直接启动的频率在 500Hz 到 1kHz 左右带负载时要更低。我在实际项目中通常把启动频率设为 300Hz然后以每毫秒增加 10Hz 的速度加速到目标速度后再匀速运行。这个参数不是固定的需要根据负载惯量实测调整。梯形加减速实现起来不难。核心是在定时器中断里维护一个“当前频率”变量然后按时间改变它的值。PIC18F86J16 的定时器可以实现非常精确的计时如果你需要更高的速度平滑度可以改成 S 形加减速但梯形曲线在大多数工业场景下已经够用了。3.4 状态机与故障处理步进电机控制程序比想象中更需要状态机尤其是带限位、带原点、带故障恢复的设备。我在项目里把运动控制分成几个状态空闲、加速、匀速、减速、停止、故障保护。状态机的优势是逻辑清晰。比如只有在“空闲”或“停止”状态下才允许立即换向在“加速”或“匀速”状态下如果有急停指令就进入“减速”状态而不是直接停止。这样可以避免出现运行中突然反向、电机堵转的恶性故障。故障处理是工业应用里不能省略的一环。TB67S531FTG 的 TQ 引脚会在过流、热关断时拉低。我的做法是把它接到单片机的外部中断引脚并且配置为下降沿触发。一旦进入中断立即禁用驱动器输出、停掉定时器、记录故障代码。同时在运行时用另一个 I/O 引脚周期性读取 TQ 状态防止中断漏触发。void __interrupt() EXT_INT_ISR(void) { if (INTCON3bits.INT1IF) { INTCON3bits.INT1IF 0; motor_state FAULT; DRIVER_ENABLE 0; // 关闭使能 stop_pulse_timer(); // 停止脉冲输出 fault_code 0x01; // 记录故障状态 } }这里有个细节不要在中断服务函数里做太多事情。中断是紧急通道进去之后尽快关输出、置标志位正常的故障处理和状态切换放到主循环里做。否则中断嵌套和耗时操作会引发新的时序问题。4. 常见问题与调试验证实录4.1 问题速查表配合实际调试经验我整理了一份步进电机驱动系统的常见问题速查表可以直接贴在工位上参考。现象可能原因排查方法电机不转但有“嗡嗡”声电流设置过大堵转使能信号异常检查电流设定和负载测试 ENABLE 引脚电平电机噪声大明显振动衰减模式不对斩波频率过低速度在共振区切换衰减模式调整 PWM 斩波频率加减速越过共振区运行时偶发失步位置漂移加速过快频率过高电流不足降低加速度提高电流检查电源电压跌落驱动器芯片过热热关断电流设置过高散热不良衰减模式导致损耗大重新计算电流改善散热焊盘切换衰减模式上电瞬间电机抖动随后正常使能引脚悬空默认输出不确定加默认电平设置或软件延迟使能位置累计误差随运行时间增长脉冲丢失计数逻辑问题程序跑飞示波器检查 STEP 波形检查方向信号时序增加看门狗这张表里的每一条我都实际遇到过。最典型的是“加速过快导致失步”很多初学者会把加速度设得很大觉得这样响应快结果电机一加速就丢步。我的经验是加速度的设定要先摸清负载惯量最好的方式是做一个自整定功能程序自动从低加速度开始逐步增大直到出现失步前临界状态再把加速度回退 30% 作为安全值。4.2 失步问题的定位与复现失步是所有步进电机系统里最让人头疼的问题因为它往往是偶发的而且一旦失步位置就永久偏移无法自恢复。排查失步需要系统性地缩小范围。我的排查步骤是先确认机械负载没有卡滞再检查电机电流是否在额定范围内然后看电源电压带负载后有没有明显跌落。如果这些都没问题就要关注加减速参数。把加速度降一半测试如果失步消失说明加速度过高把目标速度降一档测试如果失步消失说明速度超出了电机的扭矩-转速特性。比较隐蔽的失步原因是电磁干扰。TB67S531FTG 是功率芯片开关瞬间会产生很强的 di/dt如果 STEP 信号线被干扰MCU 发出的脉冲序列到达驱动器时会多出毛刺、少掉边沿。这时候用示波器在驱动器 CLOCK 引脚上看波形通常能发现问题。解决手段就是前面说的串电阻、加滤波电容、优化 PCB 布局、使用屏蔽线。还有一个容易忽略的点方向信号必须在步进脉冲之前稳定。TB67S531FTG 数据手册上对 CW/CCW 相对于 CLOCK 的建立时间有明确要求如果 MCU 同时翻转方向和输出脉冲驱动芯片在工作边界处可能读到不确定的方向值表现为“偶尔朝反方向走一步再转回来”从位置上看就是一整圈的偏差。4.3 发热问题的平衡技巧工业设备里驱动板和电机的发热几乎是无解的物理题但可以通过设定合理工作点来平衡。电机发热主要来自铜损和铁损驱动器发热主要来自 MOSFET 开关损耗和导通损耗。要让整体温度降下来最立竿见影的方法是降低电流上限但代价是扭矩下降。我在一个 3D 打印机的项目中试过一种做法使用 PWM 方式动态调整 VREF。根据运行状态切换电流档位。比如在空闲驻留时把电流降到额定值的 30%此时电机锁紧力足够发热量却只有全流时的 1/10 左右。在运动过程中再把电流升回 100%。这个功能在固件里实现很简单只需要一个 PWM 通道驱动 RC 滤波后连接 VREF 引脚。实测效果非常明显电机外壳温度从长时间稳定 75℃ 降到 55℃ 左右驱动器芯片温度从 95℃ 降到 70℃。对于需要 24 小时不间断运行的设备这种温升改善意味着器件寿命成倍提升也直接降低了热关断故障率。另外一个容易被忽略的是电源容量。如果电源在峰值电流时电压跌落了 10% 以上驱动器为了维持恒流会提高占空比开关损耗随之增加芯片温度自然升高。所以我建议所有步进驱动系统的电源按电机额定电流总和的 1.5 倍以上来选型这个余量不是为了峰值而是为了稳定。4.4 实际应用效果与可扩展方向这套系统在我参与过的几台工业设备上表现都比较稳定。一台是小型桌面机械臂三个步进电机分别驱动底座旋转、大臂俯仰、末端升降用 24V 供电PIC18F86J16 同时控制三路 TB67S531FTG。整个系统长时间连续运行 8 小时后控制器表面温度正常没有出现失步和位置漂移。另一台是激光切割机的 X/Y 轴运动平台采用了 1/32 细分驱动配合丝杆传动实际重复定位精度在微米量级。这个项目里记忆最深的是噪声问题客户对设备噪声有明确要求我们在衰减模式上反复切换最终通过“混合衰减 提高斩波频率”把运行噪声压低了约 8 分贝效果非常直观。这套方案还有一个很大的优势是扩展性好。PIC18F86J16 的引脚资源足够同时管理两到三个轴只要把驱动芯片数量扩充、把定时器和 PWM 资源分配好就行。如果后续需要增加 EtherCAT 或者 CANopen 通信单片机上加一个通信协处理器结构上完全兼容不需要推翻重来。如果你正在规划一个多轴小型设备这种“8 位 MCU 多路专用驱动芯片”的思路确实值得认真考虑。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价