0 卖盘信息
BOM询价
您现在的位置: 首页 > 电子资讯 >基础知识 > xc1004运动芯片怎么样?xc1004四轴SPI运动控制芯片?

xc1004运动芯片怎么样?xc1004四轴SPI运动控制芯片?

来源: elecfans
2020-11-05
类别:基础知识
eye 27
文章创建人 拍明

原标题:xc1004运动芯片怎么样?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.3vTTL输出

控制轴数

4轴

脉冲频率

e版:1.2MHZf版: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)

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

运动方式20:绝对位移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)

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

运动方式20:绝对位移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

sfrP0M1=0x93;

sfrP0M0=0x94;

sfrP1M1=0x91;

sfrP1M0=0x92;

sfrP2M1=0x95;

sfrP2M0=0x96;

sfrP3M1=0xb1;

sfrP3M0=0xb2;

sfrP4M1=0xb3;

sfrP4M0=0xb4;

sfrP5M1=0xC9;

sfrP5M0=0xCA;

sfrP6M1=0xCB;

sfrP6M0=0xCC;

sfrP7M1=0xE1;

sfrP7M0=0xE2;

sfrP5=0xC8;

sfrSPSTAT=0xcd;

sfrSPCTL=0xce;

sfrSPDAT=0xcf;

sfrIE2=0xaf;

sfrAUXR=0x8e;

sfrT2H=0xd6;

sfrT2L=0xd7;

sfrP_SW2=0xba;

#defineCKSEL(*(unsignedcharvolaTIlexdata*)0xfe00)

#defineCKDIV(*(unsignedcharvolaTIlexdata*)0xfe01)

#defineIRC24MCR(*(unsignedcharvolaTIlexdata*)0xfe02)

#defineXOSCCR(*(unsignedcharvolaTIlexdata*)0xfe03)

#defineIRC32KCR(*(unsignedcharvolatilexdata*)0xfe04)

//#defineFOSC16000000UL//使用外部16M晶振

#defineFOSC24000000UL//使用内部24M晶振

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

sbitb2=P1^1;

sbitb1=P5^5;

sbitled=P3^5;

sbitcs3=P3^3;

sbitcs2=P3^2;

sbitcs1=P1^2;

sbitsck=P1^5;

sbitin=P1^4;

sbitout=P1^3;

#defineSPI3_CSHIGHcs3=1//CS3

#defineSPI3_CSLOWcs3=0

#defineSPI2_CSHIGHcs2=1//CS2

#defineSPI2_CSLOWcs2=0

#defineSPI1_CSHIGHcs1=1//CS1

#defineSPI1_CSLOWcs1=0

#defineSPI_SCKHIGHsck=1//SCK

#defineSPI_SCKLOWsck=0

#defineSPI_OUTHIGHout=1

#defineSPI_OUTLOWout=0//MOSI

#defineSPI_INin//MISO

unsignedcharinbuf[50];

unsignedcharb1_state=0;

voidinitial()

{

P1M1=0;

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

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

SPI2_CSHIGH;

SPI3_CSHIGH;

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

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

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

}

voidinit_uart()

{

SCON=0x50;

T2L=BRT;

T2H=BRT>>8;

AUXR=0x15;

}

/*

串口发送一个字节。

*/

voidUSART_Txbyte(unsignedchari)

{

SBUF=i;

while(TI==0);

TI=0;

}

/*

串口发送一串数据。

*/

voidUSRAT_transmit(unsignedchar*fdata,unsignedcharlen)

{

unsignedchari;

for(i=0;i<len;i++)< span="">

{

USART_Txbyte(fdata[i]);

}

}

voiddelay_nus(unsignedlongn)

{

unsignedlongj;

while(n--)

{

j=1;

while(j--);

}

}

//延时nms

voiddelay_nms(unsignedlongn)

{

while(n--)

delay_nus(1000);

}

/*

函数名:SPI_SendData

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

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

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

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

*/

unsignedcharSPI_SendData(unsignedcharoutdata)

{

unsignedcharRecevieData=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;

}

returnRecevieData;

}

/*

unsignedcharSPI_SendData(unsignedcharoutdata)

{

unsignedcharRecevieData=0,i;

SPDAT=outdata;//发送数据

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

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

returnSPDAT;

}

*/

/*

函数名:enabled_cs

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

参数:

cardno卡号

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

*/

voidenabled_cs(unsignedcharcardno)

{

if(cardno==1)

{

SPI1_CSLOW;

}

if(cardno==2)

{

SPI2_CSLOW;

}

if(cardno==3)

{

SPI3_CSLOW;

}

}

/*

函数名:disabled_cs

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

参数:

cardno卡号

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

*/

voiddisabled_cs(unsignedcharcardno)

{

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)

*/

voidset_speed(unsignedcharcardno,unsignedcharaxis,unsignedlongacc,unsignedlongspeed)

{

unsignedcharOutByte[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)

*/

voidset_command_pos(unsignedcharcardno,unsignedcharaxis,longvalue)

{

unsignedcharOutByte[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)

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

*/

voidsudden_stop(unsignedcharcardno,unsignedcharaxis,unsignedcharmode)

{

unsignedcharOutByte[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取消缓存插补暂停

*/

voidset_special(unsignedcharcardno,unsignedcharvalue)

{

unsignedcharOutByte[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[]读取的数据存放的数组

*/

voidget_inp_state(unsignedcharcardno,unsignedcharamount,unsignedcharinbuf[])

{

unsignedcharOutByte[25];

chari;

enabled_cs(cardno);

inbuf[0]=SPI_SendData(0x04);

for(i=1;i<amount;i++)< span="">

{

inbuf[i]=SPI_SendData(0);

}

disabled_cs(cardno);

delay_nms(1);

}

/*

函数名:go_home

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

参数:

cardno卡号

no轴号

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

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

*/

voidgo_home(unsignedcharcardno,unsignedcharno,longspeed1,longspeed2)

{

unsignedcharOutByte[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卡号

no1X轴轴号

no2Y轴轴号

no3Z轴轴号

no4E轴轴号

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

mode0:绝对位移1:相对位移

*/

voidinp_move4(unsignedcharcardno,unsignedcharno1,unsignedcharno2,unsignedcharno3,unsignedcharno4,longpulse1,longpulse2,longpulse3,longpulse4,unsignedcharmode)

{

unsignedcharOutByte[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)

mode10:逆时针插补1:顺时针插补

mode20:绝对位移1:相对位移

*/

voidinp_arc(unsignedcharcardno,unsignedcharno1,unsignedcharno2,longx,longy,longi,longj,unsignedcharmode1,unsignedcharmode2)

{

unsignedcharOutByte[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)

mode10:逆时针插补1:顺时针插补

mode20:绝对位移1:相对位移

*/

voidinp_helical(unsignedcharcardno,unsignedcharno1,unsignedcharno2,unsignedcharno3,longx,longy,longz,longi,longj,unsignedcharmode1,unsignedcharmode2)

{

unsignedcharOutByte[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输出高电平

*/

voidwrite_bit(unsignedcharcardno,unsignedcharnumber,unsignedcharvalue)

{

unsignedcharOutByte[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

*/

voidwait_delay(unsignedcharcardno,unsignedintvalue)

{

unsignedcharOutByte[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轴号

mode0:绝对位移1:相对位移

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

*/

voidpmove(unsignedcharcardno,unsignedcharaxis,unsignedcharmode,longpulse1)

{

unsignedcharOutByte[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)

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

*/

voidwait_stop(unsignedcharcardno,unsignedcharaxis)

{

unsignedcharOutByte[25];

OutByte[0]=0xf;

OutByte[1]=axis;

enabled_cs(cardno);

SPI_SendData(OutByte[0]);

SPI_SendData(OutByte[1]);

disabled_cs(cardno);

delay_nms(1);

}

voidmain(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点亮

}

}



责任编辑:David

【免责声明】

1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。

2、本文的引用仅供读者交流学习使用,不涉及商业目的。

3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。

4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。

拍明芯城拥有对此声明的最终解释权。

相关资讯