☰
基于EtherCAT与双编码器全闭环的机器人关节驱动器设计
2026/9/25 2:01:00 网站建设 项目流程

做机器人关节驱动器这件事,很多人一开始会把它当成"小号伺服驱动器"来设计。真正上手才发现,一旦电机输出端接上谐波减速器、再挂到机械臂上,原来的单编码器反馈思路会立刻失效——电机端读到的角度,和末端实际到达的角度之间,隔着一整套柔性传动带来的弹性变形、回差和动态滞后。这也是为什么我最后把方案定在了"基于 EtherCAT + 双编码器全闭环"这条路上。

这篇文章就把这个项目从硬件选型、双编码器标定、EtherCAT 从站通信到三环整定的完整链路整理出来。适合正在做机器人关节模组、伺服驱动器或关节控制方案的工程师参考,也适合想从脉冲控制转向总线控制的同学提前避坑。文章里所有参数和调试流程都来自实际项目,不是照搬手册,照着做至少能跑通第一版样机。

1. 为什么关节驱动器非得用"双编码器+EtherCAT"这套组合

1.1 单编码器方案在机器人关节上的局限性

机器人关节的典型结构是电机+减速器+编码器,其中减速器以谐波减速器为主流。如果只用一个电机端编码器,位置环反馈来自电机轴,输出轴角度理论上等于电机角度除以减速比。但谐波减速器的柔轮在负载下有明显的弹性变形,再加上齿间摩擦、装配误差和回差,输出端实际角度与电机端换算角度之间会出现不可忽略的偏差。负载越大、加速度越高,这个偏差越明显,而且方向不确定、呈非线性变化,单纯靠软件补偿很难压住。

单编码器方案在机器人上的表现通常是:低速匀速还行,一频繁启停、反向、变负载就开始抖动;定位精度标定后勉强OK,但跑圆弧轨迹时圆度误差明显,末端会有"蠕动感"。这本质上是因为位置环反馈的点在弹性环节之前,而真正需要控制精度的是弹性环节之后的输出端。所以高端机器人关节里,双编码器几乎成了标配:电机端一个编码器负责高速闭环,输出端再放一个高分辨率编码器直接测量关节真实位置。

1.2 EtherCAT 总线带来的核心价值

早期做多轴机器人,常用做法是每根关节用脉冲+方向线、模拟量或CAN总线。五六个轴还能忍,一旦轴数上到七八个甚至十几个,布线和调试就成了灾难:线缆多、接错率高、抗电磁干扰差,而且上位机无法保证所有关节"同一时刻"收到新指令。脉冲方式下即使并行发脉冲,各轴的接收时刻也有微秒级到毫秒级偏差,高速轨迹下会直接导致多轴联动不同步。

EtherCAT 解决的是两个层面的问题。第一是拓扑结构,一根标准网线通过菊花链把所有关节串起来,从站控制器(ESC)在数据帧经过时取走下发数据、插入上传数据,不需要协议栈处理整帧,因此网络开销小;第二是同步性,EtherCAT 的分布式时钟(DC)机制可以让几十个从站在纳秒级精度上锁存输入、刷新输出。对机器人来说,这意味着所有关节的编码器在同一时刻采样、所有关节的电流环在同一时刻更新给定,轨迹插补才能真正落地。

1.3 我这次项目的定位与范围

这台驱动器做的是"关节级集成方案",也就是每个关节模组内置一块驱动板,整机通过 EtherCAT 菊花链串联。通信协议走 CoE(CANopen over EtherCAT),主站用倍福 TwinCAT,也兼容 SOEM 这类开源主站。驱动器的控制结构是典型的 FOC 矢量控制,外层跑位置环,内层跑速度环和电流环。

两个编码器的分工很明确:电机端用磁编码器(SPI 接口),负责电流环和速度环的反馈;输出端用高位数绝对值编码器(SSI 接口),负责位置环反馈。这样既保留了 FOC 高频响应的优势,又能用输出端编码器把谐波减速器的柔性误差关进闭环里。项目实测下来,六轴联动走 R100 的圆形轨迹,圆度误差可以控制在 0.2mm 以内,这个精度对很多协作机器人场景已经够用。

2. 硬件方案选择:主控、从站控制器、驱动桥和编码器接口的配合

2.1 主控与 EtherCAT 从站控制器(ESC)的经典组合

EtherCAT 从站侧的逻辑,不需要自己用 FPGA 从零实现,主流方案是 MCU + ESC 芯片。我选的是 LAN9252,它内置两个以太网 PHY 和完整的 EtherCAT 数据链路层,通过 SPI 接口和主控交换数据。MCU 每周期被 ESC 的中断触发一次,在中断服务函数里读取接收的 PDO 数据、执行伺服控制算法、把上传数据写回 ESC。

主控用的 STM32F407,Cortex-M4 带 FPU,跑 FOC 三环和协议栈还有余量。如果控制周期要做到 250us 甚至更短,可以换 H750 或更强的主控,但 F407 在这个项目里绰绰有余。另一种选择是 AX58100,它同样集成双网口,部分型号还直接带 PWM 输出和编码器接口,外围更省;ET1100 是倍福原厂方案,资料最全但成本和布线复杂度高。实际选型时主要看两点:你需要的 PDO 数据量多大,以及控制周期要跑到多少。数据量大、周期短,就让 ESC 和 MCU 尽量靠近,SPI 走线做到最短。

2.2 驱动桥与电流采样电路

驱动部分我用了 DRV8323 栅极驱动器,配合三相分立马达 MOSFET。DRV8323 支持 6 路 PWM 输入,内置电流采样放大器,可以通过 SPI 配置死区时间、过流保护阈值和增益。MOSFET 的耐压按母线电压的两倍以上选,48V 母线我用的是 100V 耐压的管子。

这里有一个特别容易踩的坑:ADC 采样时刻必须和 PWM 周期中心对齐。电流采样用的是低侧采样电阻,如果在 PWM 开关瞬间采电流,采到的是续流噪声或开关尖峰,电流波形会乱七八糟,电流环根本稳不住。正确做法是把 ADC 触发配置成与定时器上溢/下溢事件同步,在 PWM 开通中间点采样。

栅极驱动的死区时间也不能只用默认值。机器人关节经常正反转快速切换,死区太小可能导致上下桥直通;死区太大会引入电流死区效应,低速时转矩脉动明显。我是按 MOSFET 关断延迟实测后设为 200ns 左右,再通过示波器验证开关波形。

2.3 双编码器接口的硬件设计细节

电机端编码器我用的是 TLE5012B,磁编码器,SPI 接口,12 位分辨率。选它不是因为精度高,而是关节内部空间小,磁编码器抗油污、抗污染能力比光电式好,安装也简单。输出端编码器用的是单圈 17 位绝对值编码器,SSI 接口,直接测关节输出轴角度。

编码器供电必须单独处理。磁编码器芯片对电源纹波非常敏感,纹波稍大就会导致位置数据跳变。我的做法是编码器电源用 LDO 单独供电,再串一个 LC 滤波器,信号线在靠近 MCU 的地方加 ESD 保护二极管。另外 SSI 接口的时钟线要控制速率,线太长时降低时钟频率,否则读回来的数据会偶发跳码。

2.4 PCB 布局:信号完整性与地平面处理

硬件调试阶段最耗时的问题往往不是原理图,而是 PCB 布局。EtherCAT 是百兆以太网信号,差分对必须做阻抗控制,走线尽量短、远离 MOS 管开关节点;编码器 SPI/SSI 信号属于敏感模拟量,同样要远离功率侧。

地平面处理上,我把功率地和信号地分区域铺设,在驱动芯片下方用磁珠或单点连接。数字地、控制地、编码器地不要混接,否则母线大电流回流会在地线上形成压降,造成编码器数据抖动和通信偶发断线。有过一版 PCB 图省事把所有地直接连通,结果 EtherCAT 通信在电机高速运转时频繁掉站,后来重新分割才解决。

3. 双编码器全闭环:零位标定与柔性误差补偿

3.1 为什么两个编码器的数据不能简单做差

电机端编码器和输出端编码器的读数,理论上可以通过减速比换算后做差,但这个差值里面混着安装误差、谐波回差和柔轮弹性变形,直接用来做反馈是不行的。更合理的做法是分层闭环:电流环和速度环用电机端编码器,位置环用输出端编码器。

位置环输出的是期望电机速度,速度环再基于电机端编码器做内环反馈。这种外环高分辨率慢速、内环快速稳定的级联结构,能充分发挥双编码器各自的优势。如果反过来,直接用输出端编码器误差计算出电流指令给电流环,由于输出端采样滞后和机械柔性,闭环带宽会被压得很低,系统极容易振荡。

3.2 零位标定的完整操作流程

拿到新板子后,双编码器的零点是不对齐的,如果跳过标定直接跑位置闭环,一上电电机就会猛转。我的标定流程大致分四步:

  1. 电机低速空转,先确认电机端编码器方向和输出端编码器方向一致。方向反了,把编码器方向位翻转,或者直接换信号线。
  2. 让电机以极低频(0.1Hz 左右)缓慢正转,记录电机端编码器值和输出端编码器值,建立映射关系,确认减速比与谐波减速器的名义减速比一致。
  3. 再缓慢反转回零,读取输出端编码器的变化量,算出谐波减速器回差的大致方向。
  4. 当前电机电角度为零时,把该位置记录为换相零位;再结合输出端编码器的读数,计算出两个编码器零点之间的固定偏移量,存入参数。

标定时切忌快速转动。谐波减速器有扭转回差,从正反不同方向到达同一位置时,输出端读数可能差出几十 counts,标定结果自然不准。我一般让电机正反转多走几轮,取平均值作为最终标定结果,这样回差对零点的影响能降到最小。

标定逻辑可以简单写成:

void calibrate_zero_position(void) { // 1. 电机端编码器原始值 motor_enc_raw = read_motor_encoder(); // 2. 输出端编码器原始值 joint_enc_raw = read_joint_encoder(); // 3. 缓慢正转到参考位置,记录两端读数 // 4. 再反转回原点,记录两端读数 // 5. 取两次记录的平均值,消除谐波回差 zero_offset = motor_enc_raw - joint_enc_raw * GEAR_RATIO; }

3.3 回差补偿与柔轮变形观测

标定完成后,双编码器差值仍然是有用的。静止时如果电机端不动、输出端受到外力产生微小位移,差值的变化就反映了柔轮变形量。把柔轮刚度近似看成线性弹簧,就可以把这个差值当作"扭矩观测器"来用,参与前馈和摩擦补偿。

动态控制中这个差值也有价值。位置环跟踪时,如果把柔性变形量换算成角度补偿,提前给速度环一个前馈量,能明显减小末端超调和抖动。正反转切换瞬间也一样,电机端已经开始动了、输出端还没跟上,双编码器能识别出这个"空程"状态,驱动软件可以主动做摩擦补偿或力矩斜坡,而不是傻等位置环慢慢收敛。

4. EtherCAT 从站通信与 DC 时钟同步的调参实操

4.1 从站数据交换流程与 ESI 文件配置

EtherCAT 从站的开发顺序,一定是先把通信链路打通,再写伺服算法。LAN9252 负责处理网帧,数据经 SM(SyncManager)和 FMMU 映射到内部寄存器,MCU 通过 SPI 读写这些寄存器。所以第一步是把 ESI 文件(XML 设备描述文件)写正确,把它加载到主站工具里,保证从站能被正确扫描。

CSP 模式下 PD0 映射一般这样配:

<RxPdo> <Index>0x1600</Index> <Name>RxPDO_CSP</Name> <Entry> <Index>0x6040</Index> <SubIndex>0x00</SubIndex> <Name>Controlword</Name> </Entry> <Entry> <Index>0x607A</Index> <SubIndex>0x00</SubIndex> <Name>TargetPosition</Name> </Entry> <Entry> <Index>0x60FF</Index> <SubIndex>0x00</SubIndex> <Name>TargetVelocity</Name> </Entry> </RxPdo>

TxPDO 对应实际位置、实际速度、状态字和电流反馈。注意 PDO 索引、子索引和数据类型必须与 CiA402 协议一致,否则主站能扫描到从站但值对不上。

4.2 DC 分布式时钟:为什么所有从站必须同步

多关节机器人如果没有 DC 同步,每个从站在自己的本地时钟驱动下独立采样编码器,主站发下来的目标位置被各从站按各自时间接收,轴与轴之间的动作会相差若干微秒。单个周期内误差虽小,高速轨迹下累积起来就会表现为末端抖动和轨迹失真。

EtherCAT 的 DC 机制是让网络中第一个支持 DC 的从站作为参考时钟,其余从站通过测量帧经过的传输延迟,算出各自时钟与参考时钟的偏移,再在本地定时触发 SYNC 事件,让所有从站在同一时刻锁存输入、输出数据。调好 DC 后,所有关节的编码器是同一时刻采样的,所有关节的 PWM 是同一时刻更新的。

实际调试时,TwinCAT 的从站信息页面会显示每个从站的传播延迟(Propagation Delay)和系统时间偏移。这两个值正常应该是几乎不变的常数。如果它们来回跳动,说明 DC 同步有问题。

4.3 TwinCAT 下调 DC 的完整步骤

  1. 扫描硬件,加载 ESI 文件。
  2. 在从站参数里启用 DC,指定其中一个从站作为参考时钟。
  3. 打开 TwinCAT 的 SyncInfo 模块,观察每个从站的传输延迟和时钟偏移。
  4. 用示波器或 TwinCAT Scope 看实际 SYNC 中断时间抖动。

如果发现 DC 抖动过大,优先检查 ESC 中断引脚和 MCU 中断优先级的配置。MCU 里如果有其他高优先级中断长时间占用 CPU,SYNC 中断响应就会延迟,导致每周期实际采样点漂移。建议把 ESC 中断设为最高优先级,中断服务函数里只做数据交换和时间戳标记,伺服算法放在主循环或定时器中断里。

我用的一版固件曾把串口调试中断优先级设得比 ESC 中断还高,结果电机低速运行时看不出问题,高速时通信偶发瞬断,查了很久才发现 DC 抖动已经到微秒级了。

4.4 开源源码主站兼容性

除了 TwinCAT,也建议在开发早期用 SOEM 这个开源主站验证从站基本通信。SOEM 可以直接调用 ecat_slave 接口扫描从站、配置 PDO、读写 SDO,对于快速验证 PDO 映射很有帮助。我自己就在配套的工具脚本里写过一段 SOEM 主站程序,用来批量读取所有关节的状态字和实际位置,排查从站通信问题比 TwinCAT 更直接。

5. 三环整定与高频往复运动下的稳定性

5.1 电流环整定:先测准电机参数

电流环是所有控制的基础,整定前先把电机相电阻和相电感测准。用 LCR 表测最稳妥,或者用驱动器自带的电流环辨识功能。测出 R 和 L 后,电流环 PI 参数按典型公式算初值:

  • Kp = L * 2π * 带宽
  • Ki = R * 2π * 带宽

带宽取多少需要权衡。带宽越高电流响应越快,但开关频率、采样噪声和电流纹波都可能成为制约。我的经验是取 PWM 频率的 1/10 左右,也就是 PWM 20kHz 时电流环带宽先按 1-2kHz 整定,然后根据实际阶跃响应再微调。

电流环整定时要先松开机械负载,让电机空转,给一个阶跃电流指令,用示波器看电流波形。正常情况是快速上升、略微超调、然后收敛到目标值。如果波形振荡或者有嗡嗡声,说明带宽过高或 Ki 太大。

5.2 速度环和位置环的级联整定顺序

速度环带宽一般取电流环的 1/5 到 1/10。机器人关节惯量大,还有谐波减速器的柔性,速度环增益太高会激发机械谐振峰,表现为特定频率下的啸叫和抖动。位置环带宽更保守,几 Hz 到十几 Hz 往往足够,因为位置环外面还有轨迹规划,过度追求位置环带宽只会放大编码器噪声。

我的调参顺序是:先把电流环稳定,再闭合速度环,从低增益慢慢往上加。每加一次就观察速度波形听电机声音,出现谐振就立即退回,记录谐振频率。然后用陷波滤波器把这个频率压掉,再继续往上提增益。这样做出来的速度环既稳又高带宽。

位置环在速度环稳定后闭合,用输出端编码器做反馈。给阶跃位置指令观察跟踪误差和超调,如果末端有过冲,不要动位置环 P,先检查速度环是否有积风现象,再考虑加位置环微分或前馈。

5.3 高频往复运动中的谐振抑制与噪声处理

高频往复运动是检验整套系统稳定性的最好手段。这种工况下,机械谐振、采样量化噪声、电流环谐波、母线电压跌落全都暴露出来了。我的处理手段有三个:

一是陷波滤波器。在速度环输出或者电流环给定之前加一个双二阶 IIR 陷波器,中心频率对准速度波形 FFT 分析出来的谐振峰,品质因子不要设太高,避免陷波器自己引入相位滞后。

二是速度反馈低通滤波。增量式编码器差分测速在低速时噪声很大,可以加低通,但截止频率要权衡,太低会导致速度环相位延迟增大,反而引发振荡。

三是加速度前馈。高频往复运动下,单纯靠位置环去纠错会滞后,如果能从轨迹规划侧拿到期望加速度,加到速度环/电流环给定上作为前馈,轮廓误差能显著下降。EtherCAT 主站完全可以在同一个周期里把加速度指令一起发下来。

5.4 一组合适的初始化参数参考

以 48V 母线、额定电流约 5A 的关节电机为例,我最终定下来的一套参数大致是这样:

控制环采样率目标带宽反馈信号源整定结果
电流环20kHz约 1kHz相电流采样 + 电机端编码器电角度Kp≈0.3V/A, Ki≈150V/(A·s)
速度环1kHz-2kHz约 100Hz电机端编码器差分Kp≈1.5A·s/rad
位置环1kHz约 8-15Hz输出端绝对值编码器Kp≈120 1/s, 无微分

注意这套参数只能当起点,实际还是得按自己的电机参数和负载逐项调。换电机、换减速比之后不做整定直接套,大概率会抖。

5.5 高频工况下的电源与热管理

最后说一个容易被忽视的问题:高频往复运动时,母线电压会被电流突变拉出明显跌落。母线电容容量不足时,电流环给定一大,母线电压瞬时掉几伏,FOC 的调制比跟着变,电流响应就会畸变。我在这套驱动器上给母线侧并了足量的低 ESR 电容,同时在最靠近 MOS 管桥臂的位置放了一组高频去耦电容。

散热也重要。电机端编码器、驱动芯片和功率管集中在一个关节模组里,空间小,热量容易堆积。我用铝制外壳做整体散热,功率管下面打热过孔接到外壳,实测满负载长时间运行外壳温度稳定在 70℃ 左右,驱动器不再降额运行,电流环和速度环路参数也就不会随温度漂移。

最后再分享一点个人体会。这个项目从原理图到六轴联动跑起来,硬件调试只占一小半,真正花时间的是零位标定和 DC 同步。尤其是双编码器零位,动过减速器、换过编码器之后都要重新标定,否则之前调好的三环参数全都白费。现在这套驱动器的测试样机已经稳定运行,后续我计划把双编码器差值进一步利用起来,做更精细的柔轮刚度辨识和力矩前馈。如果大家也在做类似的功能,欢迎随时交流具体调参细节。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询