Elmo 驱动器关于双编码器读数的获取方式
问题提出
本文使用的 Elmo 驱动器型号是 Gold Twitter。
想要获取双编码器的目的是发现当使用双编码器进行驱动器调参时,发现位置环跟踪非常不稳定,存在震荡现象。因为在 Elmo 的双编码器配置里,电机端的编码器用于配置速度环和 Communication ,而输出端(负载端)的编码器用于配置位置环。当输入输出间的减速器存在弹性时,就会导致简单的 PID 不能有效完成位置控制,产生震荡。
解决这个问题的方法很简单,就是驱动器的三环都用电机端编码器,而不用输出端编码器。问题是本文所用的关节配置是电机端安装相对编码器,输出端安装绝对编码器,如果不用输出端的编码器,那么电机断电后就会丢失零位。因此我们有必要同时获取两个编码器的信息,并仅把电机端编码器用于电机三环调参。
在 EASII 软件上直接设置的话,是不能完成上述要求的,只能实现(1)单编码器 + 三环;(2)电机端编码器(速度环)+ 负载端编码器(位置环);两种配置。本文想要实现的是驱动器上直接基于电机端编码器做三环控制,同时也要获取输出端编码器以获取绝对位置,这个绝对位置在控制器上也可以做进一步的算法控制。
在知乎上看到其他人也有这个问题,当时他们也没有讲清楚怎么同时读双编码器的问题。 https://zhuanlan.zhihu.com/p/55702051
解决方案
经过研究 Elmo 的命令参考和 DS402 协议,最终解决上述问题。
分为两部分
1. 编码器配置
首先去 EASII 的 Help 里找到 Elmo 驱动器命令参考中关于编码器配置的内容,这部分配置集中在 CA 寄存器组,如下图,Gold 驱动器有 4 个传感器反馈通道(socket),这里 CA 命令中 CA[41-44] 表示对 socket 连接到哪种传感器。在本文的配置里,驱动器 Socket1 连接了 Quad Encoder B (CA[41] = 1
),Socket2 连接 Biss-C 编码器 (CA[42] = 24
)。
那么这些编码器如何配置呢?直接在驱动器的调试界面配置似乎不行,因为我们想要实现双编码器配置 + 单编码器三环,而如果在调试界面里配置单反馈就不能配置第二个编码器了。最后探索发现,这个调试界面是直接读写驱动器的寄存器命令来完成调试的,它修改的寄存器只限于界面上显示的寄存器。因此我们可以先把驱动器配置为双反馈,配置好双编码器后,保存,再把驱动器配置成单反馈,再进行后续的电流、速度、位置的调试工作即可。
配置编码器所需要对应的寄存器也可以在 CA 这一页看到,例如配置 BissC 编码器需要很多对应的寄存器(下图)。
本文绝对编码器配置:
对应的寄存器:
CA[22] = 7
CA[23] = 1
CA[35] = 17
CA[36] = 2.5E+7
CA[42] = 24 //Socket2配置为 General Biss 编码器
CA[58] = 0
CA[59] = 19 // 表示编码器是19位的
CA[60] = 8
CA[61] = 0 // 不减少精度 如果是1,19位的编码器会被当成18位来用。
CA[62] = 0 // 多圈配置,无
CA[66] = 27 // BissC编码器单帧传递总位数
CA[67] = 8 // 位置数据起始位
按照以上步骤配置好后,驱动器三环全部使用 Socket1 的编码器,Socket2 的数据可以读到但并没有使用。如何读到 Socket2 也就是绝对编码器的数据呢?
2. 通信配置
DS402 协议里除了 0x6064 这个对象反馈位置外,还有一个 0x20A0 反馈辅助位置(Auxiliary Position),这个辅助位置的数据来源由 CA[79]
来配置,因此我们设置 CA[79] = 2
就可以拿到 Socket2 也就是绝对编码器的数据了。此外 0x20A0 这个对象还有 PY
、OV[53]
两个别名,对应的说明如下图。
最后,在 EtherCAT 过程对象配置中,把 0x20A0 加进去,这样上层主机就可以拿到双编码器的数据了(0x6064 和 0x20A0)。
在调试时也可以打开状态监视器(Status Monitor)直接将对应的寄存器名称放进去,这样调试时也可以观察到两编码器的数据。