图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--实现双电机速度同步的更多相关文章

  1. Copley-STM32串口+CANopen实现双电机力矩同步

    原来有个CANopen的主站卡,现在没了,只有单片机,用单片机来制作一个CANopen的主站卡貌似不是很难,但是需要时间.无奈仔细看了一个Copley的说明,决定采用CAN口+串口来实现之前的功能. ...

  2. otter双主同步安装与配置

    otter是阿里的开源数据同步项目,资源地址就不用说了哈,网上找,阿里云论坛关于单方向同步的配置已经很清楚了,理论上说,双主同步也不复杂,但是毕竟 是数据库,比较重要,配置双主的时候,总觉得心里没底, ...

  3. IIC - 【转载】对I2C总线的时钟同步和总线仲裁的深入理解

    对I2C总线的时钟同步和总线仲裁的深入理解 每一个IIC总线器件内部的SDA.SCL引脚电路结构都是一样的,引脚的输出驱动与输入缓冲连在一起.其中输出为漏极开路的场效应管.输入缓冲为一只高输入阻抗的同 ...

  4. java实现高性能的数据同步

    最近在做一个银行的生产数据脱敏系统,今天写代码时遇到了一个“瓶颈”,脱敏系统需要将生产环境上Infoxmix里的数据原封不动的Copy到另一台 Oracle数据库服务器上,然后对Copy后的数据作些漂 ...

  5. 旧文备份:CANopen中SYNC的功能和使用

    SYNC是CANopen管理各节点同步数据收发的一种方法,相当于网络节拍,基于同步的PDO按照这个网络节拍来执行实时数据的收发.SYNC属于生产/消费型通讯方式,网络中有且只有一个SYNC生产者,一般 ...

  6. MySQL 异地 双机房同步之otter

    一.背景: 阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求, 同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了ott ...

  7. Sqlite3常用的插入方法及性能测试

    最近做到的项目涉及一个大数据量缓存重传,其中要用到的sqlite技术,把自己的学习心得整理了一下. SQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中. ...

  8. [MFC] 高仿Flappy bird 桌面版

    这是今年年初做的东西,一直没有时间整理,现在拿出来分享下~ 目录 开发背景 开发语言及运行环境 效果展示 游戏框架说明 游戏状态及逻辑说明 经典算法说明 重量级问题解决 开发感想 一.开发背景: fl ...

  9. PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1

    ※★◆●PP66 EEPPPPMM SSyysstteemm AAddmmiinniissttrraattiioonn GGuuiiddee 16 R1AApprriill 22001166Conte ...

随机推荐

  1. Arrays.asList() 的使用注意

    Sometimes it is needed to convert a Java array to List or Collection because the latter is a more po ...

  2. 关于REST API设计的文章整理

    1. rest api uri设计的7个准则(1)uri末尾不需要出现斜杠/(2)在uri中使用斜杠/表达层级关系(3)在uri中可以使用连接符-提升可读性(4)在uri中不允许出现下划线字符_(5) ...

  3. nohup命令执行退出后进程退出

    nohup命令常常用于让进程在后台执行.但是如果仅仅是执行: nohup command & 之后直接关闭终端的话,会发现之前已经启动进程也会退出.解决办法:nohup command &am ...

  4. C++模板的使用以及常见问题

    最近的数据结构实验频繁地遇到了模板,之前对这一块接触不多,遇到了很多问题,放到这里总结一下. 模板的声明有两种:template <typename Type>或者template< ...

  5. C++ WString与String互相转换

    std::wstring StringToWString(const std::string& str) { , str.c_str(), -, NULL, ); wchar_t *wide ...

  6. [译]使用Command模式和MediatR简化你的控制器

    原文 你希望保持你的controller足够简单. 你的controller越来越臃肿,你听说command模式是一个给controller瘦身的解决方案. 但是你不知道command模式是否适合你的 ...

  7. 前段js的各种弹出框

    artDialog 首页 > 文档与示例 artDialog —— 经典的网页对话框组件,内外皆用心雕琢. 支持普通与 12 方向气泡状对话框 完善的焦点处理,自动焦点附加与回退 支持 ARIA ...

  8. Docker 网络设置

    一.Docker 网络默认使用的 Bridge 模式 默认生成为 docker0 :每个容器使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上: 1.Docker ...

  9. ubuntu 简单安装配置gitlab

    安装 gitlab-ce 社区版 依赖 sudo apt-get install curl openssh-server ca-certificates postfix 添加gitlab包服务并安装 ...

  10. var/let/const区别何在??(转载)

    原文地址:http://www.cnblogs.com/liuhe688/p/5845561.html let和const有很多相似之处,先说一说let吧. 1. let添加了块级作用域 我们知道,J ...