直线插补算法

直线插补算法,就是刀具或绘笔每走一步都要和给定的数据进行比对,看该点在次点的上方或者是下方,从而决定下一步该怎么走。

即机床数控系统依照一定方法确定刀具运动轨迹的过程。也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点的方法,也称为“数据点的密化”;数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。

单片机控制步进电机运作,实物图奉上:


插补算法坐标给进的如下图:


C语言控制步进电机画直线的代码如下:

				NextOffset=0;//每一步要走的偏差判断;
			
				if(X >=0 && Y>0)  //ONE
				{ 
					 Number_XY=(X+Y)*50/12.5;
					
					 while(1)
					 {
							 if(NextOffset >= 0 && X0 != X)
							 {
								NextOffset=NextOffset-Y;
								X0=X0+1;
								Y0=Y0;
					
								for(i=0;i<4;i++)
								{
									P0=Clockwise[i]; //left
									Delay30ms();
									Number_XY--;
								}
							 }
							 
							 if(NextOffset < 0  && Y0 != Y)
							 {
								NextOffset=NextOffset+X;
								X0=X0;
								Y0=Y0+1;
						
								for(i=0;i<4;i++)
								{
									P2=Clockwise[i];     //down;
									Delay30ms();
									Number_XY--;

								}
							 } 
							 if(Number_XY <= 0)
							 break;
							 
							 if(X0==X && Y0==Y)
							 Number_XY--;
					 }
				}
				
				
				if(X < 0 && Y>=0)   //TWO
				{
					X=abs(X);
					Number_XY=(X+Y)*50/12.5;
					 while(1)
					 {
							 if(NextOffset >= 0 && X0 != X)
							 {
								NextOffset=NextOffset-Y;
								X0=X0+1;
								Y0=Y0;
					
								for(i=0;i<4;i++)
								{
									P0=Anti_Clockwise[i]; //RIGHT
									Delay30ms();
									Number_XY--;
								}
							 }
							 
							 if(NextOffset < 0  && Y0 != Y)
							 {
								NextOffset=NextOffset+X;
								X0=X0;
								Y0=Y0+1;
						
								for(i=0;i<4;i++)
								{
									P2=Clockwise[i];     //down;
									Delay30ms();
									Number_XY--;

								}
							 } 
							 
							 if(Number_XY <= 0)
							 break;
							 
							 if(X0==X && Y0==Y)
							 Number_XY--;
					 }
				}
				
			
				if(X <=0 && Y<0) //THREE
				{
					X=abs(X);
					Y=abs(Y);
					Number_XY=(X+Y)*50/12.5;
					 while(1)	
					 {
							 if(NextOffset >= 0 && X0 != X)
							 {
								NextOffset=NextOffset-Y;
								X0=X0+1;
								Y0=Y0;
					
								for(i=0;i<4;i++)
								{
									P0=Anti_Clockwise[i]; //RIGHT
									Delay30ms();
									Number_XY--;
								}
							 }
							 
							 if(NextOffset < 0  && Y0 != Y)
							 {
								NextOffset=NextOffset+X;
								X0=X0;
								Y0=Y0+1;
						
								for(i=0;i<4;i++)
								{
									P2=Anti_Clockwise[i]; //UP
									Delay30ms();
									Number_XY--;

								}
							 } 
							 if(Number_XY <= 0)
							 break;
							
							if(X0==X && Y0==Y)
							 Number_XY--;
					 }
				}
				

				if(X >0 && Y <=0 )//FOUR
				{
					Y=abs(Y);
					Number_XY=(X+Y)*50/12.5;
					 while(1)
					 {
							 if(NextOffset >= 0 && X0 != X)
							 {
								NextOffset=NextOffset-Y;
								X0=X0+1;
								Y0=Y0;
					
								for(i=0;i<4;i++)
								{
									P0=Clockwise[i]; //left
									Delay30ms();
									Number_XY--;
								}
							 }
							 
							 if(NextOffset < 0  && Y0 != Y)
							 {
								NextOffset=NextOffset+X;
								X0=X0;
								Y0=Y0+1;
						
								for(i=0;i<4;i++)
								{
									P2=Anti_Clockwise[i]; //UP
									Delay30ms();
									Number_XY--;

								}
							 } 
							 if(Number_XY <= 0)
							break;
							
							if(X0==X && Y0==Y)
							 Number_XY--;
					 }
				}
				
	}

C语言圆弧插补代码如下:

	NextOffset = Dfr_X*Dfr_X + Dfr_Y*Dfr_Y -  Radius*Radius;//偏差初始值;

	while(1)  //one
	{
		if(NextOffset >= 0  && Dfr_X != 0)
		{
		  NextOffset = NextOffset - 2 * Dfr_X + 1;
			Dfr_X=Dfr_X-1;
			Dfr_Y=Dfr_Y;
			
			for(i=0;i<4;i++)
			{
				P0=Anti_Clockwise[i]; //	right
				Delay30ms();
				Count_Step++;
			}
		}
		
		if(NextOffset < 0 && Dfr_Y != Radius)
		{	
			NextOffset = NextOffset +2*Dfr_Y + 1;   
			Dfr_X=Dfr_X;
			Dfr_Y=Dfr_Y+1;
			
			for(i=0;i<4;i++)
			{
				P2=Clockwise[i];   // down		
				Delay30ms();
			}	
		}
		
		if(Dfr_X==0 )
		break;
	}	
	
	
	while(1) //two
	{	
	if(NextOffset >= 0  && Dfr_Y != 0)
		{  
			NextOffset = NextOffset -2*Dfr_Y + 1;
			Dfr_X=Dfr_X;
			Dfr_Y=Dfr_Y-1;
			 
			for(i=0;i<4;i++)
			{
				P2=Anti_Clockwise[i];  //right			
				Delay30ms();

			}
			
		}	
		
		if(NextOffset < 0 && Dfr_X != Radius)
		{  
			NextOffset = NextOffset +2*Dfr_X + 1;
			Dfr_X=Dfr_X+1;
			Dfr_Y=Dfr_Y;
			for(i=0;i<4;i++)
			{
				P0=Anti_Clockwise[i]; // up			
				Delay30ms();
			}
		}
		
		if( Dfr_Y==0 )
		break;
	}	
	
	while(1)  //three
	{
		if(NextOffset >= 0  && Dfr_X != 0)
		{
		  NextOffset = NextOffset - 2*Dfr_X + 1;
			Dfr_X=Dfr_X-1;
			Dfr_Y=Dfr_Y;
			for(i=0;i<4;i++)
			{
				P0=Clockwise[i]; //left		
				Delay30ms();
			}
		}

		if(NextOffset < 0 && Dfr_Y != Radius)
		{	
			NextOffset = NextOffset +2*Dfr_Y + 1;   
			Dfr_X=Dfr_X;
			Dfr_Y=Dfr_Y+1;
			for(i=0;i<4;i++)
			{
				P2=Anti_Clockwise[i];   //up	
				Delay30ms();

			}
			
		}	
		
		if(Dfr_X==0 )
		break;
	}	
	
	while(1) //four
	{	
	if(NextOffset >= 0  && Dfr_Y != 0)
		{  
			NextOffset = NextOffset -2*Dfr_Y + 1;
			Dfr_X=Dfr_X;
			Dfr_Y=Dfr_Y-1;
			 
			for(i=0;i<4;i++)
			{
				P2=Clockwise[i]; //down;
				Delay30ms();
			}		
		}	
		
		if(NextOffset < 0 && Dfr_X != Radius)
		{  
			NextOffset = NextOffset +2*Dfr_X + 1;
			Dfr_X=Dfr_X+1;
			Dfr_Y=Dfr_Y;
			for(i=0;i<4;i++)
			{
				P0=Clockwise[i]; //left	
				Delay30ms();
			}
		}
		
		if(Dfr_Y==0 )
		break;
	
	}	



Matlab中的直线插补算法可以通过使用插值函数来实现。插值函数可以根据给定的起点和终点,以及插补点的数量,生成一系列均匀分布的插补点,从而实现直线插补。 在Matlab中,常用的直线插补算法有线性插值和样条插值两种。 1. 线性插值: 线性插值是一种简单的插值方法,它假设插补点之间的曲线是直线。在Matlab中,可以使用`linspace`函数生成均匀分布的插补点,然后使用`interp1`函数进行线性插值。具体步骤如下: ```matlab % 定义起点和终点 start_point = [x1, y1]; end_point = [x2, y2]; % 设置插补点数量 num_points = 10; % 生成均匀分布的插补点 x_interp = linspace(start_point(1), end_point(1), num_points); y_interp = linspace(start_point(2), end_point(2), num_points); % 进行线性插值 interp_points = [x_interp', y_interp']; ``` 2. 样条插值: 样条插值是一种更精确的插值方法,它通过拟合曲线来实现插补。在Matlab中,可以使用`interp1`函数进行样条插值。具体步骤如下: ```matlab % 定义起点和终点 start_point = [x1, y1]; end_point = [x2, y2]; % 设置插补点数量 num_points = 10; % 生成均匀分布的插补点 x_interp = linspace(start_point(1), end_point(1), num_points); y_interp = linspace(start_point(2), end_point(2), num_points); % 进行样条插值 interp_points = interp1([start_point(1), end_point(1)], [start_point(2), end_point(2)], x_interp, 'spline'); ``` 这些算法可以根据实际需求进行调整和扩展,以满足不同的应用场景。
评论 35
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值