【发布时间】:2021-04-27 16:09:43
【问题描述】:
我是 CANOPEN 的新手。我写了一个程序,通过 PDO1 读取实际位置(默认是状态字 + 实际位置)。
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”,驱动程序会出现错误“同步帧超时”。我不知道驱动程序有问题或我的代码有问题。我的代码有问题吗?谢谢!
【问题讨论】:
-
这都是属于某个CANopen协议栈的高层API,所以有点难说。它是哪个堆栈? CANopen 的同步机制主要用于让 PDO 在收到同步消息后做出响应,或者在获得同步后的指定时间内做出响应。或者在实时系统中,您可以简单地将其用作简单的系统时钟,并在获得同步的位置激活输出。无论如何,我想您应该检查这些“1000”和“100”值的含义。 CANopen OD 与单位不一致 - 有时表示毫秒,有时表示其他时间单位。
-
我阅读了制造商的文件。它说设置传输类型为1-240并发送同步。如文档所述,同步周期和同步窗口时间都以微秒为单位
标签: c embedded can-bus canopen