您好,欢迎来电子发烧友网! ,新用户?[免费注册]

您的位置:电子发烧友网>电子元器件>芯片引脚图>

xc1004运动芯片怎么样?xc1004四轴SPI运动控制芯片详解(含例程)

2020年10月22日 10:32 兰峰控制技术w75815895 作者:兰峰控制技术w75 用户评论(0

Xc1004四轴SPI运动控制芯片 

 

 

   概述

   SPI通讯,仅需使用10条指令便可完成复杂工作。

芯片四轴输出,多个芯片通过不同片选脚可控制达120轴。

独立轴e版本支持最大脉冲输出频率1.2MHz独立输出。

插补轴f版本支持四轴,三轴,二轴,一轴直线插补,二轴圆弧插补,螺旋插补,支持连续插补,支持速度前瞻。

脉冲输出使用脉冲+方向方式。

各版本拥有128条运动指令缓存空间。

LQFP48封装,引脚输入输出3.3V,可兼容5V。

 

性能参数

 

供电电源

3.3VDC   电流100MA

温度范围

-40 ~ +105

封装

LQFP48

IO输入

3.3v ,兼容5v

IO输出

3.3v   TTL输出

控制轴数

  4

脉冲频率

  e版:1.2MHZ     f版:400kHZ  

运动性能

e版:单轴运行,指令缓存

f版:1-4轴直线插补 ,圆弧插补,螺旋插补,支持指令缓存,支持连续插补

通信速度

SPI:10Mbps

 

 

 

引脚排列

 

引脚号

引脚名称

引脚功能说明

1

VDD

电源正极+3.3V

2

Y4

4号输出口

3

Y5

5号输出口

4

Y6

6号输出口

5

A

空引脚

6

B

空引脚

7

RST

复位引脚,低电平有效

8

VSS

电源负极

9

VDD

电源正极+3.3V

10

LMT1-

1轴负限位或原点,低电平有效

11

LMT2-

2轴负限位或原点,低电平有效

12

LMT3-

3轴负限位或原点,低电平有效

13

LMT4-

4轴负限位或原点,低电平有效

14

LMT1+

1轴正限位,低电平有效

15

LMT2+

2轴正限位,低电平有效

16

LMT3+

3轴正限位,低电平有效

17

LMT4+

4轴正限位,低电平有效

18

STOP

急停引脚,低电平有效

19

NC

空引脚

20

VSS

电源负极

21

Y0

0号输出口

22

Y1

1号输出口

23

VSS

电源负极

24

VDD

电源正极+3.3V

25

CS

SPI通信使能脚,低电平有效

26

SCK

SPI通信时钟脚

27

SO

SPI通信数据输出脚,接单片机数据输入脚

28

SI

SPI通信数据输入脚,接单片机数据输出脚

29

P1

第1轴脉冲信号

30

TXD

串口数据发送

31

RXD

串口数据接收

32

D1

第1轴方向信号

33

Y2

2号输出口

34

Y3

3号输出口

35

VSS

电源负极

36

VDD

电源正极+3.3V

37

SIGN

工作状态指示,闲时慢速交替变化,轴运行时快速交替变化

38

P2

第2轴脉冲信号

39

D2

第2轴方向信号

40

P3

第3轴脉冲信号

41

D3

第3轴方向信号

42

NC

空引脚

43

NC

空引脚

44

VSS

电源负极

45

P4

第4轴脉冲信号

46

D4

第4轴方向信号

47

VSS

电源负极

48

VDD

电源正极+3.3V

 

SPI通讯协议

 

芯片与单片机使用SPI通讯,单片机作为主机,芯片为从机。CPHA=0,CPOL=0,高位在前,SPI数据宽度为8位。空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将CS引脚置低,整条指令发送完成后必须将CS置高。

每条指令间隔1MS以上

 

SPI时序图如下:

 

SPI通讯指令

 

设置轴速度(e版本f版本共用指令)

 

发送:

功能码

补充0

轴号

加速度

运行速度

0x01

0x00

1字节

4字节

4字节

 

部分参数解释:

轴号(1,2,3,4) 

加减速    加减速为:  e版(1-480000)(Hz/s2)  f版(1-1600000)(Hz/s2)

运行速度  运行频率为:e版(1-1200000)(Hz)     f版(1-400000)(Hz)

 

要点:e版本轴号有效,速度为对应轴的速度。f版本由于共用一个插补核心,轴号设为任意值都为所有轴速度,如需改变当前运动指令里的速度需在当前指令前重设速度。加速度最大可设为运行速度4倍。

 

 

 

设置轴逻辑位置(e版本f版本共用指令)

 

发送:

 

功能码

补充0

轴号

位置

0x12

0x00

1字节

4字节

 

部分参数解释:

轴号(1,2,3,4)   1-4:1-4轴

位置      轴逻辑位置,范围(-268435455~+268435455

 

 

轴停止(e版本f版本共用指令)

发送:

 

功能码

轴号

模式

0x17

1字节

1字节

      

部分参数解释:

 

轴号(1,2,3,4)       1-4: 1-4轴 

模式(0,1,2)        0:急停并清空后面缓存的指令   1:减速停不清空后面缓存的指令    2:急停不清空后面缓存的指令

要点:f版本由于共用一个插补核心,轴号设为任意值都会让所用轴停止

 

各轴逻辑位置和状态(e版本f版本共用指令)

发送:

 

功能码

数据0

0x04

最多19个字节

        

返回:

起始码

各轴运行状态

缓存数量

1轴坐标

2轴坐标

3轴坐标

4轴坐标

0x00

1字节

2字节

4字节

4字节

4字节

4字节


 

部分参数解释:

 

 

各轴运行状态(转为8位二进制数)

 

第0位为e版1轴状态     0:停止中  1:运行中

第1位为e版2轴状态     0:停止中  1:运行中

第2位为e版3轴状态     0:停止中  1:运行中

第3位为e版4轴状态     0:停止中  1:运行中

 

第5位为f版插补核各轴状态    0:停止中  1:运行中

 

缓存数量(0-128)   还未运行的缓存指令数

 

各轴坐标        范围(-268435455~+268435455

 

 

要点:返回字节按功能顺序排列,由于SPI工作模式是一边发送一边接收,如只需取前面字节的数据,为节省通讯时间,可只发送对应字节的数据0。例如只需获取各轴运行状态,发送2个字节0便可。轴运行状态只是轴的瞬时状态,不能用来指示圆弧指令是否完成。可通过读取缓存数量来判断缓存区指令是否完成。一条圆弧指令会动态占用最多120条缓存空间。

设置特殊功能(f版本专用指令)

 

发送:

 

功能码

补充0

功能

0xfa

0x00

1字节

 

 

 

部分参数解释:

 

当功能写入0xfc,缓存内运动指令暂停。

当功能写入0xfd,取消缓存内运动指令暂停。

以下指令会自动进入缓存区并排队执行:

 

回原点(e版本f版本共用指令)

发送:

 

功能码

补充0

轴号

进入原点速度

离开原点速度

0x1a

0x00

1字节

4字节

4字节

 

 

 

 

 

部分参数解释:

 

轴号(1,2,3,4)

 

进入原点速度  运行频率为:值(1-400000)(Hz)

 

离开原点速度  运行频率为:值(1-400000)(Hz)

 

要点:回原点指令会自动生成一段负脉冲和一段正脉冲。以进入原点速度输出负脉冲时,左限位原点开关生效时自动减速停;随后以离开原点速度输出正脉冲,离开原点限位开关时自动急速停止,急停后可作为原点。回原点指令不宜和其它运动指令混合在一起放入缓存里,回原点过程应单独存在。

 

 

四轴直线插补(f版本专用指令)

发送:

 

 

功能码

X轴号

Y轴号

Z轴号

E轴号

X脉冲数

Y脉冲数

Z脉冲数

E脉冲数

补充0

运动方式

0x0a

1字节

1字节

1字节

1字节

4字节

4字节

4字节

4字节

0x00

1字节

 

 

部分参数解释:

X轴号(1,2,3,4)

Y轴号(1,2,3,4)

Z轴号(1,2,3,4)

E轴号(1,2,3,4)

 

X脉冲(-268435455~+268435455

Y脉冲(-268435455~+268435455

Z脉冲(-268435455~+268435455

E脉冲(-268435455~+268435455

 

运动方式(0,1)   0:绝对位移  1:相对位移 

 

要点:当只需要少于四轴做插补时,不用的轴号和脉冲数写0。

 

二轴圆弧插补(f版本专用指令)

发送:

 

功能码

X轴号

Y轴号

终点坐标X

终点坐标Y

圆心坐标X

圆心坐标Y

运动方式1

运动方式2

0x0c

1字节

1字节

4字节

4字节

4字节

4字节

1字节

1字节

 

 

 

 

部分参数解释:

X轴号(1,2,3)

Y轴号(1,2,3)

终点坐标         圆弧插补的终点位置,范围-268435455~+268435455

圆心坐标         圆弧插补的圆心点位置,范围-268435455~+268435455

运动方式1        0:逆时针插补   1:顺时针插补   2:三点定圆弧

运动方式2        0:绝对位移  1:相对位移 

 

要点:圆弧各坐标必须能构成正常的圆弧。圆弧插补指令会根据圆弧参数动态占用缓存空间。当运动方式1设为2时,为三点定圆弧模式,圆心坐标参数设为圆弧的中间点坐标。

 

 

三轴螺旋插补(f版本专用指令)

发送:

 

功能码

X轴号

Y轴号

Z轴号

终点坐标X

终点坐标Y

脉冲数

圆心坐标X

圆心坐标Y

运动方式1

运动方式2

0x0d

1字节

1字节

1字节

4字节

4字节

字节

4字节

4字节

1字节

1字节

 

 

部分参数解释:

X轴号    (1,2,3)   圆弧X轴

Y轴号    (1,2,3)   圆弧Y轴

Z轴号    (1,2,3)   螺旋轴

终点坐标     圆弧插补的终点位置,范围-268435455~+268435455

圆心坐标     圆弧插补的圆心点位置,范围-268435455~+268435455

运动方式1     0:逆时针插补   1:顺时针插补 

运动方式2     0:绝对位移  1:相对位移 

 

等待延时(e版本f版本共用指令)

 

发送:

 

功能码

延时量

0x0e

2字节

 

 

部分参数解释:

 

延时量(1-10000)MS

 

要点:等待延时是指等待所设延时量后才执行后面的指令。

 

 

写输出口状态(e版本f版本共用指令)

发送:

 

功能码

输出端口

输出状态

0x03

1字节

1字节

 

 

部分参数解释:

 

输出端口号   (0-6)    Y0-Y6

输出状态     (0,1)    0:输出低电平   1:输出高电平

 

 

单轴运行(e版本专用指令)

 

发送:

功能码

轴号

运动方式

脉冲数量

0x02

1字节

1字节

4字节

 

 

部分参数解释:

 

轴号(1,2,3,4)    独立轴运动的轴号

脉冲数量 (-268435455~+268435455)输出的脉冲数 >0:正方向移动   <0:负方向移动

运动方式(0,1)   0:绝对位移  1:相对位移  

 

 

等待轴停止(e版本专用指令)

发送:

 

功能码

轴号

0x0f

1字节

 

 

部分参数解释:

 

轴号(1,2,3,4)   1,2,3,4:独立轴1-4轴    

 

要点:等待轴停止是指在对应轴停止之前一直等待,直到轴停止后才执行后面的指令。独立轴不会自动等待轴运行完成后才执行下一条指令。插补轴会自动等待轴运行完成后才执行下一条指令。

电路连接

 

芯片引脚输出最大电流15Ma,输入灌电流最大25Ma。如多芯片组网,各芯片的SCK,SO,SI引脚并联,CS脚独立受单片机控制。单片机SPI数据输入脚接芯片SO脚,需内部或外部上拉。单片机SPI数据输出脚接芯片SI脚。芯片,单片机,差分输出连接参考图:

 

运动控制编程参考

通过51单片机控制运动控制芯片的SPI通信程序示例。

(来自产品官网:http://www.lf-control.com

 

#include

#include

//MCU: stc8f2k08s2      

sfr P0M1 = 0x93;

sfr P0M0 = 0x94;

sfr P1M1 = 0x91;

sfr P1M0 = 0x92;

sfr P2M1 = 0x95;

sfr P2M0 = 0x96;

sfr P3M1 = 0xb1;

sfr P3M0 = 0xb2;

sfr P4M1 = 0xb3;

sfr P4M0 = 0xb4;

sfr P5M1 = 0xC9;

sfr P5M0 = 0xCA;

sfr P6M1 = 0xCB;

sfr P6M0 = 0xCC;

sfr P7M1 = 0xE1;

sfr P7M0 = 0xE2;

sfr P5 = 0xC8;

sfr     SPSTAT      =   0xcd;

sfr     SPCTL       =   0xce;

sfr     SPDAT       =   0xcf;

sfr     IE2         =   0xaf;

sfr     AUXR        =   0x8e;

sfr     T2H         =   0xd6;

sfr     T2L         =   0xd7;

sfr     P_SW2       =   0xba;

 

 

 

 

#define CKSEL           (*(unsigned char volatile xdata *)0xfe00)

#define CKDIV           (*(unsigned char volatile xdata *)0xfe01)

#define IRC24MCR        (*(unsigned char volatile xdata *)0xfe02)

#define XOSCCR          (*(unsigned char volatile xdata *)0xfe03)

#define IRC32KCR        (*(unsigned char volatile xdata *)0xfe04)

 

 

//#define FOSC            16000000UL          //使用外部16M晶振

 #define FOSC            24000000UL           //使用内部24M晶振

#define BRT             (65536 - FOSC / 115200 / 4)        //定义115200波特率

 

sbit b2    =   P1^1;

sbit b1    =   P5^5;

sbit led   =   P3^5;

 

sbit cs3    = P3^3;

sbit cs2    = P3^2;

sbit cs1    = P1^2;

sbit sck = P1^5;

sbit in     = P1^4;

sbit out = P1^3;

 #define SPI3_CSHIGH cs3=1 // CS3

#define SPI3_CSLOW   cs3=0

 

 #define SPI2_CSHIGH cs2=1 // CS2

#define SPI2_CSLOW   cs2=0

 

 #define SPI1_CSHIGH cs1=1 // CS1

#define SPI1_CSLOW   cs1=0

 

#define SPI_SCKHIGH sck=1 //SCK

#define SPI_SCKLOW sck=0

#define SPI_OUTHIGH out=1

#define SPI_OUTLOW  out=0//MOSI

#define SPI_IN in//MISO

 

unsigned char inbuf[50];      

unsigned char b1_state=0;

 

 void initial()

{

 P1M1 =      0;

 P1M0 =    0x2c;        // 引脚模拟通信时,MOSI,SCK, CS    设为推挽输出

 

 SPI1_CSHIGH;      //CS不使用时设为高

 SPI2_CSHIGH;

 SPI3_CSHIGH;

 SPI_SCKLOW;//SCK空闲状态一定要为低电平。

 

 

 //SPCTL = 0xd0;                               //使能SPI主机模式

 //SPSTAT = 0xc0;                              //清中断标志

                     

}

 

void init_uart()

{

      

   SCON = 0x50;

    T2L = BRT;

    T2H = BRT >> 8;

    AUXR = 0x15;

  

}

 

 

 

/*

串口发送一个字节。

*/

 void USART_Txbyte(unsigned char i)

{

    SBUF   =   i;

    while(TI ==0);

    TI     =   0; 

}

 

 

/*

串口发送一串数据。

*/

void USRAT_transmit(unsigned char *fdata,unsigned char len)

{

   unsigned char i;                                    

        

   for(i=0;i

   {

      USART_Txbyte(fdata[i]);     

   }

  

}  

 

 

 

 void delay_nus(unsigned long n)

{

       unsigned long j;

       while(n--)

 

       {

              j=1;    

            while(j--);

       }

}

 

//延时n ms

 

void delay_nms(unsigned long n)

 

{

       while(n--)

          delay_nus(1000);       

 

}

 

 

 

/*

函数名:   SPI_SendData

功能:软件模拟SPI通讯发送并接收一个8位字节数据。

如需使用硬件SPI,单片机作为主机,运动控制芯片为从机。CPHA=0,CPOL=0,高位在前,SPI数据宽度为8位。

空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将CS引脚置低,整条指令发送完成后必须将CS置高。

每条指令间需有时间间隔,推荐延时1MS以上。

 

*/

 

unsigned char SPI_SendData(unsigned char outdata)

{

 

unsigned char RecevieData=0,i;

SPI_SCKLOW;

//  _nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();

      

for(i=0;i<8;i++)

{

SPI_SCKLOW;

_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();   

if(outdata&0x80)

   {

   SPI_OUTHIGH;

    }

else

   {

  SPI_OUTLOW;

   }

 outdata<<=1;

     

 _nop_(); _nop_(); _nop_();_nop_();    _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();

 SPI_SCKHIGH; //

 

  RecevieData <<= 1;

 

 if(SPI_IN)

   {

    RecevieData |= 1;

   }

   

 _nop_(); _nop_(); _nop_();_nop_();    _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();

  SPI_SCKLOW;

}

 

return RecevieData;

 

}

 

 

/*

unsigned char SPI_SendData(unsigned char outdata)

{

 

unsigned char RecevieData=0,i;

 

SPDAT =  outdata;                           //发送数据

  while (!(SPSTAT & 0x80));               //查询完成标志

    SPSTAT = 0xc0;                          //清中断标志

return SPDAT;

 

}

 */

 

 

 

/*

函数名:  enabled_cs

功能:SPI运动控制模块使能对应芯片模块的CS脚

参数:

cardno 卡号

用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片模块关联使用。

*/

void enabled_cs(unsigned char cardno)

{

if(cardno==1)

{

SPI1_CSLOW;

}

 if(cardno==2)

{

SPI2_CSLOW;

}

 

if(cardno==3)

{

SPI3_CSLOW;

}

 

}

 

/*

函数名:  disabled_cs

功能:SPI运动控制模块禁止对应芯片模块的CS脚

参数:

cardno 卡号

用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片关联使用。

*/

void disabled_cs(unsigned char cardno)

{

 

if(cardno==1)

{

SPI1_CSHIGH;

}

 if(cardno==2)

{

SPI2_CSHIGH;

}

 

if(cardno==3)

{

SPI3_CSHIGH;

}

   

}

 

 

 

 

/*

函数名:  set_speed

功能:设置轴速度

参数:

cardno 卡号

 axis  轴号(1,2,3,4)

acc        加减速: 值(Hz/s2)

speed      运行频率为:值(Hz)

 

 

*/

 

void set_speed(unsigned char cardno ,unsigned char axis ,unsigned long acc ,unsigned long speed )

{

unsigned char OutByte[25];

 

OutByte[0] = 1;

OutByte[1] = 0;

OutByte[2] = axis;

OutByte[3] = acc >>24;

OutByte[4] = acc >>16;

OutByte[5] = acc >>8;

OutByte[6] = acc ;

OutByte[7] = speed >>24;

OutByte[8] = speed >>16;

OutByte[9] = speed >>8;

OutByte[10] = speed ;

   

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);

SPI_SendData(OutByte[7]);

SPI_SendData(OutByte[8]);

SPI_SendData(OutByte[9]);

SPI_SendData(OutByte[10]); 

disabled_cs(cardno);    

   

delay_nms(1);

}

 

 

 

 

 

/*

函数名:    set_command_pos

功能: 设置轴逻辑位置

 

参数:

cardno 卡号

axis   轴号(1,2,3,4)

pulse  位置脉冲数,范围(-268435455~+268435455)

 

*/

void set_command_pos(unsigned char cardno ,unsigned char axis, long value )

{

unsigned char OutByte[25];

 

OutByte[0] = 0x12 ;

OutByte[1] = 0 ;

OutByte[2] = axis ;

OutByte[3] = value >>24;

OutByte[4] = value >>16;

OutByte[5] = value >>8;

OutByte[6] = value ;

   

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);  

disabled_cs(cardno);    

      

   

 delay_nms(1);

}

 

 

 

/*

函数名: sudden_stop

功能: 轴立即停止

参数:

cardno 卡号

axis   停止的轴号(1,2,3,4)     

mode  0:急停并清空后面缓存的指令  2:急停不清后面缓存的指令

*/

void sudden_stop(unsigned char cardno ,unsigned char axis ,unsigned char mode)

{

unsigned char OutByte[25];

 

OutByte[0] = 0x17 ;

OutByte[1] = axis ;

OutByte[2] = mode;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

disabled_cs(cardno);

 

delay_nms(1);    

}

 

 

 

 

 /*

函数名: set_special

功能:设置特别功能

参数:

cardno 卡号

value 

      

       0xfc     缓存插补运动暂停

       0xfd   取消缓存插补暂停

         

*/

void set_special(unsigned char cardno,unsigned char value)

{

unsigned char OutByte[25];

 

OutByte[0] = 0xFA ;

OutByte[1] = 0;

OutByte[2] = value;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

disabled_cs(cardno);

delay_nms(1);    

   

}

 

 

 /*

函数名: get_inp_state

功能: 获取轴状态,缓存剩余量,各轴逻辑位置。

 

参数:

cardno 卡号

amount  获取字节数量。   设为20将取全部数据。

inbuf[]   读取的数据存放的数组

*/

void  get_inp_state( unsigned char cardno, unsigned char amount,unsigned char inbuf[])

{  

unsigned char OutByte[25];

 

char i;   

enabled_cs(cardno);

inbuf[0]=SPI_SendData(0x04);

for(i=1;i

{  

inbuf[i]=SPI_SendData(0);

 

}

disabled_cs(cardno);

delay_nms(1);

   

 

}

 

 

/*

函数名:     go_home

功能:回原点,回到原点开关会自动减速停止,随后离开原点开关自动急停

参数:

cardno     卡号

no   轴号

speed1      进入原点速度,运行频率为:值(Hz)

speed2      离开原点速度,运行频率为:值(Hz)

*/

 

void go_home(unsigned char cardno,unsigned char no , long speed1 ,long speed2 )

{

unsigned char OutByte[25];

OutByte[0] = 0x1a;

OutByte[1] = 0;

OutByte[2] = no;

OutByte[3] = speed1>>24;

OutByte[4] = speed1 >>16;

OutByte[5] = speed1>> 8;

OutByte[6] = speed1;

OutByte[7] = speed2 >>24;

OutByte[8] = speed2 >>16;

OutByte[9] = speed2 >>8;

OutByte[10] = speed2 ;

 

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);

SPI_SendData(OutByte[7]);

SPI_SendData(OutByte[8]);

SPI_SendData(OutByte[9]);

SPI_SendData(OutByte[10]);

 

disabled_cs(cardno);

   

delay_nms(1);    

 

 

}

 

 

 

 

/*

函数名:     inp_move4

功能:四轴直线插补

参数:

cardno     卡号

no1   X轴轴号

no2   Y轴轴号

no3   Z轴轴号

no4   E轴轴号

pulse1,pulse2,pulse3,pulse4            X-Y-Z-E轴移动的距离,范围(-8388608~+8388607)

mode  0:绝对位移  1:相对位移 

*/

 

void inp_move4(unsigned char cardno,unsigned char no1 ,unsigned char no2 ,unsigned char no3 ,unsigned char no4, long pulse1  ,long pulse2 ,long pulse3 ,long pulse4 ,unsigned char mode )

{

unsigned char OutByte[25];

OutByte[0] = 0xa;

OutByte[1] = no1;

OutByte[2] = no2;

OutByte[3] = no3;

OutByte[4] = no4;

OutByte[5] = pulse1>>24;

OutByte[6] = pulse1 >>16;

OutByte[7] = pulse1>> 8;

OutByte[8] = pulse1;

OutByte[9] = pulse2 >>24;

OutByte[10] = pulse2 >>16;

OutByte[11] = pulse2 >>8;

OutByte[12] = pulse2 ;

  OutByte[13] = pulse3 >>24;

OutByte[14] = pulse3 >>16;

OutByte[15] = pulse3 >>8;

OutByte[16] = pulse3 ;

   OutByte[17] = pulse4 >>24;

OutByte[18] = pulse4 >>16;

OutByte[19] = pulse4 >>8;

OutByte[20] = pulse4 ;

OutByte[21] = 0 ;

OutByte[22] = mode;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);

SPI_SendData(OutByte[7]);

SPI_SendData(OutByte[8]);

SPI_SendData(OutByte[9]);

SPI_SendData(OutByte[10]);

SPI_SendData(OutByte[11]);

SPI_SendData(OutByte[12]);

SPI_SendData(OutByte[13]);

SPI_SendData(OutByte[14]);

SPI_SendData(OutByte[15]);

SPI_SendData(OutByte[16]);

SPI_SendData(OutByte[17]);

SPI_SendData(OutByte[18]);

SPI_SendData(OutByte[19]);

SPI_SendData(OutByte[20]);

SPI_SendData(OutByte[21]);

SPI_SendData(OutByte[22]);

disabled_cs(cardno);

   

delay_nms(1);    

 

 

}

 

 

 

/*

函数名: inp_arc

功能:二轴圆弧插补

参数:

cardno 卡号

no1    参与插补X轴的轴号

no2    参与插补Y轴的轴号

x,y    圆弧插补的终点位置(相对于起点),范围(-8388608~+8388607)           

i,j    圆弧插补的圆心点位置(相对于起点),范围(-8388608~+8388607)

mode1       0:逆时针插补   1:顺时针插补

mode2  0:绝对位移  1:相对位移

*/

void inp_arc(unsigned char cardno ,unsigned char no1,unsigned char no2, long x , long y, long i, long j,unsigned char mode1,unsigned char mode2 )

{

unsigned char OutByte[25];

OutByte[0] = 0xc;

OutByte[1] = no1;

OutByte[2] = no2;

OutByte[3] = x >>24;

OutByte[4] = x >>16;

OutByte[5] = x >>8;

OutByte[6] = x ;

OutByte[7] = y >>24;

OutByte[8] = y >>16;

OutByte[9] = y >>8;

OutByte[10] = y ;

OutByte[11] = i >>24;

OutByte[12] = i >>16;

OutByte[13] = i >>8;

OutByte[14] = i ;

OutByte[15] = j >>24;

OutByte[16] = j >>16;

OutByte[17] = j >>8;

OutByte[18] = j ;

OutByte[19] = mode1;

OutByte[20] = mode2;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);

SPI_SendData(OutByte[7]);

SPI_SendData(OutByte[8]);

SPI_SendData(OutByte[9]);

SPI_SendData(OutByte[10]);

SPI_SendData(OutByte[11]);

SPI_SendData(OutByte[12]);

SPI_SendData(OutByte[13]);

SPI_SendData(OutByte[14]);

SPI_SendData(OutByte[15]);

SPI_SendData(OutByte[16]);

SPI_SendData(OutByte[17]);

SPI_SendData(OutByte[18]);

SPI_SendData(OutByte[19]);

SPI_SendData(OutByte[20]);

disabled_cs(cardno);

   

delay_nms(100);     

}

 

/*

函数名: inp_helical

功能:圆弧螺旋插补

参数:

cardno 卡号

no1    参与插补X轴的轴号

no2    参与插补Y轴的轴号

no3    参与插补螺旋轴的轴号

x,y    圆弧插补的终点位置(相对于起点),范围(-8388608~+8388607)

z      参与插补螺旋轴的位置(相对于起点)       

i,j    圆弧插补的圆心点位置(相对于起点),范围(-8388608~+8388607)

mode1      0:逆时针插补   1:顺时针插补

mode2     0:绝对位移  1:相对位移  

*/

void inp_helical(unsigned char cardno ,unsigned char no1,unsigned char no2,unsigned char no3,long x , long y,long z, long i, long j,unsigned char mode1,unsigned char mode2 )

{

unsigned char OutByte[30];

OutByte[0] = 0xd;

OutByte[1] = no1;

OutByte[2] = no2;

OutByte[3] = no3;

OutByte[4] = x >>24;

OutByte[5] = x >>16;

OutByte[6] = x >>8;

OutByte[7] = x ;

OutByte[8] = y >>24;

OutByte[9] = y >>16;

OutByte[10] = y >>8;

OutByte[11] = y ;

OutByte[12] = z >>24;

OutByte[13] = z >>16;

OutByte[14] = z >>8;

OutByte[15] = z ;

OutByte[16] = i >>24;

OutByte[17] = i >>16;

OutByte[18] = i >>8;

OutByte[19] = i ;

OutByte[20] = j >>24;

OutByte[21] = j >>16;

OutByte[22] = j >>8;

OutByte[23] = j ;

OutByte[24] = mode1;

OutByte[25] = mode2;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);

SPI_SendData(OutByte[7]);

SPI_SendData(OutByte[8]);

SPI_SendData(OutByte[9]);

SPI_SendData(OutByte[10]);

SPI_SendData(OutByte[11]);

SPI_SendData(OutByte[12]);

SPI_SendData(OutByte[13]);

SPI_SendData(OutByte[14]);

SPI_SendData(OutByte[15]);

SPI_SendData(OutByte[16]);

SPI_SendData(OutByte[17]);

SPI_SendData(OutByte[18]);

SPI_SendData(OutByte[19]);

 SPI_SendData(OutByte[20]);

SPI_SendData(OutByte[21]);

SPI_SendData(OutByte[22]);

SPI_SendData(OutByte[23]);

SPI_SendData(OutByte[24]);

SPI_SendData(OutByte[25]);

disabled_cs(cardno);

   

delay_nms(1);    

}

 

 

 

 

 

/*

函数名: write_bit

功能:写输出口状态

参数:

cardno 卡号

number  端口号(0-6)  Y0-Y6

value   状态(0,1) 0 输出低电平   1 输出高电平

 

*/

void write_bit(unsigned char cardno , unsigned char number, unsigned char value)

{

unsigned char OutByte[25];

OutByte[0] = 0x03 ;

OutByte[1] = number;

OutByte[2] = value;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

disabled_cs(cardno);

 

delay_nms(1);

 

}

 

 

/*

函数名: wait_delay

功能:等待延时数

参数:

cardno 卡号

value      延时量(1-10000)MS

 

*/

void wait_delay(unsigned char cardno ,unsigned int value)

{

unsigned char OutByte[25];

 

OutByte[0] = 0x0e ;

OutByte[1] = value>>8;

OutByte[2] = value;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

disabled_cs(cardno);

 

delay_nms(1);

 

}

 

 

 

 

 

 /*

函数名:     pmove

功能: e版本单轴运行

参数:

cardno     卡号

axis   轴号

mode  0:绝对位移  1:相对位移

pulse1            X轴移动的距离,范围(-8388608~+8388607)

 

*/

void pmove(unsigned char cardno,unsigned char axis,unsigned char mode, long pulse1 )

{

unsigned char OutByte[25];

OutByte[0] = 0x2;

OutByte[1] = axis ; 

OutByte[2] = mode;

OutByte[3] = pulse1>>24;

OutByte[4] = pulse1 >>16;

OutByte[5] = pulse1>>8;

OutByte[6] = pulse1;

 

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

SPI_SendData(OutByte[2]);

SPI_SendData(OutByte[3]);

SPI_SendData(OutByte[4]);

SPI_SendData(OutByte[5]);

SPI_SendData(OutByte[6]);  

disabled_cs(cardno);

   

delay_nms(1);    

 

 

}

 

 

/*

函数名: wait_stop

功能: e版本等待轴停止

参数:

cardno 卡号

axis   停止的轴号(1,2,3,4)      

mode  0:急停并清空后面缓存的指令  2:急停不清后面缓存的指令

*/

void wait_stop(unsigned char cardno ,unsigned char axis)

{

unsigned char OutByte[25];

 

OutByte[0] = 0xf ;

OutByte[1] = axis ;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

disabled_cs(cardno);

 

delay_nms(1);    

}

 

 

 

 

 

void main(void) 

{

   initial();

   init_uart();

   // ES = 1;

   // EA = 1;

 

   // P_SW2 = 0x80;

   // XOSCCR = 0xc0;                              //启动外部晶振

   // while (!(XOSCCR & 1));                      //等待时钟稳定

   // CKDIV = 0x00;                               //时钟不分频

   // CKSEL = 0x01;                               //选择外部晶振

   // P_SW2 = 0x00;

 

 

     led=0;

 delay_nms(100)   ;

 

 

      

   

 

 

     /*下面的指令为1,2轴回原点

 

 

      go_home(1,1,30000,5000 ) ;    //  1轴回原点

      go_home(1,2,30000,5000 ) ;    //   2轴回原点

      do

     {

     get_inp_state( 1, 4,inbuf);      //只需读出4个字节来判断轴状态

     }

      while(inbuf[3]);      // 等待缓存数量为0 ,如果多条运动指令在缓存里 ,可以读取缓存数量来判断指令有没执行完成。

     //while(inbuf[1]);     // 等待轴停止 ,如果只有一条除圆弧外的运动指令,可以读取轴状态来判断有没执行完。

    set_command_pos(1 ,1,0);    //设1轴坐标    

    set_command_pos(1 ,2,0);    //设2轴坐标

        

      */    

 

   while(1)

     {

     

     

     

     

     if(!b1)     //按下按键

        {

        delay_nms(10);    

       if(!b1)

        {

         

 

          /*e型测试指令*/

         // set_speed(1 ,1,200000,50000);      //设置1轴运行速度50K,加速度200k   

        // set_speed(1 ,2,200000,50000);       //设置1轴运行速度50K,加速度200k

        // set_speed(1 ,3,40000,10000);        //设置1轴运行速度10K,加速度40k

         //write_bit(1 , 6, 0);                // Y6输出低

        // pmove(1,1,1, 1000);              //1轴相对运行速1000个脉冲

        // pmove(1,2,1, 1000);              // 2轴相对运行速1000个脉冲

         //wait_stop(1 ,1);                 //等待1轴停止

         //wait_stop(1 ,2);                 //等待2轴停止

         // wait_delay(1 ,500);                // 延时500MS

        // pmove(1,3,1, 1000);              //3轴相对运行速1000个脉冲

          //write_bit(1 , 6, 1);               // Y6输出高

 

 

       /*f型测试指令*/

       //  write_bit(1 , 6, 0);

       //  set_speed(1 ,1,200000,50000);   //设置运行速度50K,加速度200h    

       //   wait_delay(1 ,500);       // 延时500MS

         //   write_bit(1 , 2, 0);

    //  inp_move4(1,1,0,0,0,80000 ,0,0 ,0 ,1);  //  1,2轴插补

           //  set_speed(1,1 ,800000,25000);   //设置运行速度25K,加速度800K 

          //inp_move4(1,1,2,0,0,20000 ,10000,0 ,0 ,1);  //  1,2轴插补

    //   inp_arc(1 ,1,2, -20000, 20000, -20000, 0,0,1) ; //  1,2轴圆弧插补

           //set_speed(1 ,1,800000,25000);   //设置运行速度250K,加速度800K   

        // inp_arc(1 ,1,2, -20000, 20000, -20000, 0,0,1) ;

       //   wait_delay(1 ,500);

      //       write_bit(1 , 6, 1);

         //  wait_delay(1 ,500);

       //  write_bit(1 , 6, 0);

          

    /*下面的指令会直接发到缓存区自动排队运行*/

    //  write_bit(1 , 6, 0);        // Y6输出低

      //   set_speed(1 ,1,40000,25000);

    // inp_move4(1,1,2,3,4,320000 ,32000,32000 ,32000 ,1);  //   4轴直线插补

      //wait_delay(1 ,2000);          //模块内部指令间延时3S

      //inp_move4(1,1,2,0,0,32000 ,32000,0 ,0 ,1);  //    1,2轴直线插补   

      // wait_delay(1 ,2000);

     // inp_move4(1,2,0,0,0,32000 ,0,0 ,0 ,1);  //    2轴单独运行 

   //inp_arc(1 ,1,2, -20000, 20000, -20000, 0,0,1) ;     //  2轴圆弧插补,终点相对起点坐标(-20000,20000),圆心相对起点坐标(-20000,0),逆时针方向,画出1/4圆弧。

     // write_bit(1 , 6, 1);                        // Y6输出高 ,判断指令段有没执行完成也可以在指令段后面加一条端口输出指令,然后用单片机来读引脚来判断。

 

     

 

   

 

           while(!b1);

       }    

         

        }

     

     

       

 

 

      if(!b2)      //按下按键

        {

        delay_nms(10)     ;

        if(!b2)

          {

 

        sudden_stop(1,1,0);             //    f型立即停止所有插补轴 ,并清缓存   。 e型立即停止1轴 ,并清缓存 。

   

 

        while(!b2);

 

 

           }

      }

 

 

     

        get_inp_state( 1, 20,inbuf);     //读出20个字节数据放入数组 

       // USRAT_transmit(inbuf,20);       //  串口将数组数据发送出去查看

                  //// USART_Txbyte(inbuf[3]);

 

       if(inbuf[3]==0)           //inbuf[1]数据为0表示所有轴都停

             led=1;      

         else

             led=0;       // 指示LED点亮

 

 

 

     }    

   

}

非常好我支持^.^

(0) 0%

不好我反对

(0) 0%

( 发表人:steve )

      发表评论

      用户评论
      评价:好评中评差评

      发表评论,获取积分! 请遵守相关规定!