superrf 发表于 2011-8-26 14:18:04

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

闲来无事,写段直线插补算法,做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");
}

xiaozhou 发表于 2011-8-27 01:42:34

看不明白

superrf 发表于 2011-8-27 08:30:24

采用逐点比较法,用控制台输出结果
http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671594ZIQS8Q.JPG
(原文件名:1.JPG)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671595SCL8BO.JPG
(原文件名:2.JPG)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671596Z2ZJTS.JPG
(原文件名:3.JPG)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671597NB5GD2.JPG
(原文件名:4.JPG)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671598XDUDJR.JPG
(原文件名:5.JPG)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671599CUKNDU.JPG
(原文件名:6.JPG)

http://cache.amobbs.com/bbs_upload782111/files_44/ourdev_671600U9YR5P.JPG
(原文件名:轨迹.JPG)

steel 发表于 2011-8-27 09:25:49

两个坐标开环的CNC系统中应用比较普遍,不能实现多轴联动

superrf 发表于 2011-8-27 09:30:51

这是两轴直线插补算法,改动一下可以驱动XY,YZ,XZ平面直线运动

xiaomage_2000 发表于 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;
   }
}

superrf 发表于 2011-8-27 12:54:55

回复【5楼】xiaomage_2000
-----------------------------------------------------------------------

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

p4s5j6 发表于 2011-8-27 13:03:13

bucuo

xiaomage_2000 发表于 2011-8-27 13:15:02

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

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

ljgvictory 发表于 2011-8-27 14:45:05

mark

kupica 发表于 2011-8-27 23:48:53

mark

sunmy 发表于 2011-8-28 00:08:52

不错顶顶

superrf 发表于 2011-8-31 16:10:03

寻找加减速算法,希望高手们提供些资料,梯形,S形的都行

hongguoguo 发表于 2011-8-31 16:51:43

关注一下

bingshuihuo888 发表于 2011-8-31 21:54:18

mark

Tomas_Yung 发表于 2011-9-1 19:06:12

准备试试!

MCU678 发表于 2011-9-15 02:55:34

mark

julian_ 发表于 2011-9-24 12:02:04

看来是个软件高手了。看不懂虽然。

siatliuliu 发表于 2011-10-21 14:14:06

mark

zyzsorry 发表于 2012-11-6 08:07:03

哥哥。写程序给个注释啊?眼睛花了。有点累。

zhiyiyunmeng@ 发表于 2012-11-6 08:34:32

楼主你好,可以给我们广大爱好者普及下什么是插补吗。

E-WALKER 发表于 2014-7-14 12:55:37

不错,今天刚好看到这

xiangbin099 发表于 2015-4-25 09:37:03

值得学习……

kaixiang 发表于 2015-7-13 22:38:41

高手就是不一样 谢谢

3DA502 发表于 2015-7-13 22:55:11

数字积分法         

kaixiang 发表于 2016-1-31 14:28:50

谢谢分享谢谢

crl6 发表于 2016-2-25 21:19:45

逐点比较法 插补怎样?

codefish 发表于 2016-2-25 23:01:06

谢谢分享。

advarx21ic 发表于 2017-8-13 13:49:38

谢谢分享!

苹果520 发表于 2019-1-23 15:36:41

谢谢分享···
页: [1]
查看完整版本: 写段直线插补算法,做CNC控制可用,欢迎拍砖