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 ...
随机推荐
- HDU 1020(连续同字符统计 **)
题意是要统计在一段字符串中连续相同的字符,不用再排序,相等但不连续的字符要分开输出,不用合在一起,之前用了桶排序的方法一直 wa,想复杂了. 代码如下: #include <bits/stdc+ ...
- 伯克利SocketAPI(一) socket的C语言接口/最简单的服务器和对应的客户端C语言实现
1. 头文件 2. API函数 3. 最简单的服务器和对应的客户端C语言实现 3.1 server #include <sys/types.h> #include <sys/sock ...
- authenticate验证的流程
from django.contrib.auth import authenticate # 默认的第一个加密算法 class PBKDF2PasswordHasher(BasePasswordHas ...
- 使用JAVA数组实现顺序栈
1,首先总结一下线性表(分为顺序表和链接表,[即顺序存储结构和链式存储结构的区别])和栈(顺序栈和链接栈)还有队列(顺序队列和链接队列)的JAVA类库中的实现: java.util.ArrayList ...
- Excel列名序号互转
public static int ToIndex(string columnName) { if (!Regex.IsMatch(columnName.ToUpper(), @"[A-Z] ...
- LINQ to SQL 中 Concat、Union、Intersect、Except 方法的使用
Ø 前言 LINQ to SQL 中需要对两个或多个数据集进行操作,比如:合并.取交集等,主要使用下面四个方法,这四个方法都是 System.Linq.IQueryable<out T> ...
- JavaSE回顾及巩固的自学之路(一)——————前言
长长的呼出一口气,终于到了末端了,JavaSE,Java入门的基础,历经一个多月,终于细细的学了一遍,大部分的时间都是熬夜到半夜两点钟.本来是一个月的课程,足足让我给学了将近两个月,为什么呢?第一,还 ...
- 【python小练】0010
第 0010 题:使用 Python 生成类似于下图中的字母验证码图片 思路: 1. 随机生成字符串 2. 创建画布往上头写字符串 3. 干扰画面 code: # codeing: utf-8 fro ...
- 哈希函数(hash函数)
hash,—般译为“散列”,也可以直接音译为“哈希”,是对输入的任意长度(又称预映射),通过哈希算法,转换成固定长度的哈希值输出.这种转换是一种压缩映射,即,哈希值空间通常比输入空间小得多,不同的输入 ...
- /*+ hint*/用法,该如何解决
/*+ use_hash(b, a)*/用法SELECT /*+ use_hash(b, a)*/ 1, NVL(b.AgentWorkGroup, ' '), ................ ...