运动控制插补--逐点比较法
直线插补
在数控机床运作的时候,如果我们想让机床的钻头走一条直线,他的钻头在微观的视角里面实际上走的不是直线,而是呈现一个阶梯状态的路径,在走的每一步中,根据偏差预定轨迹,在x方向或者y方向给一个很小的脉冲,接下来是运用直线插补的逐点比较法进行插补计算。
假设我们起点是O(0,0),终点是A(6,4)
有这样一个公式
F>=0,F=F-|ye|
F<0 ,F=F+|Xe|
这里面(xe,ye)就是终点的坐标(6,4)。
有这几个参数:
| 步数 | 偏差判别 | 坐标进给 | 偏差计算 | 终点判断E |
初始E=x+y=6+4=10
第0步,E=10,在原点,所以偏差计算F(0,0)=0
第1步,之前没有偏差,F>0,x方向进给,偏差计算F=F-|ye|=0-4=-4,E=9
第2步,这里由于第一步只给了x方向的进给,就开始有偏差了,偏差为-4,偏差判别F<0,y方向向上给一个进给,进行偏差计算,F=F+|xe|=-4+6=2,终点E=8
第3步,偏差判别F>0,x方向给进给,F=F-|ye|=2-4=-2,E=7
第4步,F=-2<0,Y方向给进给,F=F+|xe|=-2+6=4,E=6
第5步,F=4>0,x方向给进给,F=F-|ye|=4-4=0,E=5
第6步,F=0>=0,x方向给进给,F=F-|ye|=0-4=-4,E=4
第7步,F=-4<0,Y方向给进给,F=F+|xe|=-4+6=2,E=3
第8步,F=2>0,x方向给进给,F=F-|ye|=2-4=-2,E=2
第9步,F=-2<0,Y方向给进给,F=F+|xe|=-2+6=4,E=1
第10步,F=4>0,x方向给进给,F=F-|ye|=4-4=0,E=0
以上就是计算过程,将结果汇总制成图表:
| 步数 | 偏差判别 | 坐标进给 | 偏差计算 | 终点判断E |
| 0 | F(0,0)=0 | 10 | ||
| 1 | F=0 | +x | F=F-|ye|=0-4=-4 | 9 |
| 2 | F<0 | +y | F=F+|xe|=-4+6=2 | 8 |
|
3 | F>0 | +x | F=F-|ye|=2-4=-2 | 7 |
| 4 | F=-2<0 | +y | F=F+|xe|=-2+6=4 | 6 |
| 5 | F=4>0 | +x | F=F-|ye|=4-4=0 | 5 |
| 6 | F=0>=0 | +x | F=F-|ye|=0-4=-4 | 4 |
| 7 | F=-4<0 | +y | F=F+|xe|=-4+6=2 | 3 |
| 8 | F=2>0 | +x | F=F-|ye|=2-4=-2 | 2 |
| 9 | F=-2<0 | +y | F=F+|xe|=-2+6=4 | 1 |
| 10 | F=4>0 | +x | F=F-|ye|=4-4=0 | 0 |
最终运动效果如下,直线是预期轨迹,折线是实际运动轨迹

算法实现
static int F=0;
int x,y,E;
void gx();//x方向给脉冲
void gy();//y方向给脉冲
int main(){
//x,y预处理,负数取反
if(x<0),x=std::abs(x);
if(y<0),y=std::abs(y);
E=x+y;
while(E>=0)
{
if(F>=0){
gx();
F=F-y;
}
if(F<0){
gy();
F=F=x;
}
E--;
}
return 0;
}
我这个算法实现有局限性,即起始点是在原点,线段在坐标系的第二象限,如果是在其他位置,xy的进给方向和所在坐标轴的正负相同,如果线段不是从原点开始需要将线段通过计算移到原点。
圆弧插补
圆弧插补的原理和直线的相似下面是计算公式分为顺时针和逆时针
//方向一顺二逆三顺四逆
F>=0,F=F-2|yi|+1
F<0 ,F=F+2|xi|+1
//方向一逆二正三逆四正
F>=0,F=F-2|xi|+1
F<0 ,F=F+2|yi|+1

更多推荐
所有评论(0)