TMS320F28335主控 EtherCAT伺服方案 EtherCAT低压伺服,提供TI DSP和FPGA源码和PDF原理图。

这板子上的TMS320F28335烫得能煎鸡蛋,但正是这颗DSP扛起了整个EtherCAT实时通讯的大旗。咱们直接扒开代码看门道——在ecat_slave.c里藏着这么一段:

void ECAT_ProcessRxPdo(uint16_t *pData) {
    volatile int32_t *target_pos = (int32_t*)(&pData[0x6020]);
    gMotor.target_position = SWAP32(*target_pos); // 字节序转换不能忘
    ECAT_TriggerServoISR(); // 触发伺服中断
}

看见没?EtherCAT主站发来的目标位置直接怼到0x6020地址,这里用了SWAP32处理网络字节序转换。重点是这个TriggerServoISR,它直接唤醒DSP的PWM中断服务,确保位置指令能在20us内响应。

FPGA那边负责的是硬实时活儿,Verilog代码里这段脉冲计数逻辑挺有意思:

always @(posedge encoder_a) begin
    if(encoder_b) 
        position_cnt <= position_cnt - 1;
    else 
        position_cnt <= position_cnt + 1;
    // 边沿检测窗口仅2ns,比DSP快一个数量级
end

注意这里的双沿触发检测,用FPGA实现正交编码器解码,比用DSP的QEP模块精度高多了。实测发现用28335自带的QEP模块在3000rpm时会有±3LSB误差,而FPGA方案直接干到0误差。

原理图里有个骚操作——在PWM输出部分(第8页右下角)并了个74LVC1G17斯密特触发器。这玩意儿看似多余,实测能有效消除DSP引脚在死区切换时的毛刺。有次现场干扰大,电机抖得像筛糠,加上这个缓冲器后波形立马干净如刀切。

说到中断嵌套,DSP这边有个坑要注意:

#pragma CODE_SECTION(EPwm1_ISR, "ramfuncs")
__interrupt void EPwm1_ISR(void) {
    ESTOP0; // 紧急停止保护
    UpdatePwmDuty(gMotor.actual_current); 
    PieCtrlRegs.PIEACK.all = PIEACK_GROUP3; 
}

必须把中断服务函数放到RAM里执行,否则Flash的等待周期会让中断响应延迟爆表。曾经有个兄弟没加这个pragma,结果伺服周期从标称的50us硬生生拖到120us,电机直接变步进。

这套方案最狠的是把EtherCAT从站堆栈跑在DSP的CLA协处理器上,主核专心做运动控制。CLA的代码看着有点魔性:

cla_code void Cla1Task3() {

ecat_stack.process(); // EtherCAT协议栈在CLA运行

ECATLED = ~ECATLED; // 状态灯用GPIO31翻转

}


用CLA处理网络协议栈,实测比主核节省35%的CPU占用。不过要小心CLA和主核共享内存的同步问题,有个项目就因为没加内存屏障,导致从站状态字偶尔抽风。

烧写时遇到个玄学问题:当使用并行FLASH引导时,必须把代码中的ECAT初始化函数放到0x3F8000之后,否则从站EEPROM配置会加载失败。后来查手册发现是DSP的FLASH分页机制在作妖,解决办法是在cmd文件里加个强制对齐:

MEMORY {
    ECAT_INIT : origin = 0x3F8000, length = 0x1000
}

这套方案的电流环带宽实测能达到2.5kHz,秘诀是在FPGA里做了三阶Σ-Δ调制。不过要警惕散热——全速运行时MOSFET驱动芯片的温度能飙到85℃,建议在电机母线上并个NTC做温度补偿。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐