搜索
bottom↓
回复: 29

写段直线插补算法,做CNC控制可用,欢迎拍砖

[复制链接]

出0入0汤圆

发表于 2011-8-26 14:18:04 | 显示全部楼层 |阅读模式
闲来无事,写段直线插补算法,做CNC控制可用,欢迎拍砖
#define AXIS_X 0
#define AXIS_Y 1
#define AXIS_Z 2

typedef struct _line_t
{
  int32_t x1;
  int32_t y1;
  int32_t x2;
  int32_t y2;
}line_t;

typedef struct
{
  int32_t x;
  int32_t y;
  int32_t z;
}state_t;
typedef struct
{
  int32_t f;
  int8_t dir_x;
  int8_t dir_y;
  int8_t dir_z;
  int32_t delta_x;
  int32_t delta_y;
  int32_t delta_z;
  int32_t len;
  int32_t pos;
}line_drv_t;


line_drv_t drv;
state_t cnc_state;

void draw_moveto(x2,y2)
{
  drv.f = 0;
  if(x2>cnc_state.x)
  {
    drv.delta_x = x2 - cnc_state.x;
    drv.dir_x = 1;
  }else
  {
    drv.delta_x = cnc_state.x - x2;
    drv.dir_x = -1;
  }
  if(y2>cnc_state.y)
  {
    drv.delta_y = y2 - cnc_state.y;
    drv.dir_y = 1;
  }else
  {
    drv.delta_y = cnc_state.y - y2;
    drv.dir_y = -1;
  }

  drv.len = drv.delta_x + drv.delta_y;
  drv.pos = 0;
  //if(drv.f >= 0)
  drv.f = drv.f - drv.delta_y;
}
void cnc_step(uint8_t axis)
{
  switch(axis)
  {
    case AXIS_X:
      cnc_state.x += drv.dir_x;
      break;
    case AXIS_Y:
      cnc_state.y += drv.dir_y;
      break;
  }
  printf("%d,%d\n",cnc_state.x,cnc_state.y);
}
void draw_move()
{
  if(drv.f >= 0)
  {
    //move x
    cnc_step(AXIS_X);
    drv.f = drv.f - drv.delta_y;
  }else
  {
    //move y
    cnc_step(AXIS_Y);
    drv.f = drv.f + drv.delta_x;
  }
  drv.pos++;
}
void cnc_int()
{
  cnc_state.x = 100;
  cnc_state.y = 100;
  cnc_state.z = 0;
}
void test_cnc()
{
  cnc_int();
  draw_moveto(0,0);
  while(drv.pos < drv.len)
  {
    draw_move();
  }
  printf("cnc\n");
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2011-8-27 01:42:34 | 显示全部楼层
看不明白

出0入0汤圆

 楼主| 发表于 2011-8-27 08:30:24 | 显示全部楼层
采用逐点比较法,用控制台输出结果

(原文件名:1.JPG)


(原文件名:2.JPG)


(原文件名:3.JPG)


(原文件名:4.JPG)


(原文件名:5.JPG)


(原文件名:6.JPG)


(原文件名:轨迹.JPG)

出0入0汤圆

发表于 2011-8-27 09:25:49 | 显示全部楼层
两个坐标开环的CNC系统中应用比较普遍,不能实现多轴联动

出0入0汤圆

 楼主| 发表于 2011-8-27 09:30:51 | 显示全部楼层
这是两轴直线插补算法,改动一下可以驱动XY,YZ,XZ平面直线运动

出0入0汤圆

发表于 2011-8-27 11:50:16 | 显示全部楼层
不错顶顶!我刚按你的这个思路也写了个,请你给看看?
void line (u8 F,s32 X0,s32 Y0,s32 X1,s32 Y1)//F:进给速度 X0,Y0:X,Y轴起点坐标 X1,Y1:X,Y轴终点坐标
{
  u8 x,y;
  u32 i,j;
  x=1;
  y=1;
  while(!(x|y)) //如果x,y都为0就说明位置到了
  {
   if(X1>X0) //终点坐标大于起点坐标
   {
    XS=1;   //方向信号为高,电机正转
    x=1;
    }
   else if (X1<X0)//起点坐标大于终点坐标
   {
    XS=0;   //方向信号为0,电机反转
    x=1;
    }
   else x=0; //起点坐标等于终点坐标,X轴不动
   
   if(Y1>Y0)
   {
    YS=1;    //方向信号为高,电机正转
    y=1;
    }
   else if(Y1<Y0)
    {
     YS=0;   //方向信号为0,电机反转
        y=1;
        }
   else y=0;//起点坐标等于终点坐标,Y轴不动
   
   i=X1*Y0-X0*Y1;
   if(i>=0)
   {
    XP=1;   //脉冲输出引脚
    X0++;
    }
    else
    {
    YP=1;   //脉冲输出引脚
    Y0++;
    }

   delay(F); //吧速度值先在主程序转为倒数,然后直接当做延时值传递给延时函数
   X0=0;   //脉冲引脚拉低,一个脉冲输出完成。
   Y0=0;
   }
}

出0入0汤圆

 楼主| 发表于 2011-8-27 12:54:55 | 显示全部楼层
回复【5楼】xiaomage_2000
-----------------------------------------------------------------------

写段测试程序试试,我那段程序通过控制台输出,查看结果是不是预期输出就行
draw_move();是准备中断中调用的,通过修改中断触发周期就可以控制速度

出0入0汤圆

发表于 2011-8-27 13:03:13 | 显示全部楼层
bucuo

出0入0汤圆

发表于 2011-8-27 13:15:02 | 显示全部楼层
回复【6楼】superrf  
回复【5楼】xiaomage_2000
-----------------------------------------------------------------------
写段测试程序试试,我那段程序通过控制台输出,查看结果是不是预期输出就行
draw_move();是准备中断中调用的,通过修改中断触发周期就可以控制速度

-----------------------------------------------------------------------
哦,呵呵,回头试试看,多谢你的资料!

出0入0汤圆

发表于 2011-8-27 14:45:05 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-27 23:48:53 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-8-28 00:08:52 | 显示全部楼层
不错顶顶

出0入0汤圆

 楼主| 发表于 2011-8-31 16:10:03 | 显示全部楼层
寻找加减速算法,希望高手们提供些资料,梯形,S形的都行

出0入0汤圆

发表于 2011-8-31 16:51:43 | 显示全部楼层
关注一下

出0入0汤圆

发表于 2011-8-31 21:54:18 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-1 19:06:12 | 显示全部楼层
准备试试!

出0入0汤圆

发表于 2011-9-15 02:55:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-9-24 12:02:04 | 显示全部楼层
看来是个软件高手了。看不懂虽然。

出0入0汤圆

发表于 2011-10-21 14:14:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-11-6 08:07:03 | 显示全部楼层
哥哥。写程序给个注释啊?眼睛花了。有点累。

出0入0汤圆

发表于 2012-11-6 08:34:32 来自手机 | 显示全部楼层
楼主你好,可以给我们广大爱好者普及下什么是插补吗。

出0入0汤圆

发表于 2014-7-14 12:55:37 | 显示全部楼层
不错,今天刚好看到这

出0入0汤圆

发表于 2015-4-25 09:37:03 | 显示全部楼层
值得学习……

出0入0汤圆

发表于 2015-7-13 22:38:41 | 显示全部楼层
高手就是不一样 谢谢

出0入0汤圆

发表于 2015-7-13 22:55:11 | 显示全部楼层
数字积分法         

出0入0汤圆

发表于 2016-1-31 14:28:50 | 显示全部楼层
谢谢分享谢谢

出0入0汤圆

发表于 2016-2-25 21:19:45 来自手机 | 显示全部楼层
逐点比较法 插补怎样?

出0入0汤圆

发表于 2016-2-25 23:01:06 | 显示全部楼层
谢谢分享。

出0入0汤圆

发表于 2017-8-13 13:49:38 | 显示全部楼层
谢谢分享!

出0入0汤圆

发表于 2019-1-23 15:36:41 | 显示全部楼层
谢谢分享···
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-23 18:38

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表