xc1004运动芯片怎么样?xc1004四轴SPI运动控制芯片?
原标题: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)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。