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)直接将对应的寄存器名称放进去,这样调试时也可以观察到两编码器的数据。
原文地址:https://www.cnblogs.com/Gentleaves/p/17360413.html
- 基于典型相关分析的词向量
- 分享一波关于做 Kaggle 比赛,Jdata,天池的经验,看完我这篇就够了。
- system表空间不足的问题分析(r6笔记第66天)
- 挑战数据结构和算法面试题——最大间隔
- 一则orabbix报警的分析(r6笔记第65天)
- 中科院计算所开源深度文本匹配开源工具 MatchZoo
- 简单易学的机器学习算法——线性回归(1)
- 当主键碰到NULL(r6笔记第64天)
- 记一次dg故障的处理总结(r6笔记第63天)
- Java企业面试——Javaweb
- Linux下/var/spool/clientmqueue空间不足的解决(r6笔记第81天)
- Pytorch 0.3发布:实现多方面提速,增加对ONNX支持 | 快讯
- 基于DB time的调优分析 (r6笔记第79天)
- 通过shell脚本抓取awr报告中的问题sql(r6笔记第78天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 浏览器在线预览offce,vue-pdf预览pdf文件
- vivo商城前端架构升级-总览篇
- 《JSON笔记之三》---postman中传入json串
- Spring源码学习笔记(13)——JDBC
- java系列之注解
- NodeJs初入Http模块和Url模块
- Spring系列之实例化、初始化处理器
- NodeJs安装supervisor实现重载
- MyBatis系列之浅谈SQL执行流程分析
- NodeJs引入自定义模块
- NodeJs引入操作第三方插件
- RocketMQ 环境搭建
- ThreadLocal源码分析
- ThreadPoolExecutor详解
- 接口测试框架实战 | 流程封装与基于加密接口的测试用例设计