发新帖我要提问
12
返回列表
打印
[资料分享]

基于TI 8960 运动控制卡的介绍

[复制链接]
楼主: gaoke231
手机看帖
扫描二维码
随时随地手机跟帖
21
gaoke231|  楼主 | 2019-1-31 21:37 | 只看该作者 回帖奖励 |倒序浏览
Borland C 调用函数库的方法如下:
(1) 在 Borland C 的开发环境下,选择“Project\Open Project”命令新建
一个项目;
(2) 将光 盘 中 “ 开发 包 \C 或 C++ ” 下面 的 “ adt8960H.LIB ” 或
“adt8960L.LIB”和“adt8960.H”文件拷贝到新建项目路径下;
(3) 选择“Project\Add Item”命令,在对话框中选择“adt8960H.LIB ”
或“adt8960L.LIB”,单击“Add”按钮;
(4) 在用户程序文件中增加#include “adt8960.h”申明;
经过上述四步,即可在程序中调用库函数。

使用特权

评论回复
22
gaoke231|  楼主 | 2019-1-31 22:06 | 只看该作者
卡的初始化
在程序的开始首先应调用adt8960_initial()函数,确认ADT8960卡的安装是
否正确,然后设置脉冲输出的模式,限位开关的工作模式,以上参数应根据具
体的机器来设置,一般只应在程序初始化时设置一次,以后不应再设置。
通常应根据可能使用的最大使用频率确定R值,除非最低频率不能满足使
用要求,否则在使用过程中不应改变 R 值

使用特权

评论回复
23
gaoke231|  楼主 | 2019-1-31 22:07 | 只看该作者
匀速运动
参数的设置很简单,只需要将驱动速度设置成等于起始速度,其余的参数
不用设置。
相关函数:
set_startv
set_speed

使用特权

评论回复
24
gaoke231|  楼主 | 2019-1-31 22:07 | 只看该作者
SSSS 曲线加减速
对于一些负载较重的方式,为了达到较好的加速效果,采用S曲线加速,
此时加加速度的值需设置,加加速度的计算对S曲线的形状有很大的影响,可
参考前面的例子。
相关函数:
set_startv
set_speed
set_acc
set_acac
set_ad_mode (设为S曲线加减速方式)

使用特权

评论回复
25
gaoke231|  楼主 | 2019-1-31 22:08 | 只看该作者
插补速度
ADT8960卡可以任意2轴作直线插补,任意3轴作直线插补,任意4轴直线
插补,任意5轴直线插补以及6轴直线插补。
关于插补的速度,是使用最前面的一个轴的速度参数,作为长轴的速度,
例如
inp_move2 (0,3,1,100,200)
是采用第一个轴的速度参数,即X轴,而与参数中的顺序无关。
inp_move3 (0,3,4,2,100,200,500)
是采用第二个轴的速度参数,即Y轴,而与参数中的顺序无关

使用特权

评论回复
26
gaoke231|  楼主 | 2019-1-31 22:08 | 只看该作者
错误信息监测:
使用get_stopdata()函数获取错误信息可获取轴的停止信息,包括由硬件限
位引起的停止,原点信号引起的停止,正常停止,以及其他停止

使用特权

评论回复
27
gaoke231|  楼主 | 2019-1-31 22:08 | 只看该作者
运动控制卡可使用限位开关或者软件限位控制轴的运动范围,负向限位开关或
者负向软件限位触发后,只能朝正向运动,而不能再朝负向运动;正向限位开
关或者正向软件限位触发后,只能朝负向运动,而不能再朝正向运动;注意,
软件限位只能在回零成功后方可使用

使用特权

评论回复
28
gaoke231|  楼主 | 2019-1-31 22:09 | 只看该作者
(1) 回原点分为四大步:
第一步:快速接近stop0(logical0原点设置),找到stop0;
第二步:慢速反向离开stop0,反向移动指定原点范围脉冲
数;
第三步:再次慢速接近stop0;
第四步:慢速接近stop1(logical1编码器Z相)

使用特权

评论回复
29
gaoke231|  楼主 | 2019-1-31 22:09 | 只看该作者
void main()
{
int retnX = -1;
retnX = SetHomeMode_Ex(0, 1, 0, 0, 0, -1, 2000, 400, 100); //'设置
回零模式
retnX = SetHomeSpeed_Ex(0, 1, 100, 500, 200, 100, 200); //'设置
回零速度
retnX = HomeProcess_Ex(0, 1) ;//'启动回零
if (retnX < 0 || retnX > 10)
{ // MessageBox ("回零失败");
Return;
}
while(true)
{
//DoEvent();
retnX = GetHomeStatus_Ex(0, 1);//查询回零状态
// HomeStatus.Caption = "回原点状态:" + CStr(retnX)
if (retnX < 0 || retnX > 10)
{ //MessageBox("回零失败");
break;
}
if( retnX == 0 )
{
//MessageBox ("成功");
break;
}
}

使用特权

评论回复
30
gaoke231|  楼主 | 2019-1-31 22:11 | 只看该作者
回零注意参数设置,原点(STOP0)搜寻起始速度不能大于原
点搜寻速度,如不需搜寻 STOP1 信号,把此参数设为-1,需要
时,请按照函数说明进行设置即可,上例是以 X 轴为例,如需多
轴回零,只需再增加函数调用即可,注意,此处举例并未搜寻 Z
相信号,即 STOP1 信号,如需,可进行设置即可调用。

使用特权

评论回复
31
gaoke231|  楼主 | 2019-1-31 22:12 | 只看该作者
插补速度是以第一轴速度为基准,开始插补前只要设好第一
轴的参数即可。下面是一个匀速直线插补的简单例子,圆弧插补
与多轴直线插补的匀速驱动基本相同。

使用特权

评论回复
32
gaoke231|  楼主 | 2019-1-31 22:12 | 只看该作者
程序如下:
#include “adt8960.h”
void main()
{
int cardno;
cardno=adt8960_initial();
if(cardno<=0) return; //未安装ADT854卡
//以下只对第一块卡X轴操作
//如果有多块卡,即cardno>1
//可修改卡号,操作其他卡
set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向方式
set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向方式
set_startv(0,1,1000); //X起始速度 1000
set_speed(0,1, 1000); //X驱动速度 1000
inp_move2(0,1,2,10000,-20000);//X-Y开始插补
//X正向移动10000步
//Y反向移动20000步
int s1;
while(1)
{
get_inp_status(0,&s1); //读插补状态
if(s1==0)break; //插补结束跳出
…… //可执行读键盘,显示位置等函数
}
return ;
}

使用特权

评论回复
33
gaoke231|  楼主 | 2019-1-31 22:12 | 只看该作者
两轴直线插补的加/减速驱动,只要将第一轴设置成直线加减
速或S曲线加减速即可,注意,驱动开始之前须设成减速有效状
态。
将上面的例子改成加减速驱动,X-Y直线加减速。

使用特权

评论回复
34
gaoke231|  楼主 | 2019-1-31 22:13 | 只看该作者
程序如下:
#include “adt8960.h”
void main()
{
int cardno;
cardno=adt8960_initial();
if(cardno<=0) return; //未安装ADT8960卡
//
//如果有多块卡,即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_startv(0,1,1000); //X起始速度 1000
set_speed(0,1,8000); //X驱动速度 8000
set_acc(0,1,1000);
inp_move2(0,1,2,10000,-20000);//X-Y开始插补
//X正向移动10000步
//Y反向移动20000步
int s1;
while(1)
{
get_inp_status(0,&s1); //读插补状态
if(s1==0)break; //插补结束跳出
…… //可执行读键盘,显示位
置等函数
}
return ;
}

使用特权

评论回复
35
gaoke231|  楼主 | 2019-1-31 22:14 | 只看该作者
三轴直线插补可为任意三轴,以第一轴的速度为基准。
下面是一个直线加减速的简单的例子,其余加减速方式只须
改一下设置即可

使用特权

评论回复
36
gaoke231|  楼主 | 2019-1-31 22:14 | 只看该作者
#include “adt8960.h”
void main()
{
int cardno;
cardno=adt8960_initial();
if(cardno<=0) return; //未安装ADT8960卡
//以下只对第一块卡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_ad_mode(0,1,0);
set_startv(0,1,1000); //X起始速度 1000
set_speed(0,1,8000); //X驱动速度 8000
set_acc(0,1,1000);
inp_move3(0,1,2,3,5000,10000,-20000); //X-Y-Z开始插

//X正向移动5000步
//Y正向移动10000步
//Z反向移动20000步
int s1;
while(1)
{
get_inp_status(0,&s1); //读插补状态
if(s1==0 )break; //插补结束跳出
…… //可执行读键盘,显示
位置等函数
}
return ;
}

使用特权

评论回复
37
gaoke231|  楼主 | 2019-1-31 22:15 | 只看该作者
在实施项目的过程中卡的初始化设置
只需设一次即可,即在程序系统初始化的过程中卡的初始化设置
后,就无需设置.此处仅举例说明,实现圆弧可用缓存软件圆弧
插补

使用特权

评论回复
38
gaoke231|  楼主 | 2019-1-31 22:16 | 只看该作者
程序如下:
#include “adt8960.h”
void main()
{
int cardno;
int s1,s2;
cardno=adt8960_initial();
if(cardno<=0) return; //未安装adt8960卡
//以下只对第一块卡X轴操作
//如果有多块卡,即cardno>1
//可修改卡号,操作其他卡
set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向
方式
set_pulse_mode(0,2,1,0,0); //设置Y轴为脉冲+方向
方式
int m=reset_fifo(0);//清除缓存
for (int i=0; i<50; )
{
//加工50段数据,每段为100个脉冲
if (read_fifo_full(0)==0)//0:未满,1:满
{
//读取缓存是否满
m=fifo_inp_move2(0,1,2,100,100,3000);
i++;
}
else
{
//MessageBox("缓存满,稍后存放");
break;
}
}
return ;
}

使用特权

评论回复
39
gaoke231|  楼主 | 2019-1-31 22:17 | 只看该作者
目的:
让X轴以下列速度运动30000步
起始速度:2000 pss
驱动速度:20000 pss
#include “adt8960.h”
void main()
{
int cardno;
cardno=adt8960_initial();
if(cardno<=0) return; //未安装ADT8960卡
//以下只对第一块卡X轴操作
//如果有多块卡,即cardno>1
//可修改卡号,操作其他卡
set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向
方式
symmetry_relative_move (0,1, 20000, 400, 4000, 0.1, 300,
0);
int s;
while(1)
{
get_status(0,1,&s); //读驱动状态
if(s==0)break; //驱动结束跳出
…… //可执行读键盘,显示位
置等函数
}
return ;
}

使用特权

评论回复
40
gaoke231|  楼主 | 2019-1-31 22:17 | 只看该作者
目的:
让X轴以下列速度运动30000步
起始速度:2000 pss
驱动速度:20000 pss
#include “adt8960.h”
void main()
{
int cardno;
cardno=adt8960_initial();
if(cardno<=0) return; //未安装ADT8960卡
//以下只对第一块卡X轴操作
//如果有多块卡,即cardno>1
//可修改卡号,操作其他卡
set_pulse_mode(0,1,1,0,0); //设置X轴为脉冲+方向
方式
symmetry_absolute_move(0, 1, 20000, 400, 4000, 0.1,
300, 0);
int s;
while(1)
{
get_status(0,1,&s); //读驱动状态
if(s==0)break; //驱动结束跳出
…… //可执行读键盘,显示位
置等函数
}
return ;

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则