我们有一个机器人项目,其中电机控制器使用CANopen进行通信。我需要使用主微控制器与这些电机控制器进行通信。问题是我需要在该微控制器中开发一个CANopen层,但是我只知道如何在低电平(CAN)上发送和接收。
我对CANopen知之甚少(PDO,SDO,心跳,对象字典等)。我试图阅读CiA规范,但这非常复杂。如果有人可以指出正确的方向或给我一个好的教程来编写简单的CANopen层,我将不胜感激。
最佳答案
由于这似乎是一个普遍感兴趣的话题-我同意理解完整的原始规格可能会有些痛苦。因此,这里建议“让您的驱动器继续前进”,而不是“实现整个过程”:
检查您的CANopen驱动器是否可以通过CiA 402标准对象进行操作,并且出于性能方面的考虑,最好不要配置和使用PDO,并且您真的不需要心跳信号。通常是切换驱动器的状态机(对象6040h,控制字),设置操作模式(对象6060h),以及设置其他参数,例如“轮廓位置速度”。
然后仅实施加速的SDO传输。 (请参见http://en.wikipedia.org/wiki/CANopen。)SDO下载用于在驱动器中写入/更改对象。 SDO上传用于读取对象。
我建议使用可以读写SDO并具有CAN总线监视器的PC软件。 (我们的Kickdrive Zero免费软件可以做到这一点,但实际上,任何其他适用于CANopen的PC工具都可以使用。)请为所需的数据类型和对象做一些读写示例。看一下它如何转换成CAN级别的帧。对于基本的整数数据类型,对于请求而言始终只有一帧,对于答案而言始终只有一帧。
现在,在您的微控制器上构建一个简单的协议栈,该协议栈可以发送SDO下载/上传请求并处理答案。
免责声明-以上内容与“实施CANopen”,“支持CANopen”甚至“与CANopen兼容”甚至不近。这是关于“使驱动器尽快移动而没有第三方代码”。有时候这是正确的做法。