TMS320F28335主控 EtherCAT伺服方案 EtherCAT低压伺服
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做温度补偿。

更多推荐


所有评论(0)