1. 项目缘起与总体设计思路
做机器人关节驱动,绕不开一个老问题:编码器到底装在哪?
大多数入门方案,电机尾部装一个编码器就算完事。可等你在真实关节上跑过几轮,就会发现这种单编码器方案在机器人关节这种重负载、变负载、甚至带冲击的场景下,问题特别多。尤其是谐波减速器、行星减速器带来的弹性变形和回差,会让电机端测量的角度和实际连杆角度之间存在不可忽略的偏差。低速时抖、换向时顿、过载时瓢,都跟这个“看不见”的偏差有关。
所以我做这个项目时的想法非常直接:做一个基于 EtherCAT 的机器人关节驱动器,同时带电机端编码器和输出端编码器,通过双编码器融合来同时兼顾低速平稳性和高速动态性。通信走 EtherCAT,控制模式以 CSP(Cyclic Synchronous Position,周期同步位置模式)为主,必要时切 CSV(周期同步速度)/ CST(周期同步力矩)模式。主控用 STM32 加从站协议栈芯片的方案,属于目前工程里最成熟、最不折腾的一条路。
这个项目适合谁?适合正在做机器人关节模组、协作机械臂、AGV 驱动轮、转台这类设备的人。如果你的项目里也遇到“电机端编码器反馈和实际输出端位置对不上”的尴尬,那这套双编码器的思路基本是必选项。另外对想搞清楚 EtherCAT 从站到底怎么调试、DC 时钟同步踩过哪些坑的人,这篇也值得从头看完。
先放一个总体的架构表,后面所有细节都围绕这个骨架展开。
| 模块 | 选型 | 说明 |
|---|---|---|
| 主控 MCU | STM32F405 / F407 | 处理控制环、编码器读取、EtherCAT 报文解析 |
| EtherCAT 从站控制器 | LAN9252 / ESC 芯片 | 负责 EtherCAT 数据链路层,减轻 MCU 实时负担 |
| 电机端编码器 | 17bit 磁编码器(如 TLE5012B) | 高速运行时的电流环/速度环反馈 |
| 输出端编码器 | 19bit 绝对值光电编码器(或高分辨率磁编码器) | 关节绝对位置反馈,用于位置环和误差补偿 |
| 功率驱动 | 集成式三相栅极驱动 + MOS 管全桥 | 根据母线电压和峰值电流选型 |
| 通信拓扑 | 星型/线型 EtherCAT 网络 | 机器人多关节菊花链拓扑 |
这里最核心的设计决策有两个:第一,为什么非要做双编码器;第二,为什么通信和控制链路要选 EtherCAT。下面分别说。
1.1 为什么机器人关节需要双编码器
先做一个简单计算。假设关节输出端使用了 100:1 的谐波减速器,电机端编码器分辨率是 17 bit,也就是每圈 131072 个计数。那么折算到输出端,理论分辨率是 131072 × 100,数值上非常好看,但这是“纸面精度”。谐波减速器在负载作用下,柔轮会产生弹性扭转变形,这个变形量通常在 1~3 arcmin 级别,折算成位置误差可能达到几十到上百角秒。如果你只靠电机端编码器做位置闭环,这个误差完全测不到,也不会被修正。更麻烦的是,减速器回差在换向时会引入一个跳变,轻载和重载下回差表现还不一样,单编码器方案对这种现象毫无感知。
双编码器解决的就是这个问题:电机端编码器负责“快而灵敏”,输出端编码器负责“准而绝对”。电机端编码器装在电机轴上,响应快、频响高,适合做电流环和速度环的反馈;输出端编码器装在关节输出法兰对应侧,直接反映真实连杆位置,适合做位置环反馈。两者通过一个融合算法各取所长,既不会让速度环因为输出端编码器的分辨率和工作范围受限,也不会让位置环因为电机端编码器看不到减速器变形而产生误差。
我在实际调机时有一个体会:如果只做位置环单闭环,输出端编码器直接参与反馈,低速性能其实也不错,但高速时受编码器更新率限制,容易在速度环引起滞后;如果只把电机端编码器用于速度环,输出端编码器只做位置反馈,二者之间又缺少一个过渡机制,加减速过程中会出现明显的“两层皮”现象。双编码器真正的价值,是让两个反馈环各司其职,同时用融合算法把它们平滑衔接起来。
1.2 为什么通信与控制选 EtherCAT 和 CSP 模式
机器人是多关节协同系统,关节个数从 6 到 20 不等。如果每个关节都用传统的脉冲方向控制,线束复杂、同步性差、调试困难。EtherCAT 在这种场景下的优势几乎是碾压性的:分布式时钟(DC)可以让所有从站在硬件级别同步,同步抖动可以做到亚微秒级;帧处理在从站 ESC 芯片里硬件完成,主站到从站的周期可以做到 1kHz 甚至更高,而 CPU 占用很低。
CSP 模式是 EtherCAT 的 CiA 402 协议里专门用于位置同步控制的模式。上位机在每个同步周期下发目标位置,从站内部通过插值或者直接执行,实现多轴联动。机器人轨迹规划通常在上位机完成,关节驱动器只需要执行位置指令并保证本地闭环的响应足够快,CSP 是天然匹配。调试期间偶尔用 CSV 或 CST 模式做单关节动态测试,后期整机联动时回到 CSP,这种组合非常常见。
2. 硬件架构与核心选型解析
2.1 主控与从站控制器的选择逻辑
EtherCAT 从站实现的本质,是把实时性要求极高的链路层交给专用硬件,MCU 只处理应用层数据。我最初也想过用纯软件协议栈在 STM32 上跑 EtherCAT,但试过之后就放弃了:同步抖动和不稳定因素太多,而且大量中断会挤占控制环的时间预算。ESC 芯片方案才是工业级产品的标准做法。
LAN9252 是我在几个项目里用得最多的从站控制器,因为它成本适中、资料多、SPI 接口方便连接 STM32。如果追求更低成本,也可以考虑 AX58100 这类国产 ESC,但工具链和生态成熟度相对弱一些。STM32F405 的主频 168MHz,算力和外设足够跑双编码器读取、电流环和位置环。如果项目后面要加更复杂的动力学前馈或者自适应算法,建议直接上 F407 甚至 H7 系列,但在本项目中 F405 已经够用。
这里有个选型细节值得注意:ESC 和 MCU 之间用 SPI 通信,SPI 速率直接决定了 EtherCAT 报文搬运的延迟。我实测 10MHz SPI 速率下,一个周期内从 ESC 读取 RXPDO 数据并将 TXPDO 回写的总耗时约 30~50 微秒,这为控制环和编码器读取留出了可观的时间余量。如果想压榨性能,可以把 SPI 提高到 20MHz,但需要注意布线长度和信号完整性。
2.2 双编码器硬件布局与信号接口设计
双编码器的物理布局是项目的关键。电机端编码器我选择 TLE5012B,因为它是 SPI 接口、17 bit 分辨率、抗振动能力强,适合安装在电机尾部。输出端编码器选用 19 bit 绝对值编码器,SPI 或 BiSS-C 接口,安装在减速器输出端。
信号接口设计上要格外注意:
- 电机端和输出端编码器的电源必须独立滤波。电机启动瞬间母线电压跌落会通过电源耦合到编码器,导致读取瞬间跳变。建议各加一颗 LDO 和 π 型滤波。
- SPI 时钟线要尽量短,双编码器共用 SPI 总线时分时片选,注意总线电容对信号边沿的影响。编码器线长超过 20cm 时,建议降低 SPI 速率或转成差分信号传输。
- 编码器零位对齐非常关键。电机端编码器零位和电气角度零位的对应关系,必须在驱动器出厂时标定一次,写入 Flash;输出端编码器零位则要和机械原点对齐。
我踩过的一个坑是:刚开始用共地方式连接两个编码器,电机加负载时编码器数据偶发跳变。后来把编码器电源和信号地单独走线,并加磁珠隔离,问题彻底消失。这个问题看起来不起眼,但在批量产品里是可靠性隐患的重灾区。
2.3 功率驱动部分的电流环硬件支持
电流环的响应速度决定了整个驱动器的动态性能。功率部分我采用“预驱动芯片 + 三相全桥 MOS”的方案,预驱动芯片负责把 MCU 的 PWM 信号转换成适合 MOS 管的栅极驱动电压,同时检测过流、过温、欠压故障。
电流采样用的是两相低边采样电阻,加一颗差分运放放大信号后送 MCU ADC。另一个常用方案是集成式电流传感器,比如 ACS712,但它的带宽和噪声在高速电机控制里不算最优。低边采样电路的优点是带宽高、成本低,缺点是需要在 PCB 布局时特别注意采样电阻的 Kelvin 连接,否则电流环的零漂会影响低速性能。
采样电阻的选型公式很简单:R_sense = V_ref / (I_peak × Gain)。比如母线电流峰值 30A,ADC 基准电压 3.3V,运放增益 20,则 R_sense = 3.3 / (30 × 20) = 5.5mΩ。实际取 5mΩ 标准值,再配合运放偏置调整零位。
3. EtherCAT 从站实现与 DC 同步调试细节
3.1 从站协议栈与应用层数据交互
EtherCAT 从站的软件开发,本质上是在 ESC 芯片提供的数据链路层之上实现 CiA 402 协议规定的对象字典和服务。应用层与 ESC 的数据交互通过 PDO(过程数据对象)进行。我使用的协议栈代码结构大致是:
ecat_main.c:初始化 ESC,注册应用层回调ecat_app.c:实现 CoE(CANopen over EtherCAT)协议,包括对象字典读写、SDO 服务pdo_mapping.c:定义 RXPDO/TXPDO 映射关系motor_control.c:从 PDO 数据中提取目标位置,执行控制算法并回写实际值
开发时最关键的是对象字典设计。以 CSP 模式为例,核心对象包括:
| 索引 | 对象名 | 说明 |
|---|---|---|
| 0x6040 | Controlword | 控制字,控制状态机切换 |
| 0x6060 | Modes of operation | 运行模式设置,8=CSP,9=CSV,10=CST |
| 0x607A | Target position | CSP 模式目标位置 |
| 0x6064 | Position actual value | 实际位置反馈 |
| 0x60C2 | Interpolation time period | 插补时间周期 |
| 0x60FF | Target velocity | CSV 模式目标速度 |
| 0x6071 | Target torque | CST 模式目标力矩 |
应用层开发时,我建议先用主站的从站信息描述文件(ESI)来验证对象字典映射关系。ESI 文件中的 PDO 映射必须与应用层代码保持一致,否则主站扫描从站时会报错或数据错位。我遇到过好几次“明明赋值了目标位置,电机却不动”的排查经历,最后都是因为 PDO 映射里字节序或者偏移搞错了。
3.2 DC 分布式时钟同步实现
EtherCAT 最吸引人的特性就是 DC 同步。通俗地说,DC 机制让每个从站维护一个本地时钟,主站通过周期性报文不断校准所有从站时钟,并给每个从站分配一个同步中断时刻。这样所有关节驱动器在同一时刻采集编码器、执行控制算法、更新 PWM 输出,实现真正意义上的硬件同步。
DC 同步的实现分三层:
- 时钟漂移补偿:主站通过 ARMW/FRMW 命令读写从站时钟,测量传播延迟并校准本地时间。这一层主要由主站完成,从站只需要响应。
- 同步中断生成:ESC 芯片内部有 SYNC0/SYNC1 中断输出,配置好周期后,它会按照 DC 时间生成精确的中断脉冲。这个中断就是控制环的节拍。
- 应用层时间戳:MCU 在收到 SYNC 中断后,不仅可以执行控制任务,还可以把“本地时间戳”写入 TXPDO,方便主站观测每个从站的实际执行延迟。
调 DC 同步时我踩过最典型的坑:SYNC 中断的周期设置和控制周期不一致,导致偶发丢帧和电流噪声。后来我严格保证 SYNC0 周期等于 PDO 映射中的通信周期,并且让控制中断优先级高于 SPI 通信中断,问题才稳下来。
下面是一个典型的初始化流程伪代码,帮助理解从站侧 DC 配置:
void ecat_dc_init(void) { // 1. 设置同步周期为 1000us esc_write_reg(ECAT_REG_SYNC0_CYCLE_TIME, 1000); esc_write_reg(ECAT_REG_SYNC0_ACTIVE, 1); // 2. 配置 SYNC0 中断映射到应用层 esc_write_reg(ECAT_REG_SYNC_IRQ_MASK, ECAT_SYNC0_IRQ); // 3. 使能 DC 模式 esc_write_reg(ECAT_REG_DC_ACTIVE, 1); // 4. 设置从站站号(由主站配置) // 5. 等待主站启动 DC 同步 // 6. 在 SYNC0 中断回调中执行控制环 }注意:DC 同步正常后,不同从站的实际执行时间差可以控制在 100ns 级别。如果你用示波器测量各个关节的 SYNC 脉冲,看到的应该是一排整齐的边沿。如果抖动达到微秒级,先检查主站的 DC 配置和从站的时钟漂移补偿是否正常,不要急着怀疑硬件。
3.3 从站网口拓扑设计与 TX/RX 处理
EtherCAT 从站通常至少需要两个网口:一个用于接收上一级报文,一个用于转发到下一级。很多人的疑问是:“从站需要几个 TX 网口?”答案是:标准 EtherCAT 从站是两个网口,一个进一个出;带分支功能的从站才需要多个出口。机器人关节关节一般是线型菊花链,两个网口刚好够用。
LAN9252 集成两个 Ethernet PHY 接口,外挂两个网络变压器和 RJ45 或者直接走板对板连接器。PCB 布线时要注意差分对的等长和阻抗控制。我见过有人在这块偷懒,结果 EtherCAT 链路偶发丢包,从站频繁掉线,排查非常痛苦。100BASE-TX 的差分阻抗是 100Ω,差分对长度差尽量控制在 5mil 以内,这是硬指标。
4. 双编码器融合算法与全闭环控制实现
4.1 双编码器融合的控制结构
双编码器融合的核心思想,是把两个编码器放在不同控制环中,同时通过一个观测器或加权滤波器,将输出端编码器的低频精度和电机端编码器的高频响应结合起来。
我采用的架构是这样的:
- 电流环:完全使用电机端编码器的电角度,做 FOC 控制。电流环频率 20kHz。
- 速度环:速度反馈由电机端编码器差分得到,频率 10kHz。
- 位置环:位置反馈由输出端编码器提供,同时融合电机端编码器的高频增量,频率 1kHz。
位置环与速度环之间,不对两个编码器直接做切换,而是用一阶低通滤波器和微分补偿器做融合。具体做法是:输出端编码器位置经过低通滤波,得到低频绝对位置;电机端编码器位置经过高通滤波,得到高频增量;两者相加得到融合位置,用于位置环反馈。
实现代码示意:
float fused_position = 0.0f; float alpha = 0.02f; // 低通系数,决定融合截止频率 void encoder_fusion_update(void) { uint32_t motor_pos = read_motor_encoder(); uint32_t output_pos = read_output_encoder(); float motor_deg = motor_encoder_to_deg(motor_pos) / gear_ratio; float output_deg = output_encoder_to_deg(output_pos); // 低通:输出端编码器位置 filt_output += alpha * (output_deg - filt_output); // 高通:电机端编码器位置增量 float motor_high = motor_deg - filt_motor; filt_motor = motor_deg; fused_position = filt_output + motor_high; }注意这里的融合截止频率,需要根据关节的机械带宽来定。对于 100:1 减速器,通常融合截止频率在 2~5Hz,即输出端编码器的绝对位置负责低频定位,电机端编码器负责高频跟随。如果截止频率太低,位置环会感觉“迟钝”;太高,输出端编码器的噪声会被引入速度环。
4.2 全闭环参数整定与工程调参顺序
我调试双编码器驱动器时,有一个固定的顺序,能少走很多弯路。分享出来供参考:
- 先标定电机端编码器电气角度偏移。不标定,电流环直接飞车。
- 关掉位置环和速度环,只做电流环调试。给阶跃力矩指令,观察电流响应曲线,调节 PID 的 Kp、Ki 直到电流环带宽达到预期。
- 开启速度环,用电机端编码器做反馈。空载下给定速度阶跃,观察跟随误差,调节速度环的 Kp 和积分系数。
- 加上输出端编码器的融合位置反馈,再调位置环。先给正弦波位置指令,观察跟踪误差和相位滞后。
- 最后加负载,观察重载下的位置误差和动态响应是否仍然满足要求。
参数整定的经验值:电流环 Kp 和 Ki 可以先根据电机电感和电阻估算,再用临界比例度法微调;速度环的积分项不要一开始就给很大,否则低速容易振荡;位置环只加比例项通常就够,积分项只在需要消除静差时引入,且要注意抗饱和。
4.3 全闭环模式下输出端编码器回差的补偿
谐波减速器回差不会完全消失,双编码器方案的价值之一,就是可以在控制层面“看到”回差并补偿它。
具体操作是:在速度环和位置环之间增加一个偏差补偿环节。当输出端编码器位置与电机端编码器折算位置的差值超过一个阈值时,认为关节处于回差状态,在位置环输出中叠加一个补偿量,方向与运动方向一致。
我实际使用的补偿策略是:
- 换向时,检测到方向变化后,等待输出端编码器位置跟随一定距离,再恢复正常控制。本质上是一种“先走、后校正”的滞回逻辑。
- 低速稳态时,如果输出端编码器位置与指令位置存在固定偏差,通过位置环的积分项逐步消除,避免为了消除 0.1° 的回差而过量增加增益导致振荡。
5. STM32 控制核心与软件架构实战
5.1 控制环的实时性保障与中断优先级设计
双编码器驱动器里,时序是最容易失控的地方。EtherCAT 周期中断、编码器 SPI 读取、电流环 ADC 采样、控制算法计算全部挤在同一个 MCU 上,中断优先级安排不好,系统就会出现随机抖动。
我的优先级设计如下,从高到低:
- SYNC0 同步中断:最高优先级,触发整个控制序列。
- ADC 采样完成中断:电流采样转换完成,立即读取。
- 电机端编码器 SPI DMA 传输完成中断:速度环和电流环需要它的数据。
- EtherCAT 协议栈处理(通过 SPI 读取 RXPDO):次要高优先级。
- 输出端编码器读取:位置环更新,优先级低于速度环。
这里的关键点:EtherCAT 数据读取和双编码器读取,千万不能放在同一个中断回调里串行执行。如果某个周期里 SPI 总线被编码器占用,导致 ESC 数据读取被延后,就会引起报文丢失。我的做法是:SYNC0 中断里只启动一个 DMA 任务依次读取电流采样和电机端编码器;ESC 数据通过 SPI DMA 与 MCU 并行交换,控制任务完成后直接从内存中取最新 PDO 数据。
5.2 PDO 数据的映射与字节序处理
EtherCAT 是 little-endian 传输,而 STM32 本身也是 little-endian,通常不会有问题。但如果你在代码里用了结构体指针直接映射 PDO 缓冲区,就很容易被编译器对齐规则坑到。
我建议的做法是:定义 PDO 缓冲区为uint8_t数组,需要读取字段时手动组合,或者使用#pragma pack(1)定义结构体。对比一下:
#pragma pack(1) typedef struct { uint16_t controlword; uint8_t mode; int32_t target_position; int32_t target_velocity; uint16_t torque_offset; } RXPDO_t; #pragma pack(1) typedef struct { uint16_t statusword; int32_t actual_position; int32_t actual_velocity; int16_t actual_torque; uint32_t error_code; } TXPDO_t;使用 packed 结构体之后,直接通过指针访问字段,效率高且不容易出错。
5.3 状态机实现:从停机到回零再到使能
CiA 402 状态机是驱动器必须具备的基本逻辑。状态切换的流程是:Disable Voltage → Switch On Disabled → Ready To Switch On → Switched On → Operation Enable。每一步都由主站发送 Controlword 控制,从站更新 Statusword 并执行相应动作。
实际调试中最容易出问题的,是主站下发的期望状态和从站实际状态不一致。比如主站认为驱动器已回到“Ready To Switch On”,但从站因为内部故障停在“Fault”状态,主站如果继续下发使能命令,就会超时。因此从站代码里故障上报要及时,最好把具体故障码写入对象字典 0x603F(Error code),方便上位机显示。
另外机器人关节驱动器还必须实现“回零”功能。双编码器方案中的回零比较特殊:输出端编码器是绝对值编码器,理论上断电也能记住位置,但电机端编码器的电气零位仍需在每次上电时对齐。我在这块的处理是:上电后先读取输出端编码器的绝对值,作为位置环的初始反馈;然后通过励磁或者短脉冲找电机端编码器的 Z 信号,完成电气角对齐。整个过程在 100ms 内完成,不影响整机上电速度。
6. 常见问题与排查技巧实录
6.1 EtherCAT 从站掉线的系统化排查
从站掉线是这一类项目里最常见的故障。我总结了一套排查流程,按顺序执行能省下几个小时的瞎折腾:
| 症状 | 可能原因 | 排查动作 |
|---|---|---|
| 主站扫描不到从站 | ESC 芯片供电、复位时序异常 | 用示波器测 ESC 的复位引脚和时钟引脚,确认 3.3V 正常 |
| 从站能扫描到但通信周期错乱 | 网口链路协商不一致 | 检查所有从站的网口速率是否都是 100Mbps 全双工 |
| 运行几分钟后掉线 | 从站过热或触点接触不良 | 用测温枪检查 ESC 表面温度,检查连接器弹片是否氧化 |
| 掉线后重连失败 | 主站超时参数太激进 | 调大主站 PDO 超时时间,观察连续丢帧数 |
我遇到过最隐蔽的一次掉线:从站看起来一切正常,但主站始终报“Lost Link”。后来发现是网线用的非屏蔽线,在电机大电流工作时电磁干扰导致 PHY 芯片偶发误码。换上屏蔽网线后故障彻底消失。从这个教训来看,机器人关节内部布线不要图便宜用普通网线,屏蔽层质量在这一场景下不是可选项。
6.2 双编码器数据跳变和融合位置抖动的处理
输出端编码器偶尔跳一两个 LSB 是正常现象,但如果跳变影响到位置环稳定性,就需要排查源头。我常用的措施有三个:
- 在编码器 SPI 读取时加入连续两次读取校验,不一致则丢弃本次数据。
- 对融合位置做一阶低通滤波,截止频率根据机械带宽设定。
- 在位置环的误差计算中加入死区,小于死区的误差不参与控制,避免微小的编码器噪声反复激励电机。
其中第二点尤其值得注意:双编码器融合算法本身就带有滤波性质,但如果滤波过度,会影响关节的刚性和带宽。我实测下来,把融合滤波截止频率和速度环带宽拉开至少 3 倍,系统最稳定。比如速度环带宽 30Hz,融合滤波截止频率就取 10Hz 左右。
6.3 ELMO 等成品驱动器报错的对照启发
项目开发中我也用过 ELMO 这类成品伺服驱动器。它们的报错机制对自研驱动器很有启发。比如 ELMO 报错 2311-81,通常对应编码器通信超时或电池电压异常。自研驱动器同样需要把编码器通信超时、编码器数据校验失败、过流、过温、母线欠压等故障全部做成可上报的故障码,而不是只靠主站侧超时判断。
我在自己的驱动器固件里定义了一组故障码,至少覆盖以下场景:
| 故障码 | 含义 | 处理动作 |
|---|---|---|
| 0x10 | 电机端编码器通信故障 | 紧急停机,状态机切换到 Fault |
| 0x11 | 输出端编码器通信故障 | 紧急停机,给出告警 |
| 0x20 | 母线过压/欠压 | 停机并上报具体电压值 |
| 0x30 | 功率板过温 | 降额运行或停机 |
| 0x40 | 电流环饱和/过流 | 软件限流,必要时停机 |
6.4 网口图标删除等非专业技术问题的说明
最近搜索热词里出现了“设备和驱动器有个空白图标删不掉”“u盘提示格式化”这类内容。虽然这些和 EtherCAT 驱动器开发不直接相关,但测试 EtherCAT 从站时,很多工程师其实是在 Windows 工控机上装主站工具(如 TwinCAT),确实会遇到系统“设备和驱动器”里出现奇怪图标、U 盘插入提示格式化之类的问题。简单说,前者通常是 Windows 注册表残留或者虚拟光驱残留,后者多半是 U 盘文件系统损坏或主站工具占用了盘符。这些都不影响 EtherCAT 本身工作,但遇到了会分散精力。处理方式很简单:检查磁盘管理里的卷信息,删除残留的设备映射,或者换一个 USB 口加载驱动,基本都能解决。
7. 驱动器稳定性与量产化落地的几个注意事项
从样机到批量,有几个细节如果不在设计阶段考虑,后面会非常痛苦。
第一个是编码器线缆的屏蔽处理。机器人关节内部空间狭小,电机线、编码器线和 EtherCAT 网线往往挤在一起。编码器信号线必须采用双绞屏蔽线,屏蔽层单端接地。我见过的很多干扰问题,最后都归结到屏蔽层两端都接地导致的共模电流。
第二个是母线电容容量的计算。电机加减速时,母线电压会有波动。驱动器直流母线电容的经验公式是:C = I_peak × Δt / ΔU。假设峰值电流 20A,允许电压跌落 10V,加速时间 2ms,则 C = 20 × 0.002 / 10 = 4000μF。实际选型还要考虑电容 ESR 和温度寿命,不建议只按理论最小值选。
第三个是控制板与功率板的隔离。EtherCAT 通信和编码器反馈通常属于控制侧,功率侧存在高压和大电流,必须做隔离设计。即使是小功率关节,也建议至少用数字隔离器隔离 SPI 信号,否则接地环路会在批量产品中引发莫名其妙的偶发故障。
第四个是软件升级和参数存储。驱动器参数(电流环 PID、编码器零位、融合系数)需要存储在非易失区。我建议用 Flash 模拟 EEPROM 的方式,并加入参数校验和回滚机制。否则在产线调试时误写入一组导致飞车的参数,可能把整台设备损毁,而重启电源也救不回来。
8. 实测数据与个人的一些调整心得
项目最后,我简单记录了一组实测数据。在 1kHz 位置环、10kHz 速度环、20kHz 电流环配置下,带 100:1 谐波减速器的关节模组:
- 空载下,1° 阶跃位置指令的调节时间约 45ms,无超调;
- 带 10kg 负载做 10mm/s 低速轨迹时,位置跟踪误差小于 0.02mm;
- 做正弦轨迹时,融合位置反馈的相位滞后比单电机端编码器方案降低了约 40%;
- DC 同步下,相邻两个关节的 SYNC0 中断信号实测抖动在 ±80ns 以内。
这个数据不算极致,但用来做一台 6 轴协作机械臂是完全够用的。
关于双编码器融合系数,我个人经验是:不要一上来追求最优参数,先把所有观测和滤波环节关掉,让系统能稳定运行,再逐步加大融合比例。这种“先稳定后优化”的思路几乎适用于所有复杂控制系统。另一个让我印象深刻的经验是,输出端编码器的安装同轴度一定要严格控制。如果输出端编码器安装偏心超过 0.1mm,转一圈会有一次明显的位置波动,这种机械误差任何控制算法都补偿不了。每次组装关节模组,我都会先用千分表打一遍编码器安装跳动,这比调控制参数更重要。
如果你正在做类似的机器人关节驱动器,我最后想说的一句是:项目前期花时间把 EtherCAT 从站的 PDO 映射和 DC 同步机制搞透彻,是性价比最高的一件事。因为后续所有的控制逻辑都建立在这层稳定、同步的数据交换之上。数据链路歪了,后面所有花哨的算法都是空中楼阁。