PIC18F97J60与TB67S531FTG的工业步进电机以太网控制方案
前阵子帮客户改一套小型三轴点胶机的控制方案对方开口就要“能联网、能调微步、别用PLC”我手里正好有存货PIC18F97J60做主控配东芝的TB67S531FTG驱动两相双极步进电机。这套组合用下来网络通信没费劲电机驱动也稳尤其是电流衰减可调这个特性对现场低频振动和噪音帮助很大。这篇文章就把整个设计思路、硬件接线、MCU侧代码逻辑和调试踩坑记录都摊开讲一遍想用STM32或者其它单片机替换主控也完全能照搬这套运动控制逻辑。先说个背景步进电机在工业和机器人里基本是“定位执行器”的老面孔两相双极步进电机因为转矩大、控制简单、成本可控从点胶机到小型机械臂都在用。标题里这两个芯片一个管驱动一个管控制和通信搭配起来可以把一个完整的运动轴做成“带网口”的节点上位机通过以太网直接发位置和速度指令不需要额外堆一个上位机板卡或者PLC去单独发脉冲。1. 先拆解这个方案为什么是“TB67S531FTG PIC18F97J60”1.1 驱动器选型TB67S531FTG 强在哪TB67S531FTG是东芝的步进电机驱动IC属于CLOCK-IN接口类型也就是说主控只管给STEP脉冲和DIR方向电平芯片内部自己完成恒流斩波。相比DRV8825和A4988这颗芯片最让我看重的是ACDSActive Current Decay Selection主动电流衰减选择功能。你可以在驱动过程中选择快衰减、慢衰减或混合衰减这个参数不是摆设——电机低速运行时绕组电流的衰减方式直接影响噪音、振动和发热。实测下来有的电机在慢衰减下安静有的在混合衰减下更平滑能现场调整比固定衰减模式的驱动IC友好太多。另一个优势是保护功能齐全。过流保护、热关断、欠压锁定都内置了工业现场电源波动大、用户又喜欢热插拔这些保护能在不少时刻救你一命。输出能力方面这颗芯片峰值电流能做到3A左右RMS大概2A驱动42步进电机绰绰有余带小型57电机也够用覆盖面比A4988宽不少。1.2 主控选型PIC18F97J60 的工业通信优势PIC18F97J60是Microchip一颗“自带以太网”的8位单片机芯片内部集成了10Base-T的MAC和PHY外部只需要接一个带网络变压器的RJ45座子就能把设备接入以太网。这一点在工业场景里很实用意味着不用再外挂W5500、ENC28J60这些网络芯片PCB面积省下一块物料也少几个。你想想如果做成十几个轴的设备每块控制板都少一颗网络芯片成本和故障率都会下来。有些朋友会问8位单片机做运动控制会不会不够这得看需求。如果你只负责产生脉冲、读取限位、跑以太网协议PIC18F97J60完全扛得住它有好几个定时器和两路SPI模块足够生成两轴甚至三轴的STEP脉冲。当然它没有硬件乘除法做浮点PID确实吃力但步进电机的闭环控制本来就可以用定点数整数运算解决我在后面会给出代码思路。1.3 系统架构从上位机到电机转子的信号流先画一条链路上位机PC/HMI/SCADA通过以太网发Modbus TCP指令 → PIC18F97J60接收并解析目标位置、速度、加速度 → MCU根据运动规划输出STEP脉冲和DIR方向信号 → TB67S531FTG把脉冲转换成两相绕组的电流 → 电机转子转到目标位置。需要注意的是这个架构里PIC18F97J60既是运动控制器也是通信网关。它还可以同时采集编码器反馈、原点开关、限位开关甚至把电流、温度这些实时数据回传给上位机。对于工业设备来说这种“分布式轴节点”的结构非常灵活每个轴都是一个独立节点坏了只换一块板不需要拆整机线束。这套架构可以跑开环也可以跑闭环。开环的步进电机靠同步特性保证定位只要不丢步就够闭环则再加一个编码器或者磁栅尺让MCU读取实际位置用级联PID把位置误差收回来适合精度要求更高的机器人关节或高速搬运场景。2. 硬件设计要点TB67S531FTG 外围电路怎么搭2.1 关键接口信号与参数确认老规矩动手画原理图之前先看数据手册的引脚功能表。TB67S531FTG的控制接口是STEP、DIR、ENA其中ENA建议单独用MCU的一个GPIO控制方便做上电禁能、异常停机。模式选择引脚用来设置步进细分常见版本支持全步、半步、1/4、1/8、1/16微步你根据应用需要把它接高或接地就行。电源方面VM接电机电源我习惯用24V或者36V的工业开关电源。逻辑电源用3.3V正好和PIC18F97J60的IO电平一致不需要额外电平转换。这里有个新手容易踩的坑虽然很多驱动IC标称逻辑输入兼容5V但PIC18F97J60工作在3.3V和驱动芯片对接时只要确认驱动芯片的逻辑阈值低于3.3V就行数据手册通常会写VIH最小值通常不超过2.0V所以直连没问题。TB67S531FTG的VREF引脚用来设置输出电流通过一个电位器或者电阻分压网络接到该引脚。输出电流由VREF电压和采样电阻的阻值共同决定。工程上我一般采用下面的做法先根据电机铭牌额定电流选采样电阻一般42步进电机的额定相电流在1.5A左右57电机在2~3A然后根据数据手册给出的公式计算VREF电压再用电位器微调最后用电流探头夹住电机绕组线实测峰值电流。2.2 电流设定、A C D S 衰减模式选择电流设定是整个硬件设计里最影响实际效果的一步。电流太小电机力矩不足带负载时容易失步电流太大电机和驱动芯片都发热现场长时间运行心里没底。举个例子手头一台42步进电机铭牌标额定相电流1.68A。我方案里选择采样电阻0.22Ω根据数据手册的计算关系把VREF电压初值定在0.85V左右然后实测绕组电流微调。实际操作中不建议一直追求100%额定电流负载不重时把电流放到额定值的70%~80%发热和噪音都能降一截。ACDS模式的选择也在这个阶段一并确定。启动阶段可以把衰减模式设成混合衰减这样能兼顾高速时的电流建立速度和低速时的噪音表现。如果电机低速运行有明显的“嗡嗡”声或共振可以试试切到慢衰减再把电流波形用示波器抓出来看观察电流是否在斩波期间出现明显过冲如果过冲严重就转成快衰减试试。这个调试过程没有绝对最优解只能针对手头电机型号、电压、负载工况去试。2.3 上电时序、电源与布线经验上电时序是个容易被忽视的细节。驱动芯片的VM电源和逻辑电源最好能同时上电或者至少保证逻辑电源先建立。如果VM先上电而逻辑电源还没稳定芯片内部逻辑状态不确定上电瞬间可能误动作电机“咔哒”一声乱跳一下。我一般在PCB上加一个简单的电源监控芯片或者用MOS管控制VM的接入等3.3V稳定后再导通VM。布线方面VM电源走线要宽驱动芯片附近的去耦电容不能省。我习惯VM引脚旁边放一个100μF电解电容再加一个0.1μF陶瓷电容电解电容吸收电机反电动势和电流脉冲陶瓷电容滤高频噪声。特别注意驱动芯片的散热焊盘要接到大面积地PCB底部多打散热过孔小封装芯片如果散热做不好持续大电流跑十几分钟就会触发热关断。STEP、DIR、ENA这些信号线要远离VM电源线如果PCB空间局促可以串一个100Ω左右的电阻或者在MCU侧加RC滤波。运动控制板最容易出的问题是电机一跑编码器信号或者通信就乱跳多数情况下是STEP信号的上升沿太陡通过地平面耦合到了敏感信号上。3. PIC18F97J60 侧的控制逻辑与代码实现3.1 引脚分配与寄存器配置在PIC18F97J60的引脚分配上我尽量让模块简单清晰。以太网的RJ45接口通过专用引脚连接这个不需要额外配置太多主要是初始化以太网模块设置好MAC地址和IP地址。STEP脉冲用一个定时器的输出比较或者IO翻转来实现DIR用一个普通GPIOENA用另一个普通GPIO。具体分配建议开个表格列出来信号PIC18F97J60引脚方向说明STEPRB0/TMR1外部输入相关引脚输出定时器中断里翻转产生步进脉冲DIRRB1输出方向电平高/低对应正反转ENARB2输出使能信号根据板卡有效电平定义SDO以太网模块输入以太网数据收发SDI以太网模块输出以太网数据收发SPICLK以太网模块输出以太网时钟以太网模块初始化时一个容易出问题的点是MAC地址和IP地址不能冲突如果把MAC地址写成了全0或者广播地址网络包发出去会被交换机直接丢。我一般在EEPROM里存一组MAC地址上电时读出来填充到以太网模块的寄存器中这样每块板卡的MAC都不同调试多轴时不会互相干扰。3.2 STEP 脉冲生成与转速换算步进电机的转速和STEP脉冲频率有直接关系。比如常见的42步进电机步距角是1.8°说明每圈需要200个整步。如果把驱动芯片设成1/16微步那每圈就是3200个脉冲。假设目标转速是300 RPM那么每秒需要的脉冲数是300 / 60 × 3200 16000 Hz也就是说STEP引脚要产生16kHz的完整脉冲方波。如果我用定时器中断来翻转STEP引脚每次中断翻转一次电平那么一个完整脉冲需要两个翻转低→高→低所以定时器的中断频率应该是脉冲频率的两倍也就是32kHz。照这个算法我用PIC18F97J60的一个16位定时器时钟源设为4MHz预分频1:1那么周期寄存器的初始值就是4,000,000 / 32,000 - 1 124这里124的周期值看上去不大但足够精确因为4MHz是系统时钟分频后得到的稳定时钟。如果电机转速需要更高可以把预分频调小或者系统时钟调高注意不要让定时器中断频率过高导致CPU没时间处理以太网报文。实际代码里我一般这样处理volatile unsigned char step_pin_state 0; void __interrupt() T1_ISR(void) { TMR1IF 0; // 清中断标志 step_pin_state !step_pin_state; STEP_IO step_pin_state; // 翻转STEP引脚 }主程序里修改变量TMR1周期寄存器就能改变电机转速。这个结构很稳因为STEP脉冲生成完全由定时器中断驱动不受主程序里通信任务的影响。3.3 加减速与级联PID的落地思路步进电机有一个特性不能瞬间达到很高的脉冲频率否则转子跟不上定子磁场直接失步。所以运动控制里一定要做加减速曲线。最简单实用的是梯形加减速启动时脉冲频率从起始频率逐渐升到目标频率快到目标位置时再降下来。提速的每一步都在定时器中断里按比例减小周期寄存器的值简单说就是“加速阶段周期变小减速阶段周期变大”。我在实际项目里用S形曲线替代梯形效果更好但计算量更大。S形曲线的思路是加速度本身不是突然跳变的而是有一个从0缓慢增加到最大值再缓慢回落到0的过程。用定点数整数运算实现时可以预先算好一张加减速查询表把不同阶段对应的脉冲周期存在数组里运行中查表取值这样PIC18F97J60这种8位MCU也可以轻松跑起来。闭环控制我采用级联PID外环是位置环内环是速度环。这个结构适合有编码器反馈的步进电机系统// 位置环每1ms执行一次 pos_error target_position - encoder_position; if (abs(pos_error) deadband) { velocity_cmd 0; } else { velocity_cmd pos_kp * pos_error pos_ki * integral_pos; } limit(velocity_cmd, max_velocity); // 速度环每100us执行一次 velocity_actual (encoder_position - last_encoder_position) / dt; velocity_error velocity_cmd - velocity_actual; timer_period vel_kp * velocity_error vel_ki * integral_vel; UpdateTmrPeriod(timer_period);注意这里的PID系数最好用整数定点数表示比如位置环的P系数乘1000存入变量计算后再除以1000。浮点在8位MCU上太慢了而且PID调参主要靠现场试凑整数运算足够。如果做纯开环控制不需要编码器只需要加减速和非阻塞通信如果做闭环编码器信号用PIC18F97J60的输入捕捉模块或者外部计数器去读取尤其要注意编码器A/B相要滤波防止机械振动导致计数跳变。3.4 Modbus TCP通信与运动指令解析工业场景里最常用的协议是Modbus TCPPIC18F97J60集成以太网控制器跑Modbus TCP非常合适。我在项目中自己实现了一个精简的Modbus TCP栈主要有以下几个寄存器目标位置、运动速度、加速度、原点回归触发、当前报警代码。上位机只要往这些寄存器写数据MCU就执行对应的运动。通信和运动控制要解耦这点我踩过坑最开始我在Modbus处理函数里直接做更新周期结果一旦上位机轮询频繁脉冲频率就被一遍遍重置电机走出来的轨迹弯弯曲曲。后来我把Modbus接收到的目标值先存到缓冲区运动控制循环独立运行只在定时器周期结束时才去读缓冲区运动轨迹立刻变得平滑。4. 工业与机器人场景下的调试干货4.1 通信与隔离让上位机指令不乱工业现场最让人头疼的是变频器、伺服驱动器、开关电源带来的电磁干扰。TB67S531FTG本身工作在脉冲宽度调制状态很容易产生高频噪声如果这些噪声耦合到以太网信号或者编码器信号上轻则通信丢包重则定位乱跑。我在控制板和驱动板之间加了数字隔离器STEP、DIR、ENA信号都通过隔离器传输隔离器两侧电源分别用LDO独立供电。这样电机回路的噪声不会直接灌进MCU的地平面。实测在没有隔离的情况下电机一启动网口偶发断开加上隔离后长时间跑程序再没出现过网络闪断。以太网变压器和RJ45插座的选择也别贪便宜尽量用带屏蔽的RJ45座外壳接地。PIC18F97J60的以太网PHY虽然是内置的但对外部网络变压器的中心抽头接法有要求具体参考数据手册的推荐电路中心抽头别乱动直接影响差分信号质量。4.2 常见问题速查表下面这个表是我在调试这套系统时真实记录的问题和解决办法直接抄作业就行。症状可能原因处理方式电机不转也没有声音ENA使能电平不对或逻辑电源未建立确认ENA有效电平示波器量VM和VCC是否正常电机抖动严重低速明显电流衰减模式设置不当或电流过小切换ACDS模式调大VREF电压到额定电流附近电机高速丢步加减速太陡脉冲频率突变降低目标加速度延长加速时间检查负载是否过重驱动芯片温度很高电流设定过大或斩波频率设置偏低测量实际绕组电流调低VREF检查散热焊盘焊接网口偶尔断开电源噪声或接线接触不良隔离控制信号检查RJ45屏蔽地加共模电感上电瞬间电机乱跑一下VM上电时序早于逻辑电源加电源监控或延时电路确保逻辑电源先稳定4.3 几条独家避坑经验最后分享几个常规文档里不会写但现场调试非常管用的经验。第一ENA引脚不要悬空。有些工程师觉得悬空和接高电平差不多实际不是。TB67S531FTG的ENA是差分逻辑输入悬空时电平状态不确定芯片可能处于使能和禁能的临界状态表现为“时转时不转”。我在板卡上对ENA做了上下拉电阻默认禁止输出等MCU启动完成后再主动启用。第二STEP脉冲不要用延时函数拉高再拉低。如果你在主循环中用delay_ms(1)翻转STEP看起来好像也能走到一个位置但实际速度极不稳定因为延时受中断影响脉冲间隔会抖。一定要用定时器中断或者硬件PWM输出STEP信号才能保证匀速。第三电流探头比示波器电压波形更重要。早期我只看VREF电压和示波器上STEP信号的对不对结果电机还是发烫。后来借来电流探头夹在电机绕组线上才发现实际电流比设定值高出一倍。原因是采样电阻焊接不良或者地线分割引入了误差。调电流时一切以实测绕组电流为准不要轻信按钮上的数值。第四PLC不一定要靠脉冲输出控制步进。很多人用PLC发高速脉冲但PLC脉冲频率上限有限而且高频脉冲容易受扫描周期影响。用PIC18F97J60这种MCU做成以太网节点上位机发指令MCU自己算脉冲解放了PLC的高速输出口也方便多轴同步。如果你在做类似项目我强烈建议试试把脉冲生成任务下放到轴控制板。根据我个人经验这套“TB67S531FTG PIC18F97J60”组合做单轴和双轴控制非常成熟做成四轴也不复杂只是需要更多PWM通道和定时器资源。后续如果要扩展可以考虑加上温度采集做驱动器健康监测或者用CANopen协议替代Modbus TCP这样和市面上大多数运动控制器对接更顺滑。有些场景如果能做成编码器闭环还可以在低速高负载下获得更硬的机械特性让步进电机在低成本项目里达到准伺服级别的表现。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →