我是CANOPEN的新手。我编写了一个通过PDO1读取实际位置的程序(默认值是statusword +实际位置)。
void canopen_init() {
// code1 setup PDO mapping
nmtPreOperation();
disablePDO(PDO_TX1_CONFIG_COMM);
setTransmissionTypePDO(PDO_TX1_CONFIG_COMM, 1);
setInhibitTimePDO(PDO_TX1_CONFIG_COMM, 0);
setEventTimePDO(PDO_TX1_CONFIG_COMM, 0);
enablePDO(PDO_TX1_CONFIG_COMM);
setCyclePeriod(1000);
setSyncWindow(100);
//code 2: enable OPeration
readyToSwitchOn();
switchOn();
enableOperation();
motionStart();
// code 3
nmtActiveNode();
}
int main (void) {
canopen_init();
while {
delay_ms(1);
send_sync();
}
} 如果删除“代码2”(伺服处于Switch_on_disable状态),则每次同步发送时都可以读取位置。但是如果我使用“代码2",驱动程序会出现”同步帧超时“错误。我不知道司机有问题或我的代码有问题。我的代码有问题吗?谢谢!
发布于 2021-04-29 15:02:05
问题解决了。由于伺服系统产生了大量的电磁干扰,使我的控制器无法正常工作。隔离后,效果很好:)!
发布于 2021-04-28 13:14:59
我不知道这是什么协议栈,也不知道它是如何工作的,但是这些:
setCyclePeriod(1000);
setSyncWindow(100);可能对应于这些OD条目:
7.5.2.6)
它们分别设置同步PDO的同步间隔和时间窗口。标准将后者描述为:
,如果同步窗口长度过期,则可以丢弃所有同步TPDO,并且可以发送EMCY消息;所有同步RPDO都可以被丢弃,直到接收到下一同步消息为止。使用下一条同步消息恢复同步RPDO处理。
现在,如果您将这个同步时间窗口设置为100 up,但是有一个草率的繁忙等待延迟delay_ms(1),那么这就不算了。如果将零写入对象1007h,则禁用同步窗口功能。我想setSyncWindow(0);可能会这么做。你可以试着这样做,看看这是否是问题所在。如果是这样的话,你必须放弃你的忙碌--等待合适的硬件定时器,一个用于同步周期,另一个用于PDO超时(如果必须使用该功能)。
https://stackoverflow.com/questions/67286771
复制相似问题