ARTICLE DETAIL

资讯详情

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

TB67S531FTG+STM32L041C6:两相双极步进驱动与S形加减速实践

TB67S531FTG+STM32L041C6:两相双极步进驱动与S形加减速实践 在车间里折腾过步进电机的人都明白一个道理光有一台参数漂亮的电机没用真正决定它能不能稳稳干活的是驱动器加主控这套组合拳。我最近在做一台小型直角坐标搬运臂和一条双工位传送模组的驱动改造两套设备里塞的都是两相双极步进电机之前用的是那种通用型驱动板加简单单片机跑起来低速抖、高速丢步、发热还大尤其在24V母线、负载频繁变化的工况下表现很不稳定。折腾了几轮之后我把方案换成了TB67S531FTG这颗驱动芯片配STM32L041C6这颗超低功耗主控重新设计了一套驱动与控制架构。这一篇就把我选型的判断、电流设定的计算过程、固件的加减速实现、还有现场联调踩过的坑原原本本摊开讲一遍。适合正在做工业控制、机器人关节、自动化模组的朋友参考也适合刚接触步进驱动、想搞明白为什么这么配的新手。1. 这套工业级驱动组合为什么值得选1.1 两相双极步进电机在机器人和工控里的真实需求两相双极步进电机最大的特点是没有中心抽头四个线头分成两组线圈每相需要H桥双向驱动电流可以正反流动。相比单极电机双极结构在同体积下扭矩更大、利用率更高这也是为什么机器人关节、丝杆滑台、传送带这类需要精确定位、频繁启停的场景几乎清一色用它。但它的控制难点也很直白——你得给它稳定的恒流控制、平滑的微步细分、还要在高速时能跟得上换相节奏。工业现场的诉求归纳起来其实就几条。第一是定位精度要稳一个模组的丝杆导程5mm、电机1.8度步距角、配上1/16微步理论单步步长就是0.00156mm这个量级但实际能不能稳定到这个程度全靠驱动器电流纹波控制得好不好。第二是动态响应要快机械臂抓取工件往往要求几百毫秒内到位这背后就是加减速曲线的功底。第三是可靠性工业环境温度高、振动大、电磁干扰复杂驱动器和主控的抗干扰、散热、保护设计必须过硬。第四是功耗与成本能省一颗芯片、能少一层散热就省一点长期批量生产这笔账很可观。我遇到的痛点恰好集中在前三条。原来的通用驱动板用分离MOS加简单比较器做恒流电流纹波大低速时电机咔咔响单片机是8位的算加减速曲线时力不从心高速段换相频率一上来就丢步工件抓偏了好几次。换方案的目标很明确找一个把PWM恒流、微步细分、保护逻辑都集成好的驱动IC再配一颗算力够用、低功耗、外设匹配的MCU。1.2 驱动器选型TB67S531FTG到底解决了什么TB67S531FTG是东芝BiCD工艺做的一颗单片双极步进电机驱动IC属于他们TB67S系列里比较适合中低功率工业场景的型号。它最大的价值在于把过去需要一堆外围器件才能搭出来的恒流驱动电路集成到了单颗芯片里。内置的PWM恒流控制意味着你只要给定一个参考电压和检流电阻芯片自己就会去调节输出把相电流控制在你设定的水平。这对我们这种要做稳定扭矩输出的场景来说省下的不只是板子面积更是调试周期。它支持的最高细分做到1/32这对低速平滑度提升非常明显。1/32细分下1.8度步距角被拆成0.05625度电机在爬行时的台阶感会大幅减弱。同时它具备待机节能功能设备空闲时可以通过引脚切到待机、降低功耗这对于需要长时间待机又在唤醒后立即动作的自动化产线很实用。选它还有一个现实原因——供电范围。工业现场常见的24V母线可以直接喂给它不需要为驱动级再单独做一级降压这对简化电源树、降低EMI风险很有帮助。输出电流能力覆盖了我手头这批电机的额定电流区间大约0.5A到1.5A这个档留有余量又不至于大材小用。1.3 主控选型STM32L041C6的定位与匹配点STM32L041C6是STM32L0系列里的一颗Cortex-M0内核MCU主打超低功耗和性价比。它对我来说的关键优势有几个。首先是定时器资源够用TIM2是32位定时器配合输出比较或者PWM模式能产出非常干净的步进脉冲改写自动重装载值就能实时调频加减速实现起来很顺手而且32位不会在长行程计数时溢出。其次是低功耗特性配合驱动的待机功能可以做出整机待机电流很低的方案产线闲置时省电。它的Flash和RAM规模不算大但对于步进控制这种任务来说完全够——加减速曲线可以用增量式算法实时算不必把整条曲线都存下来位置环就是一个整数加减用不到大内存。8KB RAM跑一个状态机加几个缓冲绰绰有余。还有一个隐性好处是它的GPIO翻转能力和内部RC或外部晶振配置灵活我用内部RC配合HSE做时钟源省掉了一些外部器件。1.4 整体架构的落地形态整套系统我的搭法是STM32L041C6负责三大块——运动规划目标位置、速度、加减速、脉冲生成TIM2输出CLK、普通GPIO出方向、状态管理使能、待机、故障处理。TB67S531FTG负责电流闭环和功率输出四路输出直接接电机两组线圈。电流设定通过VREF引脚给一个DAC或者PWM滤波出来的模拟电压配合外置检流电阻决定相电流。微步模式用MO引脚组合来选。控制信号就这么几根CLK脉冲、CW/CCW方向、ENABLE使能、RESET复位、待机切换。总线侧我留了UART或者CAN给上位机下发位置和速度指令。工业场景里我倾向CAN抗干扰和节点管理更省心但小模组里UART也够用。这套架构的核心思想是MCU管逻辑、IC管功率把对时间敏感的脉冲生成和对精度敏感的电流控制分开各司其职。注意方向信号CW/CCW的建立时序必须早于第一个CLK脉冲的上升沿中间要留出足够的建立时间否则芯片可能锁存到旧方向造成第一拍反向。2. 硬件设计电流、斩波与供电这些坑2.1 相电流由VREF和检流电阻共同决定这是新手最容易翻车的地方。TB67S531FTG的相电流不是随便给个VREF就行的它遵循一个确定的换算关系典型形式是IOUT VREF / (K × R_RS)其中R_RS是外接检流电阻K是芯片内部的电流设定系数常见取值为5具体以数据手册的电流设定表为准。这个公式告诉我们相电流和检流电阻是反比关系检流电阻一改VREF也得跟着重新算。举个我实际用的例子。电机额定相电流1.2A我选检流电阻R_RS0.2Ω那么反推VREFVREF IOUT × K × R_RS 1.2 × 5 × 0.2 1.2V所以我给VREF一个1.2V的电压。这里有个关键点检流电阻上会持续流过相电流功耗是I²R拿1.2A、0.2Ω算单个电阻就是0.288W峰值场景更要注意必须选功率足够的型号通常要2W以上的贴片电阻最好留一倍余量。注意检流电阻必须用低温度系数的精密电阻普通厚膜电阻随温度漂移大会导致高低温环境下电流设定跑偏直接体现为冬天扭矩足、夏天发热大。实测心得VREF的引入方式上我用的是MCU的DAC输出加RC滤波好处是软件可以直接调电流方便在调试阶段动态试出最优值。如果预算紧张、电路想更省也可以用PWM加二阶RC滤波模拟一个DAC但要注意纹波纹波太大会让相电流跟着抖低速时能明显听出电机声音不干净。我试过只用一阶RC噪声明显改成二阶后才稳定。2.2 斩波频率与OSC引脚的影响TB67S531FTG内部的电流调节是靠斩波实现的斩波频率由OSC引脚外接的元件确定。这个频率的选取有讲究。太低会进入音频范围电机就会唱歌太高则开关损耗增加、EMI变差。我一般让它落在20kHz到50kHz之间避开人耳敏感区同时开关损耗也可接受。调法是改变OSC引脚的外接电阻或电容值具体对应关系同样以手册的频率-元件曲线为准。我的做法是先按手册给一个中间值跑起来用示波器看检流电阻上的电流波形看纹波幅度和频率是否合理。如果纹波峰峰值太大低速运行时的抖动就会很明显。这里有个容易被忽略的点斩波频率和电机电感是耦合的。电机电感越大电流上升越慢在细分步进时越容易在单步时间内来不及把电流建立到位表现出来就是高速时扭矩衰减。所以选电机的时候别只看额定电流还要看电感量电感小的电机更适合高细分高速运行。2.3 供电、去耦与散热的布局要点功率级的布局直接决定系统稳不稳。TB67S531FTG的VM引脚电源输入要就近放大容量电解电容做储能再用小容量陶瓷电容做高频去耦。我在VM附近放了100uF以上的电解加1uF和0.1uF陶瓷电容这是吸收电机换相瞬间电流突变的标准做法。电机每次换相都会产生反电动势和电流突变没有足够的去耦电容母线电压就会被拉出尖峰轻则误动作重则损伤芯片。散热方面芯片底部有散热焊盘必须通过过孔阵列连接到板子内层或背面的大铜皮焊盘和铜皮之间要保证足够的过孔数量。我一般是焊盘下打9到16个过孔凝胶填满。电机电流在1A以上时芯片会有明显温升不能只靠封装表面散热。大电流走线要短、要宽。输出到电机的四根线尽量短局限在板子的一侧避免和大电流换向路径形成环路。检流电阻到芯片的地回路要单独走采用开尔文连接把大电流路径和信号采样路径分开否则检流测到的电压里混入地线上的压降电流设定就不准了。实测心得电机线建议用双绞线或屏蔽线尤其在长线缆场景下。我曾经因为电机线太长又没屏蔽导致CLK信号被干扰电机偶尔多走一步改成屏蔽线并单端接地后问题消失。3. 固件实现从脉冲生成到S形加减速3.1 用TIM2产出干净的步进脉冲脉冲生成我选TIM2的PWM模式。通过配置预分频器PSC和自动重装载寄存器ARR来设定脉冲频率。系统时钟假设是32MHzPSC设为0那么步进脉冲频率f_step f_CLK / ((PSC 1) × (ARR 1)) 32,000,000 / (ARR 1)反推如果要跑10kHz的步频ARR 32,000,000 / 10,000 - 1 3199。要跑到100kHzARR 319。占空比我一般设50%保证脉冲边沿清晰被驱动器稳定识别。配置的核心代码大致这样// STM32L041C6 - 使用TIM2_CH1输出步进脉冲PWM void StepPulse_Init(void) { // 使能TIM2时钟 RCC-APB1ENR | RCC_APB1ENR_TIM2EN; TIM2-PSC 0; // 不分频 TIM2-ARR 3199; // 初始10kHz TIM2-CCR1 1600; // 50%占空比 TIM2-CCMR1 (6 4); // PWM模式1, CH1预装载使能 TIM2-CCMR1 | (1 3); TIM2-CCER | (1 0); // 使能CH1输出 TIM2-CR1 | (1 7); // ARR预装载使能 TIM2-CR1 | (1 0); // 使能计数器 } // 动态改频: 传入目标步频(Hz) void StepPulse_SetFreq(uint32_t freq) { uint32_t arr 32000000UL / freq - 1; TIM2-ARR arr; TIM2-CCR1 (arr 1) / 2; // 保持50%占空比 }要点在于ARR和CCR1都要设预装载这样改频时新值在当前周期结束后才生效避免产生毛刺脉冲。这是保证脉冲干净的关键细节直接改寄存器而不走预装载会在切换瞬间吐出半个畸变的脉冲容易被驱动器误判成一步。方向控制就是普通GPIO写之前先确保脉冲停了。我的做法是先停脉冲、设方向、延时几个微秒、再开脉冲顺序不能乱。3.2 微步设定与位置换算TB67S531FTG用MO引脚组合来选细分常见的档位有1/1、1/2、1/4、1/8、1/16、1/32。细分越高单步角度越小运行越平滑但同样转速下需要更高的脉冲频率MCU的负担和高速丢步风险也上升。这是个权衡。位置换算很简单。电机步距角1.8度一圈200个整步。假设选1/16细分那么每圈脉冲数200 × 16 3200 脉冲/圈再结合丝杆导程算直线位移。导程5mm那么每毫米需要的脉冲数3200 / 5 640 脉冲/mm有了这个系数上位机下发移动到100mm时固件就把100乘以640得到64000个脉冲作为目标。这个换算系数建议在固件里做一次校准标定因为实际机械误差、联轴器间隙都会有影响。我的做法是让设备走一个已知距离比如100mm用卡尺量实际位移反推一个修正系数写进参数区。注意细分档位一旦选定必须在固件里用对应的换算系数不能沿用默认值。我见过因为改了拨码但忘了改固件系数导致定位偏差十几倍的案例。3.3 加减速曲线与运动状态机高速丢步的根本原因往往是加减速没做好。电机从静止直接跳到高步频转子跟不上磁场变化就会丢步甚至啸叫。所以必须做加减速。我采用的是S形加减速比梯形更平滑冲击小。实现思路是维护一个当前步频变量每个脉冲更新时根据剩余步数和当前速度决定加速、匀速还是减速。加速阶段速度按一条S曲线递增接近目标时根据剩余步数和当前速度判断减速点开始按S曲线递减。一个简化的增量式实现是这样的// S形加减速: 每步更新一次频率 void Motion_Update(void) { if (state ACCEL) { if (cur_freq target_freq) { cur_freq accel_inc; // 加速增量随速度变化 accel_inc jerk; // 加加速度, 使曲线平滑 } else { state CRUISE; } } else if (state CRUISE) { if (steps_remain decel_steps) { state DECEL; } } else if (state DECEL) { cur_freq - decel_inc; if (cur_freq start_freq) { cur_freq start_freq; } if (steps_remain 0) { StopPulse(); state IDLE; } } StepPulse_SetFreq(cur_freq); }这里accel_inc和jerk的取值要结合电机和负载的惯量来调。惯量大的负载加速增量要小起步更柔轻载则可以激进一点。我是先在空载下调出一组参数再带上实际负载微调最终以不丢步为前提取最快的加速。减速点的计算很关键。减速点算早了匀速段太短效率低算晚了减速距离不够会冲过目标或者急停丢步。计算方法是用当前速度、减速度和剩余步数反推保证在减速段能恰好把速度降到起始频率。我在固件里用一个查找表加实时计算混合的方式兼顾精度和速度。注意每次改变方向或短行程运动时如果行程短到还没加速起来就要减速要特殊处理避免出现加速还没完成就进减速的状态机异常。我专门加了一个ShortMove分支来处理。4. 联调排查现场踩过的坑与速查表4.1 丢步、抖动、异响的排查顺序现场调试最耗时的就是这几类问题。我的排查顺序是固定的先看机械再看电流再看时序最后看算法。机械层面联轴器松动、导轨阻力大、皮带张力不均都会造成丢步假象但现象和电气问题很像。所以第一步永远是空载测试把机械负载脱开单独跑电机如果空载就丢步那基本是电气或参数问题如果空载正常带载丢步先怀疑机械阻力或扭矩不够。电流层面用示波器看检流电阻上的波形判断相电流是否达到设定值、纹波是否过大。如果电流明显低于设定可能是VREF偏低或检流电阻选大了。如果纹波大可能是斩波频率不合适或去耦不足。时序层面检查CLK、方向、使能的建立和保持时间。用逻辑分析仪抓一下方向信号是否在脉冲之前建立好。算法层面最后才怀疑加减速参数。把加速拉到很慢跑一遍如果不丢步了那就是加减速太激进了慢慢往上调。4.2 常见问题速查表现象可能原因排查方法解决方式低速抖动、声音大细分偏低、电流纹波大看电流波形、听异响频率提高细分、调整斩波频率、加大去耦高速丢步加减速太激进、电机电感大降速测试、看是否改善放缓加减速、换低电感电机电机发热严重相电流设定偏高、散热不足测实际相电流降VREF、改善散热焊盘和铜皮偶尔多走一步CLK受干扰、方向时序不对逻辑分析仪抓波形加屏蔽、单端接地、检查建立时间待机后唤醒异常待机切换时序不对测使能和待机引脚时序严格按手册时序唤醒并复位定位偏差累积换算系数不对、丢步走已知距离反测重新标定系数、排查丢步4.3 实测经验与优化技巧第一VREF的软启动能省很多事。设备一上电瞬间母线电容充电、电流冲击大如果此时电机已经使能容易出现冲击。我的做法是让固件启动时先给低VREF延时几百毫秒再升到目标值让电流平稳建立。第二待机和使能要分清。待机是省电状态唤醒需要时间使能是输出是否开放。我在状态机里把两者分开管理空闲一定时间先降速停止再切待机收到新指令先退出待机、等稳定后再使能、然后启动脉冲。顺序乱了第一拍就容易丢。第三电流设定不要贴着电机额定值给满。留个10%到20%的余量既能保证扭矩又能降低发热延长寿命。我一开始按额定值给夏天连续跑半小时电机烫手降了15%之后温度明显舒服扭矩却没感觉不够用。第四加减速参数应该跟位置指令一起下发或者存在参数区不同工位、不同负载可以配不同参数。工业产线经常一个控制器带多个轴或多种工况固定死参数很难兼顾。最后分享一个我调试时的小技巧把电机电流波形和CLK脉冲同时接到示波器上两个通道对照着看能非常直观地发现电流还没建立到位脉冲就来了这种情况这是很多高速丢步问题的真正根源光调加减速曲线是治标把电流建立时间和脉冲周期对齐才是治本。这个对齐关系随着速度升高会越来越紧张所以高速段要么提高母线电压帮电流快点建立要么就得在算法里给电流建立留出时间余量。
返回列表