直线插补(Line Interpolation)为车床上常用的一种插补方式,在此方式中,两点间的插补沿着直线的点群来逼近,沿此直线控制刀具的运动。
所谓直线插补就是只能用于实际轮廓是直线的插补方式(如果不是直线,也可以用逼近的方式把曲线用一段线段去逼近,从而每一段线段就可以用直线插补了)。
首先假设在实际轮廓起始点处沿x方向走一小段(一个脉冲当量),发现终点在实际轮廓的下方,则下一条线段沿y方向走一小段,此时如果线段终点还在实际轮廓下方,则继续沿y方向走一小段,直到在实际轮廓上方以后,再向x方向走一小段,依次循环类推。
直到到达轮廓终点为止这样,实际轮廓就由一段段的折线拼接而成,虽然是折线,但是如果我们每一段走刀线段都非常小(在精度允许范围内),那么此段折线和实际轮廓还是可以近似地看成相同的曲线的。
扩展资料
G01为数控加工技术指令中的直线插补指令。直线插补指令的功能为刀具以程序中设定的进给速度,从某一点出发,直线移动到目标点。
在该模式下,刀具以两个端点间最短的距离从一个位置移动到另一个位置,这是非常重要的编程功能,主要应用于轮廓加工和成型加工中。任何斜线运动(比如倒角、斜切、角、锥体等)必须以这种模式编程,以进行精确加工。
G01倒角控制功能可以在两相邻轨迹的程序段之间插入直线倒角或圆弧倒角。
参考资料来源:百度百科-G01
参考资料来源:百度百科-插补
这是我自己编的一个程序仿真通过,控制核心板是51单片机可以参考:
//第一象限顺弧
#include<reg51h>
//#define xe 10 //终点横坐标
//#define ye 0 //终点纵坐标
//#define x0 10 //起点横坐标
//#define y0 0 //起点纵坐标
//#define R 10 //半径
void xzRotateStep(); // X向走一步
void yzRotateStep(); // -x向走一步
void xfRotateStep(); // y向走一步
void yfRotateStep(); // -y向走一步
void d1shun(); //第一象限顺弧
void d4shun(); //第二象限顺弧
void d3shun(); //第三象限顺弧
void d2shun(); //第四象限顺弧
int kx=0x01; int ky=0x10; //
/延时函数/
void display(int x)
{
int i,y;
for(i=x;i>0;i--)
for(y=100;y>0;y--);
}
void main()
{
d1shun();
d4shun();
d3shun();
d2shun();
}
void d1shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
int kx=
F=xi=0;
yi=10;
count=20;
do{
if(F>=0)
{
yfRotateStep(); //-y向走一步
F=F-2yi+1;
xi=xi;
yi=yi-1;
}
else
{
xzRotateStep(); //+x向走一步
F=F+2xi+1;
xi=xi+1;
yi=yi;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?
}
void d4shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
F=xi=10;
yi=0;
count=20;
do{
if(F>=0)
{
xfRotateStep(); //-x向走一步
F=F-2xi+1;
xi=xi-1;
yi=yi;
}
else
{
yfRotateStep(); //-y向走一步
F=F+2yi+1;
xi=xi;
yi=yi+1;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?
}
void d3shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
F=xi=0;
yi=-10;
count=20;
do{
if(F>=0)
{
yzRotateStep(); //+y向走一步
F=F-2yi+1;
xi=xi;
yi=yi-1;
}
else
{
xfRotateStep(); //-x向走一步
F=F+2xi+1;
xi=xi+1;
yi=yi;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?
}
void d2shun()
{
int F,xi,yi,count ;// (xi,yi)为动点坐标,F为偏差值,count为计数值。
int k=0;
F=xi=-10;
yi=0;
count=20;
do{
if(F>=0)
{
xzRotateStep(); //-x向走一步
F=F-2xi+1;
xi=xi-1;
yi=yi;
}
else
{
yfRotateStep(); //-y向走一步
F=F+2yi+1;
xi=xi;
yi=yi+1;
}
count--; k++;
P2=k;
}
while(count) ; //计数为0?
}
void xzRotateStep()
{
int i;
switch(kx)
{
case 0x01: kx=P1=0x02;display(200);for(i=0;i<20000;i++); break;
case 0x02: kx=P1=0x04;display(200);for(i=0;i<20000;i++) ;break;
case 0x04: kx=P1=0x01;display(200);for(i=0;i<20000;i++) ;break;
}
}
void xfRotateStep()
{
int i;
switch(kx)
{
case 0x01: kx=P1=0x04;display(200);for(i=0;i<20000;i++); break;
case 0x04: kx=P1=0x02;display(200);for(i=0;i<20000;i++) ;break;
case 0x02: kx=P1=0x01;display(200);for(i=0;i<20000;i++) ;break;
}
}
void yzRotateStep()
{
int j ;
switch(ky)
{
case 0x10: ky=P1=0x20;display(200);for(j=0;j<20000;j++);break;
case 0x20: ky=P1=0x40;display(200);for(j=0;j<20000;j++);break;
case 0x40: ky=P1=0x10;display(200);for(j=0;j<20000;j++);break;
}
}
void yfRotateStep()
{
int j ;
switch(ky)
{
case 0x10: ky=P1=0x40;display(200);for(j=0;j<20000;j++);break;
case 0x40: ky=P1=0x20;display(200);for(j=0;j<20000;j++);break;
case 0x20: ky=P1=0x10;display(200);for(j=0;j<20000;j++);break;
}
}
限于篇幅,程序省去 按键子程序 延时子程序 液晶初始化及相关程序、字符部分
#include<reg52h>#include<intrinsh>
#define mode 0x81 // 方式0,A口、B口输出,C口高4位输出,低4位输入
# include "stdioh"
# include "stringh"
# include "mathh"
xdata unsigned char PA _at_ 0x7f00;
xdata unsigned char PB _at_ 0x7f01;
xdata unsigned char PC _at_ 0x7f02;
xdata unsigned char caas _at_ 0x7f03; //控制字
sbit P32=P3^2;
sbit P33=P3^3;
sbit P35=P3^5;
#define uchar unsigned char
#define uint unsigned int
unsigned char h,Pos ;
unsigned int R,NX,NY;
unsigned char key;
code unsigned char KeyTable[] = { // 键码定义
0x0f, 0x0b, 0x07, 0x03,
0x0e, 0, 0x06, 0x02,
0x0d, 0x09, 0x05, 0x01,
0x0c, 0x08, 0x04, 0x00
};
code unsigned char LEDMAP[] = { // 八段管显示码
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07,
0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71
};
unsigned char Code_ ; // 字符代码寄存器
#define PD1 61 // 122/2 分成左右两半屏(122x32)
unsigned char Column;
unsigned char Page_ ; // 页地址寄存器 D1,DO:页地址
unsigned char Code_ ; // 字符代码寄存器
unsigned char Command; // 指令寄存器
unsigned char LCDData; // 数据寄存器
xdata unsigned char CWADD1 _at_ 0x1cff; // 写指令代码地址(E1)
xdata unsigned char DWADD1 _at_ 0x1eff; // 写显示数据地址(E1)
xdata unsigned char CRADD1 _at_ 0x1dff; // 读状态字地址(E1)
xdata unsigned char DRADD1 _at_ 0x1fff; // 读显示数据地址(E1)
xdata unsigned char CWADD2 _at_ 0x3cff; // 写指令代码地址(E2)
xdata unsigned char DWADD2 _at_ 0x3eff; // 写显示数进地址(E2)
xdata unsigned char CRADD2 _at_ 0x3dff; // 读状态字地址(E2)
xdata unsigned char DRADD2 _at_ 0x3fff; // 读显示数据地址(E2)
//----------------------液晶-----------------
// 清屏
// 中文显示程序 /
/直线 插 补8/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=50;y>0;y--);
}
void zhengx()
{
PA=0x00;
delay(10);
PA=0x01;
delay(10);
}
void fux()
{
PA=0x02;
delay(10);
PA=0x03;
delay(10);
}
void zhengy()
{
PB=0x00;
delay(10);
PB=0x10;
delay(10);
}
void fuy()
{
PB=0x20;
delay(10);
PB=0x30;
delay(10);
}
void zhixian(int NX,int NY)
{int FM, NXY, XOY,ZF,z;
FM=0;
{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0&&P32!=0&&P33!=0;NXY--)
{ {if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0;NXY--)
{ if(FM>=0)
{if(XOY==1||XOY==4)
{ZF=1;
zhengx();
}
else
{ZF=2;
fux();
}
FM=FM-fabs(NY);
}
else
{if(XOY==1||XOY==2)
{
ZF=3;
zhengy();
}
else
{ZF=4;
fuy();
}
FM=FM+fabs(NX);
}
}
for(z=0;z<200;z++)
{P35 = 0;
delay(10);
P35 = 1;
delay(10);
}
}
}
以上就是关于数控编程中直线插补指的是什么全部的内容,包括:数控编程中直线插补指的是什么、如何编写顺时针圆弧的逐点比较法插补算法程序、求51单片机可以用的直线插补的c程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)