TMS320F28335主控+EtherCAT伺服方案

工业现场最怕的就是控制信号延迟和通信抽风,搞运动控制的兄弟肯定懂这种痛。TI的TMS320F28335这块DSP芯片算是老江湖了,主频150MHz还带FPU,对付多轴联动的算法绰绰有余。但光有运算能力不够,实时通信才是王道——这就轮到EtherCAT上场表演了。

硬件连线其实简单到离谱,RJ45网口直连伺服驱动器,但底层协议栈得自己捣鼓。F28335的EPWM模块配置个精准时钟源是基本功,这里给个定时器中断配置的硬核操作:

EPwm1Regs.TBPRD = SYSTEM_FREQ / (2 * PWM_FREQ); // 载波频率设成10kHz
EPwm1Regs.TBCTL.bit.CTRMODE = TB_COUNT_UPDOWN; // 上下计数模式
EPwm1Regs.CMPA.half.CMPA = EPwm1Regs.TBPRD * dutyCycle; // 占空比直接怼进去

这段代码看着平平无奇,但要是PRD寄存器没算准,整个EtherCAT的分布式时钟同步直接翻车。实测发现把定时器误差控制在±5ns以内,八个伺服轴做圆弧插补时才不会画出蚯蚓轨迹。

TMS320F28335主控+EtherCAT伺服方案

协议栈方面建议直接扒TI的ethercat_slave例程,重点看ProcessData函数怎么处理PDO映射。比如把伺服的位置反馈打包成输出报文:

#pragma DATA_SECTION(ecatOutputs,"ECAT_DATA_BUFFERS")
uint16_t ecatOutputs[ECAT_OUTPUTS_SIZE]; // 输出数据强制对齐

void mapServoData(void) {
    ecatOutputs[0] = (uint16_t)(motor1.position >> 16);  // 高16位
    ecatOutputs[1] = (uint16_t)(motor1.position & 0xFFFF);// 低16位
    // 后面塞电流环参数...
}

这里用#pragma硬核指定数据段地址是为了避免DMA搬运时出现玄学问题。曾经有个兄弟忘了加这个修饰符,结果从站数据在DC同步时偶尔错位,查了三天才发现是内存对齐的锅。

调试时建议先拿单个伺服开刀,用Wireshark抓包看SM0通道的同步报文。当看到0x0900报文里的ESC寄存器开始规律跳动,说明分布式时钟已经活过来了。这时候再往COE字典里写607Ah目标位置,伺服应该会发出轻微嗡鸣——别慌,这是正常现象,跟老式硬盘寻道声差不多。

最后来个骚操作:通过修改ET9300物理芯片的EEPROM,把从站响应时间压缩到1ms以内。但要注意不同品牌伺服的参数页偏移量可能暗藏杀机,某次我把松伺服的加速时间参数写到了安川的扭矩限制地址,结果电机直接开启狂暴模式...(建议操作前先买好保险)

更多推荐