CANopen--实现双电机速度同步
图1
将上图图中左边的电机和右边的电机进行速度同步,右边的电机同步左边的电机速度。这里需要知道Copley的驱动中的速度环的输入输出情况。如下图所示,速度环限制器接收速度命令信号,经限制后,产生一限制速度命令信号给输入滤波器。输入滤波器将信号传递到求和节点处,求和节点将速度命令信号与反馈的实际速度值相减得到一差值信号。(当在负载端有一编码器的情况下,速度反馈值通常来源于电机端的编码器。)差值信号经过比例增益和积分增益的处理最终产生出电流命令信号。可设置的滤波器可作用于速度环的输入和输出端。
图2 电机驱动速度环
在速度模式下,速度环的命令来源于以下某一种
图3 速度环命令来源
为了达到目的,要设定2#电机驱动器工作在速度模式下,即 The velocity loop is driven by the paogrammed velocity value, 此时只有设置对象字典0x2300为11。将1#电机的速度发送给2#电机,其实就是将1#的programmed velocity value发送给2#电机,2#电机将接受到数当做它的programmed velocity value,就实现了二者的同步。
图4
这里我将1#电机设置成位置模式,然后将其中的速度环的Programmed velocity command 发送给2#电机,那么问题来了,我怎么通过配置将1#电机的值发送给2#,让2#接收呢,我不可能在电机驱动里面去编写一套接收函数吧。这里先留个疑问,接下来就按照CANopen的配置过程将两个电机的PDO进行映射。
PDO通信参数,定义了该设备所使用的COB-ID、传输类型、定时周期等。RPDO通讯参数位于对象字典索引的1400h to 15FFh,TPDO通讯参数位于对象字典索引的1800h to 19FFh。每条索引代表一个PDO的通信参数集,其中的子索引分别指向具体的各种参数。如下表所示。
表1
PDO映射参数是初学者学习CANopen时的一个难点,它包含了一个对象字典中的对象列表,这些对象映射到相应的PDO,其中包括数据的长度(单位,位),对于生产者和消费者都必须要知道这个映射参数,才能够正确的解释PDO内容。就是将通信参数、应用数据和具体CAN报文中数据联系起来。
综上,也就是在通信参数中定义了双方通信的方式,映射参数中定义了通信的内容,也就是在规定好的通信参数的情况下发送或者接受映射参数中的规定的数据字典对应的值。
其中不得不提到的是COB-ID(通信对象标识符),即Communication Object ID,也就是发送或者接收对应帧的ID,再说的形象一点,我发送一帧带有特殊ID的消息,如果你想接收到这帧数,你接收的ID号必须和我的一样。在一些说明书里面说明了诸如下列的说明:
表2 COB-组成说明
表3 对象COB-ID列表
举例:4 号从站TPDO2 的COB-ID 为280h + 4 = 284h。但是有时候你可能有疑问,TPDO5的COB-ID为多少呢?上述都是人为规定的一个规律,为了方便大家写的程序好读懂,实际调试过程中大家经常的人为规定双方的COB-ID号是多少,不一定说要遵循上面表中的规律。这里,我们将对应的COB-ID设置为222,用的是RPDO6和TPDO4,即1#电机发送的数据从TPDO4中发出,2#电机在RPDO6中接收数据。
图5
设置好消息同步,来一个同步信号(注意二者之中只要一个产生同步信号就行了)1#电机就发送一个命令给2#电机。
配置的代码如下:
驱动1 ID =1 主轴
配置TPDO
第1步:DisablePDO(最高位置1)
23 03 18 01 22 02 00 80
第2步:设置通信参数
2F 03 18 02 01 00 00 00 //设置为循环同步
第3步:清空映射对象数目
2F 03 1A 00 00 00 00 00
第4步:映射对象
23 03 1A 01 20 00 41 23
第5步:设置映射对象个数
2F 03 1A 00 01 00 00 00
第6步:Enable PDO(最高位清零)
23 03 18 01 22 02 00 00
主轴设置成
2B 00 23 00 1E 00 00 00
设置成operation模式
驱动2 ID = 2 从轴
配置RPDO
第一步:DisablePDO(最高位置1)
23 05 14 01 22 02 00 80
第二步:设置通信参数
2F 03 14 02 01 00 00 00 //设置为循环同步
第三步:清空映射对象数目
2F 05 16 00 00 00 00 00
第四步:映射对象
23 05 16 01 20 00 41 23
第五步:设置映射对象个数
2F 05 16 00 01 00 00 00
第六步:Enable PDO(最高位清零)
23 05 14 01 22 02 00 00
第七步:从轴设置成the velocity loop is driven by the programmed velocity value.
2B 00 23 00 0B 00 00 40
第八步:设置成为operation 模式
设置同步消息周期
23 06 10 00 10 27 00 00 ///10ms同步一次
激活同步功能
23 05 10 00 80 00 00 40
CANopen--实现双电机速度同步的更多相关文章
- Copley-STM32串口+CANopen实现双电机力矩同步
原来有个CANopen的主站卡,现在没了,只有单片机,用单片机来制作一个CANopen的主站卡貌似不是很难,但是需要时间.无奈仔细看了一个Copley的说明,决定采用CAN口+串口来实现之前的功能. ...
- otter双主同步安装与配置
otter是阿里的开源数据同步项目,资源地址就不用说了哈,网上找,阿里云论坛关于单方向同步的配置已经很清楚了,理论上说,双主同步也不复杂,但是毕竟 是数据库,比较重要,配置双主的时候,总觉得心里没底, ...
- IIC - 【转载】对I2C总线的时钟同步和总线仲裁的深入理解
对I2C总线的时钟同步和总线仲裁的深入理解 每一个IIC总线器件内部的SDA.SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起.其中输出为漏极开路的场效应管.输入缓冲为一只高输入阻抗的同 ...
- java实现高性能的数据同步
最近在做一个银行的生产数据脱敏系统,今天写代码时遇到了一个“瓶颈”,脱敏系统需要将生产环境上Infoxmix里的数据原封不动的Copy到另一台 Oracle数据库服务器上,然后对Copy后的数据作些漂 ...
- 旧文备份:CANopen中SYNC的功能和使用
SYNC是CANopen管理各节点同步数据收发的一种方法,相当于网络节拍,基于同步的PDO按照这个网络节拍来执行实时数据的收发.SYNC属于生产/消费型通讯方式,网络中有且只有一个SYNC生产者,一般 ...
- MySQL 异地 双机房同步之otter
一.背景: 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求, 同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了ott ...
- Sqlite3常用的插入方法及性能测试
最近做到的项目涉及一个大数据量缓存重传,其中要用到的sqlite技术,把自己的学习心得整理了一下. SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. ...
- [MFC] 高仿Flappy bird 桌面版
这是今年年初做的东西,一直没有时间整理,现在拿出来分享下~ 目录 开发背景 开发语言及运行环境 效果展示 游戏框架说明 游戏状态及逻辑说明 经典算法说明 重量级问题解决 开发感想 一.开发背景: fl ...
- PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1
※★◆●PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1AApprriill 22001166Conte ...
随机推荐
- [leetcode-108,109] 将有序数组转换为二叉搜索树
109. 有序链表转换二叉搜索树 Given a singly linked list where elements are sorted in ascending order, convert it ...
- Mongoose笔记
Mongoose是在node.js异步环境下对mongodb进行便捷操作的对象模型工具 mongoose是针对mongoDB操作的一个对象模型库,封装了mongoDB对文档的.增删改查等方法 使用Ko ...
- 细说shiro之五:在spring框架中集成shiro
官网:https://shiro.apache.org/ 1. 下载在Maven项目中的依赖配置如下: <!-- shiro配置 --> <dependency> <gr ...
- 【bzoj 4756】[Usaco2017 Jan] Promotion Counting
Description The cows have once again tried to form a startup company, failing to remember from past ...
- C# 常用的工具方法
1.DateTime 转为Unix的long的时间戳 long orderTime = order.AddTime.ToUnixTimeStamp("Milliseconds"); ...
- Docker 查看容器 IP 地址
查看Docker的底层信息. docker inspect 会返回一个 JSON 文件记录着 Docker 容器的配置和状态信息 docker inspect NAMES # 查看容器所有状态信息: ...
- flex中使用white-space
在微信小程序开发中,view设置为flex布局,但是flex的flex-wrap属性不起作用,如果起作用的话,默认值即no-wrap不换行.如果要测试view-scroll并且scroll-x 就没法 ...
- webpack配置模块的查找范围
一般我们的入口文件会引入一下公共的样式文件,比如这样 import './style' 但是这个样式文件并不会生效呀,因为你的写法不对鸭,你要把文件的后缀名也要写 import './style.cs ...
- jq中的事件委托:closest,parent,parents,delegate
closest .closest(selector) 从当前元素开始沿 DOM 树向上,获得匹配第一个符合选择器的祖先元素,返回零个或一个元素的 jQuery 对象. .parents() 和 .cl ...
- 【提取元素的值 】【追加文本append】【删除文本remove】【class的操作】【读取元素的宽度,高度】
1.取值 $("#test").text() //取id=test里面的文字 $("#test&qu ...