下载贤集网APP入驻自媒体
1. 引言
通常对于伺服控制的机械设备对于对回零是一个必备的过程,但由于工程师对回零的理解偏差,导致软件设计的问题进而造成系统回零的不稳定,从而影响机械系统的定位精度。固高的回零的功能是一种开放指令系统,可以根据客户不同的需要定制不同的回零方式,但其机械和电气系统结构的基本构成是相同的。
2. 回零点的目的
自动化机械设备是为取代人工来处理对速度,精度有较高要求,并希望能确保获取一致性好的产品而诞生的。为了保证产品的一致性,必须首先确保机械设备的参考原始零位的精准性,这样才能保证在长时间工作时生产出的产品的一致性,而零点是机械系统的参考基准,所以必须保证参考基准的精确和唯一性,回零的目的是确保机械系统零点的重复定位精度在设计范围内,或者说确保单轴或多轴构成的X-Y-Z坐标系的零点在整个自动化设备的机械系统中的位置偏差在设计允许范围内。
3. 机电系统回零点的基本结构
典型单轴直线系统的主要构成部件有: 电机(步进电机或伺服),滚珠丝杆(或皮带,齿轮),滑动导轨,运动平台,左右限位感应器,感应片和零点感应器,以这些主要部件为基础,构成的单轴基本结构如下图一:
4.固高控制器的Home回零过程
说明:Home捕获模式下,当出现Home下降沿时,FPGA立刻锁存Home开关所对应的编码器位置,同时将该编码器轴的捕获状态标志位置1,然后退出Home捕获模式。 当Home捕获触发以后,重新启动Home捕获时,会自动清除对应轴的捕获触发标志位。
5. 固高控制器的Home相关指令
6. 固高控制器的Home例程
#include "stdafx.h"
#include "windows.h"
#include "conio.h"
#include "gts.h"
#define AXIS 1
#define SEARCH_HOME -200000
#define HOME_OFFSET -2000
int main(int argc, char* argv[])
{
short rtn, capture;
TTrapPrm trapPrm;
long status,pos;
double prfPos, encPos, axisPrfPos, axisEncPos;
// 打开运动控制器
rtn = GT_Open();
printf("GT_Open()=%d\n",rtn);
// 复位运动控制器
rtn = GT_Reset();
printf("GT_Reset()=%d\n",rtn);
// 配置运动控制器
rtn = GT_LoadConfig("test.cfg");
printf("GT_LoadConfig()=%d\n",rtn);
// 清除指定轴的报警和限位
rtn = GT_ClrSts(AXIS);
printf("GT_ClrSts()=%d\n",rtn);
// 驱动器使能
rtn = GT_AxisOn(AXIS);
printf("GT_AxisOn()=%d\n",rtn);
// 启动Home捕获
rtn = GT_SetCaptureMode(AXIS,CAPTURE_HOME);
printf("GT_SetCaptureMode()=%d\n",rtn);
// 切换到点位运动模式
rtn = GT_PrfTrap(AXIS);
printf("GT_PrfTrap()=%d\n",rtn);
// 读取点位模式运动参数
rtn = GT_GetTrapPrm(AXIS,&trapPrm);
printf("GT_GetTrapPrm()=%d\n",rtn);
trapPrm.acc = 0.25;
trapPrm.dec = 0.25;
// 设置点位模式运动参数
rtn = GT_SetTrapPrm(AXIS,&trapPrm);
printf("GT_SetTrapPrm()=%d\n",rtn);
// 设置点位模式目标速度,即回原点速度
rtn = GT_SetVel(AXIS,10);
printf("GT_SetVel()=%d\n",rtn);
// 设置点位模式目标位置,即原点搜索距离
rtn = GT_SetPos(AXIS,SEARCH_HOME);
printf("GT_SetPos()=%d\n",rtn);
// 启动运动
rtn = GT_Update(1<<(AXIS-1));
printf("GT_Update()=%d\n",rtn);
printf("\nWaiting for home signal...\n");
do {
// 读取轴状态
rtn = GT_GetSts(AXIS,&status);
// 读取捕获状态
rtn = GT_GetCaptureStatus(AXIS,&capture,&pos);
// 读取规划位置
rtn = GT_GetPrfPos(AXIS,&prfPos);
// 读取编码器位置
rtn = GT_GetEncPos(AXIS,&encPos);
printf("capture=%d prfPos=%lf encPos=%lf\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);
// 运动到“捕获位置+偏移量”
rtn = GT_SetPos(AXIS, pos + HOME_OFFSET);
printf("GT_SetPos()=%d\n",rtn);
// 在运动状态下更新目标位置
rtn = GT_Update(1<<(AXIS-1));
printf("GT_Update()=%d\n",rtn);
do {
// 读取轴状态
rtn = GT_GetSts(AXIS,&status);
// 读取规划位置
rtn = GT_GetPrfPos(AXIS,&prfPos);
// 读取编码器位置
rtn = GT_GetEncPos(AXIS,&encPos);
printf("status=0x%-8lx prfPos=%-10.1lf encPos=%-10.1lf\r",status,prfPos,encPos);
// 等待运动停止
}while( status & 0x400 );
// 检查是否到达“Home捕获位置+偏移量”
if( prfPos != pos+HOME_OFFSET )
{
printf("\nmove to home pos error\n");
getch();
return 2;
}
printf("\nHome finish\n");
// 延时一段时间,等待电机停稳
Sleep(200);
printf("\nPress any key to set pos as 0...\n");
getch();
// 位置清零
rtn = GT_ZeroPos(AXIS);
printf("GT_ZeroPos()=%d\n",rtn);
// 读取规划位置
rtn = GT_GetPrfPos(AXIS,&prfPos);
// 读取编码器位置
rtn = GT_GetEncPos(AXIS,&encPos);
// 读取axis规划位置
rtn = GT_GetAxisPrfPos(AXIS,&axisPrfPos);
// 读取axis编码器位置
rtn = GT_GetAxisEncPos(AXIS,&axisEncPos);
printf("\nprfPos=%-10.0lf encPos=%-10.0lf axisPrfPos=%-10.0lf axisEncPos=%-10.0lf", prfPos, encPos, axisPrfPos, axisEncPos);
getch();
return 0;