ARTICLE DETAIL

资讯详情

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

重磅:EtherCAT 周期校准与传播延迟测量详解1

重磅:EtherCAT 周期校准与传播延迟测量详解1 通过对SOEM (Simple Open EtherCAT Master) 的 ethercatdc.c 代码及协议文档深入学习对FPGA 实现 EtherCAT DCDistributed Clocks时钟同步的完整机制进入详细解释。PGA EtherCAT 主站的 DCDistributed Clocks时钟同步模块负责在上电阶段完成以下任务(对应 SOEM 的 ecx_configdc() 函数ethercatdc.c L253-431完成上电时的 DC 初始化对齐)1.读取从站 DL 状态确认 DC 支持能力2.广播写端口时间戳寄存器0x0900清零所有从站端口时间戳3.对每个从站循环执行读系统时间(0x0918) → 计算offset → 写偏移寄存器(0x0920) → 写传播延迟(0x0928)4.STATIC_COMP 阶段循环 15000 次写系统时间(0x0910)补偿 ESC 内部 PLL5.进入 SYNC_DONE_ST 终态DC 同步完成**一EtherCAT DC 同步基础原理多轴伺服系统要求各从站在相同时刻执行运动控制指令否则会导致各轴运动不同步轨迹偏差位置控制精度下降高速运动时出现机械振动上电时主站执行一次性 DC 对齐计算 offset、写 0x0920、写 0x0928运行时主站每 1ms 只收发 PDO 数据不重新计算 offset。漂移补偿由从站 ESC 硬件 PLL0x0930/0x0934自动完成。****二.状态机设计状态定义:localparam IDLE7d0;// 初始空闲localparam REG0027d1;// 读DL状态localparam REG9007d2;// 广播写端口时间戳localparam LOOP_BODY7d3;// 循环体localparam STATIC_COMP7d99;// 系统时间补偿localparam SYNC_DONE_ST7d100;// 终态状态转移逻辑:****三.对应soem的代码分析// ethercatdc.c L270-303 (ecx_configdc 函数)/* 步骤1: 广播清零所有从站端口时间戳 */ecx_BWR(context-port,0,ECT_REG_DCTIME0,sizeof(ht),ht,EC_TIMEOUTRET);/* 步骤2: 获取主站时间SOEM简化规范应读参考从站时间 */mastertimeosal_current_time();mastertime64...;/* 步骤3: 遍历每个DC从站一次性完成以下操作 */for(i1;i*(context-slavecount);i){if(context-slavelist[i].hasdc){slavehcontext-slavelist[i].configadr;/* 3a: 读端口0时间戳 (0x0900) */ecx_FPRD(slaveh,ECT_REG_DCTIME0,ht,...);/* 3b: 读帧起始接收时间 (0x0918) 从站本地时间 */ecx_FPRD(slaveh,ECT_REG_DCSOF,hrt,...);/* 3c: 计算偏移 主站时间 - 从站本地时间 */hrthtoell(-etohll(hrt)mastertime64);/* 3d: 写入偏移寄存器 0x0920 (一次性) */ecx_FPWR(slaveh,ECT_REG_DCSYSOFFSET,hrt,...);/* 3e: 读4个端口时间戳用于传播延迟计算 */ecx_FPRD(slaveh,ECT_REG_DCTIME0,ht,...);// DCrtAecx_FPRD(slaveh,ECT_REG_DCTIME1,ht,...);// DCrtBecx_FPRD(slaveh,ECT_REG_DCTIME2,ht,...);// DCrtCecx_FPRD(slaveh,ECT_REG_DCTIME3,ht,...);// DCrtD/* 3f: 计算传播延迟并写入 0x0928 (一次性) */context-slavelist[i].pdelay((dt3-dt1)/2)dt2...;ecx_FPWR(slaveh,ECT_REG_DCSYSDELAY,ht,...);}}****四.测量过程的整体流程**由于DC分布时钟是ethercat主站的核心本项目采用FPGA实现全部DC时钟功能大幅度压缩抖动。笔者正在调试之中如果有更多的朋友想了解请留言适当时机放出完整代码。奉上pdelay手写公式推导
返回列表