直线插补算法

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

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

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


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


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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NextOffset=0;//每一步要走的偏差判断;  
  2.   
  3. if(X >=0 && Y>0)  //ONE  
  4. {   
  5.      Number_XY=(X+Y)*50/12.5;  
  6.       
  7.      while(1)  
  8.      {  
  9.              if(NextOffset >= 0 && X0 != X)  
  10.              {  
  11.                 NextOffset=NextOffset-Y;  
  12.                 X0=X0+1;  
  13.                 Y0=Y0;  
  14.       
  15.                 for(i=0;i<4;i++)  
  16.                 {  
  17.                     P0=Clockwise[i]; //left  
  18.                     Delay30ms();  
  19.                     Number_XY--;  
  20.                 }  
  21.              }  
  22.                
  23.              if(NextOffset < 0  && Y0 != Y)  
  24.              {  
  25.                 NextOffset=NextOffset+X;  
  26.                 X0=X0;  
  27.                 Y0=Y0+1;  
  28.           
  29.                 for(i=0;i<4;i++)  
  30.                 {  
  31.                     P2=Clockwise[i];     //down;  
  32.                     Delay30ms();  
  33.                     Number_XY--;  
  34.   
  35.                 }  
  36.              }   
  37.              if(Number_XY <= 0)  
  38.              break;  
  39.                
  40.              if(X0==X && Y0==Y)  
  41.              Number_XY--;  
  42.      }  
  43. }  
  44.   
  45.   
  46. if(X < 0 && Y>=0)   //TWO  
  47. {  
  48.     X=abs(X);  
  49.     Number_XY=(X+Y)*50/12.5;  
  50.      while(1)  
  51.      {  
  52.              if(NextOffset >= 0 && X0 != X)  
  53.              {  
  54.                 NextOffset=NextOffset-Y;  
  55.                 X0=X0+1;  
  56.                 Y0=Y0;  
  57.       
  58.                 for(i=0;i<4;i++)  
  59.                 {  
  60.                     P0=Anti_Clockwise[i]; //RIGHT  
  61.                     Delay30ms();  
  62.                     Number_XY--;  
  63.                 }  
  64.              }  
  65.                
  66.              if(NextOffset < 0  && Y0 != Y)  
  67.              {  
  68.                 NextOffset=NextOffset+X;  
  69.                 X0=X0;  
  70.                 Y0=Y0+1;  
  71.           
  72.                 for(i=0;i<4;i++)  
  73.                 {  
  74.                     P2=Clockwise[i];     //down;  
  75.                     Delay30ms();  
  76.                     Number_XY--;  
  77.   
  78.                 }  
  79.              }   
  80.                
  81.              if(Number_XY <= 0)  
  82.              break;  
  83.                
  84.              if(X0==X && Y0==Y)  
  85.              Number_XY--;  
  86.      }  
  87. }  
  88.   
  89.   
  90. if(X <=0 && Y<0//THREE  
  91. {  
  92.     X=abs(X);  
  93.     Y=abs(Y);  
  94.     Number_XY=(X+Y)*50/12.5;  
  95.      while(1)     
  96.      {  
  97.              if(NextOffset >= 0 && X0 != X)  
  98.              {  
  99.                 NextOffset=NextOffset-Y;  
  100.                 X0=X0+1;  
  101.                 Y0=Y0;  
  102.       
  103.                 for(i=0;i<4;i++)  
  104.                 {  
  105.                     P0=Anti_Clockwise[i]; //RIGHT  
  106.                     Delay30ms();  
  107.                     Number_XY--;  
  108.                 }  
  109.              }  
  110.                
  111.              if(NextOffset < 0  && Y0 != Y)  
  112.              {  
  113.                 NextOffset=NextOffset+X;  
  114.                 X0=X0;  
  115.                 Y0=Y0+1;  
  116.           
  117.                 for(i=0;i<4;i++)  
  118.                 {  
  119.                     P2=Anti_Clockwise[i]; //UP  
  120.                     Delay30ms();  
  121.                     Number_XY--;  
  122.   
  123.                 }  
  124.              }   
  125.              if(Number_XY <= 0)  
  126.              break;  
  127.               
  128.             if(X0==X && Y0==Y)  
  129.              Number_XY--;  
  130.      }  
  131. }  
  132.   
  133.   
  134. if(X >0 && Y <=0 )//FOUR  
  135. {  
  136.     Y=abs(Y);  
  137.     Number_XY=(X+Y)*50/12.5;  
  138.      while(1)  
  139.      {  
  140.              if(NextOffset >= 0 && X0 != X)  
  141.              {  
  142.                 NextOffset=NextOffset-Y;  
  143.                 X0=X0+1;  
  144.                 Y0=Y0;  
  145.       
  146.                 for(i=0;i<4;i++)  
  147.                 {  
  148.                     P0=Clockwise[i]; //left  
  149.                     Delay30ms();  
  150.                     Number_XY--;  
  151.                 }  
  152.              }  
  153.                
  154.              if(NextOffset < 0  && Y0 != Y)  
  155.              {  
  156.                 NextOffset=NextOffset+X;  
  157.                 X0=X0;  
  158.                 Y0=Y0+1;  
  159.           
  160.                 for(i=0;i<4;i++)  
  161.                 {  
  162.                     P2=Anti_Clockwise[i]; //UP  
  163.                     Delay30ms();  
  164.                     Number_XY--;  
  165.   
  166.                 }  
  167.              }   
  168.              if(Number_XY <= 0)  
  169.             break;  
  170.               
  171.             if(X0==X && Y0==Y)  
  172.              Number_XY--;  
  173.      }  
  174. }  

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

[objc]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. NextOffset = Dfr_X*Dfr_X + Dfr_Y*Dfr_Y -  Radius*Radius;//偏差初始值;  
  2.   
  3. while(1)  //one  
  4. {  
  5.     if(NextOffset >= 0  && Dfr_X != 0)  
  6.     {  
  7.       NextOffset = NextOffset - 22 * Dfr_X + 1;  
  8.         Dfr_X=Dfr_X-1;  
  9.         Dfr_Y=Dfr_Y;  
  10.           
  11.         for(i=0;i<4;i++)  
  12.         {  
  13.             P0=Anti_Clockwise[i]; //    right  
  14.             Delay30ms();  
  15.             Count_Step++;  
  16.         }  
  17.     }  
  18.       
  19.     if(NextOffset < 0 && Dfr_Y != Radius)  
  20.     {     
  21.         NextOffset = NextOffset +2*Dfr_Y + 1;     
  22.         Dfr_X=Dfr_X;  
  23.         Dfr_Y=Dfr_Y+1;  
  24.           
  25.         for(i=0;i<4;i++)  
  26.         {  
  27.             P2=Clockwise[i];   // down        
  28.             Delay30ms();  
  29.         }     
  30.     }  
  31.       
  32.     if(Dfr_X==0 )  
  33.     break;  
  34. }     
  35.   
  36.   
  37. while(1//two  
  38. {     
  39. if(NextOffset >= 0  && Dfr_Y != 0)  
  40.     {    
  41.         NextOffset = NextOffset -2*Dfr_Y + 1;  
  42.         Dfr_X=Dfr_X;  
  43.         Dfr_Y=Dfr_Y-1;  
  44.            
  45.         for(i=0;i<4;i++)  
  46.         {  
  47.             P2=Anti_Clockwise[i];  //right            
  48.             Delay30ms();  
  49.   
  50.         }  
  51.           
  52.     }     
  53.       
  54.     if(NextOffset < 0 && Dfr_X != Radius)  
  55.     {    
  56.         NextOffset = NextOffset +2*Dfr_X + 1;  
  57.         Dfr_X=Dfr_X+1;  
  58.         Dfr_Y=Dfr_Y;  
  59.         for(i=0;i<4;i++)  
  60.         {  
  61.             P0=Anti_Clockwise[i]; // up           
  62.             Delay30ms();  
  63.         }  
  64.     }  
  65.       
  66.     if( Dfr_Y==0 )  
  67.     break;  
  68. }     
  69.   
  70. while(1)  //three  
  71. {  
  72.     if(NextOffset >= 0  && Dfr_X != 0)  
  73.     {  
  74.       NextOffset = NextOffset - 2*Dfr_X + 1;  
  75.         Dfr_X=Dfr_X-1;  
  76.         Dfr_Y=Dfr_Y;  
  77.         for(i=0;i<4;i++)  
  78.         {  
  79.             P0=Clockwise[i]; //left       
  80.             Delay30ms();  
  81.         }  
  82.     }  
  83.   
  84.     if(NextOffset < 0 && Dfr_Y != Radius)  
  85.     {     
  86.         NextOffset = NextOffset +2*Dfr_Y + 1;     
  87.         Dfr_X=Dfr_X;  
  88.         Dfr_Y=Dfr_Y+1;  
  89.         for(i=0;i<4;i++)  
  90.         {  
  91.             P2=Anti_Clockwise[i];   //up      
  92.             Delay30ms();  
  93.   
  94.         }  
  95.           
  96.     }     
  97.       
  98.     if(Dfr_X==0 )  
  99.     break;  
  100. }     
  101.   
  102. while(1//four  
  103. {     
  104. if(NextOffset >= 0  && Dfr_Y != 0)  
  105.     {    
  106.         NextOffset = NextOffset -2*Dfr_Y + 1;  
  107.         Dfr_X=Dfr_X;  
  108.         Dfr_Y=Dfr_Y-1;  
  109.            
  110.         for(i=0;i<4;i++)  
  111.         {  
  112.             P2=Clockwise[i]; //down;  
  113.             Delay30ms();  
  114.         }         
  115.     }     
  116.       
  117.     if(NextOffset < 0 && Dfr_X != Radius)  
  118.     {    
  119.         NextOffset = NextOffset +2*Dfr_X + 1;  
  120.         Dfr_X=Dfr_X+1;  
  121.         Dfr_Y=Dfr_Y;  
  122.         for(i=0;i<4;i++)  
  123.         {  
  124.             P0=Clockwise[i]; //left   
  125.             Delay30ms();  
  126.         }  
  127.     }  
  128.       
  129.     if(Dfr_Y==0 )  
  130.     break;  
  131.   
  132. }  
  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
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'); ``` 这些算法可以根据实际需求进行调整和扩展,以满足不同的应用场景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值