如何编写顺时针圆弧的逐点比较法插补算法程序

如何编写顺时针圆弧的逐点比较法插补算法程序,第1张

这是我自己编的一个程序仿真通过,控制核心板是51单片机可以参考:

//第一象限顺弧

#include<reg51.h>

//#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=0x01int ky=0x10//

/*延时函数*/

void display(int x)

{

int i,y

for(i=xi>0i--)

for(y=100y>0y--)

}

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-2*yi+1

xi=xi

yi=yi-1

}

else

{

xzRotateStep() //+x向走一步

F=F+2*xi+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-2*xi+1

xi=xi-1

yi=yi

}

else

{

yfRotateStep() //-y向走一步

F=F+2*yi+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-2*yi+1

xi=xi

yi=yi-1

}

else

{

xfRotateStep() //-x向走一步

F=F+2*xi+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-2*xi+1

xi=xi-1

yi=yi

}

else

{

yfRotateStep() //-y向走一步

F=F+2*yi+1

xi=xi

yi=yi+1

}

count-- k++

P2=k

}

while(count) //计数为0?

}

void xzRotateStep()

{

int i

switch(kx)

{

case 0x01: kx=P1=0x02display(200)for(i=0i<20000i++)break

case 0x02: kx=P1=0x04display(200)for(i=0i<20000i++) break

case 0x04: kx=P1=0x01display(200)for(i=0i<20000i++) break

}

}

void xfRotateStep()

{

int i

switch(kx)

{

case 0x01: kx=P1=0x04display(200)for(i=0i<20000i++)break

case 0x04: kx=P1=0x02display(200)for(i=0i<20000i++) break

case 0x02: kx=P1=0x01display(200)for(i=0i<20000i++) break

}

}

void yzRotateStep()

{

int j

switch(ky)

{

case 0x10: ky=P1=0x20display(200)for(j=0j<20000j++)break

case 0x20: ky=P1=0x40display(200)for(j=0j<20000j++)break

case 0x40: ky=P1=0x10display(200)for(j=0j<20000j++)break

}

}

void yfRotateStep()

{

int j

switch(ky)

{

case 0x10: ky=P1=0x40display(200)for(j=0j<20000j++)break

case 0x40: ky=P1=0x20display(200)for(j=0j<20000j++)break

case 0x20: ky=P1=0x10display(200)for(j=0j<20000j++)break

}

}

数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。

插补常用方法:

1、逐点比较法:由运动偏差产生信息,通过不断比较刀具与被加工零件轮廓之间的相对位置,决定刀具的进给。

2、数据采样法:这种方法先根据编程速度,将给定轮廓轨迹按插补周期分割为插补进给段,即用一系列首尾相连的微小线段来逼近给定曲线。

3、数字积分法:数字积分法具有运算速度快、脉冲分配均匀、易于实现多坐标联动及描绘平面各种函数曲线的特点,应用比较广泛。

扩展资料

插补分类:

1、直线插补:在此方式中,两点间的插补沿着直线的点群来逼近,沿此直线控制刀具的运动。所谓直线插补就是只能用于实际轮廓是直线的插补方式。

2、圆弧插补:圆这是一种插补方式,在此方式中,根据两端点间的插补数字信息,计算出逼近实际圆弧的点群,控制刀具沿这些点运动,加工出圆弧曲线。

参考资料

百度百科-插补

百度百科-插补运算


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11147761.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存