2轴直线插补程序分析

来源:互联网 发布:linux重启网络命令 编辑:程序博客网 时间:2024/04/29 23:53

1、数据采样插补法

在CNC系统中较广泛采用的另一种插补计算方法即所谓数据采样插补法,或称为时间分割法。它尤其适合于闭环和半闭环以直流或交流电机为执行机构的位置采样控制系统。这种方法是把加工一段直线或圆弧的整段时间细分为许多相等的时间间隔,称为单位时间间隔(或插补周期)。每经过一个单位时间间隔就进行一次插补计算,算出在这一时间间隔内各坐标轴的进给量,边计算边加工,直至加工终点。

与基准脉冲插补法不同,采用数据采样法插补时,在加工某一直线段或圆弧段的加工指令中必须给出加工进给速度v,先通过速度计算,将进给速度分割成单位时间间隔的插补进给量F(或称为轮廓步长),又称为一次插补进给量。根据运动轨迹与各坐标轴的几何关系,就可求出各轴载一个插补周期内的插补进给量,按时间间隔以增量形式给各轴送出一个插补增量,通过驱动部分是机床完成预定的轨迹。

由上述分析可知,这类算法的核心问题是如何计算各坐标轴的增长数,有了前一周期末的动点位置值和本次插补周期内的坐标增长段,就很容易计算出本插补周期末的动点命令位置坐标值。对应直线插补来讲,插补所行程的轮廓步长子线段(即增长段)与个顶的直线重合,不会造成轨迹误差。而在圆弧插补中,寅要用切线或选线来逼近圆弧,因而不可避免的灰带来轮廓误差。其中切线近似又有较大的轮廓误差而不大采用,常用的是选线逼近法。

2、DDA直线插补

设我们要对xy平面上的直线进行脉冲分配,直线起点为坐标原点,终点为E(Xe,Ye)。假定Vx,Vy分别表示动点在x和y方向的移动速度,则在x和y方向上的移动距离微笑增量DeltaX和DeltaY应为

DeltaX=Vx*DeltaT

DeltaY=Vy*DeltaT

对应直线函数来说,Vx和Vy是常数,则下式成立

DeltaX/Xe = DeltaY/Ye = K                           K为比例系数

在DeltaT时间内,x和y位移增量的参数方程为

DeltaX = Vx * DeltaT = K*Xe*DeltaT

DeltaY = Vy * DeltaT = K*Ye*DeltaT

动点从原点走向终点的过程,可以看做是各坐标每经过一个单位时间间隔DeltaT分别以增量K*Xe和K*Ye同时累加的结果。经过m次累加后,xy分别都到达终点。推导可以得出,比例系数K和累加次数m的关系是互为倒数。因为m必须是整数,所以K一定是小数。在选取K时主要考虑每次增量DeltaX或DeltaY不大于1,以保证坐标轴上每次分配进给脉冲不超过一个单位步距。

假设直线与X轴的夹角为A,每次插补进给量为F,单轴进给速度为V,并且Xe>Ye,则

tgA = Ye/Xe                    cosA = 1/sqr(1+tgA*tgA)

DeltaX = F * cosA            DeltaY = F * sinA

F = DeltaX / cosA = V * DeltaT / cosA = V * DeltaT *sqr(1+tgA*tgA) = V * DeltaT * sqr(1+(Ye*Ye)/(Xe*Xe))

V和DeltaT为已知量,以此可以计算出xy轴的各移动分量

上面是网络上一些插补算法说明的摘要。在我看来DDA插补算法是一个基准算法,其他算法是在此基础上进行整合优化的结果。

3、程序分析

    //双轴插补数据准备
    ax=labs(value1);
    ay=labs(value2);                -------------- value12是xy需要输出的脉冲数,将直线描述在第一象限
    actx=ax,acty=ay;
    ax/=5,ay/=5;-------------------------------- 换算为移动距离,单位为1um,5个脉冲移动1um
    actx=actx-ax*5,acty=acty-ay*5;-------- 计算剩余脉冲数,
    ...............
    if (ax>ay){dda=ax,a=ay;}---------------- 找出长轴,
    else {dda=ay,a=ax;}
    b=dda;
    if (b>0)a=a/b;-------------------------------- if(b>0)恒成立,计算tgA
    a=sqrt(1.0+a*a)*3.0;---------------------- 计算插补进给量F,3实际上是在单轴上的移动速度为3um/ms
    b=0x4a8;------------------------------PC中8253定时器的计数值,好像1193比较精确一点吧,8253频率1.19318MHz
    a=b/a;------------------------------------------ 计算进给量为1um时的计数值
    jog_time_const=a;---------------------------计数值基准
    accdec_scal=2;-------------------------------加速度倍数
    sumx=sumy=dda/2;-------------------------聪明的算法,sum为移动后的剩余量,在此=dda/2相当于0.5
    step_controler=ax+ay; --------------------xy移动总的长度
    ...............
    //定时中断执行插补
    sumx+=ax;
    sumy+=ay;
    if (sumx>=dda)
    {
        sumx-=dda;
        x=x_axis;
    }
    else x=0;
    if (sumy>=dda)
    {
        sumy-=dda;
        y=y_axis;
    }
    else  y=0;

上面的中断程序的伪代码如下

lastX += DeltaX = F * cosA

lastY + = DeltaY = F * sinA

if (lastX > 1) { X mov; lastX –=1}

if(lastY > 1) { Y mov; lastY –=1}

由于采用定时中断,所以DeltaT=1.推导后可以得出

lastX += Vx*DeltaT = K*Xe*DeltaT=Xe/m

lastY += Ye/m

这里需要浮点数的计算,所以作者很聪明的进行了优化,避免了浮点数计算提高了速度。

 

进一步的优化处理:定时中断程序中,可以设置长轴标志位,描述长轴;长轴每次中断都会输出一个脉冲,这样定时中断程序的计算量又减小了。

原创粉丝点击