电工技术基础_电工基础知识_电工之家-电工学习网

欢迎来到电工学习网!

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

2021-10-03 12:58分类:电子元器件 阅读:

 

Xc1004四轴SPI运动控制系统集成ic?

?

?

? ?简述

?? SPI通信,仅需应用10条命令便可进行繁杂工作中。

soc芯片四轴輸出,好几个集成ic根据不一样片选脚可操纵达120轴。

单独轴e版本号适用较大单脉冲輸出頻率1.2MHz单独輸出。

插补轴f版本号适用四轴,三轴,二轴,一轴平行线刀具半径补偿,二轴弧形刀具半径补偿,螺旋式刀具半径补偿,适用持续刀具半径补偿,适用速率展望。

单脉冲輸出应用单脉冲 方位方法。

各版本号有着128条健身运动命令缓存文件室内空间。

LQFP48封裝,脚位I/O3.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

11号輸出口

3

Y5

5号輸出口

4

Y6

六号輸出口

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

2号輸出口

23

VSS

开关电源负级

24

VDD

开关电源正级 3.3V

25

CS

SPI通讯也就能脚,低电频合理

26

SCK

SPI通讯数字时钟脚

27

SO

SPI通讯数据信息輸出脚,接单片机设计数据信息键入脚

28

SI

SPI通讯数据信息键入脚,接单片机设计数据信息輸出脚

29

P1

第一轴差分信号

30

TXD

串口通信数据信息推送

31

RXD

串口通信信息接受

32

D1

第一轴方位数据信号

33

Y2

2号輸出口

34

Y3

3号輸出口

35

VSS

开关电源负级

36

VDD

开关电源正级 3.3V

37

SIGN

运行状态标示,闲暇时慢速度更替转变,轴运转时迅速更替转变

38

P2

第2轴差分信号

39

D2

第2轴方位数据信号

40

P3

第三轴差分信号

41

D3

第三轴方位数据信号

42

NC

空脚位

43

NC

空脚位

44

VSS

开关电源负级

45

P4

第4轴差分信号

46

D4

第4轴方位数据信号

47

VSS

开关电源负级

48

VDD

开关电源正级 3.3V

?

SPI通信协议

?

集成ic与stm32应用SPI通信,单片机设计做为服务器,集成ic为从机。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。比如只需获得各轴运作情况,推送两个字节数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轴? ??

?

关键点:等候轴终止就是指在相匹配轴终止以前一直等候,直至轴终止后才实行之后的命令。单独轴不容易全自动等候轴运作进行后才实行下一条命令。刀具半径补偿轴会全自动等候轴运作进行后才实行下一条命令。

电源电路联接

?

集成ic脚位輸出最大的电流量15Ma,键入灌电流量较大25Ma。如多主板芯片组网,各集成ic的SCK,SO,SI脚位串联,CS脚单独受单片机设计操纵。单片机设计SPI数据信息键入脚接集成icSO脚,需內部或外界下拉。单片机设计SPI数据信息輸出脚接集成icSI脚。集成ic,单片机设计,差分信号輸出联接参照图:

?

运动控制系统程序编写参照

根据51单片机操纵运动控制系统集成ic的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,单片机设计做为服务器,运动控制系统集成ic为从机。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健身运动模块也就能相匹配集成ic控制模块的CS脚

主要参数:

cardno 信用卡卡号

用单片机设计不一样脚位去操纵不一样集成ic的CS脚,便于好几个集成ic控制模块关系应用。

*/

void enabled_cs(unsigned char cardno)

{

if(cardno==1)

{

SPI1_CSLOW;

}

?if(cardno==2)

{

SPI2_CSLOW;

}

?

if(cardno==3)

{

SPI3_CSLOW;

}

?

}

?

/*

涵数名:? disabled_cs

作用:SPI健身运动模块严禁相匹配集成ic控制模块的CS脚

主要参数:

cardno 信用卡卡号

用单片机设计不一样脚位去操纵不一样集成ic的CS脚,便于好几个集成ic关系应用。

*/

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照亮

?

?

?

??? ?}? ??

???

}

上一篇:DVI接口能不能转VGA接口?DVI接口如何转VGA接口?

下一篇:74LS273引脚图和工作原理

相关推荐

电工推荐

    电工技术基础_电工基础知识_电工之家-电工学习网
返回顶部