您好,歡迎來電子發(fā)燒友網(wǎng)! ,新用戶?[免費注冊]

您的位置:電子發(fā)燒友網(wǎng)>電子元器件>芯片引腳圖>

xc1004運動芯片怎么樣?xc1004四軸SPI運動控制芯片詳解(含例程)

2020年10月22日 10:32 蘭峰控制技術w75815895 作者:蘭峰控制技術w75 用戶評論(0

Xc1004四軸SPI運動控制芯片?

?

?

? ?概述

?? SPI通訊,僅需使用10條指令便可完成復雜工作。

芯片四軸輸出,多個芯片通過不同片選腳可控制達120軸。

獨立軸e版本支持最大脈沖輸出頻率1.2MHz獨立輸出。

插補軸f版本支持四軸,三軸,二軸,一軸直線插補,二軸圓弧插補,螺旋插補,支持連續(xù)插補,支持速度前瞻。

脈沖輸出使用脈沖+方向方式。

各版本擁有128條運動指令緩存空間。

LQFP48封裝,引腳輸入輸出3.3V,可兼容5V。

?

性能參數(shù)

?

供電電源

3.3VDC?? 電流100MA

溫度范圍

-40 ~ +105

封裝

LQFP48

IO輸入

3.3v ,兼容5v

IO輸出

3.3v ? TTL輸出

控制軸數(shù)

? 4

脈沖頻率

??e版:1.2MHZ?? ??f版:400kHZ??

運動性能

e版:單軸運行,指令緩存

f版:1-4軸直線插補 ,圓弧插補,螺旋插補,支持指令緩存,支持連續(xù)插補

通信速度

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通信數(shù)據(jù)輸出腳,接單片機數(shù)據(jù)輸入腳

28

SI

SPI通信數(shù)據(jù)輸入腳,接單片機數(shù)據(jù)輸出腳

29

P1

第1軸脈沖信號

30

TXD

串口數(shù)據(jù)發(fā)送

31

RXD

串口數(shù)據(jù)接收

32

D1

第1軸方向信號

33

Y2

2號輸出口

34

Y3

3號輸出口

35

VSS

電源負極

36

VDD

電源正極+3.3V

37

SIGN

工作狀態(tài)指示,閑時慢速交替變化,軸運行時快速交替變化

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通訊協(xié)議

?

芯片與單片機使用SPI通訊,單片機作為主機,芯片為從機。CPHA=0,CPOL=0,高位在前,SPI數(shù)據(jù)寬度為8位??臻e狀態(tài)下單片機SCK引腳必須為低電平。每一條指令開始發(fā)送前將CS引腳置低,整條指令發(fā)送完成后必須將CS置高。

每條指令間隔1MS以上。

?

SPI時序圖如下:

?

SPI通訊指令

?

設置軸速度(e版本f版本共用指令)

?

發(fā)送:

功能碼

補充0

軸號

加速度

運行速度

0x01

0x00

1字節(jié)

4字節(jié)

4字節(jié)

?

部分參數(shù)解釋:

軸號(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版本共用指令)

?

發(fā)送:

?

功能碼

補充0

軸號

位置

0x12

0x00

1字節(jié)

4字節(jié)

?

部分參數(shù)解釋:

軸號(1,2,3,4)?? 1-4:1-4軸

位置????? 軸邏輯位置,范圍(-268435455~+268435455

?

?

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

發(fā)送:

?

功能碼

軸號

模式

0x17

1字節(jié)

1字節(jié)

??? ??

部分參數(shù)解釋:

?

軸號(1,2,3,4)?? ??? 1-4: 1-4軸?

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

要點:f版本由于共用一個插補核心,軸號設為任意值都會讓所用軸停止。

?

各軸邏輯位置和狀態(tài)(e版本f版本共用指令)

發(fā)送:

?

功能碼

數(shù)據(jù)0

0x04

最多19個字節(jié)

????????

返回:

起始碼

各軸運行狀態(tài)

緩存數(shù)量

1軸坐標

2軸坐標

3軸坐標

4軸坐標

0x00

1字節(jié)

2字節(jié)

4字節(jié)

4字節(jié)

4字節(jié)

4字節(jié)


?

部分參數(shù)解釋:

?

?

各軸運行狀態(tài)(轉為8位二進制數(shù))

?

第0位為e版1軸狀態(tài)??? ?0:停止中? 1:運行中

第1位為e版2軸狀態(tài)??? ?0:停止中? 1:運行中

第2位為e版3軸狀態(tài)??? ?0:停止中? 1:運行中

第3位為e版4軸狀態(tài)??? ?0:停止中? 1:運行中

?

第5位為f版插補核各軸狀態(tài)??? 0:停止中? 1:運行中

?

緩存數(shù)量(0-128)?? 還未運行的緩存指令數(shù)

?

各軸坐標??? ????范圍(-268435455~+268435455

?

?

要點:返回字節(jié)按功能順序排列,由于SPI工作模式是一邊發(fā)送一邊接收,如只需取前面字節(jié)的數(shù)據(jù),為節(jié)省通訊時間,可只發(fā)送對應字節(jié)的數(shù)據(jù)0。例如只需獲取各軸運行狀態(tài),發(fā)送2個字節(jié)0便可。軸運行狀態(tài)只是軸的瞬時狀態(tài),不能用來指示圓弧指令是否完成??赏ㄟ^讀取緩存數(shù)量來判斷緩存區(qū)指令是否完成。一條圓弧指令會動態(tài)占用最多120條緩存空間。

設置特殊功能(f版本專用指令)

?

發(fā)送:

?

功能碼

補充0

功能

0xfa

0x00

1字節(jié)

?

?

?

部分參數(shù)解釋:

?

當功能寫入0xfc,緩存內(nèi)運動指令暫停。

當功能寫入0xfd,取消緩存內(nèi)運動指令暫停。

以下指令會自動進入緩存區(qū)并排隊執(zhí)行:

?

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

發(fā)送:

?

功能碼

補充0

軸號

進入原點速度

離開原點速度

0x1a

0x00

1字節(jié)

4字節(jié)

4字節(jié)

?

?

?

?

?

部分參數(shù)解釋:

?

軸號(1,2,3,4)

?

進入原點速度? 運行頻率為:值(1-400000)(Hz)

?

離開原點速度? 運行頻率為:值(1-400000)(Hz)

?

要點:回原點指令會自動生成一段負脈沖和一段正脈沖。以進入原點速度輸出負脈沖時,左限位原點開關生效時自動減速停;隨后以離開原點速度輸出正脈沖,離開原點限位開關時自動急速停止,急停后可作為原點。回原點指令不宜和其它運動指令混合在一起放入緩存里,回原點過程應單獨存在。

?

?

四軸直線插補(f版本專用指令)

發(fā)送:

?

?

功能碼

X軸號

Y軸號

Z軸號

E軸號

X脈沖數(shù)

Y脈沖數(shù)

Z脈沖數(shù)

E脈沖數(shù)

補充0

運動方式

0x0a

1字節(jié)

1字節(jié)

1字節(jié)

1字節(jié)

4字節(jié)

4字節(jié)

4字節(jié)

4字節(jié)

0x00

1字節(jié)

?

?

部分參數(shù)解釋:

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:相對位移?

?

要點:當只需要少于四軸做插補時,不用的軸號和脈沖數(shù)寫0。

?

二軸圓弧插補(f版本專用指令)

發(fā)送:

?

功能碼

X軸號

Y軸號

終點坐標X

終點坐標Y

圓心坐標X

圓心坐標Y

運動方式1

運動方式2

0x0c

1字節(jié)

1字節(jié)

4字節(jié)

4字節(jié)

4字節(jié)

4字節(jié)

1字節(jié)

1字節(jié)

?

?

?

?

部分參數(shù)解釋:

X軸號(1,2,3)

Y軸號(1,2,3)

終點坐標? ???????圓弧插補的終點位置,范圍-268435455~+268435455

圓心坐標 ????????圓弧插補的圓心點位置,范圍-268435455~+268435455

運動方式1 ???????0:逆時針插補?? 1:順時針插補?? 2:三點定圓弧

運動方式2?? ?????0:絕對位移? 1:相對位移?

?

要點:圓弧各坐標必須能構成正常的圓弧。圓弧插補指令會根據(jù)圓弧參數(shù)動態(tài)占用緩存空間。當運動方式1設為2時,為三點定圓弧模式,圓心坐標參數(shù)設為圓弧的中間點坐標。

?

?

三軸螺旋插補(f版本專用指令)

發(fā)送:

?

功能碼

X軸號

Y軸號

Z軸號

終點坐標X

終點坐標Y

脈沖數(shù)

圓心坐標X

圓心坐標Y

運動方式1

運動方式2

0x0d

1字節(jié)

1字節(jié)

1字節(jié)

4字節(jié)

4字節(jié)

字節(jié)

4字節(jié)

4字節(jié)

1字節(jié)

1字節(jié)

?

?

部分參數(shù)解釋:

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版本共用指令)

?

發(fā)送:

?

功能碼

延時量

0x0e

2字節(jié)

?

?

部分參數(shù)解釋:

?

延時量(1-10000)MS

?

要點:等待延時是指等待所設延時量后才執(zhí)行后面的指令。

?

?

寫輸出口狀態(tài)(e版本f版本共用指令)

發(fā)送:

?

功能碼

輸出端口

輸出狀態(tài)

0x03

1字節(jié)

1字節(jié)

?

?

部分參數(shù)解釋:

?

輸出端口號?? (0-6)??? Y0-Y6

輸出狀態(tài)???? (0,1)?? ?0:輸出低電平?? 1:輸出高電平

?

?

單軸運行(e版本專用指令)

?

發(fā)送:

功能碼

軸號

運動方式

脈沖數(shù)量

0x02

1字節(jié)

1字節(jié)

4字節(jié)

?

?

部分參數(shù)解釋:

?

軸號(1,2,3,4)??? 獨立軸運動的軸號

脈沖數(shù)量 (-268435455~+268435455)輸出的脈沖數(shù) >0:正方向移動? ?<0:負方向移動

運動方式(0,1)?? 0:絕對位移? 1:相對位移??

?

?

等待軸停止(e版本專用指令)

發(fā)送:

?

功能碼

軸號

0x0f

1字節(jié)

?

?

部分參數(shù)解釋:

?

軸號(1,2,3,4)?? 1,2,3,4:獨立軸1-4軸? ??

?

要點:等待軸停止是指在對應軸停止之前一直等待,直到軸停止后才執(zhí)行后面的指令。獨立軸不會自動等待軸運行完成后才執(zhí)行下一條指令。插補軸會自動等待軸運行完成后才執(zhí)行下一條指令。

電路連接

?

芯片引腳輸出最大電流15Ma,輸入灌電流最大25Ma。如多芯片組網(wǎng),各芯片的SCK,SO,SI引腳并聯(lián),CS腳獨立受單片機控制。單片機SPI數(shù)據(jù)輸入腳接芯片SO腳,需內(nèi)部或外部上拉。單片機SPI數(shù)據(jù)輸出腳接芯片SI腳。芯片,單片機,差分輸出連接參考圖:

?

運動控制編程參考

通過51單片機控制運動控制芯片的SPI通信程序示例。

(來自產(chǎn)品官網(wǎng):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?????????? //使用內(nèi)部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空閑狀態(tài)一定要為低電平。

?

?

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

?//SPSTAT = 0xc0;????????????????????????????? //清中斷標志

??? ?????????????????

}

?

void init_uart()

{

? ????

?? SCON = 0x50;

??? T2L = BRT;

??? T2H = BRT >> 8;

??? AUXR = 0x15;

??

}

?

?

?

/*

串口發(fā)送一個字節(jié)。

*/

?void USART_Txbyte(unsigned char i)

{

??? SBUF?? =?? i;

??? while(TI ==0);

??? TI???? =?? 0;?

}

?

?

/*

串口發(fā)送一串數(shù)據(jù)。

*/

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);????? ?

?

}

?

?

?

/*

函數(shù)名:?? SPI_SendData

功能:軟件模擬SPI通訊發(fā)送并接收一個8位字節(jié)數(shù)據(jù)。

如需使用硬件SPI,單片機作為主機,運動控制芯片為從機。CPHA=0,CPOL=0,高位在前,SPI數(shù)據(jù)寬度為8位。

空閑狀態(tài)下單片機SCK引腳必須為低電平。每一條指令開始發(fā)送前將CS引腳置低,整條指令發(fā)送完成后必須將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;????????? ?????????????????//發(fā)送數(shù)據(jù)

? while (!(SPSTAT & 0x80));?????????????? //查詢完成標志

??? SPSTAT = 0xc0;????????????????????????? //清中斷標志

return SPDAT;

?

}

?*/

?

?

?

/*

函數(shù)名:? enabled_cs

功能:SPI運動控制模塊使能對應芯片模塊的CS腳

參數(shù):

cardno 卡號

用單片機不同引腳去控制不同芯片的CS腳,以便多個芯片模塊關聯(lián)使用。

*/

void enabled_cs(unsigned char cardno)

{

if(cardno==1)

{

SPI1_CSLOW;

}

?if(cardno==2)

{

SPI2_CSLOW;

}

?

if(cardno==3)

{

SPI3_CSLOW;

}

?

}

?

/*

函數(shù)名:? disabled_cs

功能:SPI運動控制模塊禁止對應芯片模塊的CS腳

參數(shù):

cardno 卡號

用單片機不同引腳去控制不同芯片的CS腳,以便多個芯片關聯(lián)使用。

*/

void disabled_cs(unsigned char cardno)

{

?

if(cardno==1)

{

SPI1_CSHIGH;

}

?if(cardno==2)

{

SPI2_CSHIGH;

}

?

if(cardno==3)

{

SPI3_CSHIGH;

}

???

}

?

?

?

?

/*

函數(shù)名:? set_speed

功能:設置軸速度

參數(shù):

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);

}

?

?

?

?

?

/*

函數(shù)名:??? set_command_pos

功能: 設置軸邏輯位置

?

參數(shù):

cardno 卡號

axis?? 軸號(1,2,3,4)

pulse ?位置脈沖數(shù),范圍(-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);

}

?

?

?

/*

函數(shù)名: sudden_stop

功能: 軸立即停止

參數(shù):

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);????

}

?

?

?

?

?/*

函數(shù)名: set_special

功能:設置特別功能

參數(shù):

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);????

???

}

?

?

?/*

函數(shù)名: get_inp_state

功能: 獲取軸狀態(tài),緩存剩余量,各軸邏輯位置。

?

參數(shù):

cardno 卡號

amount ?獲取字節(jié)數(shù)量。?? 設為20將取全部數(shù)據(jù)。

inbuf[]?? 讀取的數(shù)據(jù)存放的數(shù)組

*/

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);

???

?

}

?

?

/*

函數(shù)名:??? ?go_home

功能:回原點,回到原點開關會自動減速停止,隨后離開原點開關自動急停

參數(shù):

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);????

?

?

}

?

?

?

?

/*

函數(shù)名:??? ?inp_move4

功能:四軸直線插補

參數(shù):

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);????

?

?

}

?

?

?

/*

函數(shù)名: inp_arc

功能:二軸圓弧插補

參數(shù):

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);?????

}

?

/*

函數(shù)名: inp_helical

功能:圓弧螺旋插補

參數(shù):

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);????

}

?

?

?

?

?

/*

函數(shù)名: write_bit

功能:寫輸出口狀態(tài)

參數(shù):

cardno 卡號

number? 端口號(0-6)? Y0-Y6

value?? 狀態(tài)(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);

?

}

?

?

/*

函數(shù)名: wait_delay

功能:等待延時數(shù)

參數(shù):

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);

?

}

?

?

?

?

?

?/*

函數(shù)名:??? ?pmove

功能: e版本單軸運行

參數(shù):

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);????

?

?

}

?

?

/*

函數(shù)名: wait_stop

功能: e版本等待軸停止

參數(shù):

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));????????????????????? //等待時鐘穩(wěn)定

?? // 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個字節(jié)來判斷軸狀態(tài)

??? ?}

??? ? while(inbuf[3]);?? ?? // 等待緩存數(shù)量為0 ,如果多條運動指令在緩存里 ,可以讀取緩存數(shù)量來判斷指令有沒執(zhí)行完成。

??? ?//while(inbuf[1]);? ?? // 等待軸停止 ,如果只有一條除圓弧外的運動指令,可以讀取軸狀態(tài)來判斷有沒執(zhí)行完。

??? 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);

??????????

??? /*下面的指令會直接發(fā)到緩存區(qū)自動排隊運行*/

??? //? 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);??????? ? //模塊內(nèi)部指令間延時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輸出高 ,判斷指令段有沒執(zhí)行完成也可以在指令段后面加一條端口輸出指令,然后用單片機來讀引腳來判斷。

?

??? ?

?

???

?

?????????? 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個字節(jié)數(shù)據(jù)放入數(shù)組?

?????? // USRAT_transmit(inbuf,20);??? ?? //? 串口將數(shù)組數(shù)據(jù)發(fā)送出去查看

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

?

?????? if(inbuf[3]==0)????????? ?//inbuf[1]數(shù)據(jù)為0表示所有軸都停

?????????? ? led=1;?? ???

?????? ? else

?????????? ? led=0; ???? ?// 指示LED點亮

?

?

?

??? ?}? ??

???

}

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

( 發(fā)表人:steve )

      發(fā)表評論

      用戶評論
      評價:好評中評差評

      發(fā)表評論,獲取積分! 請遵守相關規(guī)定!

      ?