上个月接了一个小型伺服样机项目,客户要求六周内拿出可演示的原型。按我以前做伺服的惯性,这套东西从主控选型、MOSFET驱动、电流采样、编码器接口到自己写FOC算法、调PI、再改上位机通讯,六周其实很紧,稍不留神就延期。这次我没按老路走,翻了一圈芯片选型,最后把方案定在TMC9660这颗单轴伺服SoC上。结果整个开发周期被我压到了两周:第一周硬件搭建加开环跑通,第二周闭环调完、通讯接好、保护逻辑配完,电机带负载跑起来,波形也看得过去。这篇文章就把这两周的思路和实操记录写下来,给打算用TMC9660做伺服驱动开发的同行做个参考。
TMC9660不是一个新的分立器件,它是把主控、栅极驱动、电流检测、编码器接口和运动控制固件全部集成在一颗芯片里的单轴伺服方案。这意味着你不再需要在一堆芯片之间做繁琐的匹配和调试,只需要把外围功率级、采样电阻、编码器和通讯接口搭好,然后用寄存器去控制它。这种“把复杂藏起来”的做法,对快速出样机的项目非常友好,但对那些习惯从底层全部自己撸的开发者也确实是个思维转换。
1. TMC9660是什么,为什么它能缩短伺服开发周期
1.1 一颗SoC把主控、驱动、算法都装进去
先说说这颗芯片本身。TMC9660内部有一颗带FPU的Cortex-M4F内核,这基本上就是一片完整的伺服主控。它不像传统方案那样需要你外挂一颗MCU去跑FOC,而是在芯片内部把电机控制算法和运动控制逻辑都做成了固件,直接通过寄存器映射来操作。
我把它理解成一个“伺服大脑预制件”:你告诉它电机是什么类型、额定电流多少、编码器多少线、想要什么梯形波还是S形速度曲线,剩下的电流环、速度环、位置环运算它自己完成,而且还把电流检测放大、栅极驱动这些模拟前端一并集成进去。实际做的过程中,我甚至不需要碰一行电机控制算法代码,不需要移植FOC库,也不需要调SVPWM的定时器输出逻辑,因为它已经在ROM里跑起来了。
这对开发节奏的影响是颠覆性的。以前做伺服,光是把FOC跑顺、让电机转起来不啸叫、不炸管子,就要耗掉一到两周。而现在这些由芯片固件兜底,我的工作重心变成了:把硬件接对、把参数配好、把外围联调做好。说白了,这就是“用寄存器换时间”。
1.2 和传统方案比,省在哪、风险在哪
传统做伺服驱动的常见组合是“MCU + 预驱 + MOSFET + 运放 + 编码器接口芯片”,主控里自己写电流环、速度环、位置环。这种方式好处是自由度极高,坏处是链条太长。我拆过很多现成的伺服驱动器,发现里面的核心算法和TMC9660固件做的事情并没有本质区别,但自己维护这套代码需要大量时间,而且任何一个环节出了问题,定位起来都很痛苦。
用TMC9660最大的节省在于把“底噪”去掉了。不需要再纠结电流采样放大器的带宽够不够、运放零点漂移怎么处理、MOSFET驱动互补信号死区有没有风险,因为这些芯片内部已经处理得比较完善。你花时间的地方是电机参数标定、PID参数调节、通讯对接和应用层逻辑,这些恰好是伺服项目真正差异化的地方。
当然风险也有。集成方案意味着灵活性下降,如果电机非常特殊,比如电感极小、需要超高频PWM,或者要做非常规的算法验证,TMC9660这种寄存器约束会限制你的操作空间。另外,习惯了寄存器控制之后,再去调底层FOC细节会手生。所以我的建议是:快速项目、产品验证、中小批量设备用TMC9660很合适;如果是想深挖伺服算法本身,那还是得走全自研路线。两条路没有对错,只有合不合适。
2. 快速搭建伺服硬件平台
2.1 电源与栅极驱动:先把能量链路做好
硬件是伺服的地基,这块不能省。我这次用的是24V和48V两条母线电压做测试,最终样机按48V系统交付,电机额定功率大概200W。TMC9660的栅极驱动外围需要自举电容和续流电容,布局时务必靠近芯片引脚,否则高压侧MOSFET驱动波形容易失真,轻则效率下降,重则导致MOSFET发热甚至直通。
电源我单独给了三路:逻辑电源、栅极驱动电源、母线功率电源。很多人为了省事把逻辑电源和栅极驱动电源并在一起,结果PWM开关噪声串进逻辑电路,通讯偶发出错,最后查了半天才发现是电源串扰。上电时序也要留意,先让逻辑部分起来,再使能功率级,否则有些MOSFET在上电瞬间会出现半导通状态,过流保护都来不及反应。
母线电容的容量可以按峰值电流和允许电压跌落粗算。比如峰值电流20A,目标电压跌落控制在2V以内,PWM频率20kHz,那么单个PWM周期内电容至少要顶住1ms级别的电流毛刺。我用的经验公式很简单:C = I_peak × t / ΔV,代入之后大概需要1000uF以上,实际我留了2000uF并加了一组陶瓷电容去滤高频。宁可电容多一点,也不能让母线电压在负载突变时掉太多,否则电流环会出现动态饱和,表现为电机加力时明显发软。
注意:做硬件时尽量把逻辑地、采样地、功率地在单点汇合,不要让大电流走信号地回路。这个坑我踩过,早期板子布局不当,一启动电机SPI通讯就乱码,后来把地分割成单点才解决。
2.2 MOSFET与采样电阻:功率级的三个关键选择
MOSFET选型有三件事:耐压、持续电流、开关损耗。耐压我习惯留1.5倍以上的余量,48V系统选100V规格的管子,24V系统最低也要40V。持续电流不能卡着额定电流选,电机堵转、加速时的峰值电流通常是额定电流的三倍,所以持续电流至少留2倍余量。驱动损耗方面,Qg越小越好,栅极电阻也要跟管子匹配,太大开关损耗高,太小振铃严重。我这版用的管子RDS(on)在10mΩ左右,Qg约30nC,实测满功率下散热片只是温热。
采样电阻是整个电流环精度的命根子。TMC9660内部有集成的电流检测放大器,外部只需要配一个低值采样电阻,常见阻值范围在1mΩ到10mΩ之间。阻值太小分辨率不够,阻值太大发热严重,还要考虑ADC满量程。假设内部放大后的满量程对应100mV,采样电阻1mΩ,那最大可测电流理论上100A,但实际要留出一半以上余量,持续电流控制在50A以内才安全。我这套额定电流5A的设计,最终选了5mΩ采样电阻,靠近MOSFET源极,并且用开尔文接法单独引采样线。
注意:采样电阻的开尔文连接不是可选项,是必选项。功率电流路径和采样信号线必须分开,否则大电流流过铜箔产生的电压降会被叠加到采样信号上,导致电流环误判,轻则电流波形毛刺多,重则系统震荡。
2.3 编码器与接口:位置反馈决定了控制上限
位置反馈对伺服性能的影响比很多人想象的要大。TMC9660常见接法有两种:增量式ABZ编码器和SPI型绝对值编码器。增量式编码器我做过1000线4倍频,也就是每圈4000个计数,做简单速度闭环够用,但低速时能感觉到平稳性一般,因为分辨率不够时速度估算的低速量化噪声会传到电流环。绝对值编码器就好很多,比如很多国产伺服电机上配的18位绝对值编码器,每圈分辨率262144,低速运行非常顺滑。
如果你看到某款伺服驱动器的编码器分辨率是262144,不要惊讶,那就是18位绝对值编码器,也就是每圈有2的18次方个计数。这个分辨率等级在目前伺服市场上非常常见。高速运行时SPI读取绝对位置会有延迟,但TMC9660会处理内部位置跟踪,外部只需要保证编码器通讯稳定即可。我实际测试下来,262144分辨率的编码器让位置环的稳态精度和低速平稳性都提升了一个档次。
编码器接线也是容易翻车的地方。差分信号最好用双绞屏蔽线,屏蔽层单端接地;SPI信号线要短,布线时避免和PWM线平行。我还做过一个蠢事:编码器方向接反了,开环测试时没注意,一上闭环电机直接飞车,还好限位挡块和使能逻辑兜着没出事。所以方向校验一定要放在闭环之前做。
2.4 控制板布局的几条硬经验
这节内容说给画过伺服板子的人听会更共鸣。第一,采样电阻和编码器接口的滤波电容不要随便加太大,虽然滤波能减少毛刺,但也会带来相位延迟,电流环带宽会受影响。第二,栅极驱动的地回路要短粗,MOSFET的源极和采样电阻之间的回路面积要越小越好,否则回路电感会引入高频震荡。第三,PWM输出引脚串联的栅极电阻不能省,它的作用是抑制振铃,比在软件里调死区更直接。
我这次打样的板子前后改了两次。第一版问题主要在编码器SPI信号被PWM噪声干扰,导致偶发位置跳变。后来把SPI走线从功率层拉开,在芯片端并联了RC滤波,并给编码器供电单独加了一颗LDO,问题才彻底消失。所以说,伺服控制板画板子不是“把线连通”就行,关键是要时刻想着每个信号的返回路径和噪声耦合路径。
3. 固件初始化与开环调试:先让电机动起来
3.1 TMCL-IDE与寄存器模型
TMC9660有一个配套的调试上位机叫TMCL-IDE,整机连上电之后,通过USB转UART或者SPI就能连上。第一次用的时候,界面里能读到芯片型号、固件版本、寄存器状态,也可以直接在图形界面里配置电机类型、电流限制、斜坡参数,就像给伺服驱动器做在线调试一样。
这个工具对我的意义在于,它把“看不见的寄存器操作”变成了“可点击的图形化配置”。调PID的时候不需要反复改代码烧录,直接在工具里改参数、看曲线,确认效果之后再固化到应用代码里。寄存器模型本身也很清晰:目标速度、目标位置、电流限制、斜坡加速度、PID参数,全部都有对应地址,主控通过UART或SPI读写这些寄存器就能控制整个伺服系统。
这里要提醒一下:不同版本固件可能对寄存器地址和功能定义有些许差异,我代码里用的寄存器号和位段定义都以实际连接的芯片手册和TMCL-IDE里读到为准。不要看我文章里写了个寄存器名就直接抄,一定要对着你自己的数据手册核对一遍。
3.2 电机参数配置与开环点动
接好线之后,第一件事不是闭环,也不是调PID,而是把电机参数告诉芯片。主要包括电机类型、极对数、额定电流、母线电压、最大速度限制这些。极对数如果填错,开环可能还能转,闭环一定乱套。额定电流要按电机铭牌填,因为它既是电流环的保护上限,也是PID输出钳位的基准。
参数填好之后,用TMCL-IDE里的点动功能,给一个很小的目标速度,让电机开环慢转。这里有一个检查顺序很重要:先确认电机转向和编码器读数方向一致。如果是增量编码器,让电机正向转一圈,然后看编码器位置值是不是在增大,如果减小说明方向反了,需要交换编码器A/B相或者调整方向位。
开环点动的时候,我会把电流限制设得非常保守,比如额定电流的30%,防止接线错误造成过流。确认相序也没有问题之后,再逐步把电流限制往上加。这个阶段虽然是开环,但恰恰最容易暴露硬件问题:有没有异响、有没有某相MOSFET明显发烫、编码器读数是否稳定。这些异常都该在开环阶段解决,不要拖到闭环之后。
3.3 电流环配置:决定整个系统底子
电流环是整个伺服控制中最内环的部分,如果电流环底子不好,外面速度环、位置环再怎么调也白搭。TMC9660的固件里已经实现了电流环算法,我们需要做的就是把电流环PI参数配好。通常的做法是先给一个很小的Kp,让电流跟随目标值,然后逐步加大Kp,直到电流波形开始出现毛刺或啸叫,然后往后退一点,得到一个相对稳定的临界值。Ki的作用是消除稳态误差,一般从Kp的1/10开始试。
调电流环的时候一定要看电流波形,不要只看电机转不转。用示波器或者TMCL-IDE自带的电流曲线工具,观察实际电流和给定电流的跟随情况。正常情况下,电流波形应该干净、跟得上给定值,超调量不能太大。
注意:电流环Kp过大的典型表现是电机在静止时发出高频“滋滋”声,甚至出现过流报警。改参数的时候一定要把过流保护阈值设好,我一般是先把保护阈值设成额定电流的1.5倍,等调稳之后再放宽到2倍以上。
3.4 编码器方向与相序校验
开环时电机能转,不代表闭环就能稳定工作。电机相序和编码器方向的匹配是闭环的前提。我在开环慢转时,会同时观察编码器位置是否线性变化,并记录电机每转一圈对应的计数。如果是增量式编码器1000线,4倍频后应该是4000个计数;如果是18位绝对值编码器,就是262144个计数。这个数值如果不对,编码器倍频设置或者线数参数肯定有错。
然后做零电角度校准,也就是找到当前转子位置和电机绕组通电方向的对应关系。很多无刷电机在开环点动之前需要做一次简单的电角度对齐,TMC9660固件里有相应的校准流程,按照调试向导操作即可。校验完之后,我会让电机以很低速闭环转几圈,确认位置反馈不抖动、不飞车,然后再去调速度环。
4. 闭环调参与系统联调:把性能抠出来
4.1 速度环与位置环调参思路
闭环调参的顺序永远是先电流环、再速度环、最后位置环。电流环调完之后,把速度环Kp从小到大加,观察阶跃响应。Kp太小,速度响应慢,带负载掉速严重;Kp太大,速度环会出现震荡,转速上下波动。加到临界出现震荡之后再退回来15%-20%,基本就是一个安全的区间。Ki则用来消除稳态误差,太大的话会导致低速爬行和过冲。
位置环最简单也最容易调坏。一般用纯P控制,或者加一点点微分。位置环的带宽必须比速度环低很多,否则整个系统会震荡。我常用的办法是先把位置环Kp设得很小,确保系统不震荡,然后逐渐增加,直到位置阶跃响应出现可接受的超调量。追求高刚性时还会加速度前馈和加速度前馈,TMC9660固件里可以配置前馈参数,用来抵消跟踪误差。
调完参数之后,不光要看阶跃响应,还要看正弦跟随曲线。用TMCL-IDE给出的曲线工具,让电机恒速转动并记录实际速度和目标速度,观察误差是否在可接受范围内。我当时的指标是:带额定负载时速度稳态误差小于0.5%,位置阶跃超调量小于5%,跟随误差不超过几个脉冲。
4.2 与上位机/PLC对接:UART、SPI、StepDir
伺服系统最终要跟控制器对接,TMC9660提供了几种途径。最直接的是UART或SPI寄存器读写,主控发一个目标位置或目标速度,再周期读取状态寄存器。这种方式的优点是实时性高、信息完整,适合自己做上位机软件的场合。我在样机里封装了一组简单的读写下发函数,结构基本就是往目标寄存器写值、读状态字、判断是否到位,整个过程非常直观。
StepDir模式也很实用。TMC9660可以工作在外部脉冲方向模式下,传统的PLC或者运动控制卡通过脉冲+方向信号控制,芯片内部自动把脉冲计数转换成目标位置。这意味着你可以把TMC9660当成一个智能伺服驱动器来用,原来的PLC程序几乎不用改。我专门用200smart这样的PLC发脉冲测了一下,StepDir模式响应干净利落,没有丢步,速度曲线也很顺滑,这对从步进电机升级到伺服的设备来说是最平滑的过渡。
如果最终要走EtherCAT这类工业总线,那TMC9660本身不自带从站,需要在前端加一颗以太网总线从站芯片,由主站通过PDO把控制字和位置值映射到TMC9660的寄存器里。比如按CiA402系列的标准,控制字、状态字、目标位置、实际位置都可以在从站里做好映射,外部的EtherCAT主站看到的就是一个标准伺服驱动器。125us或250us的周期通讯对SPI速率和中断响应有要求,建议选支持100MHz SPI的主控来做中转,才能保证周期内完成寄存器读写。
// 伪代码:主控通过SPI写目标位置到TMC9660 void write_target_position(uint32_t position) { uint8_t tx_buf[6]; uint8_t rx_buf[6]; tx_buf[0] = REG_TARGET_POSITION; tx_buf[1] = (position >> 24) & 0xFF; tx_buf[2] = (position >> 16) & 0xFF; tx_buf[3] = (position >> 8) & 0xFF; tx_buf[4] = position & 0xFF; tx_buf[5] = 0x00; // 校验字节,按实际协议填写 spi_transfer(tx_buf, rx_buf, 6); }4.3 保护功能与波形验证
伺服系统宕机不可怕,可怕的是宕机之后炸管子。TMC9660提供了过流、过压、欠压、过温、堵转等保护,这些参数在调试阶段一定要设置好。我的经验是先保守,后放宽。比如额定电流5A,先把过流阈值设到7.5A,堵转检测时间设短一点,等系统稳定之后再逐步放宽阈值,防止误触发。
波形验证是性能评估的重要环节。用示波器看相电流波形,确认PWM频率下电流纹波是否在合理范围;用电压探头看MOSFET栅极波形,检查死区时间是否足够、有没有明显振铃。通常PWM频率设在20kHz-25kHz之间,既能避开可听噪声,又不会因为开关损耗太高导致发热。如果发现栅极波形振铃严重,优先检查栅极电阻和布线,而不是急着改软件。
调试过程中我还会拍下电流波形和速度阶跃响应波形存档,方便后面做对比。比如改版换MOSFET之后,开关损耗变了,电流环参数可能就要微调,这时候之前的波形记录就是最好的参照。
5. 两周排期表与常见问题排查
5.1 两周内能跑完全流程的时间表
经常有人问“TMC9660两周出样机到底怎么排的”,我这里直接把实际操作的时间分配列出来供参考。
| 天数 | 工作内容 | 关键输出 |
|---|---|---|
| 第1-2天 | 硬件搭建、电源检查、TMCL-IDE连接测试 | 板子能上电,芯片能通讯 |
| 第3-4天 | 电机开环点动、相序确认、编码器方向校验 | 开环平稳运转,位置反馈正常 |
| 第5-6天 | 电流环配置、电流环PI粗调 | 电流跟随正常,稳态无明显噪声 |
| 第7天 | 缓冲日,处理前两天遗留问题 | 修正硬件或参数问题 |
| 第8-9天 | 速度环、位置环闭环调参 | 阶跃响应、正弦跟随达标 |
| 第10-11天 | 与PLC/上位机通讯对接,StepDir模式测试 | 控制指令响应正常 |
| 第12天 | 保护阈值、堵转检测、波形验证 | 故障保护有效,波形干净 |
| 第13-14天 | 带负载测试、散热确认、记录文档 | 负载下稳定运行,参数归档 |
这个排期看起来紧凑,但实际执行起来并没那么紧张,预留的一天缓冲几乎是必然会用上的。如果硬件打样一次成功,第5天之后就会非常顺;如果硬件出了地噪声、编码器干扰这类问题,缓冲日就派上用场了。
5.2 高频问题速查表与避坑心得
调试过程中踩过的坑整理成了一张速查表,基本上覆盖了初次使用TMC9660时最容易遇到的几类问题。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 电机上电啸叫或抖动 | 电流环Kp过大、PWM频率偏低、电流采样噪声 | 先降Kp,再检查采样布线 |
| 开环正常,闭环飞车 | 编码器方向反、相序不对、位置换算错误 | 重新校验方向与相序 |
| 过流保护频繁触发 | 采样电阻选配不当、死区时间不足、负载突变 | 查看故障寄存器,检查栅极波形 |
| 通讯偶发无响应 | 电源串扰、SPI/UART接线过长、校验错误 | 检查电源纹波,缩短通讯线 |
| 电机低速抖动 | 编码器分辨率不足、速度环Ki过大 | 换高分辨率编码器,降Ki |
| MOSFET明显过热 | 栅极电阻过大/过小、PWM频率过高、散热不足 | 调整栅极电阻,降低PWM频率 |
除了表格里的排查方法,我另外想分享三个私人心得。第一,TLCM-IDE里的参数最好定期做快照,每调到一个稳定状态就存一份配置文件,因为后面一旦调乱,你可以快速回退到上一个可用状态,不用凭记忆一点一点往回试。第二,示波器探头的地线夹很容易引入噪声,测相电流和栅极波形时建议用接地弹簧或最短的接地路径,不然你会在波形上看到很多并不存在的“毛刺”。第三,调试时先把保护阈值设保守,这句话值得重复三遍。我见过太多人一心追求极限动态,结果过流保护来不及动作,直接烧了一排MOSFET,进度反而更慢。
6. 最后说点个人体会
做伺服项目这些年,我最大的感觉是“集成化”正在改变这个领域的开发方式。以前大家比拼的是谁底层算法调得好,谁写FOC效率高,但现在技术的边界越来越清晰,基础的运动控制已经可以固化成成熟方案,工程师的时间应该花在更有价值的系统集成和应用创新上。TMC9660给了我们一个很典型的样本:把最复杂的部分封装好,开放出清晰的控制接口,让两周出高性能伺服样机成为可能。
如果你第一次用这颗芯片,我的建议是不要一上来就追求极限带宽,先把“稳、准、不炸”做到位,让电机平稳运转、位置准确、保护可靠,再逐步加前馈、加观测器、优化动态响应。调完速度环之后一定要带实际负载再看一遍阶跃响应,因为空载和满载的参数会有差别。另外,多和厂商的技术支持聊,TMC在伺服芯片上的应用文档和参考设计都比较完善,很多坑官方其实已经写在手册里了,只是我们没翻到而已。这套方案目前我已经跑通,后面还打算把EtherCAT从站加上去,让同一套硬件直接对接工业总线,那又是另一段折腾了。