固高运动控制卡学习8 –高速硬件捕获
捕获即当某一种信号触发时, 运动控制器能准确记录触发时刻轴的位置信息。 控制器提供四种捕获方式, Home 捕获, Index 捕获、 探针(Probe)捕获和 HSIO 捕获。
一、Home 捕获, Index 捕获
例程: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);
