直线插补算法

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

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

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

直线插补算法_第1张图片

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

直线插补算法_第2张图片

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;
	
	}	



你可能感兴趣的:(C语言,步进电机,圆弧插补,直线插补)