六轴运动控制卡
用 户 手 册
深圳市众为兴数控技术有限公司
ADT-836六轴运动控制卡用户手册
版权声明
本用户手册的所有部分其著作财产权归属众为兴数控技术有限公司以下简称众为兴
所有
末经众为兴许可
任何人不可任意地仿制拷贝誊抄或转译本用户手册没有任何形式的担保立场表达或其他暗示若有任何因本用户手册或其所提到之产品的所有信息所引起的直接或间接的资料流出利益损失或事业终止众为兴及其所属员工恕不担负任何责任除此之外本用户手册提到的产品规格及资料仅供参考
内容有可能会更新
商标声明
用户手册中所涉及到的产品名称仅作识别之用而这些名称可能是属于其它不同的商标或版权
INTEL WINDOWS ADT
版权所有
不得翻印
众为兴数控技术有限公司
MS
在此声明如下
PENTIUM是INTEL公司的商标836是众为兴公司的商标
恕不另行通知
DOS是 MICROSOFT公司产品标识
均属各注册公司所拥有
其它末提到的标识
http://www.adtechcn.com 1
ADT-836六轴运动控制卡用户手册
目 录
第一章 概要--------------------------------------------3 第二章 硬件安装----------------------------------------5 第三章 电气连接----------------------------------------6 第四章 地址设置---------------------------------------10 第五章 功能说明---------------------------------------11 第六章 ADT836库函数列表------------------------------25 第七章 ADT836库函数详解------------------------------27 第八章 运动控制开发编程示例--------------------------47 第九章 运动控制开发要点------------------------------74
2 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
第一章 概要
产品简介
ADT836卡是基于PC104总线的高性能六轴伺服/步进控制卡位置可变环形可在运动中随时改变速度可使用连续插补等先进功能
脉冲输出方式可用单脉冲脉冲+方向或双脉冲脉冲+脉冲方式最大脉冲频率4MHz采用先进技术使输出频率在很高的时候也能使频率误差小于0.1%
位置管理采用两个加/减计数器一个用于内部管理驱动脉冲输出的逻辑位置计数器一个用于接收外部的输入输入信号可以是A/B相输入的编码器或光栅尺也可是上/下脉冲的输入信号作为实际位置计数器计数器位数高达32位最大范围–2,147,483,648~+2,147,483,647外部输入也可用于手轮输入作为普通的计数
提供伺服接口信号如编码器信号到位信号INPOS报警信号ALARM伺服开启SERVO ON等
多种控制方式如定量运动连续运动回零运动多轴插补圆弧插补
S曲线加减速不能用等插补一般用定速运动也可用直线/S曲线加减速
于圆弧插补
插补带有连续插补功能即在插补过程中输入下一点的插补数据以保证脉冲的连续使插补达到更快更好的性能最大插补速度可达2Mhz
速度控制可用定速和直线/S曲线加减速可做非对称直线加减速可用自动/手动减速在定量驱动时可防止速度曲线产生三角波形
每轴有2个32位比较寄存器用于产生中断或作为软件限位
每轴有8个输入信号包括2个正负限位信号3个停止信号1个伺服到位信号1个伺服报警信号和1个通用输入信号除限位信号外其余信号可通过设置成无效来作为通用输入信号3个停止信号可作为原点信号减速信号编码器Z相搜寻使用所有数字输入信号均有积分型的滤波器可选8种滤波时间常数以防止干扰
提供DOSWINDOWS95/98/NT/2000/XP开发库可用VC++VBBC++等进行软件开发 主要性能
6轴伺服/步进电机控制每轴可独立控制互不影响 脉冲输出的频率误差小于0.1% 最大脉冲输出频率为4MHz
脉冲输出可用单脉冲脉冲+方向或双脉冲脉冲+脉冲方式 6轴 均有位置反馈输入32位计数最大计数范围
-2,147,483,648~+2,147,483,647
http://www.adtechcn.com 3
ADT-836六轴运动控制卡用户手册
直线或S曲线进行加/减速 非对称直线加/减速运动 2-6轴直线插补 CWCCW圆弧插补
可用连续插补功能最大驱动速度2MHz
每轴都有2 个32位比较寄存器用于逻辑位置计数器或者实际位置计数器的位置大小比较可用于软件限位或产生中断
可接收伺服马达驱动器的各种信号如2相编码器信号到位信号报警信号等
每轴有3个STOP信号可用于原点搜寻编码器Z相搜寻 运动中可实时改变速度
运动中可以实时读出逻辑位置实际位置驱动速度加速度加/减速状态加速中定速中减速中
每轴有8入8出数字I/O除2限位信号外均可作为通用I/O使用数字输出可用于伺服开启伺服报警复位等信号
每一个输入信号的输入端都装备积分型的滤波器可以设定哪一个输入信号的滤波器功能变为有效或无效滤波器的时间常数从8个种类里可以选择1个
支持DOSWINDOWS95/98/NT/2000/XP等操作系统
1234
多轴雕铣系统 机器人系统 空间座标测量系统 基于PC的数控系统
应用范围
4 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
第二章 硬件安装
一
检查配件
1 ADT-836 用户手册本手册
2 ADT-836 六轴PCI总线高性能运动控制卡(上下两块卡) 3
ADT-836 用户光盘
4 ADT-9137 37芯信号接线板2块 5 ADT-D37 37芯屏蔽连接线2条 6 ADT-DB37 37芯扁平线2条 7 ADT-9125 25芯开关信号接线板3块 8 ADT-D25 25芯屏蔽连接线3条 9 ADT-DB25 25芯扁平线3条
二安装
10关闭电脑电源
11打开电脑机箱后盖 12插入ADT-836 13
根据用户情况安装J1
J3
J6
J7
J8接口线
http://www.adtechcn.com 5
ADT-836六轴运动控制卡用户手册
第三章 电气连接
一块ADT836卡有五个输入/输出接口为25针插座
6 http://www.adtechcn.com
其中J3J6为37针插座J1J7J8
ADT-836六轴运动控制卡用户手册
J1为脉冲输出的信号接线 J3为开关量输出信号的接线 J6为开关量输入的信号接线
J7为开关量输入的信号接线(第五轴和第六轴) J8为编码器输入信号的接线 信号定义如下图
http://www.adtechcn.com 7
ADT-836六轴运动控制卡用户手册
a脉冲/方向输出信号的连接
脉冲输出可与步进/伺服驱动器很方便的连接 下图为脉冲与方向的接法
b
编码器输入信号的连接
c
数字输入的连接
以上以使用+5V电源的编码器为例+5V电源可使用内部电源也可外接
5V电源
8 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
d数字输出的连接
http://www.adtechcn.com 9
ADT-836六轴运动控制卡用户手册
第四章 地址设置
地址表
1(A11) 2(A10) 3(A9) 4(A8) 5(A7) 6(A6) 0x1000 On On On On On On 0x1040 On On On On On Off 0x1080 On 0x10C0 On ……
……
On On On Off On On On On Off Off ……
……
……
……
……
0x1800 Off On On On On On 0x1840 Off On On On On Off …….
……
……
……
……
……
……
0x1f00 Off Off Off Off On On 0x1f40 Off Off Off Off On Off 0x1f80 Off Off Off Off Off On 0x1fC0 Off Off Off Off Off Off
默认地址为0x1000
10 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
第五章 功能说明
一
定量驱动
定量驱动的意思是以固定速度或加/减速度输出指定数量的脉冲需要移动到确定的位置或进行确定的动作时使用此功能加/减速的定量驱动如下图所示
输出脉冲的剩余数比加速累计的脉冲数少时就开始减速进行加/减速的定量驱动需要设定下列参数a) b) c) d) e)
范围 R 加/减速 A/D 初始速度 SV 驱动速度 V 输出脉冲数 P
输出指定的脉
冲数后驱动也结束
加/减速定量驱动是一般如上图所示从计算的减速点开始自动减速也可以用手动减速在下列的情况下此减速点
所以需要手动地计算减速点
此外
不能正确地计算自动减速点或无法算出
直线加/减速定量驱动中需要经常变更速度 用加/减速运行圆弧插补
需要改为手动减速模式
连续插补设定减速点
二
有效
连续驱动
在连续驱动中连续输出驱动脉冲直至高位的停止命令或外部的停止信号需要运行原点搜寻
扫描操作
控制马达旋转速度时
使用此功能
http://www.adtechcn.com 11
ADT-836六轴运动控制卡用户手册
有两种停止命令一个是减速停止另一个是立即停止每个轴都有用于减速/立即停止的STOPOSTOP1在定速驱动中
为立即停止
编码器Z相信号等安排在STOPOSTOP1
低速搜寻时
用定
STOP2的3点外部信号每个信号都可以设
定有效/无效电平STOPOSTOP1STOP2信号在加/减速驱动中为减速停止 连续驱动的原点搜寻动作
把原点接近信号连续驱动连续驱动
原点信号
STOP2在各轴上设定各信号的有效/无效和逻辑电平高速搜寻时用加/减速
当设定的有效信号处于激活电平时就减速停止
速连续驱动当设定的有效信号处于激活电平时就立即停止为了以加/减速
除了输出脉冲数以外都要设定和定量驱动一样的参数
三速度曲线
1.
定速驱动 就没有加/减速驱动
下列参数应相应预先设定
而是定速驱动
使用搜寻原点编码器Z相等信
定速驱动就是以一成不变的速度输出驱动脉冲如果设定驱动速度小于初
始速度
号时找到信号后马上要立即停止的话不必进行加/减速驱动而是一开始就运行低速的定速驱动
为了定速驱动
范围 R 初始速度 SV 驱动速度 V
12 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
2. 度
直线加/速减速驱动
直线加/减速驱动是线性地从驱动开始的初始速度加速到指定的驱动速定量驱动时加速的计数器记录加速所累计的脉冲数当剩余输出脉冲数少于加速脉冲后
就开始减速
自动减速
减速时将用指定的减速度线性地
减速至初始速度
为了直线加/减速驱动
范围 R
加速度 A 加速度和减速度
减速度 D 加/减速度个别设定时的减速度( 必要时) 初始速度 SV 驱动速度 V
下列参数需预先设定
定量驱动的三角防止
在直线加减速的定量驱动中如果输出脉冲数小于要求的数时会产生如上图的三角波形
此时三角防止功能会启动
三角防止功能是在直线加减速的定量驱动中哪怕输出脉冲数小于要求的数也防止三角波形在加速中加速时和减速时消费的脉冲数大于总输出脉冲数的1/2 后停止加速保持在定速域因此哪怕输出脉冲小于输出脉冲数的1/2 也在定速域
http://www.adtechcn.com 13
ADT-836六轴运动控制卡用户手册
1
非对称直线加/减速驱动
最好变更上下移动的加
往垂直方向移动对象物时对对象物有重力加速度的负担所以在这样加速度和减速度不同的非对称直线加减速的定量驱动中度比减速度大的例子
图2是减速度比加速度大的例子
速度和减速度此时可以运行自动减速事先不用设定手动减速点图1是加速
14 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
另外跟通常的直线加减速驱动一样需要设定下述的参数
范围 R 驱动速度 V 2
线
S 曲线加/速驱动
驱动速度加/减速时可线性地增加/减少加速度/减速度以产生S型速度曲S曲线加/减速驱动如下图所示运行
加速度 A
减速度 D
初始速度 SV
驱动开始加速时加速度以指定的加速度的增加率(K) 从0线性增加至指定的数值(A) 因此这个速度曲线成为二次级抛物线(a 区间)加速度达到指定数值(A)后保持此数值这时速度曲线是直线型的速度在加速中b区间
http://www.adtechcn.com 15
ADT-836六轴运动控制卡用户手册
目标速度V和当前速度的差值比相应时间增加所增加的速度少时
C区间
加速度
趋向0减少率和增加率一样指定的减速度的减少率K线性地减少这时速度曲线成为二次抛物线速为部分S曲线加速
b区间就消失
然后设定下只有a和c
本书定义这种具有部分固定加速度的加
另一方面在a区间若在加速度达到指定数值A前目标速度V和当前速度的差值比相应时间增加所增加的速度少时区间列参数
要执行S曲线加/减速
加速度/减速度的变化率 K 初始速度 SV
这种没有固定加速度的加速称为完全S曲线加速
用户必须设定加速方式为S曲线加速
范围 R 加速度 A 减速度 D必要时驱动速度 V
运行S 曲线加/减速驱动时的注意点
运行S曲线加/减速定量驱动时驱动中不能变更驱动速度 运行S曲线加/减速时不能驱动圆弧插补
连续插补
四位置管理
16 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
1
脉冲时
逻辑位置计数器和实位计数器
向下计1
逻辑位置计数器是计数ADT850卡中的正/负方向输出脉冲输出一个正向
向上计1输出一个负方向脉冲时
实位计数器计数来自外部编码器的输入脉冲可以用命令选择输入脉冲的类型为A/B相信号或者独立2脉冲向上/下计数信号计数方向可设定
可以在任何时候写入或读出2个计数器的数据计数范围在-2,147,483,648~+2,147,483,647之间
2 比较寄存器和软件限位
能与逻辑位置计数器和实位
每轴有2个32位寄存器COMP+ COMP-可以设定
计数器比较大小把2个比较寄存器的比较对象定为逻辑计数器还是实位计数器
COMP+寄存器主要用来检测逻辑/实位计数器某个范围的上限
在驱动中
如果逻辑/实位计数器的值大于COMP+
COMP-寄存器主要用来检测逻辑/实位计数器某个范围的下限
软件限位设为有效后于COMP+的值
的值就执行减速停止此后只能执行负方向驱动命令至逻辑/实位计数器的值小
同样如果逻辑/实位计数器的值小于COMP-的值就执行减速
停止此后只能执行正方向驱动命令至逻辑/实位计数器的值大于COMP-的值
可以在任何时候写COMP+寄存器和COMP-寄存器
3
位置计数器的可变环形
从0往-方向计数的
逻辑位置计数器及实位数器是32位长的上/下环形计数器因此从32位长的最大数值FFFFFFFFh往+方向计数的话最后计数计到0话最后计数计到FFFFFFFFh任选设定
使可变环功能有效后
如果定位不是直线而是旋转运动的话
可变环功能是可以把这个环形计数器的最大数值
用此功能控制位置很方便
在
COMP+寄存器设定逻辑位置计数器的最大数值
COMP-寄存器设定实位计数器的最大数值
如在X轴为旋转轴时假设X轴为10000个脉冲旋转一圈设定可变环功能
http://www.adtechcn.com 17
ADT-836六轴运动控制卡用户手册
有效在COMP+寄存器设定9999
… …
这时计数动作 往+方向向上计数时往-方向
向下计数时
同时使用实位计数器的话在COMP-寄存
器设定9,999
9998 9999 0 1 … 1 0 9999 9998 …
这样就不需要考虑计数值超过10000时的计算问题0-9999之间
注意
每个轴都要设定可变环功能的有效/无效但是不能分别设定逻
辑位置计数器和实位计数器的有效/无效 使可变环功能有效后不能使用软件限制功能
计数范围一定在
五插补
ADT850卡可以进行2-4轴的直线插补
2轴圆弧插补
Z-W
在插补驱动过程中插补运算是在指定X轴的基本脉冲时序下运行的因
此进行插补命令之前先要设定指定X轴的初始速度驱动速度等参数插补时是以Z轴速度为基准
插补时的越限错误
插补驱动时每个驱动轴都能进行硬件限制和软件限制在插补驱动中任何
18 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
轴的限制有动作插补驱动就停止
注意
运行圆弧插补时任何方向+方向/-方向的硬件限制软件限制有效插补都会停止
因此
使用圆弧插补要非常小心
不能脱离限制区域
伺服马达的到位信号
在插补驱动中各轴到位信号INPOS一旦有效插补驱动就结束结束后所有轴的INPOS信号处于有效电平
12-4轴直线插补
设定相对于当前位置的终点坐标后就开始进行线性插补直线插补的坐标范围是带符号的24位字长插补范围为从各轴当前位置到-8,388,607~+8,388,607之间
如上图所示对指定直线的位置精确度上图还有直线插补的驱动脉冲输出例子是长轴术的结果
在插补驱动中此轴一直输出脉冲有时输出脉冲
有时不输出脉冲
在整个插补范围内有
0.5LSB
在设定的终点数值中绝对值最大的轴其它的轴是短轴
根据直线插补算
http://www.adtechcn.com 19
ADT-836六轴运动控制卡用户手册
2圆弧插补
设定相对当前位置始点的圆弧中心坐标及终点坐标后执行圆弧插补
CW圆弧插补从当前坐标至终点坐标以顺时针方向绕中心坐标画圆弧CCW圆弧插补以逆时针方向绕中心坐标画圆弧如果终点设为00能画整个圆
至于圆弧插补的算法如下图所示由X轴和Y轴定义一个平面绕中心坐标把它分为0~7的8个象限如图所示在0象限的插补坐标XY上Y绝对值一直比X的绝对值小绝对值小的轴为短轴12 56象限是X轴0347象限是Y轴短轴在这些象限之间一直输出驱动脉冲长轴根据圆弧插补运算结果有时输出脉冲有时不输出脉冲
20 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
下面是输出一个整圆的例子
以及输出脉冲的示例
终点判断 对于圆弧插补此
在插补驱动开始前
把当前坐标设为
0 0
根据中只要
心坐标的数值决定半径画圆圆弧算法的误差在插补驱动范围内有1个脉冲因
指定的终点可能不在圆的轨迹上
http://www.adtechcn.com 21
圆弧插补进入终点所在的象限时
结束点值与终点的短轴数值一致圆弧插补就结束
ADT-836六轴运动控制卡用户手册
3
插补顿
连续插补
然后输出下一插补的数据
如果上位
对于没有连续插补功能的控制卡如果需要在上一插补点结束后继续下一只能不断查询上一插补是否完成会影响插补的效果机的速度较慢
或者上位机运行多任务操作系统
而且插补速度很难提高
在两次插补之间就会出现停
而ADT850卡带有连续插补功能可以很好的解决这一问题它可在上一插补未结束时输出下一插补的数据即使在很慢的电脑上也可达到好的效果
连续插补是直线停地驱动连续插补在所有的插补节点中
圆弧插补
直线插补
…这样在每个插补节点之间不
在连续插补驱动中
先读取连续插补的允许写入状态和
必须长于设定下一
插补驱动状态如果插补未结束并且允许写入即可写入下一插补命令因此
从连续插补驱动开始至结束的时间
个插补节点的数据和发命令的时 间
连续插补中发生的错误
在连续插补驱动过程中若发生越限等错误驱动就立即在当前插补节点上停止在停止的插补节点上下一节点的数据和命令虽在但命令是无效的此外在发插补命令前必须检查错误若没有检查当发生错误停止驱动后这些数据和命令将无效
而从下面第2个插补节点开始运行
一定要进行检查
若发现错误的话要脱离连续插补的循环
连续插补中有圆弧插补时然后考虑怎么运行连续插补
4加/减速驱动的插补
插补一般用定速驱动不过ADT850卡可以用直线加/减速驱动或S 曲线加/减速驱动
只可做直线插补
运行插补
可以使用减速有效命令 和减速无效
减速
在连续插补时为了实现加/减速驱动命令在插补驱动时时
圆弧插补终点的短轴数值也许会比真值偏差1
个脉冲因此为了避免累积每个节点的误差事先要确认每个圆弧插补的终点
减速有效命令是使自动减速或手动减速变为有效
无效命令是使它变为无效复位时都是无效状态用加/减速单独运行插补驱动
驱动开始之前一定要设定成减速有效状态
直线插补的加/减速驱动
在直线插补中可以运行直线加/减速驱动及S曲线加减速驱动减速
圆弧插补的加/减速驱动
在圆弧插补位模式插补中只能用手动减速的直线加/ 减速驱动不能使用S曲线加/减速驱动及自动减速
22 http://www.adtechcn.com
在驱动中写入减速有效命令也
不能变为有效
ADT-836六轴运动控制卡用户手册
连续插补的加/减速驱动
在连续插补中只能用手动减速的直线加/减速驱动不能用S曲线加/减速驱动及自动减速时有效值时
在连续插补中
要事先设定手动减速点
这个手动减速点设
连续插补减速就
定在运行减速的最终节点上
先把减速设定为无效
并设定从X轴输出的基本脉冲的数值然后开始插补驱动
在要减速的最终插补节点上
写入插补命令之前写入允许减速命令
减速就开始
比如从插补节点1至5的连续插补中下述的程序
开始最终插补节点的驱动时
从最终插补节点的开始计算主轴输出的基本脉冲数大于手动减速点的数
在最终节点5上用手动减速的话
有
对主轴设定加/减速模式和参数
写手动减速点
写无效减速命令
节点1插补命令
检查错误等待写入下一个数据
节点2插补命令
检查错误等待写入下一个数据
写允许减速命令
节点5插补命令
由从节点5 开始的X轴基本脉冲数的数值来设定手动减速点比如假定减速化费2,000 脉冲在节点5上输出的基本脉冲的总脉冲数是5,000 的话减速点就设定为5,000-2,000=3,000
减速停止的最终插补节点需要
开始至停止一定要在1个节点内运行减速
手动
从其X或Z轴输出的基本脉冲总数要大于在减速中化费的脉冲数
http://www.adtechcn.com 23
ADT-836六轴运动控制卡用户手册
六脉冲输出方式
驱动输出脉冲有下图所示的2种脉冲输出方式以独立2脉冲方式正方向
驱动时由PU/CW 输出驱动脉冲负方向驱动时由DR/CCW输出驱动脉冲采用1脉冲方式则由PU/CW输出驱动脉冲
由DR/CCW输出方向信号
七
号
硬件限制信号
硬件限制信号LMT+LMT-是限定正方向和负方向驱动脉冲的输入信当限制信号的逻辑电平和限制信号有效时
可以由命令选择减速停止或立
即停止
八伺服马达对应的信号
与伺服马达驱动器连接的输入信号有到位信号
INPOS 和警报信号
一
每个信号的有效/无效及逻辑电平都可以设定
ALARM
INPOS 输入信号与伺服马达定位完毕信号对应设定模式为有效时信号接受从伺服马达驱动器的警报信号入信号报复位
若信号有效伺服开启等
设定为有效时
个驱动结束后等待INPOS 输入信号有效驱动状态返回结束ALARM 输入
一直监视ALARM 输
在驱动中立即停止驱动
这些用于伺服马达驱动器的输
入信号可以用通用I/O函数读其状态通用输出信号可用于偏置计数器清除警
24 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
第六章 ADT850库函数列表
一
基本参数设置类
int set_address(int cardno,long address);
int set_stop0_mode(int cardno, int axis, int value,int logic); int set_stop1_mode(int cardno, int axis, int value,int logic); int set_stop2_mode(int cardno, int axis, int value,int logic);
int set_actualcount_mode(int cardno, int axis, int value,int dir,int freq); int set_pulse_mode(int cardno, int axis, int value,int logic,int dir_logic); int set_limit_mode(int cardno, int axis, int value,int logic); int set_softlimit_mode1(int cardno, int axis, int value); int set_softlimit_mode2(int cardno, int axis, int value); int set_softlimit_mode3(int cardno, int axis, int value); int set_inpos_mode(int cardno, int axis, int value,int logic); int set_alarm_mode(int cardno, int axis, int value,int logic); int set_ad_mode(int cardno, int axis, int value); int set_dec1_mode(int cardno, int axis, int value); int set_dec2_mode(int cardno, int axis, int value); int set_circle_mode(int cardno, int axis, int value); int set_input_filter(int cardno,int axis,int number,int value);
二驱动状态检查类
int get_status(int cardno,int axis,int *value) int get_stopdata(int cardno,int axis,int *value) int get_inp_status(int card,int no,int *value) int get_inp_status2(int card,int no,int *value)
三运动参数设定类
int set_range(int cardno,int axis,long value); int set_acac(int cardno,int axis,long value); int set_acc(int cardno,int axis,long value); int set_dec(int cardno,int axis,long value); int set_startv(int cardno,int axis,long value);
http://www.adtechcn.com 25
ADT-836六轴运动控制卡用户手册
int set_speed(int cardno,int axis,long value); int set_command_pos(int cardno,int axis,long value); int set_actual_pos(int cardno,int axis,long value); int set_comp1(int cardno,int axis,long value); int set_comp2(int cardno,int axis,long value); int set_dec_pos(int cardno,int axis,long value);
四运动参数检查类
int get_command_pos(int cardno,int axis,long *pos) int get_actual_pos(int cardno,int axis,long *pos) int get_speed(int cardno,int axis,long *speed) int get_ad(int cardno,int axis,long *ad)
五驱动类
int pmove(int cardno,int axis,long pulse) int continue_move(int cardno,int axis,int dir) int dec_stop(int cardno,int axis) int sudden_stop(int cardno,int axis)
int inp_move2(int card,int no,long pulse1,long pulse2) int inp_cw_arc(int card,int no,long x,long y,long i,long j) int inp_ccw_arc(int card,int no,long x,long y,long i,long j) int inp_move3(int cardno,long pulse1,long pulse2,long pulse3)
int inp_move4(int cardno,long pulse1,long pulse2,long pulse3,long pulse4) int inp_dec_enable(int cardno,int no); int inp_dec_disable(int cardno,int no);
int inp_arc_z_move(int cardno, long x,long y,long i,long j ,long z,int dir,int
speed);
六
开关量输入输出类
int read_di(int cardno,unsigned long *value) int write_do(int cardno,unsigned long value) int read_bit(int cardno,int number)
int write_bit(int cardno,int number,int value)
26 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
第七章 ADT836库函数详解
一
1.
基本参数设置类
初始化ADT836卡
int set_address(int cardno,long address);
cardno:卡号 address:卡地址
数 2.
初始化应在应用程序第一个调用以确认可使用的卡数以及初始化一些参初始化后各状态为
4倍频
脉冲输出方式为 脉冲+方向方式 反馈输入为 A/B相编码脉冲输入停止信号STOP0限位信号LMT+软件限位无效
伺服到位信号nINPOS 无效 伺服报警信号 nALARM 无效 加速方式为直线加/减速计数器的可变环功能无效 输入滤波无效
设置stop0信号的有效/无效和逻辑电平
int set_stop0_mode(int cardno, int axis, int value,int logic); cardno axis logic 返回值
卡号 轴号1-4
1 有效 高电平停止 1
错误 低电平停止
0低电平停止 10
正确
信号无效
对称加/减速
自动减速
STOP1
STOP2 均为无效
LMT- 为低电平有效立即停止
value 0无效
初始化时状态为
注意停止方式取决于是加减速驱动还是匀速驱动对加减速驱动是减速停止3.
对匀速驱动
是立即停止
STOP1
STOP2信号也是一样
设置stop1信号的有效/无效和逻辑电平
http://www.adtechcn.com 27
ADT-836六轴运动控制卡用户手册
int set_stop1_mode(int cardno, int axis, int value,int logic); cardno axis logic 返回值 4.
卡号 轴号1-4
1 有效 高电平停止 1
错误 低电平停止
0低电平停止 10
正确
信号无效
value 0无效
初始化时状态为
设置stop2信号的有效/无效和逻辑电平
int set_stop2_mode(int cardno, int axis, int value,int logic); cardno axis logic 返回值
卡号 轴号1-4
1 有效 高电平停止 1
错误 低电平停止
0低电平停止 10
正确
信号无效
value 0无效
初始化时状态为
注意
STOP2信号有效时同时可清除实位计数器 因为由于伺服系统或机械系统的延迟
如果在停止驱动后再用软件
清除实位计数器会使原点位置有一定的误差可使用本功能达到更高的精度 5.
只有STOP2有此功能设置实位计数器cardno axis
卡号 轴号1-4
1上/下PPIN/PMIN脉冲输入
0
dir
A/B脉冲输入
的工作方式
编码器输入
int set_actualcount_mode(int cardno, int axis, int value,int dir,int freq);
value J计数方向
0 A超前B或PPIN脉冲输入向上计数
B超前A或PMIN脉冲输入向下计数 A超前B或PPIN脉冲输入向下计数 1 B超前A或PMIN脉冲输入向上计数
freq A/B脉冲输入时的倍频上/下脉冲输入时无效
28 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
04倍频
1202倍频 不倍频 正确
1
错误 方向为04倍频
返回值
初始化时状态为A/B相脉冲输入
对于大多数位置反馈装置均采用编码器或光栅尺应设置为A/B相脉冲输入方式对此种方式可采用倍频技术提高精度可设定为4倍频或2倍频6.
也可不使用倍频
对于4倍频如果采用每转1000个脉冲的编码
器正转一圈计数值应增加4000即精度提高了4倍 设置输出脉冲的工作方式
int set_pulse_mode(int cardno, int axis, int value,int logic,int dir_logic); cardno axis
卡号 轴号1-4
1脉冲+方向方式
value 0脉冲+脉冲方式
logic
0 正逻辑脉冲
1
负逻辑脉冲
http://www.adtechcn.com 29
ADT-836六轴运动控制卡用户手册
dir-logic 0方向输出信号正逻辑 1方向输出信号负逻辑
返回值
0正确
1
错误
方向输出信号正逻辑
初始化时状态为脉冲+方向方式正逻辑脉冲
设定正/负方向限位输入nLMT信号的模式设定 cardno axis logic 返回值
卡号 轴号1-4
1
有效时减速停止 1
高电平有效 1
错误
0低电平有效 0正确
立即停止
7.
int set_limit_mode(int cardno, int axis, int value,int logic);
value 0有效时立即停止
初始化时状态为低电平有效
8.
注意限位信号不能设置成有效/无效 COMP+寄存器做软件限制的设定 cardno axis 返回值
卡号 轴号1-4
无效
1
int set_softlimit_mode1(int cardno, int axis, int value);
value 0无效 初始化时状态为
有效 1
错误
0正确
注意软件限位总是减速停止那么计数值就可能回超出设定值因此在设定范围时应考虑到这一点 COMP-寄存器做软件限制的设定 int set_softlimit_mode2(int cardno, int axis, int value); cardno 卡号 axis 轴号1-4 value 0无效 1有效
1错误 返回值 0正确
初始化时状态为无效 注意
同上
9.
30 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
10. COMP+/-寄存器的比较对象设定
int set_softlimit_mode3(int cardno, int axis, int value); cardno axis 返回值
卡号 轴号1-4
1
实际位置计数器
1
错误
0正确
value 0逻辑位置计数器 初始化时状态为
逻辑位置计数器
此函数是设定软件限位的比较对象
11. 伺服到位信号nINPOS的设定
cardno axis logic 返回值
卡号 轴号1-4
int set_inpos_mode(int cardno, int axis, int value,int logic);
value 0无效 11
有效 高电平有效 1
错误
0低电平有效 0正确
无效
初始化时状态为低电平有效
注意如果nINPOS未与伺服接线或者使用步进电机请不要设成有效
12. 伺服报警信号nALARM的设定
int set_alarm_mode(int cardno, int axis, int value,int logic); cardno axis logic 返回值
卡号 轴号1-4
11
有效 高电平有效 1
错误
0低电平有效 0正确
无效
value 0无效
初始化时状态为低电平有效
注意如果nALARM未与伺服接线或者使用步进电机请不要设成有效
13. 加/减速方式的设定
int set_ad_mode(int cardno, int axis, int value); cardno axis 返回值
卡号 轴号1-4
1
S曲线加/减速
1
错误
0正确
value 0直线加/减速
http://www.adtechcn.com 31
ADT-836六轴运动控制卡用户手册
初始化时状态为直线加/减速
14. 非对称梯形加/减速的设定
int set_dec1_mode(int cardno, int axis, int value); cardno axis value t0
返回值
0卡号 轴号1-4
加速度的值正确
即对称加减速即非对称加减速
1 错误
1减速度的值
初始化时状态为对称加减速
15. 加/减速定量驱动的减速方式的设定
int set_dec2_mode(int cardno, int axis, int value); cardno axis 返回值
卡号 轴号1-4
1
手动减速 1
错误
0正确
value 0自动减速 初始化时状态为
自动减速
注意大部分情况可使用自动减速使用手动减速应设定好减速点 16. 计数器的可变环功能的设定
int set_circle_mode(int cardno, int axis, int value); cardno axis 返回值
卡号 轴号1-4
无效
1
有效 1
错误
0正确
value 0无效 初始化时状态为
可变环功能说明参见前面
17. 输入信号滤波功能设置 cardno 卡号 axis 轴号 number 输入类别
1
LMT+
int set_input_filter(int cardno,int axis,int number,int value);
LMT-STOP0STOP1
32 http://www.adtechcn.com
ADT-836六轴运动控制卡用户手册
234
STOP2
nINPOSnALARM nIN
即可分别设置上面四类输入信号的滤波状态 1
滤波有效
value 0滤波无效
初始化时状态为无效
18. 输入信号滤波时间常数设置
int set_filter_time(int cardno,int axis,int value); cardno axis
卡号 轴号
value 范围1-8含义如下
二
1
驱动状态检查类
获取各轴的驱动状态
int get_status(int cardno,int axis,int *value) cardno axis value
卡号 轴号
1-4 驱动状态的指针 0驱动结束
非0value为两个字节长度的值
D0为最低位 D15为最高位
D0
表示逻辑/实位计数器和COMP+寄存器的大小关系
1 逻辑/实位计数器>=COMP+寄存器
各位的含义如下
http://www.adtechcn.com 33
ADT-836六轴运动控制卡用户手册
0 逻辑/实位计数器 表示逻辑/实位计数器和COMP-寄存器的大小关系 1 逻辑/实位计数器>=COMP-寄存器 0 逻辑/实位计数器 在加/减速驱动中在加/减速驱动中在加/减速驱动中 加速时为1 定速时为1 减速时为1 加速度/减速度增加时为1 加速度/减速度不变时为1 加速度/减速度减少时为1 1 错误 在S曲线加/减速驱动中在S曲线加/减速驱动中在S曲线加/减速驱动中 未用 D8-D15 2 返回值 0正确 获取各轴的错误停止信息 cardno 卡号 axis 轴号 value int get_stopdata(int cardno,int axis,int *value) 错误状态的指针 0 无错误 各位的含义如下 D0为最低位 D15为最高位 D0D1D2D3D4D5D6D7 由STOP0停止 由STOP1停止 由STOP2停止 由正限位LMT+停止 由负限位LMT+停止 由伺服报警停止 COMP+ 寄存器限位驱动停止 COMP- 寄存器限位驱动停止 1 错误 非0value为两个字节长度的值 D8-D15未用 返回值 0正确 获取插补的驱动状态 cardno 卡号 3 int get_inp_status(int card,int no,int *value) 34 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 no 1X-Y轴插补或3轴以上插补 2Z-W轴插补 value 插补状态的指针 0 插补结束 11 正在插补 错误 返回值 0正确 4 取连续插补的允许写入状态 cardno 卡号 2Z-W轴插补 value 状态的指针 0 不允许写入 1 允许写入 1 错误 返回值 有错误发生 0正确 以便退出连续插补 int get_inp_status2(int card,int no,int *value) no 1X-Y轴插补或3轴以上插补 注意如果驱动结束则状态也为0因此在连续插补时还须注意是否 三 运动参数设定类 以下参数在初始化后值不确定使用前必须设定 int set_range(int cardno,int axis,long value); 1范围设定 cardno 卡号 axis 返回值 注 轴号 8000000-16000 1 错误 0正确 value R值 范围 范围是决定速度倍率8000000 加/减速度R 加/减速度的变化率的倍率参数 假设把范围数值作为R 倍率是下述的算式 因为驱动速度初始速度 加/减速度等参数的设定范围在1~8000 若需要设定为8000以上的数值的话必须提高倍率提高倍率后可以高速驱动但是速度分辨率变粗请在使用的速度范围内设定最小的数值比如如果需要40KPPS 的速度在速度范围内1~8000 倍率中最好是5设定R 为1600000 http://www.adtechcn.com 35 即 ADT-836六轴运动控制卡用户手册 R值范围是8000000-16000 如 set_range(0,1,800000)set_range(0,3,16000) 2加/减速度的变化率设定 相应的倍率为1-500 在驱动中请不要变更范围R 否则速度会变乱 为设定第一块卡的X轴的倍率为8000000/800000=10倍 为设定第一块卡的Z轴的倍率为8000000/16000=500倍 int set_acac(int cardno,int axis,long value); cardno 卡号 axis value K值返回值 轴号 1-65535 1 错误 0正确 加/减速度的变化率设定值是决定S曲线加/减速的加速度及减速度在单位时间内增加/减少率的参数把加/减速度的变化率的设定值作为K的话加/减速度的变化率由下述算式表示 =(62500000/K)*倍率 加减速度的变化率PPS / SEC2 即 =(62500000/K)*(8000000/R) 加减速度的变化率PPS / SEC2 加/减速度的变化率设定值K的设定范围是1~65,535 如 set_range(0,1,800000); set_acac(0,1,100); 则加减速度的变化率为 =6250000 PPS/SEC2 3加速度设定 cardno 卡号 axis value A值返回值 轴号 1-8000 0正确 1 错误 62500000/100 * 8000000/800000 int set_acc(int cardno,int axis,long value); 它是作为直线加减速驱动中直线加速及减速的参数在S 曲线加/减速驱动中 加速度及减速度线性从0 增加至加速度的设定值 36 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 加速度设定值为A 加速度是下述算式 如 set_range(0,1,80000); set_acc(0,1,100); 则加速度为100*125* 4减速度设定 int set_dec(int cardno,int axis,long value); cardno 卡号 axis value D值返回值 在加速度/减速度的分别设定模式中它是直线加/ 减速度驱动在减速时的减速度参数 在这个模式的S曲线加/减速驱动中设定值 减速度PPS/SEC 减速度直线从0增加至减速度的 把减速度设定值作为D减速度是下述算式 =D*125*倍率 =D*125* 8000000/R 轴号 1-8000 0正确 1 错误 8000000/80000=1250000 PPS/SEC 加速度 PPS/SEC =A*125*倍率 =A*125* 8000000/R 即 加速度PPS/SEC 加速度设定值A 的设定范围是1~8,000 即 减速度PPS/SEC 5 初始速度设定 cardno 卡号 axis value SV值返回值 轴号 1-8000 0正确 int set_startv(int cardno,int axis,long value); 1错误 它是加/ 减速驱动的加速开始时的速度和减速结束时的速度初始速度设定数值为SV 的话 初始速度 即 初始速度 初始速度是下述算式 PPS=SV* 8000000/R PPS=SV*倍率 http://www.adtechcn.com 37 ADT-836六轴运动控制卡用户手册 6驱动速度设定 int set_speed(int cardno,int axis,long value); cardno 卡号 axis value V值返回值 轴号 1-8000 0正确 1 错误 定速驱动从该速度开始运不运行加/减速驱动 开 它是加/减速驱动中达到定速区域的速度行把这个驱动速度设定在初始速度以下的话始就运行定速驱动 驱动速度PPS=V*倍率 即 驱动速度PPS=V* 在驱动中可以随便变更驱动速度设定的速度后开始运行定速驱动 注意事项 线加/减速的连续驱动如果在加速中的S曲线 直线加/减速的定量脉冲驱动时则在输出脉冲结束的减速时7逻辑位置计数器设定 设定逻辑位置计数器的数值 8000000/R 在加/减速度驱动的定速区域中 如果重新设定驱动速度就开始加速或减速到重新设定的速度达到重新 S曲线加/减速的定量脉冲驱动在驱动中不能变更驱动速度此外S曲 减速中变更速度就不能运行正确 在驱动中如果经常变更驱动速度 所以请在定速区域内变更运行 出现以初始速度拖曳驱动的可能性较大 int set_command_pos(int cardno,int axis,long value); cardno 卡号 axis 返回值 轴号 -2147483648~+2147483647 1 错误 任何时候都能读 0正确 value 范围值 逻辑位置计数器任何时候都能写 8实际位置计数器设定 设定实际位置计数器的数值 int set_actual_pos(int cardno,int axis,long value); cardno 卡号 38 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 axis 轴号 value 范围值 -2147483648~+2147483647 返回值 0正确 1 错误 实际位置计数器任何时候都能写任何时候都能读 9COMP+寄存器设定 设定COMP+寄存器的数值 int set_comp1(int cardno,int axis,long value); cardno 卡号 axis 轴号 value 范围值 -2147483648~+2147483647 返回值 0正确 1 错误 COMP+寄存器任何时候都能写 10 COMP-寄存器设定 设定COMP-寄存器的数值 int set_comp2(int cardno,int axis,long value); cardno 卡号 axis 轴号 value 范围值 -2147483648~+2147483647 返回值 0正确 1 错误 COMP-寄存器任何时候都能写 11 手动减速点设定 设定手动减速点的数值 int set_dec_pos(int cardno,int axis,long value); cardno 卡号 axis 轴号 value 范围值 0~268435455 返回值 0正确 1 错误 设定在手动减速模式的加减速定量驱动上的减速点 手动减速点 = 输出脉冲数 - 化费在减速上的脉冲数在使用手动减速模式时必须先设定好手动减速点 http://www.adtechcn.com 39 ADT-836六轴运动控制卡用户手册 四 1 运动参数检查类 以下函数在任何时候均可调用 获取各轴的逻辑位置 int get_command_pos(int cardno,int axis,long *pos) cardno 卡号 位置2 即编码器反馈输入值 int get_actual_pos(int cardno,int axis,long *pos) cardno 卡号 3 40 http://www.adtechcn.com axis 返回值 轴号 0正确 1 错误 pos 逻辑位置值的指针 此函数可随时得到轴的逻辑位置在电机未失步的情况下可代表轴的当前获取各轴的实际位置 axis 返回值 轴号 0正确 1 错误 pos 实际位置值的指针 此函数可随时得到轴的实际位置在电机有失步的情况下也能知道轴的当获取各轴的当前驱动速度 int get_speed(int cardno,int axis,long *speed) axis 返回值 轴号 0正确 1 错误 前位置 cardno 卡号 speed 当前驱动速度的指针 数据的单位和驱动设定数值V一样此函数可随时得到轴的驱动动速度4获取各轴的当前加速度 int get_ad(int cardno,int axis,long *ad) axis ad 返回值 轴号 当前加速度的指针 0正确 1 错误 cardno 卡号 数据的单位和驱动设定数值A一样此函数可随时得到轴的驱动动速度 ADT-836六轴运动控制卡用户手册 五 1 驱动类 定量驱动 int pmove(int cardno,int axis,long pulse) cardno 卡号 axis 轴号 >0<0范围 正方向移动 负方向移动 -268435455~+268435455 1 错误 pulse 输出的脉冲数 返回值 0正确 2 写入驱动命令之前一定要正确地设定速度曲线所需的参数 连续驱动 int continue_move(int cardno,int axis,int dir) cardno 卡号 axis 轴号 01 正方向移动 负方向移动 1 错误 dir 驱动的方向 返回值 0正确 3 写入驱动命令之前一定要正确地设定速度曲线所需的参数 驱动减速停止 int dec_stop(int cardno,int axis) axis 返回值 轴号 0正确 1 错误 驱动速度比初始速 cradno 卡号 在驱动脉冲输出过程中此命令作出减速停止 度慢的时候也可以用本命令立即停止 4驱动立即停止 int sudden_stop(int cardno,int axis) cardno 卡号 axis 返回值 轴号 0正确 1 错误 立即停止正在驱动中的脉冲输出在加/减速驱动中也立即停止 http://www.adtechcn.com 41 ADT-836六轴运动控制卡用户手册 5 两轴直线插补 int inp_move2(int card,int no,long pulse1,long pulse2) cardno 卡号 no 参与插补的轴号 12 X-Y Z-W 1 错误 pulse1,pulse2 移动的相对距离 范围-8388608~+8388607 0正确 返回值 注意X-Y插补的速度以X轴速度为基准Y无须设定Z-W插补的速度以 Z轴速度为基准W无须设定 6顺时针CW圆弧插补 cardno 卡号 int inp_cw_arc(int card,int no,long x,long y,long i,long j) no 参与插补的轴号 12 X-Y Z-W 相对于起点 1 错误 相对于起点 -8388608~+8388607-8388608~+8388607 x,y 圆弧插补的终点位置 范围范围 返回值 i,j 圆弧插补的圆心点位置 0正确 注意X-Y插补的速度以X轴速度为基准Y无须设定Z-W插补的速度以 Z轴速度为基准W无须设定 7逆时针CCW圆弧插补 cardno 卡号 no 1 2X-Y Z-W int inp_ccw_arc(int card,int no,long x,long y,long i,long j) x,y 圆弧插补的终点位置 范围范围 i,j 圆弧插补的圆心点位置 相对于起点 相对于起点 -8388608~+8388607-8388608~+8388607 42 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 返回值 0正确 1错误 注意X-Y插补的速度以X轴速度为基准Y无须设定Z-W插补的速度以 Z轴速度为基准W无须设定 8三轴直线插补 cardno 卡号 int inp_move3(int cardno,long pulse1,long pulse2,long pulse3) pulse1,pulse2,pulse3 X-Y-Z轴移动的相对距离 范围-8388608~+8388607 样9 注意 三轴插补只能为XYZ轴 返回值 0正确 1 错误 三轴插补的速度以X轴速度为基准 Y无须设定 Z轴的倍率和驱动速度应设置 成和X轴的倍率和驱动速度相同Z轴的初始速度应设置成和X轴的驱动速度一 不是X轴的初始速度 六轴直线插补 cardno 卡号 pulse1,pulse2,pulse3,pulse4 X-Y-Z-W轴移动的相对距离 样10 注意 范围 -8388608~+8388607 1 返回值 0正确 错误 int inp_move4(int cardno,long pulse1,long pulse2,long pulse3,long pulse4) 六轴插补的速度以X轴速度为基准 YW无须设定 Z轴的倍率和驱动速度应设置 成和X轴的倍率和驱动速度相同Z轴的初始速度应设置成和X轴的驱动速度一 不是X轴的初始速度 插补减速允许 int inp_dec_enable(int cardno,int no) cardno 卡号 no 1 2 返回值 插补减速禁止 X-Y或X-Y-Z或X-Y-Z-W插补 Z-W插补 1 错误 0正确 11 int inp_dec_disable(int cardno,int no) http://www.adtechcn.com 43 ADT-836六轴运动控制卡用户手册 cardno 卡号 no 1 2 X-Y或X-Y-Z或X-Y-Z-W插补 Z-W插补 1错误 返回值 0正确 此函数与上一函数用于加/减速驱动的插补驱动对于单个插补驱动 应设为禁止 在最后一点再设为允许 应 设为允许对连续插补后面的例子 12插补错误清除 具体应用可见 int inp_clear(int cardno); 返回值 0正确 五轴 1错误 Z WUV轴会不正常停止是指 cardno 卡号 三轴四轴 六轴插补在不正常停止时 一直停在驱动状态需要使用上述函数使其恢复到正常状态 在驱动过程中使用了停止命令或产生了限位动作等情况两轴插补不需要使用 13三轴螺旋线插补 int inp_arc_z_move(int cardno, long x,long y,long i,long j ,long z,int dir,int speed) cardno 卡号 x,y z x y 圆弧的终点位置z 的移动距离 0 顺时针圆弧 1 逆时针圆弧 匀速 1 错误 相对于起点相对于起点 i,j x y 圆弧的圆心点位置 dir 六1 speed 运行速度 三轴螺旋线插补只能为XYZ轴返回值 0正确 开关量输入输出类 读所有开关量输入状态 int read_di(int cardno,unsigned long *value) cardno 卡号 value 输入状态值的指针 value为四个字节的值 D0为低位 D31为高位 相应位为0为输入低电平 为1为输入高电平 44 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 D0D2D4D6D8D10D12D14D16D18D20D22D24D26D28D30 X LMT+ D1X STOP0 D3X STOP2 D5X ALARM D7Y STOP0 D11YSTOP2 D13 X LMT- X STOP1 X INPOS X IN Y LMT- Y STOP1 Y INPOS Y IN Y LMT+ D9 Y ALARM D15 Z LMT+ D17Z LMT- Z STOP0 D19Z STOP1 Z STOP2 D21Z INPOS Z ALARM D23Z IN W LMT+ D25W LMT- W STOP0 D27W STOP2 D29 1 错误 W STOP1 W INPOS W IN W ALARM D31 返回值 0正确 2 设置所有开关量输出状态 cardno 卡号 value D310 输出状态值 int write_do(int cardno,unsigned long value) value为四个字节的值 D0为低位 D31为高位 相应位为0为输出低电平 为1为输出高电平 D0D1 OUT0 OUT1 OUT31 1 错误 正确 3 返回值 读单个输入点 int read_bit(int cardno,int number) cardno 卡号 number 输入点 返回值 0-31 高电平 -1 错误 0低电平 1 http://www.adtechcn.com 45 ADT-836六轴运动控制卡用户手册 输入点数含义如下 X LMT- 2X INPOS 6Y LMT- 10 X STOP0 X ALARM Y STOP0 Y ALARM 0X LMT+ 1 3X STOP1 4 7 8 X STOP2 5X IN Y LMT+ 9 11Y STOP1 12YSTOP2 13Y INPOS 14 15 16 19 20 24 28 Y IN Z LMT+ 17Z LMT- 18Z STOP0 Z STOP1 Z STOP2 21Z INPOS 22W LMT+ 25W STOP2 Z ALARM 23Z IN W LMT- 26W STOP0 W ALARM 27W STOP1 29W INPOS 30 31W IN 输出单点 int write_bit(int cardno,int number,int value) cardno 卡号 number 输出点 value 0低 46 http://www.adtechcn.com 4 0-311 高 错误 返回值 0正确 1 输出数对应相应的输出号 ADT-836六轴运动控制卡用户手册 第八章 运动控制开发编程示例 所有函数均为立即返回而不是等待驱动结束后才返回操作都是由ADT850卡完成 1 开发DOS下的运动控制系统 Borland C++ 3.1 DOS下的开发库共有三个文件在配套光盘的\\ADT836\\dos\\lib\\目录下一个是头文件ADT836.h另外两个是库函数一个是大模式库ADT836l.liblarge memory model 一个是巨模式库ADT836h.libhuge memory model 可根据 不同的编译环境选择 a单轴定量匀速运动 目的 让X轴的步进电机以1000 pps的速度运动10000步 所有驱动 上位机主要做实时监控及界面处理的工作 程序如下 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 http://www.adtechcn.com 47 ADT-836六轴运动控制卡用户手册 set_range(0,1,8000000); //设置倍率为1 set_startv(0,1,1000); set_speed(0,1,1000); //如果起始速度大于或等于驱 //动速度 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 …… //可执行读键盘显示位置等函数 } return ; } b 单轴定量对称梯形加/减速运动 目的 让X轴以下列速度运动20000步 起始速度2000 pss 驱动速度20000 pss 加/减速度 40000 pss 则为匀速运动 pmove(0,1,10000); //开始驱动 48 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 加速时间应为减速与加速相同 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 20000-2000 /40000=0.45 秒 加速脉冲应为0.45* 20000+2000/2=4950 个 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_ad_mode(0,1,0); //设置为梯形加减速 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,0); //采用自动减速 set_range(0,1,1600000); //设置倍率为5 set_startv(0,1,400); //起始速度 2000/5=400 set_speed(0,1,4000); //驱动速度 20000/5=4000 set_acc(0,1,64); //加/减速度 40000/125/5=64 http://www.adtechcn.com 49 ADT-836六轴运动控制卡用户手册 pmove(0,1,20000); //开始驱动 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 …… //可执行读键盘 显示位置等函数 } return ; } c 单轴定量非对称梯形加/减速运动 目的 让X轴以下列速度运动30000步 起始速度2000 pss 驱动速度20000 pss 加速度40000 pss 减速度20000 pss 加速时间应为20000-2000 /40000=0.45 秒 50 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 加速脉冲应为0.45*减速时间应为减速脉冲应为0.9* #include “ADT836.h” void main() { 20000+2000/2=4950 个 /20000=0.9 秒 20000+2000/2=9900 个 20000-2000 set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_ad_mode(0,1,0); //设置为梯形加减速 set_dec1_mode(0,1,1); //非对称加减速 set_dec2_mode(0,1,0); //采用自动减速 set_range(0,1,1600000); //设置倍率为5 set_startv(0,1,400); //起始速度 2000/5=400 set_speed(0,1,4000); //驱动速度 20000/5=4000 set_acc(0,1,64); //加速度 40000/125/5=64 set_dec(0,1,32); //减速度 20000/125/5=32 pmove(0,1,20000); //开始驱动 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 …… //可执行读键盘 显示位置等函数 } return ; } http://www.adtechcn.com 51 ADT-836六轴运动控制卡用户手册 d 单轴定量S曲线加/减速运动 例一目的 完全S曲线 1000 pss 让X轴以下列速度作完全S曲线加速运动20000步 起始速度 驱动速度40000 pss 加速时间0.4秒 首先在计算上不考虑初始速度把它作为0 因为是完全S曲线加速所这个积分数值 斜线的 以在0.4 秒的1/20.2 秒把速度增加至40KPPS 的1/220KPPS在剩下的0.2秒增加至40KPPS这时加速度线性地增加直至0.2秒面积-下图PPS/SEC 等于增加速度20KPPS因此0.2 秒的加速度是20000*2/0.2=200000 加速度的增加率是200000/0.2=1000000 PPS/SEC/SEC #include “ADT836.h” 52 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_ad_mode(0,1,1); //设置为S曲线加减速 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,0); //采用自动减速 set_range(0,1,800000); //设置倍率为10 set_startv(0,1,100); //起始速度 1000/10=100 set_speed(0,1,4000); //驱动速度 40000/10=4000 set_acc(0,1,160); //加/减速度 200000/125/10=160 set_acac(0,1,625); // 62500000*10/1000000=625 pmove(0,1,20000); //开始驱动 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 …… //可执行读键盘 显示位置等函数 } return ; } 例二目的 部分S曲线 让X轴以下列速度作部分S曲线加速运动20000步 如下图所示用0.2秒抛物线地加速至10KPPS再用0.2秒从10KPPS直线地加速至30KPPS再用剩下的0.2秒从30KPPS抛物线地加速至40KPPS http://www.adtechcn.com 53 ADT-836六轴运动控制卡用户手册 起始速度1000 pss 驱动速度40000 pss 加速时间0.6秒 和上例一样不用考虑初始速度这时的积分数值上图的斜线面积PPS/SEC/SEC 程序如下 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡//可修改卡号 即cardno>1 操作其他卡 在0.2 秒内加速度线性增加至10KPPS相当于起动速度10KPPS因此0.2秒的加速 度是10000*2/0.2=100000 PPS/SEC加速度的增加率是100000/0.2=500000 54 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_ad_mode(0,1,1); //设置为S曲线加减速 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,0); //采用自动减速 set_range(0,1,800000); //设置倍率为10 set_startv(0,1,100); //起始速度 1000/10=100 set_speed(0,1,4000); //驱动速度 40000/10=4000 set_acc(0,1,80); //加/减速度 100000/125/10=80 set_acac(0,1,1250); // 62500000*10/500000=1250 pmove(0,1,20000); //开始驱动 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 …… //可执行读键盘 显示位置等函数 } return ; } 单轴连续驱动 在加/减速方面的设置是相同的只直至发出停止命令或外部的停止信号操作控制马达旋转速度时使用减速停止用于高速驱动 STOP1 STOP2 e 单轴的连续驱动与定量驱动的设置是不需设定脉冲数连续输出驱动脉冲有效时才停止停止 在需要运行原点搜寻扫描 停止命令和外部的停止信号均有两种停止方式一是立即停止一是减速一般情况下立即停止用于匀速驱动 LMT+ LMT-STOP 停止信号有3个 外部的可分 停止信号有两种一是限位信号一是停止信号 限位通常是用来作为保护 分别为STOP0 别设置停止有效/无效在加减速驱动时为减速停止在匀速驱动时为立即停止因此结合连续驱动函数 可很简单的做出各种原点搜寻方式 以下是一个匀速回原点的例子 http://www.adtechcn.com 55 ADT-836六轴运动控制卡用户手册 采用STOP0为原点信号 …… //初始部分与前相同略 低电平停止 set_stop0_mode(0,1,1,0); //STOP0有效set_range(0,1,8000000); //倍率为1 set_startv(0,1,200); //驱动速度为200 set_speed(0,1,200); continue_move(0,1,0); //正方向移动,假设原点在正方向 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 } set_stop0_mode(0,1,0,0); //STOP0无效 找到原点后应将//停 止信号取消以免在正常//运行时产生不必要的停止 …… // 以下是一个加/减速回原点的例子 采用STOP1为减速信号 STOP2为原点信号 56 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 …… //初始部分与前相同略 set_stop1_mode(0,1,1,0); //STOP1有效低电平停止 set_ad_mode(0,1,0); //设置为梯形加减速 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,0); //采用自动减速 set_range(0,1,8000000); //倍率为1 set_startv(0,1,200); //初始速度为200 set_speed(0,1,2000); //驱动速度为2000 set_acc(0,1,32); //加/减速度 4000/125=32 continue_move(0,1,0); //正方向移动,假设减速开关在正//方向 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 } set_stop1_mode(0,1,0,0); //STOP1无效 set_stop2_mode(0,1,1,0); //STOP2有效低电平停止 set_startv(0,1,200); //初始速度为200 set_speed(0,1,200); //驱动速度为200 continue_move(0,1,0); //正方向移动,假设原点在正方向 while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 http://www.adtechcn.com 57 ADT-836六轴运动控制卡用户手册 } set_stop2_mode(0,1,0,0); //STOP2无效 …… // f手动减速 目的 让X轴以下列速度运动20000步采用手动减速方式 起始速度2000 pss 驱动速度20000 pss 加/减速度40000 pss 加速时间应为 20000-2000 /40000=0.45 秒 加速脉冲应为0.45* 20000+2000/2=4950 个 减速点应为20000-4950=15050 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_ad_mode(0,1,0); //设置为梯形加减速 58 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,1); //采用手动减速 set_dec_pos(0,1,15050); //设定减速点 set_range(0,1,1600000); //设置倍率为5 set_startv(0,1,400); //起始速度 2000/5=400 set_speed(0,1,4000); //驱动速度 20000/5=4000 set_acc(0,1,64); //加/减速度 40000/125/5=64 pmove(0,1,20000); //开始驱动 int s; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 …… //可执行读键盘 显示位置等函数 } return ; } 其他方式的手动减速与此类同关键是减速点的计算 g动态位置的显示与命令停止 采用例b的加/减速方式速停止 #include set_address(0,0x1000); //以下只对第一块卡X轴操作 但采用连续驱动 按”s”键立即停止按”d”键减 http://www.adtechcn.com 59 ADT-836六轴运动控制卡用户手册 //如果有多块卡//可修改卡号 即cardno>1 操作其他卡 set_command_pos(0,1,0); //X轴逻辑位置清零 set_actual_pos(0,1,0); // X轴实际位置清零 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_ad_mode(0,1,0); //设置为梯形加减速 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,0); //采用自动减速 set_range(0,1,1600000); //设置倍率为5 set_startv(0,1,400); //起始速度 2000/5=400 set_speed(0,1,4000); //驱动速度 20000/5=4000 set_acc(0,1,64); //加/减速度 40000/125/5=64 continue_move(0,1,0); //开始驱动 int s; int key=-1; long pos1,pos2; while(1) { get_status(0,1,&s); //读驱动状态 if(s==0)break; //驱动结束跳出 get_command_pos(0,1,&pos1); get_actual_pos(0,1,&pos2); gotoxy(1,10); printf(“command_pos=%8ld”,pos1); gotoxy(1,12); printf(“actual_pos=%8ld”,pos2); if(kbhit()) key=getch(); else key=-1; if(key==’s’) sudden_stop(0,1); if(key==’d’) 60 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 dec_stop(0,1); } return ; } h影响 多轴运动 如在X轴驱动时 设置好Y轴的参数 然后驱动Y轴 对X轴的运动不会 以上虽为单轴操作但实际上可同时设置另外几轴的数据互相之间并不有任何影响 如此可独立操作六轴 下面是一个简单的例子X轴以匀速1000pps运动1000步Y轴以直线加减速运动300000步秒 加速时间1.2秒 起始速度10000pps驱动速度200000pps加减时间 0.2 起始速度 100 pps驱动速度4000 pss 按 s键停止 /0.2=950000 300000 pps连续运行为 200000-10000 Z轴以完全S曲线加速连续运动 W轴以匀速 首先计算Y轴的加速度 然后计算Z轴的加速度及加速度的变化率加速度计算方法为首先在0.6秒内加速至2000 pps然后0.6秒内再加至4000 pps则加速度为2000*2/0.6=6667 pps/sec 加速度的变化率为6667/0.6=11111 pps/sec/sec 程序如下 #include set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡//可修改卡号 即cardno>1 操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式 set_pulse_mode(0,3,1,0,0); //设置Z轴为脉冲+方向方式 set_pulse_mode(0,4,1,0,0); //设置W轴为脉冲+方向方式 //Y轴加减速设置 set_ad_mode(0,2,0); //设置为梯形加减速 set_dec1_mode(0,2,0); //对称加减速 http://www.adtechcn.com 61 ADT-836六轴运动控制卡用户手册 set_dec2_mode(0,2,0); //采用自动减速 //Z轴加减速设置 set_ad_mode(0,3,1); //设置为梯形加减速 set_dec1_mode(0,3,0); //对称加减速 set_dec2_mode(0,3,0); //采用自动减速 //X轴 set_range(0,1,8000000); //设置倍率为1 set_startv(0,1,1000); //起始速度 1000 set_speed(0,1,1000); //驱动速度 1000 //Y轴 set_range(0,2,320000); //设置倍率为8000000/320000=25 set_startv(0,2,400); //起始速度 10000/25=400 set_speed(0,2,8000); //驱动速度 200000/25=8000 set_acc(0,2,304); //加速度 950000/125/25=304 //Z轴 set_range(0,3,8000000); set_startv(0,3,100); set_speed(0,3,4000); set_acc(0,3,53); // 6667/125=53.3 set_acac(0,3,5625); // 62500000/11111=5625 //W轴 set_range(0,4,200000); //倍率为40 set_startv(0,4,7500); // 300000/40=7500 set_speed(0,4,7500); pmove(0,1,1000); //开始驱动 pmove(0,2,300000); continue_move(0,3,0); continue_move(0,4,0); int s1,s2,s3,s4; while(1) 62 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 { get_status(0,1,&s1); //读X驱动状态 get_status(0,2,&s2); get_status(0,3,&s3); get_status(0,4,&s4); //读Y驱动状态 //读Z驱动状态 //读W驱动状态 if(s1==0 && s2==0 && s3==0 && s4==0)break; //驱动结束跳出 if(kbhit()) key=getch(); else { key=-1; if(key==’s’) dec_stop(0,3); dec_stop(0,4); } } return ; } h 两轴直线插补 匀速 开始插补前只要设好X轴的参数即可 插补速度是以X轴速度为基准Z-W插补以Z轴为基准动基本相同 下面是一个匀速直线插补的简单例子圆弧插补与多轴直线插补的匀速驱 程序如下 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 http://www.adtechcn.com 63 ADT-836六轴运动控制卡用户手册 set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式 set_pulse_mode(0,3,1,0,0); //设置Z轴为脉冲+方向方式 set_pulse_mode(0,4,1,0,0); //设置W轴为脉冲+方向方式 set_range(0,1,8000000); //设置X倍率为1 set_startv(0,1,1000); //X起始速度 1000 set_speed(0,1,1000); //X驱动速度 1000 set_range(0,3,8000000); //设置Z倍率为1 set_startv(0,3,2000); //Z起始速度 2000 set_speed(0,3,2000); //Z驱动速度 2000 inp_move2(0,1,10000,-20000); //X-Y开始插补 //X正向移动10000步 //Y反向移动20000步 //Z正向移动20000步 //W反向移动30000步 inp_move2(0,2,20000,-30000); //Z-W开始插补 int s1,s2; while(1) { get_inp_status(0,1,&s1); //读X-Y插补状态 get_inp_status(0,2,&s2); //读Z-W插补状态 if(s1==0 && s2==0)break; //插补结束跳出 …… //可执行读键盘显示位置等函数 } return ; } i 两轴直线插补 注意 加/减速 两轴直线插补的加/减速驱动只要将X轴或Z轴设置成直线加减速或S曲线加减速即可 驱动开始之前须设成减速有效状态 X-Y直线加减速 将上面的例子改成加减速驱动 程序如下#include “ADT836.h” void main() { 64 http://www.adtechcn.com Z-W曲线加减速 ADT-836六轴运动控制卡用户手册 set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式 set_pulse_mode(0,3,1,0,0); //设置Z轴为脉冲+方向方式 set_pulse_mode(0,4,1,0,0); //设置W轴为脉冲+方向方式 set_ad_mode(0,1,0); set_dec1_mode(0,1,0); set_dec2_mode(0,1,0); set_range(0,1,8000000); //设置X倍率为1 set_startv(0,1,1000); //X起始速度 1000 set_speed(0,1,8000); //X驱动速度 8000 set_acc(0,1,1000); set_ad_mode(0,3,1); set_dec1_mode(0,3,0); set_dec2_mode(0,3,0); set_range(0,3,4000000); //设置Z倍率为2 set_startv(0,3,1000); //Z起始速度 2000 set_speed(0,3,8000); //Z驱动速度 16000 set_acc(0,3,1000); ser_acac(0,3,1000); inp_move2(0,1,10000,-20000); //X-Y开始插补 //X正向移动10000步 //Y反向移动20000步 inp_move2(0,2,20000,-30000); //Z-W开始插补 //Z正向移动20000步 //W反向移动30000步 int s1,s2; while(1) { http://www.adtechcn.com 65 ADT-836六轴运动控制卡用户手册 get_inp_status(0,1,&s1); //读X-Y插补状态 get_inp_status(0,2,&s2); //读Z-W插补状态 if(s1==0 && s2==0)break; //插补结束跳出 …… //可执行读键盘显示位置等函数 } return ; } j 三轴直线插补 加减速 三轴直线插补只能为X-Y-Z轴以X轴的速度为基准Z轴的倍率和驱动速度应设置成和X轴的倍率和驱动速度相同Z轴的初始速度应设置成和X轴的驱动速度一样可 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡 即cardno>1 不是X轴的初始速度 Y无须设定 下面是一个直线加减速的简单的例子其余加减速方式只须改一下设置即 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式 set_pulse_mode(0,3,1,0,0); //设置Z轴为脉冲+方向方式 set_pulse_mode(0,4,1,0,0); //设置W轴为脉冲+方向方式 set_ad_mode(0,1,0); set_dec1_mode(0,1,0); set_dec2_mode(0,1,0); set_range(0,1,8000000); //设置X倍率为1 set_range(0,3,8000000); //Z倍率与X倍率相同 set_startv(0,1,1000); //X起始速度 1000 set_speed(0,1,8000); //X驱动速度 8000 set_startv(0,3,8000); set_acc(0,1,1000); 66 http://www.adtechcn.com //Z起始速度同X驱动速度 set_speed(0,3,8000); //Z驱动速度同X驱动速度 ADT-836六轴运动控制卡用户手册 inp_move3(0,5000,10000,-20000); //X-Y-Z开始插补 //X正向移动5000步 //Y正向移动10000步 //Z反向移动20000步 int s1; while(1) { get_inp_status(0,1,&s1); //读X-Y-Z插补状态 if(s1==0 )break; //插补结束跳出 …… //可执行读键盘显示位置等函数 } return ; } k.两轴圆弧插补速的直线加减速驱动 匀速驱动较简单可 加减速驱动需要设置好减速点下面以驱动一半径为10000的完整圆为例说明驱动方法 加减速 两轴圆弧插补一般用匀速驱动但也可用加减速驱动不过只能用手动减 不能使用S曲线加减速及自动减速只须设置X轴 或Z轴 的初始速度与驱动速度一样即 http://www.adtechcn.com 67 ADT-836六轴运动控制卡用户手册 如上图所示半径10000 的圆通过从0 至7 象限在每个象限上短轴一直输出脉冲所以短轴每1个象限输出10000/1.414=7071 脉冲,因此在整个圆上从主轴输出的基本脉冲数是7071*8=56568 此外把初始速度设定为500 pps,在0.3秒之内用直线加速把驱动速度增加至20000pps的话,加速度是(20000-500)/0.3=65000 pps/sec加速时化费的脉冲数是上图的斜线部面积500+20000*0.3/2=3075因此如果减速度和加速度一样手动减速点就设定为56568-3075=53493 如果做一个半圆总脉冲为56568/2=28284减速点为28284-3075=25209其余相同 程序如下 #include “ADT836.h” void main() { set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡即cardno>1 68 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式 set_pulse_mode(0,3,1,0,0); //设置Z轴为脉冲+方向方式 set_pulse_mode(0,4,1,0,0); //设置W轴为脉冲+方向方式 set_ad_mode(0,1,0); //直线加减速 set_dec1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,1); //手动减速 set_range(0,1,1600000); //设置X倍率为5 set_startv(0,1,100); //X起始速度 500/5 set_speed(0,1,4000); //X驱动速度 20000/5 set_acc(0,1,104); //X加速度 65000/125/5 set_dec_pos(0,1,53493); //手动减速点 set_ad_mode(0,3,0); //同上 set_dec1_mode(0,3,0); set_dec2_mode(0,3,1); set_range(0,3,1600000); set_startv(0,3,100); set_speed(0,3,4000); set_acc(0,3,104); set_dec_pos(0,3,25209); //手动减速点 inp_cw_arc(0,1,0,0,0,10000); //X-Y顺时针圆弧插补 //终点00 即画一个整圆 //圆心位置010000 inp_ccw_arc(0,2,0,20000,0,10000); //Z-W逆时针插补 //终点020000 即画一个半圆 //圆心位置010000 int s1,s2; while(1) { get_inp_status(0,1,&s1); //读X-Y插补状态 get_inp_status(0,2,&s2); //读Z-W插补状态 if(s1==0 && s2==0)break; //插补结束跳出 http://www.adtechcn.com 69 ADT-836六轴运动控制卡用户手册 …… //可执行读键盘显示位置等函数 } return ; } l连续插补 匀速的连续插补与单个插补相似只要在上一插补数据发出后读取下一插补数据的允许写入状态如果允许的话写入下一插补数据同时应检查驱动状态如果驱动因错误而停止应退出连续插补的循环 加减速的连续插补则复杂一点只能用手动减速的直线加减速驱动不能用S曲线加减速驱动及自动减速要事先设好减速点先把减速设为无效在最后一个节点上将减速设为有效开始至停止一定要在1个节点内运行减速减速停止的最终插补节点输出的基本脉冲总数要大于在减速中化费的脉冲数 以上图为例起始速度设为500 pps驱动速度为2000 pps加速度为6000 pps/sec加速时间为2000-500/6000=0.25秒则加速所花费的脉冲为 2000+500*0.25/2=313上图最后一段为圆弧插补半径为1500四分之一圆弧脉冲数可参考上例应为1500/1.414*2=2121则减速点应为2121-313=1808 程序如下 #include “ADT836.h” void main() { int s1,s2; set_address(0,0x1000); //以下只对第一块卡X轴操作 //如果有多块卡即cardno>1 //可修改卡号操作其他卡 set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式 set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式 set_ad_mode(0,1,0); //直线加减速 set_ded1_mode(0,1,0); //对称加减速 set_dec2_mode(0,1,1); //手动减速 set_range(0,1,8000000); //设置X倍率为1 70 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 set_startv(0,1,500); //X起始速度 500 set_speed(0,1,2000); //X驱动速度 2000 set_acc(0,1,48); //X加速度 6000/125 set_dec_pos(0,1,1808); //手动减速点 //第一段 inp_dec_disable(0,1); inp_move2(0,1,4500,0); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } //第二段 inp_ccw_arc(0,1,1500,1500,0,1500); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } //第三段 inp_move2(0,1,0,1500); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } http://www.adtechcn.com 71 ADT-836六轴运动控制卡用户手册 //第四段 inp_ccw_arc(0,1,-1500,1500,-1500,0); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } //第五段 inp_move2(0,1,-4500,0); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } //第六段 inp_ccw_arc(0,1,-1500,-1500,0,-1500); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } //第七段 inp_move2(0,1,0,-1500); while(1) { get_stopdata(0,1,&s1); //读错误信息 72 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 if(s1!=0)goto err; //有错误退出 get_inp_status2(0,1,&s2); if(s2!=0)break; //允许写 } //第八段 inp_dec_enable(0,1); //允许减速 inp_ccw_arc(0,1,1500,-1500,1500,0); while(1) { get_stopdata(0,1,&s1); //读错误信息 if(s1!=0)goto err; //有错误退出 get_inp_status(0,1,&s2); if(s2==0)break; //插补结束 } return ; err: return ; } 2 用VB开发WINDOWS下的运动控制系统 一 一个是模块文件ADT836.BAS一个是 VB下的开发库共有三个文件在配套光盘的\\ADT836\\win\\vb\\目录下个是动态库ADT836.DLL WindowsNT/2000使用的文件winio.sys动态库中的函数已在模块文件ADT836.BAS中有声明基本使用方法与DOS下的编程相同 详细的例子在用户光盘上 3 用VC开发WINDOWS下的运动控制系统 一个 VC下的开发库共有三个文件在配套光盘的\\adt850\\win\\vc\\目录下 是静态库ADT836.LIB一个是头文件ADT836.H一个是WindowsNT/2000使用的文件winio.sys动态库中的函数已在头文件ADT836.H中有声明基本使用方法与DOS下的编程相同 详细的例子在用户光盘上 http://www.adtechcn.com 73 ADT-836六轴运动控制卡用户手册 第九章 运动控制开发要点 本卡在编程时常会遇到一些问题其实大部分问题是由于对本控制卡的原理不理解产生的 一确 卡的初始化 确认ADT836卡的安装是否正限位开关的工作模式 伺服 位置反馈的模式 在程序的开始首先应调用set_address 函数然后设置脉冲输出的模式 以下就一些常见的 易产生误解的情况作一些说明 信号的使用与否是否使用软件限位等等以上参数应根据具体的机器来设置一般只应在程序初始化时设置一次后一般不应再变化 以后不应再设置 另外范围设定 set_range 函数一般应根据使用的最大脉冲频率来设定此 每轴范围设定可以不同 如X轴最大频率为100K因 则范围R值应为 set_speed 最大值为80008000000/12.5=640000 即 set_range(cardno,1,640000); 当要输出100K频率时 set_speed(cardno,1,8000) 当要输出10K频率时 set_speed(cardno,1,800) 最低输出频率为1*12.5=12.5Hz 通常应根据可能使用的最大使用频率确定R值除非最低频率不能满足使用要求 二1 速度的设定 匀速运动 否则在使用过程中不应改变 R 值 倍率应为100000/8000=12.5 参数的设置很简单只需要将驱动速度设置成小于或等于起始速度其余的参数不用设置 相关函数 set_startv 74 http://www.adtechcn.com ADT-836六轴运动控制卡用户手册 set_speed 注意 2减速 相关函数 对称直线加减速 这是最常用的一种方式需设置起始速度驱动速度加速度采用自动 函数使用的值应乘上倍率才为实际的速度 set_startv set_speed set_acc set_ad_mode 设为直线加减速方式 注意 3 非对称直线加减速 加速时间与减速时间不相同 此方式一般用于往垂直方向移动对象物时需比上面多设定减速度的值 相关函数 set_startv set_speed set_acc set_dec set_ad_mode 设为直线加减速方式 4 S曲线加减速 为了达到较好的加速效果 采用S曲线加速 可 加加速度的计算对S曲线的形状有很大的影响 对于一些负载较重的方式此时加加速度的值需设置参考前面的例子 set_dec1_mode (设为非对称方式) set_dec2_mode 设为自动减速 set_dec1_mode (设为对称方式) set_dec2_mode 设为自动减速 加速度函数使用的值应乘上倍率再乘上125才为实际的加速度 http://www.adtechcn.com 75 ADT-836六轴运动控制卡用户手册 相关函数 set_startv set_speed set_acc set_acac set_ad_mode 设为S曲线加减速方式 set_dec2_mode 设为自动减速 5 手动减速 手动减速只用于自动减速不能正常使用的情况下如圆弧插补的加减速驱动连续插补的加减速驱动此时要计算手动减速点具体可参考前面的例子 6 插补速度 如 X为长轴 X轴的驱动 Y为长轴 Y轴的驱动速度 关于插补的速度虽然是设置X轴或Z轴的速度但并不是代表X轴是以这个速度运动而是长轴的速度 在X-Y直线插补时速度为设定的速度为设定的速度插补 X移动距离大于Y移动距离时 X移动距离小于Y移动距离时 在X-Y圆弧插补时长轴的确定是以象限来确定详细的说明可见前面的 的说明 只需设定X轴 或Z轴 的参数即可 Z 是设X轴的参数 同时Z轴的倍率应与X轴相同 对于两轴插补 对于三轴四轴插补X轴的驱动速度相同 对于插补 轴的起始速度应与X轴的驱动速度不是起始速度相同Z轴的驱动速度应与 才能保证插补正确运行一般使用匀速驱动 默认情况是插补减速禁 此情况用 在驱动时只有加速 而没有减速过程 因此只要设定起始速度和驱动速度即可 加减速插补也可使用只要设定好X轴参数即可但要注意的是S曲线插补不能用于圆弧插补和连续插补止即如果使用加减速插补于连续插补 76 http://www.adtechcn.com 另外插补减速允许和插补减速禁止函数的使用 如果只用单个插补 应在驱动前使用插补减速允许命令 ADT-836六轴运动控制卡用户手册 以上关于速度之所以设置较多是为了能达到更好的性能充分发挥本卡的功能 三 插补错误清除函数的使用 软件限位有效等 即只要没有走完要求的距离 否则Z 就产生 对于三轴四轴插补如果没有正确走完如在驱动过程中发出了停止命令撞到了限位开关了错误正常 对两轴插补则不用使用此函数 四 STOP0 STOP1STOP1 STOP2信号 STOP2为每个轴都有的信号 因此共有12个STOP 可 回原点方式可根据情况使用一个或对于采用高速回零时应注意 首先STOP0 应调用插补错误清除函数清除这个错误 W轴的运动将回不 其实对于绝大部分应用 许多功能不会用上 通常只有要求达到很快 的运行速度时 又要保证效果时才用到 此时的设置较复杂也是应该的 信号此信号主要用于机器回原点时使用多个信号 但需注意的是此信号为减速停止 采用原点开关前加一减速开关即采用两个STOP信号一个作为原点开关一个作为减速开关也可只用一个信号在碰到STOP信号后减速停止后反向匀速运动再次碰到时停止 即设置在有效时 如果用STOP2信号停止时 此时对于伺服驱动造成位置有一点 而是有一点 另外STOP2有一特殊功能 实际位置计数器会由STOP2清零这是为了保证在原点位置处计数器同时为0因其他的控制卡一般为在驱动停止后用软件将计数器置零时误差数值 五 伺服信号 将会出现驱动状态总是不会停止 伺服到位信号和伺服报警信号必须在确认信号已接上时才能使用如果未即使脉冲已停止发出 因伺服中有累积 仍会前进一点 而采用本卡上述方法回零 在回零后如果实际位置不为零 这是正常的不用再调用函数将位置清零 接伺服到位信号而使伺服到位信号有效 这是因为此时是以到位信号作为驱动结束的标志 其余的伺服信号如伺服ON信号报警清除信号可用通用输出信号驱动 http://www.adtechcn.com 77 因篇幅问题不能全部显示,请点此查看更多更全内容