固高运动控制卡学习8 --高速硬件捕获

        捕获即当某一种信号触发时, 运动控制器能准确记录触发时刻轴的位置信息。 控制器提供四种捕获方式, Home 捕获, Index 捕获、 探针(Probe)捕获和 HSIO 捕获。

一、Home 捕获, Index 捕获

固高运动控制卡学习8 --高速硬件捕获_第1张图片

例程:home回原点/home+Index回原点

sRtn = GT_Open();
// 复位运动控制器
sRtn = GT_Reset();
// 配置运动控制器
// 注意:配置文件test.cfg取消了各轴的报警和限位
sRtn = GT_LoadConfig("test.cfg");
// 清除指定轴的报警和限位
sRtn =GT_ClrSts(AXIS);
// 驱动器使能
sRtn = GT_AxisOn(AXIS);

/**************************1、启动Home捕获**************************************/
sRtn = GT_SetCaptureMode(AXIS, CAPTURE_HOME);

/**************************2、使相应轴运动,寻找home点***************************/
// 切换到点位运动模式
sRtn = GT_PrfTrap(AXIS);
// 读取点位模式运动参数
sRtn = GT_GetTrapPrm(AXIS, &trapPrm);
trapPrm.acc = 0.25;
trapPrm.dec = 0.25;
// 设置点位模式运动参数
sRtn = GT_SetTrapPrm(AXIS, &trapPrm);
// 设置点位模式目标速度,即回原点速度
sRtn = GT_SetVel(AXIS, 10);
// 设置点位模式目标位置,即原点搜索距离
sRtn = GT_SetPos(AXIS, SEARCH_HOME);
// 启动运动
sRtn = GT_Update(1<<(AXIS-1));

/***********************3、等待捕获触发****************************************/
printf("\nWaiting for home signal...\n");
do
{
// 读取轴状态
sRtn = GT_GetSts(AXIS, &status);
// 读取捕获状态
sRtn =GT_GetCaptureStatus(AXIS, &capture, &pos);
// 读取规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取编码器位置
sRtn = GT_GetEncPos(AXIS, &encPos);
printf("capture=%d prfPos=%.2lf encPos=%.2lf\r", capture, prfPos, encPos);
// 如果运动停止,返回出错信息
if( 0 == ( status& 0x400 ) )
{
printf("\nno home found\n");
getch();
return 1;
}
// 等待捕获触发
}while( 0 == capture );
// 显示捕获位置
printf("\ncapture pos = %ld\n", pos);

/***********************4、运动到"捕获位置+偏移量"******************************/
sRtn = GT_SetPos(AXIS, pos + HOME_OFFSET);
// 在运动状态下更新目标位置
sRtn = GT_Update(1<<(AXIS-1));

do
{
// 读取轴状态
sRtn = GT_GetSts(AXIS, &status);
// 读取规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取编码器位置
sRtn = GT_GetEncPos(AXIS, &encPos);
printf("status=0x%-8lx prfPos=%-10.1lf encPos=%-10.1lf\r", status, prfPos,
encPos);
// 等待运动停止
}while( status& 0x400 );

/*********************5、检查是否到达"Home捕获位置+偏移量"***********************/
if( prfPos != pos+HOME_OFFSET )
{
printf("\nmove to home pos error\n");
return 2;
}
printf("\nHome finish\n");
// 延时一段时间,等待电机停稳
Sleep(200);
/*********************6、进行Index捕获,可以和Home捕获一起使用,也可以不使用。不使用的话,此段代码可以直接删掉。***************************************/
// 启动index捕获
sRtn = GT_SetCaptureMode(AXIS, CAPTURE_INDEX);
commandhandler("GT_SetCaptureMode", sRtn);
// 设置当前位置+index 搜索距离为目标位置
sRtn = GT_SetPos(AXIS, (long)(prfPos + SEARCH_INDEX));
commandhandler("GT_SetPos", sRtn);
// 启动运动
sRtn = GT_Update(1<<(AXIS-1));
commandhandler("GT_Update", sRtn);
// 等待index捕获信号触发
printf("\nWaiting for index signal...\n");
do
{
// 读取轴状态
sRtn = GT_GetSts(AXIS, &status);
// 读取捕获状态
sRtn = GT_GetCaptureStatus(AXIS, &capture, &pos);
// 读取规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取编码器位置
sRtn = GT_GetEncPos(AXIS, &encPos);
printf("capture=%d prfPos=%-10.1lf encPos=%-10.1lf\r", capture, prfPos, encPos);
// 电机已经停止,说明整个搜索过程中 index 信号一直没有触发
if( 0 == ( status& 0x400 ) )
{
printf("\nno index found\n");
getch();
return 1;
}
// 如果index信号已经触发,则退出循环,捕获位置已经在pos变量中保存
}while( 0 == capture );
printf("\ncapture pos = %ld\n", pos);
// 设置捕获位置+index偏移量为目标位置
sRtn = GT_SetPos(AXIS, pos+ INDEX_OFFSET);
commandhandler("GT_SetPos", sRtn);
// 启动运动
sRtn = GT_Update(1<<(AXIS-1));
commandhandler("GT_Update", sRtn);
do
{
// 读取轴状态
sRtn = GT_GetSts(AXIS, &status);
// 读取规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取编码器位置
sRtn = GT_GetEncPos(AXIS, &encPos);
printf("status=0x%-8lx prfPos=%-10.1lf encPos=%-10.1lf\r", status, prfPos, encPos);
}while( status& 0x400 );
if( prfPos != pos+ INDEX_OFFSET)
{
printf("\nmove to index pos error\n");
getch();
return 2;
}
// home+index捕获完毕
printf("\nHome+Index finish\n");
printf("\nPress any key to set pos as 0...\n");
getch();
Sleep(200);
/************************6、 设置当前位置为零点**************************************/
sRtn = GT_ZeroPos(AXIS);

// 读取规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取编码器位置
sRtn = GT_GetEncPos(AXIS, &encPos);
// 读取axis规划位置
sRtn = GT_GetAxisPrfPos(AXIS, &axisPrfPos);
// 读取axis编码器位置
sRtn = GT_GetAxisEncPos(AXIS, &axisEncPos);
printf("\nprfPos=%-10.0lf encPos=%-10.0lf axisPrfPos=%-10.0lf axisEncPos=%-10.0lf",
prfPos, encPos, axisPrfPos, axisEncPos);
// 伺服关闭
sRtn = GT_AxisOff (AXIS);
printf("\nGT_AxisOff()=%d\n", sRtn);
getch();

二、探针(Probe)捕获

        探针捕获一般用于测量行业。当探针到达某个物体的边沿,控制器立刻捕获当前轴的位置并使轴停止。多测量边沿上的几个点,就可以准确定位物体。 控制器探针捕获的硬件接口是通用输入口 0 GPI0 )。当探针触发后,设置了探针捕获模式的轴将能得到当前轴的编码位置,若没有设置探针捕获的轴,调用 GT_GetCaptureStatus 时获取的捕获值为 0

例程: 该例程启动 1 轴的探针捕获,其余轴不启动。 当轴运动在搜索范围内, GPI0 高电平触发时,捕获才能成功。 

#define AXIS 1
#define SEARCH_PROBE -2000000 // 假设在该路程内能找到探针信号
int main(int argc, char* argv[])
{
short sRtn, capture;
TTrapPrm trapPrm;
long status, pos;
double prfPos, encPos;
// 打开运动控制器
sRtn = GT_Open();
// 复位运动控制器
sRtn = GT_Reset();
// 配置运动控制器
sRtn = GT_LoadConfig("test.cfg");
// 清除指定轴的报警和限位
sRtn =GT_ClrSts(AXIS);
// 驱动器使能
sRtn = GT_AxisOn(AXIS);
/*********************************1、启动Probe 捕获********************************/
sRtn = GT_SetCaptureMode(AXIS, CAPTURE_PROBE);
/********************************2、切换到点位运动模式并运动相关的轴***************/
sRtn = GT_PrfTrap(AXIS);
// 读取、设置点位模式运动参数
sRtn = GT_GetTrapPrm(AXIS, &trapPrm);
trapPrm.acc = 0.25;
trapPrm.dec = 0.25;
sRtn = GT_SetTrapPrm(AXIS, &trapPrm);
// 设置点位模式目标速度,即回原点速度
sRtn = GT_SetVel(AXIS, 10);
// 设置点位模式目标位置,即原点搜索距离
sRtn = GT_SetPos(AXIS, SEARCH_PROBE);
// 启动运动
sRtn = GT_Update(1<<(AXIS-1));
do
{
// 读取轴状态
sRtn = GT_GetSts(AXIS, &status);
// 读取捕获状态
sRtn =GT_GetCaptureStatus(AXIS, &capture, &pos);
// 读取规划位置
sRtn = GT_GetPrfPos(AXIS, &prfPos);
// 读取编码器位置
sRtn = GT_GetEncPos(AXIS, &encPos);
printf("capture=%d prfPos=%lf encPos=%lf\r", capture, prfPos, encPos);
// 如果运动停止,返回出错信息
if( 0 == ( status& 0x400 ) )
{
printf("\nno Probe found\n");
getch();
return 1;
}
/*******************************3、等待捕获触发并获取捕获位置**********************************/
}while( 0 == capture );
// 显示捕获位置
printf("\nProbe captured pos = %ld\n", pos);
// 伺服关闭
sRtn = GT_AxisOff (AXIS);
printf("\nGT_AxisOff()=%d\n", sRtn);
getch();
return 0;

三、HSIO (高速IO)捕获 


        运动控制器端子板共有 2 个位置比较输出通道(也即 HSIO 口), CN14 HSIO 1 6 脚差分输出 HSIO0 2 7 脚差分输出 HSIO1 5 脚是 5V 9 脚是地。 位置比较脉冲输出电压为 5V 。使用 GT_SetCaptureMode 指令,把某一编码器的捕获模式设置为 CAPTURE_HSIO0 CAPTURE_HSIO1 HSIO 作为捕获源时使用上升沿触发,即可在 HSIO0 HSIO1 口输出上升沿的同时锁存指定编码器的值。
long pBuf = 1000, pSts;
short pVal;
// 设置当1轴编码器位置为1000时HSIO0输出脉冲
GT_CompareData(1, // 对1轴进行位置比较输出
1, // 需要进行比较的数据源为外部编码器
0, // 到达比较位置后输出脉冲
0, // 初始状态
500, // 脉冲宽度为 500us
pBuf, // HSIO0 的比较位置缓冲区数据起始地址
1, // HSIO0 的比较位置缓冲区数据长度
NULL,
0);
// 设置 HSIO0 输出时,同时锁存 1、 2 轴编码器
sRtn = GT_SetCaptureMode(1, CAPTURE_HSIO0);
sRtn = GT_SetCaptureMode(2, CAPTURE_HSIO0);
// 当编码器到达 1000 脉冲时锁存 1、 2 轴编码器,此时可使用以下代码查询捕获情况
sRtn = GT_GetCaptureStatus(1, &pSts, &pVal);
sRtn = GT_GetCaptureStatus(2, &pSts, &pVal);

四、重复捕获

        使用 GT_SetCaptureRepeat 指令可以进行多次捕获,即重复捕获。设置重复捕获后,当捕获源被触发时,控制器会锁存指定编码器的值,并重新等待捕获信号再次触发。每个轴每次最多可以连续锁存 256 个位置值,捕获次数可调用 GT_GetCaptureRepeatStatus 查询,捕获到的位置值可以使用 GT_GetCaptureRepeatPos 获得

short *pSts;
long pValue[256];
unsignedlong pClk;
/******************1、若需使用 HSIO0 作为捕获源,设置 1 轴编码器重复捕获 150 次,可调用以下指令**************************/
sRtn = GT_SetCaptureMode(1, CAPTURE_HSIO0);
sRtn = GT_SetCaptureRepeat(1, 150);

/******************2、在运动过程中,可随时调用以下指令查询捕获状态以及捕获位置值**************************************/
sRtn = GT_GetCaptureRepeatStatus(1, &pSts);

/******************3、假设调用 GT_GetCaptureRepeatPos 指令时 HSIO0 已输出 38 个脉冲,********************************
*******************则 pSts 的值为38,再 调用以下指令可读取已捕获的 38 个位置值。**************************************/
sRtn =GT_GetCaptureRepeatPos(1, &pValue, 1, 38);

// 若再次调用 GT_GetCaptureRepeatPos 指令时 HSIO0 已输出 48 个脉冲,可以调用以下指令 读取第 39 个到 48 个位置值。
sRtn = GT_GetCaptureRepeatPos(1, &pValue, 39, 10);




你可能感兴趣的:(运动控制卡)