-
Xc1004四轴SPI运动控制芯片
参
考
手
册
泰
概述
SPI通讯,仅需使用10条指令便可完成复杂工作。
单芯片四轴输出,多个芯片通过不同片选脚可控制达120轴。
独立轴e版本支持最大脉冲输出频率1.2MHz独立输出。
插补轴f版本支持四轴,三轴,二轴,一轴直线插补,二轴圆弧插补,螺旋插补,支持连续插补,支持速度前瞻。
脉冲输出使用脉冲+方向方式。
各版本拥有128条运动指令缓存空间。
LQFP48封装,引脚输入输出3.3V,可兼容5V。
模块性能参数
供电电源
3.3VDC 电流100MA
温度范围
-40 ~ +105℃
封装
LQFP48
IO输入
3.3v ,兼容5v
IO输出
3.3v TTL输出
控制轴数
4轴
脉冲频率
e版:1.2MHZ f版:400kHZ
运动性能
e版:单轴运行,指令缓存
f版:1-4轴直线插补 ,圆弧插补,螺旋插补,支持指令缓存,支持连续插补
通信速度
SPI:10Mbps
引脚排列
引脚号
引脚名称
引脚功能说明
1
VDD
电源正极+3.3V
2
Y4
4号输出口
3
Y5
5号输出口
4
Y6
6号输出口
5
A
空引脚
6
B
空引脚
7
RST
复位引脚,低电平有效
8
VSS
电源负极
9
VDD
电源正极+3.3V
10
LMT1-
1轴负限位或原点,低电平有效
11
LMT2-
2轴负限位或原点,低电平有效
12
LMT3-
3轴负限位或原点,低电平有效
13
LMT4-
4轴负限位或原点,低电平有效
14
LMT1+
1轴正限位,低电平有效
15
LMT2+
2轴正限位,低电平有效
16
LMT3+
3轴正限位,低电平有效
17
LMT4+
4轴正限位,低电平有效
18
STOP
急停引脚,低电平有效
19
NC
空引脚
20
VSS
电源负极
21
Y0
0号输出口
22
Y1
1号输出口
23
VSS
电源负极
24
VDD
电源正极+3.3V
25
CS
SPI通信使能脚,低电平有效
26
SCK
SPI通信时钟脚
27
SO
SPI通信数据输出脚,接单片机数据输入脚
28
SI
SPI通信数据输入脚,接单片机数据输出脚
29
P1
第1轴脉冲信号
30
TXD
串口数据发送
31
RXD
串口数据接收
32
D1
第1轴方向信号
33
Y2
2号输出口
34
Y3
3号输出口
35
VSS
电源负极
36
VDD
电源正极+3.3V
37
SIGN
工作状态指示,闲时慢速交替变化,轴运行时快速交替变化
38
P2
第2轴脉冲信号
39
D2
第2轴方向信号
40
P3
第3轴脉冲信号
41
D3
第3轴方向信号
42
NC
空引脚
43
NC
空引脚
44
VSS
电源负极
45
P4
第4轴脉冲信号
46
D4
第4轴方向信号
47
VSS
电源负极
48
VDD
电源正极+3.3V
SPI通讯协议
芯片与单片机使用SPI通讯,单片机作为主机,芯片为从机。CPHA=0,CPOL=0,高位在前,SPI数据宽度为8位。空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将CS引脚置低,整条指令发送完成后必须将CS置高。
每条指令间隔1MS以上。
SPI时序图如下:
SPI通讯指令
◆设置轴速度(e版本f版本共用指令)
发送:
功能码
补充0
轴号
加速度
运行速度
0x01
0x00
1字节
4字节
4字节
部分参数解释:
轴号(1,2,3,4)
加减速 加减速为: e版(1-480000)(Hz/s2) f版(1-1600000)(Hz/s2)
运行速度 运行频率为:e版(1-1200000)(Hz) f版(1-400000)(Hz)
要点:e版本轴号有效,速度为对应轴的速度。f版本由于共用一个插补核心,轴号设为任意值都为所有轴速度,如需改变当前运动指令里的速度需在当前指令前重设速度。加速度最大可设为运行速度4倍。
设置轴逻辑位置(e版本f版本共用指令)
发送:
功能码
补充0
轴号
位置
0x12
0x00
1字节
4字节
部分参数解释:
轴号(1,2,3,4) 1-4:1-4轴
位置 轴逻辑位置,范围(-268435455~+268435455)
◆轴停止(e版本f版本共用指令)
发送:
功能码
轴号
模式
0x17
1字节
1字节
部分参数解释:
轴号(1,2,3,4) 1-4: 1-4轴
模式(0,1,2) 0:急停并清空后面缓存的指令 1:减速停不清空后面缓存的指令 2:急停不清空后面缓存的指令
要点:f版本由于共用一个插补核心,轴号设为任意值都会让所用轴停止。
◆获取各轴逻辑位置和状态(e版本f版本共用指令)
发送:
功能码
数据0
0x04
最多19个字节
返回:
起始码
各轴运行状态
缓存数量
1轴坐标
2轴坐标
3轴坐标
4轴坐标
0x00
1字节
2字节
4字节
4字节
4字节
4字节
部分参数解释:
各轴运行状态(转为8位二进制数)
第0位为e版1轴状态 0:停止中 1:运行中
第1位为e版2轴状态 0:停止中 1:运行中
第2位为e版3轴状态 0:停止中 1:运行中
第3位为e版4轴状态 0:停止中 1:运行中
第5位为f版插补核各轴状态 0:停止中 1:运行中
缓存数量(0-128) 还未运行的缓存指令数
各轴坐标 范围(-268435455~+268435455)
要点:返回字节按功能顺序排列,由于SPI工作模式是一边发送一边接收,如只需取前面字节的数据,为节省通讯时间,可只发送对应字节的数据0。例如只需获取各轴运行状态,发送2个字节0便可。轴运行状态只是轴的瞬时状态,不能用来指示圆弧指令是否完成。可通过读取缓存数量来判断缓存区指令是否完成。一条圆弧指令会动态占用最多120条缓存空间。
设置特殊功能(f版本专用指令)
发送:
功能码
补充0
功能
0xfa
0x00
1字节
部分参数解释:
当功能写入0xfc,缓存内运动指令暂停。
当功能写入0xfd,取消缓存内运动指令暂停。
以下指令会自动进入缓存区并排队执行:
回原点(e版本f版本共用指令)
发送:
功能码
补充0
轴号
进入原点速度
离开原点速度
0x1a
0x00
1字节
4字节
4字节
部分参数解释:
轴号(1,2,3,4)
进入原点速度 运行频率为:值(1-400000)(Hz)
离开原点速度 运行频率为:值(1-400000)(Hz)
要点:回原点指令会自动生成一段负脉冲和一段正脉冲。以进入原点速度输出负脉冲时,左限位原点开关生效时自动减速停;随后以离开原点速度输出正脉冲,离开原点限位开关时自动急速停止,急停后可作为原点。回原点指令不宜和其它运动指令混合在一起放入缓存里,回原点过程应单独存在。
四轴直线插补(f版本专用指令)
发送:
功能码
X轴号
Y轴号
Z轴号
E轴号
X脉冲数
Y脉冲数
Z脉冲数
E脉冲数
补充0
运动方式
0x0a
1字节
1字节
1字节
1字节
4字节
4字节
4字节
4字节
0x00
1字节
部分参数解释:
X轴号(1,2,3,4)
Y轴号(1,2,3,4)
Z轴号(1,2,3,4)
E轴号(1,2,3,4)
X脉冲(-268435455~+268435455)
Y脉冲(-268435455~+268435455)
Z脉冲(-268435455~+268435455)
E脉冲(-268435455~+268435455)
运动方式(0,1) 0:绝对位移 1:相对位移
要点:当只需要少于四轴做插补时,不用的轴号和脉冲数写0。
二轴圆弧插补(f版本专用指令)
发送:
功能码
X轴号
Y轴号
终点坐标X
终点坐标Y
圆心坐标X
圆心坐标Y
运动方式1
运动方式2
0x0c
1字节
1字节
4字节
4字节
4字节
4字节
1字节
1字节
部分参数解释:
X轴号(1,2,3)
Y轴号(1,2,3)
终点坐标 圆弧插补的终点位置,范围(-268435455~+268435455)
圆心坐标 圆弧插补的圆心点位置,范围(-268435455~+268435455)
运动方式1 0:逆时针插补 1:顺时针插补 2:三点定圆弧
运动方式2 0:绝对位移 1:相对位移
要点:圆弧各坐标必须能构成正常的圆弧。圆弧插补指令会根据圆弧参数动态占用缓存空间。当运动方式1设为2时,为三点定圆弧模式,圆心坐标参数设为圆弧的中间点坐标。
三轴螺旋插补(f版本专用指令)
发送:
功能码
X轴号
Y轴号
Z轴号
终点坐标X
终点坐标Y
脉冲数
圆心坐标X
圆心坐标Y
运动方式1
运动方式2
0x0d
1字节
1字节
1字节
4字节
4字节
字节
4字节
4字节
1字节
1字节
部分参数解释:
X轴号 (1,2,3) 圆弧X轴
Y轴号 (1,2,3) 圆弧Y轴
Z轴号 (1,2,3) 螺旋轴
终点坐标 圆弧插补的终点位置,范围(-268435455~+268435455)
圆心坐标 圆弧插补的圆心点位置,范围(-268435455~+268435455)
运动方式1 0:逆时针插补 1:顺时针插补
运动方式2 0:绝对位移 1:相对位移
等待延时(e版本f版本共用指令)
发送:
功能码
延时量
0x0e
2字节
部分参数解释:
延时量(1-10000)MS
要点:等待延时是指等待所设延时量后才执行后面的指令。
◆写输出口状态(e版本f版本共用指令)
发送:
功能码
输出端口号
输出状态
0x03
1字节
1字节
部分参数解释:
输出端口号 (0-6) Y0-Y6
输出状态 (0,1) 0:输出低电平 1:输出高电平
单轴运行(e版本专用指令)
发送:
功能码
轴号
运动方式
脉冲数量
0x02
1字节
1字节
4字节
部分参数解释:
轴号(1,2,3,4) 独立轴运动的轴号
脉冲数量 (-268435455~+268435455)输出的脉冲数 >0:正方向移动 <0:负方向移动
运动方式(0,1) 0:绝对位移 1:相对位移
◆等待轴停止(e版本专用指令)
发送:
功能码
轴号
0x0f
1字节
部分参数解释:
轴号(1,2,3,4) 1,2,3,4:独立轴1-4轴
要点:等待轴停止是指在对应轴停止之前一直等待,直到轴停止后才执行后面的指令。独立轴不会自动等待轴运行完成后才执行下一条指令。插补轴会自动等待轴运行完成后才执行下一条指令。
电路连接
芯片引脚输出最大电流15Ma,输入灌电流最大25Ma。如多芯片组网,各芯片的SCK,SO,SI引脚并联,CS脚独立受单片机控制。单片机SPI数据输入脚接芯片SO脚,需内部或外部上拉。单片机SPI数据输出脚接芯片SI脚。芯片,单片机,差分输出连接参考图:
运动控制编程参考
通过51单片机控制运动控制芯片的SPI通信程序示例。
(来自产品官网:http://www.lf-control.com)
#include <intrins.h>
#include <reg52.h>
//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<len;i++)
{
USART_Txbyte(fdata[i]);
}
}
void delay_nus(unsigned long n)
{
unsigned long j;
while(n--)
{
j=1;
while(j--);
}
}
//延时n ms
void delay_nms(unsigned long n)
{
while(n--)
delay_nus(1000);
}
/*
函数名: SPI_SendData
功能:软件模拟SPI通讯发送并接收一个8位字节数据。
如需使用硬件SPI,单片机作为主机,运动控制芯片为从机。CPHA=0,CPOL=0,高位在前,SPI数据宽度为8位。
空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将CS引脚置低,整条指令发送完成后必须将CS置高。
每条指令间需有时间间隔,推荐延时1MS以上。
*/
unsigned char SPI_SendData(unsigned char outdata)
{
unsigned char RecevieData=0,i;
SPI_SCKLOW;
// _nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
for(i=0;i<8;i++)
{
SPI_SCKLOW;
_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
if(outdata&0x80)
{
SPI_OUTHIGH;
}
else
{
SPI_OUTLOW;
}
outdata<<=1;
_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SPI_SCKHIGH; //
RecevieData <<= 1;
if(SPI_IN)
{
RecevieData |= 1;
}
_nop_(); _nop_(); _nop_();_nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_();
SPI_SCKLOW;
}
return RecevieData;
}
/*
unsigned char SPI_SendData(unsigned char outdata)
{
unsigned char RecevieData=0,i;
SPDAT = outdata; //发送数据
while (!(SPSTAT & 0x80)); //查询完成标志
SPSTAT = 0xc0; //清中断标志
return SPDAT;
}
*/
/*
函数名: enabled_cs
功能:SPI运动控制模块使能对应芯片模块的CS脚
参数:
cardno 卡号
用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片模块关联使用。
*/
void enabled_cs(unsigned char cardno)
{
if(cardno==1)
{
SPI1_CSLOW;
}
if(cardno==2)
{
SPI2_CSLOW;
}
if(cardno==3)
{
SPI3_CSLOW;
}
}
/*
函数名: disabled_cs
功能:SPI运动控制模块禁止对应芯片模块的CS脚
参数:
cardno 卡号
用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片关联使用。
*/
void disabled_cs(unsigned char cardno)
{
if(cardno==1)
{
SPI1_CSHIGH;
}
if(cardno==2)
{
SPI2_CSHIGH;
}
if(cardno==3)
{
SPI3_CSHIGH;
}
}
/*
函数名: set_speed
功能:设置轴速度
参数:
cardno 卡号
axis 轴号(1,2,3,4)
acc 加减速: 值(Hz/s2)
speed 运行频率为:值(Hz)
*/
void set_speed(unsigned char cardno ,unsigned char axis ,unsigned long acc ,unsigned long speed )
{
unsigned char OutByte[25];
OutByte[0] = 1;
OutByte[1] = 0;
OutByte[2] = axis;
OutByte[3] = acc >>24;
OutByte[4] = acc >>16;
OutByte[5] = acc >>8;
OutByte[6] = acc ;
OutByte[7] = speed >>24;
OutByte[8] = speed >>16;
OutByte[9] = speed >>8;
OutByte[10] = speed ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
SPI_SendData(OutByte[6]);
SPI_SendData(OutByte[7]);
SPI_SendData(OutByte[8]);
SPI_SendData(OutByte[9]);
SPI_SendData(OutByte[10]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: set_command_pos
功能: 设置轴逻辑位置
参数:
cardno 卡号
axis 轴号(1,2,3,4)
pulse 位置脉冲数,范围(-268435455~+268435455)
*/
void set_command_pos(unsigned char cardno ,unsigned char axis, long value )
{
unsigned char OutByte[25];
OutByte[0] = 0x12 ;
OutByte[1] = 0 ;
OutByte[2] = axis ;
OutByte[3] = value >>24;
OutByte[4] = value >>16;
OutByte[5] = value >>8;
OutByte[6] = value ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
SPI_SendData(OutByte[3]);
SPI_SendData(OutByte[4]);
SPI_SendData(OutByte[5]);
SPI_SendData(OutByte[6]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: sudden_stop
功能: 轴立即停止
参数:
cardno 卡号
axis 停止的轴号(1,2,3,4)
mode 0:急停并清空后面缓存的指令 2:急停不清后面缓存的指令
*/
void sudden_stop(unsigned char cardno ,unsigned char axis ,unsigned char mode)
{
unsigned char OutByte[25];
OutByte[0] = 0x17 ;
OutByte[1] = axis ;
OutByte[2] = mode;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: set_special
功能:设置特别功能
参数:
cardno 卡号
value
0xfc 缓存插补运动暂停
0xfd 取消缓存插补暂停
*/
void set_special(unsigned char cardno,unsigned char value)
{
unsigned char OutByte[25];
OutByte[0] = 0xFA ;
OutByte[1] = 0;
OutByte[2] = value;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
SPI_SendData(OutByte[2]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: get_inp_state
功能: 获取轴状态,缓存剩余量,各轴逻辑位置。
参数:
cardno 卡号
amount 获取字节数量。 设为20将取全部数据。
inbuf[] 读取的数据存放的数组
*/
void get_inp_state( unsigned char cardno, unsigned char amount,unsigned char inbuf[])
{
unsigned char OutByte[25];
char i;
enabled_cs(cardno);
inbuf[0]=SPI_SendData(0x04);
for(i=1;i<amount;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点亮
}
}
-
xc1004四轴SPI运动控制芯片,最低80元,LQFP48封装。
SPI通讯,仅需使用10条指令便可完成复杂工作。
单模块四轴输出,多个模块多从机工作可达120轴。
支持四轴,三轴,二轴,一轴直线插补,二轴圆弧插补,螺旋插补
。脉冲输出使用脉冲+方向方式。
拥有128条运动指令缓存空间,支持连续插补,支持速度前瞻。
bc014四轴电子凸轮运动控制模块可通过串口TTL连接PLC,电脑,单
片机用于各种需要运动控制的设备。
仅需使用少量指令便可完成复杂工作。
单模块四轴输出,多个模块多从机工作可达120轴。
支持四轴,三轴,二轴,一轴直线插补,二轴圆弧插补,螺旋插补,
椭圆插补。脉冲输出使用脉冲+方向方式。
拥有512条运动指令缓存空间,支持连续插补,支持速度前瞻。
bc014s支持手轮和电子凸轮功能。
模块尺寸仅6*8CM。
官网:http://www.lf-control.com ,可下载相关文档。
-
Mpc013,mpc014,mpc014g运动控制模块
参
考
手
册
泰
概述
Mpc013,mpc014,mpc014g模块引脚兼容,指令功能兼容。Mpc013三轴高速独立控制,无插补功能,SPI通信。mpc014四轴共用一个插补核心, SPI通信。mpc014g在mpc014基础上增加串口G代码控制功能。
◆ SPI或串口通讯,仅需使用少量指令便可完成复杂工作。
◆ 单模块四轴输出,多个模块多从机工作可达120轴。
◆ 支持四轴,三轴,二轴,一轴直线插补,二轴圆弧插补,螺旋插补。脉冲输出使用脉冲+方向方式。
◆ 拥有512条运动指令缓存空间,支持连续插补,支持速度前瞻。
◆ 引脚输入输出3.3V,可兼容5V。
模块性能参数
供电电源
3.3VDC 电流100MA
温度范围
-40 ~ +105℃
封装
双列直插30P
IO输入
3.3v ,兼容5v
IO输出
3.3v TTL输出
控制轴数
Mpc013 3轴 Mpc014 4轴 Mpc014g 4轴
脉冲频率
Mpc013 2M Mpc014 500k Mpc014g 500k
运动性能
Mpc013 3轴独立单轴控制,支持指令缓存
Mpc014 1-4轴直线插补 ,圆弧插补,螺旋插补,支持指令缓存,支持连续插补
Mpc014g 1-4轴直线插补 ,圆弧插补,螺旋插补,支持指令缓存,支持连续插补,支持G代码控制
通信速度
SPI:20Mbps 串口:115200bps
状态指示灯
闲时慢速交替变化,轴运行时快速交替变化
封装尺寸
引脚排列
引脚号
引脚名称
引脚功能说明
1
VCC
电源正极+3.3V
2
GND
电源负极
3
TXD
串口数据发送
4
RXD
串口数据接收
5
CS
SPI通信使能脚,低电平有效
6
SCK
SPI通信时钟脚
7
SO
SPI通信数据输出脚,接单片机数据输入脚
8
SI
SPI通信数据输入脚,接单片机数据输出脚
9
X0
1轴负限位或原点,低电平有效
10
X1
2轴负限位或原点,低电平有效
11
X2
3轴负限位或原点,低电平有效
12
X3
4轴负限位或原点,低电平有效
13
X4
4号输入口
14
X5
5号输入口
15
X6
6号输入口
16
P1
第1轴脉冲信号
17
D1
第1轴方向信号
18
P2
第2轴脉冲信号
19
D2
第2轴方向信号
20
P3
第3轴脉冲信号
21
D3
第3轴方向信号
22
P4
第4轴脉冲信号(mpc013无)
23
D4
第4轴方向信号(mpc013无)
24
Y0
0号输出口
25
Y1
1号输出口
26
Y2
2号输出口
27
Y3
3号输出口
28
Y4
4号输出口
29
Y5
5号输出口
30
Y6
6号输出口
SPI通讯协议
模块与单片机使用SPI通讯,单片机作为主机,模块为从机。CPHA=0,CPOL=0,高位在前,SPI数据宽度为8位。空闲状态下单片机SCK引脚必须为低电平。每一条指令开始发送前将CS引脚置低,整条指令发送完成后必须将CS置高。
每条指令间隔1MS以上。
SPI时序图如下:
SPI通讯指令
◆设置轴速度
发送:
功能码
加速度
运行速度
倍率
0x01
2字节
2字节
1字节
部分参数解释:
加减速 加减速为:值(1-10000)*倍率(Hz/s2)
运行速度 运行频率为:值(1-10000)*频率倍率(Hz)
倍率 频率倍率(1-100)
要点:所设速度为所有轴速度,如需改变当前运动指令里的速度需在当前指令前重设速度。
设置轴逻辑位置
发送:
功能码
轴号
位置
0x12
1字节
4字节
部分参数解释:
轴号(1,2,3,4) 1-4:1-4轴
位置 轴逻辑位置,范围(-268435455~+268435455)
◆轴停止
发送:
功能码
轴号
0x17
1字节
部分参数解释:
轴号(1,2,3,6) 1,2,3:独立轴1-3轴停 6,插补核心所有轴停止。
要点:只有mpc013有独立轴1-3轴。Mpc014所有轴共用一个插补核心,虚拟轴号为6。
◆获取各轴逻辑位置和状态
发送:
功能码
数据0
0x00
最多19个字节
返回:
起始码
各轴运行状态
各轴限位状态
剩余缓存数量
1轴坐标
2轴坐标
3轴坐标
4轴坐标
0x3f
1字节
1字节
1字节
4字节
4字节
4字节
4字节
部分参数解释:
各轴状态值(转为8位二进制数)
第0位表示独立第一轴状态 0:停止中 1:运行中
第1位表示独立第二轴状态 0:停止中 1:运行中
第2位表示独立第三轴状态 0:停止中 1:运行中
第5位为插补核心各轴状态 0:停止中 1:运行中
各轴限位值(转为8位二进制数)
第0位表示第一轴状态 0:正常 1:限位
第1位表示第二轴状态 0:正常 1:限位
第2位表示第三轴状态 0:正常 1:限位
第3位表示第四轴状态 0:正常 1:限位
剩余缓存数量(0-250) 剩余超过250条也显示250条
各轴坐标 范围(-268435455~+268435455)
要点:返回字节按功能顺序排列,由于SPI工作模式是一边发送一边接收,如只需取前面字节的数据,为节省通讯时间,可只发送对应字节的数据0。例如只需获取各轴运行状态,发送2个字节0便可。
设置特殊功能
发送:
功能码
功能
0xfa
1字节
部分参数解释:
当功能写入0xfb,清除缓存。
当功能写入0xfc,缓存内运动指令暂停。
当功能写入0xfd,取消缓存内运动指令暂停。
以下指令会自动进入缓存区并排队执行:
单轴运行
发送:
功能码
轴号
脉冲数量
运动方式
0x02
1字节
4字节
1字节
部分参数解释:
轴号(1,2,3) 单轴运动的轴号
脉冲数量 (-268435455~+268435455)输出的脉冲数 >0:正方向移动 <0:负方向移动
运动方式(0,1) 0:绝对位移 1:相对位移
要点: 此指令只有mpc013可用 ,mpc014如只需一轴运动可使用一轴直线插补指令。
一轴直线插补
发送:
功能码
X轴号
X脉冲数
运动方式
0x07
1字节
4字节
1字节
部分参数解释:
X轴号(1,2,3,4)
X脉冲(-268435455~+268435455)
运动方式(0,1) 0:绝对位移 1:相对位移
二轴直线插补
发送:
功能码
X轴号
Y轴号
X脉冲数
Y脉冲数
运动方式
0x07
1字节
1字节
4字节
4字节
1字节
部分参数解释:
X轴号(1,2,3,4)
Y轴号(1,2,3,4)
X脉冲(-268435455~+268435455)
Y脉冲(-268435455~+268435455)
运动方式(0,1) 0:绝对位移 1:相对位移
三轴直线插补
发送:
功能码
X轴号
Y轴号
Z轴号
X脉冲数
Y脉冲数
Z脉冲数
运动方式
0x07
1字节
1字节
1字节
4字节
4字节
4字节
1字节
部分参数解释:
X轴号(1,2,3,4)
Y轴号(1,2,3,4)
Z轴号(1,2,3,4)
X脉冲(-268435455~+268435455)
Y脉冲(-268435455~+268435455)
Z脉冲(-268435455~+268435455)
运动方式(0,1) 0:绝对位移 1:相对位移
四轴直线插补
发送:
功能码
X轴号
Y轴号
终点坐标X
终点坐标Y
圆心坐标X
圆心坐标Y
运动方式1
运动方式2
0x08
1字节
1字节
4字节
4字节
4字节
4字节
1字节
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:相对位移
二轴圆弧插补
发送:
功能码
X轴号
Y轴号
Z轴号
E轴号
X脉冲数
Y脉冲数
Z脉冲数
E脉冲数
运动方式
0x07
1字节
1字节
字节
字节
4字节
4字节
字节
字节
1字节
部分参数解释:
X轴号(1,2,3)
Y轴号(1,2,3)
终点坐标 圆弧插补的终点位置,范围(-268435455~+268435455)
圆心坐标 圆弧插补的圆心点位置,范围(-268435455~+268435455)
运动方式1 0:逆时针插补 1:顺时针插补
运动方式2 0:绝对位移 1:相对位移
三轴螺旋插补
发送:
功能码
X轴号
Y轴号
Z轴号
终点坐标X
终点坐标Y
脉冲数
圆心坐标X
圆心坐标Y
运动方式1
运动方式2
0x08
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:相对位移
等待延时
发送:
功能码
延时量
0x0e
2字节
部分参数解释:
延时量(1-10000)MS
要点:等待延时是指等待所设延时量后才执行后面的指令。
◆写输出口状态
发送:
功能码
输出端口号
输出状态
0x03
1字节
1字节
部分参数解释:
输出端口号 (0-6) Y0-Y6
输出状态 (0,1) 0:输出低电平 1:输出高电平
◆等待轴停止
发送:
功能码
轴号
0x09
1字节
部分参数解释:
轴号(1,2,3) 1,2,3:独立轴1-3轴
要点:等待轴停止是指在对应轴停止之前一直等待,直到轴停止后才执行后面的指令。只有mpc013才有独立轴1-3轴,独立轴不会自动等待轴运行完成后才执行下一条指令。Mpc014所有轴都基于一个插补核心,会自动等待轴运行完成后才执行下一条指令。
电路连接
模块引脚输出最大电流15Ma,输入灌电流最大25Ma。如多模块组网,各模块的SCK,SO,SI引脚并联,CS脚独立受单片机控制。单片机SPI数据输入脚接模块SO脚,需内部或外部上拉。单片机SPI数据输出脚接模块SI脚。模块,单片机,差分输出连接参考图:
运动控制编程参考
通过51单片机控制mpc014运动控制模块的程序,完整电路图和程序工程可到官网http://www.mpc000.com下载。
#include <intrins.h>
#include <reg52.h>
//MCU: stc8f2k08s2 运动模块:http://www.mpc000.com
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 BRT (65536 - FOSC / 115200 / 4) //定义115200波特率
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空闲状态一定要为低电平。
}
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<len;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,单片机作为主机,mpc014为从机。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;
}
/*
函数名: enabled_cs
功能:mpc013,mpc014串口SPI运动控制模块使能对应芯片模块的CS脚
参数:
cardno 卡号
用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片模块关联使用。
*/
void enabled_cs(unsigned char cardno)
{
if(cardno==1)
{
SPI1_CSLOW;
}
if(cardno==2)
{
SPI2_CSLOW;
}
if(cardno==3)
{
SPI3_CSLOW;
}
}
/*
函数名: disabled_cs
功能:mpc013,mpc014串口SPI运动控制模块禁止对应芯片模块的CS脚
参数:
cardno 卡号
用单片机不同引脚去控制不同芯片的CS脚,以便多个芯片关联使用。
*/
void disabled_cs(unsigned char cardno)
{
if(cardno==1)
{
SPI1_CSHIGH;
}
if(cardno==2)
{
SPI2_CSHIGH;
}
if(cardno==3)
{
SPI3_CSHIGH;
}
}
/*
函数名: set_speed
功能:mpc013,mpc014串口SPI运动控制模块设置轴速度
参数:
cardno 卡号
acc 加减速:值*倍率(Hz/s2)
speed 运行频率为:值*倍率(Hz)
range 倍率(1-100)
*/
void set_inp_speed(unsigned char cardno ,unsigned int acc ,unsigned int speed ,unsigned char range)
{
unsigned char OutByte[25];
OutByte[0] = 1;
OutByte[1] = acc >>8;
OutByte[2] = acc ;
OutByte[3] = speed >>8;
OutByte[4] = speed ;
OutByte[5] = range;
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]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: pmove
功能:mpc013模块单轴运行 ,仅独立轴可用。
参数:
cardno 卡号
axis 轴号(1,2,3)
pulse 输出的脉冲数 >0:正方向移动 <0:负方向移动 范围(-268435455~+268435455)
mode 0:绝对位移 1:相对位移
*/
void pmove(unsigned char cardno ,unsigned char axis,long pulse , unsigned char mode)
{
unsigned char OutByte[25];
OutByte[0] = 2 ;
OutByte[1] = axis;
OutByte[2] = pulse >>24;
OutByte[3] = pulse >>16;
OutByte[4] = pulse >>8;
OutByte[5] = pulse ;
OutByte[6] = 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]);
disabled_cs(cardno);
delay_nms(1) ;
}
/*
函数名: set_command_pos
功能: mpc013,mpc014串口SPI运动控制模块设置轴逻辑位置
参数:
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] = axis ;
OutByte[2] = value >>24;
OutByte[3] = value >>16;
OutByte[4] = value >>8;
OutByte[5] = 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]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: sudden_stop
功能: mpc013,mpc014串口SPI运动控制模块轴立即停止
参数:
cardno 卡号
axis 停止的轴号(1,2,3,6) 1,2,3:独立轴1-3轴停 6,插补模块所有轴停止。
*/
void sudden_stop(unsigned char cardno ,unsigned char axis)
{
unsigned char OutByte[25];
OutByte[0] = 0x17 ;
OutByte[1] = axis ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: set_special
功能:mpc014串口SPI运动控制模块设置特别功能
参数:
cardno 卡号
value
0xfb 清除缓存
0xfc 缓存插补运动暂停
0xfd 取消缓存插补暂停
*/
void set_special(unsigned char cardno,unsigned char value)
{
unsigned char OutByte[25];
OutByte[0] = 0xFA ;
OutByte[1] = value;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: get_inp_state
功能: mpc013,mpc014串口SPI运动控制模块获取轴状态,限位状态,缓存剩余量,各轴逻辑位置。
参数:
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);
for(i=0;i<amount;i++)
{
inbuf[i]=SPI_SendData(0);
}
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: inp_move1
功能:mpc014串口SPI运动控制模块一轴直线插补
参数:
cardno 卡号
no1 X轴轴号
pulse1 X轴移动的距离,范围(-8388608~+8388607)
mode 0:绝对位移 1:相对位移
*/
void inp_move1(unsigned char cardno,unsigned char no1 , long pulse1 ,unsigned char mode )
{
unsigned char OutByte[25];
OutByte[0] = 0x7;
OutByte[1] = no1;
OutByte[2] = pulse1>>24;
OutByte[3] = pulse1 >>16;
OutByte[4] = pulse1>> 8;
OutByte[5] = pulse1;
OutByte[6] = 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]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: inp_move2
功能:mpc014串口SPI运动控制模块二轴直线插补
参数:
cardno 卡号
no1 X轴轴号
no2 Y轴轴号
pulse1,pulse2 X-Y轴移动的距离,范围(-8388608~+8388607)
mode 0:绝对位移 1:相对位移
*/
void inp_move2(unsigned char cardno,unsigned char no1 ,unsigned char no2 , long pulse1 ,long pulse2 ,unsigned char mode )
{
unsigned char OutByte[25];
OutByte[0] = 0x8;
OutByte[1] = no1;
OutByte[2] = no2;
OutByte[3] = pulse1>>24;
OutByte[4] = pulse1 >>16;
OutByte[5] = pulse1>> 8;
OutByte[6] = pulse1;
OutByte[7] = pulse2 >>24;
OutByte[8] = pulse2 >>16;
OutByte[9] = pulse2 >>8;
OutByte[10] = pulse2 ;
OutByte[11] = 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]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: inp_move3
功能:mpc014串口SPI运动控制模块三轴直线插补
参数:
cardno 卡号
no1 X轴轴号
no2 Y轴轴号
no3 Z轴轴号
pulse1,pulse2,pulse3 X-Y-Z轴移动的距离,范围(-8388608~+8388607)
mode 0:绝对位移 1:相对位移
*/
void inp_move3(unsigned char cardno,unsigned char no1 ,unsigned char no2 ,unsigned char no3, long pulse1 ,long pulse2 ,long pulse3 ,unsigned char mode )
{
unsigned char OutByte[25];
OutByte[0] = 0x9;
OutByte[1] = no1;
OutByte[2] = no2;
OutByte[3] = no3;
OutByte[4] = pulse1>>24;
OutByte[5] = pulse1 >>16;
OutByte[6] = pulse1>> 8;
OutByte[7] = pulse1;
OutByte[8] = pulse2 >>24;
OutByte[9] = pulse2 >>16;
OutByte[10] = pulse2 >>8;
OutByte[11] = pulse2 ;
OutByte[12] = pulse3 >>24;
OutByte[13] = pulse3 >>16;
OutByte[14] = pulse3 >>8;
OutByte[15] = pulse3 ;
OutByte[16] = 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]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: inp_move4
功能:mpc014串口SPI运动控制模块四轴直线插补
参数:
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] = 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]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: inp_arc
功能:mpc014串口SPI运动控制模块二轴圆弧插补
参数:
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(1);
}
/*
函数名: inp_helical
功能:mpc014串口SPI运动控制模块圆弧螺旋插补
参数:
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);
}
/*
函数名: wait_stop
功能:mpc013模块等待轴停止
参数:
cardno 卡号
axis 需要等待停止的轴号(1,2,3,6) 1,2,3:独立轴1-3轴 6,插补模块所有轴
*/
void wait_stop(unsigned char cardno ,unsigned char axis)
{
unsigned char OutByte[25];
OutByte[0] = 0x0f ;
OutByte[1] = axis ;
enabled_cs(cardno);
SPI_SendData(OutByte[0]);
SPI_SendData(OutByte[1]);
disabled_cs(cardno);
delay_nms(1);
}
/*
函数名: write_bit
功能:mpc013,mpc014串口SPI运动控制模块写输出口状态
参数:
cardno 卡号
number 端口号(0-2) Y0-Y2
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
功能:mpc013,mpc014串口SPI运动控制模块等待延时数
参数:
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);
}
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(10) ;
/*独立运行轴1,2,3轴回原点,更多方式回原点可自由组合。mpc013运动控制模块专用
set_inp_speed(1 ,200,300,100); //设加速度50000Hz/s2, 运行速度30000Hz
pmove(1,1,-1000000,1); // 1轴多脉冲负方向运动,碰到原点限位自动停止
pmove(1,2,-1000000,1); // 2轴多脉冲负方向运动 ,碰到原点限位自动停止
pmove(1,3,-1000000,1); // 2轴多脉冲负方向运动,碰到原点限位自动停止
do
{
get_inp_state( 1, 2,inbuf); //只需读出2个字节来判断轴状态
}
while(inbuf[1]); //inbuf[1]数据为0表示所有轴都停
set_command_pos(1 ,1,0); //设1轴坐标
set_command_pos(1 ,2,0); //设2轴坐标
set_command_pos(1 ,3,0); //设3轴坐标
*/
/*插补运行轴1,2,3,4轴回原点,更多方式回原点可自由组合。mpc014串口SPI运动控制模块专用
set_inp_speed(1 ,200,300,100); //设加速度50000Hz/s2, 运行速度30000Hz
inp_move4(1,1,2,3,4 ,-1000000,-1000000,-1000000,-1000000 ,1); // 4轴多脉冲插补负方向运动,碰到原点限位自动停止
do
{
get_inp_state( 1, 2,inbuf); //只需读出2个字节来判断轴状态
}
while(inbuf[1]); //inbuf[1]数据为0表示所有轴都停
set_command_pos(1 ,1,0); //设1轴坐标
set_command_pos(1 ,2,0); //设2轴坐标
set_command_pos(1 ,3,0); //设3轴坐标
set_command_pos(1 ,4,0); //设3轴坐标
*/
while(1)
{
if((!b1)&&(!b1_state))
{
delay_nms(10);
if((!b1)&&(!b1_state))
{
led=0;
b1_state=1;
set_inp_speed(1 ,300,300,100);
/*下面的指令会直接发到缓存区自动排队运行。mpc014串口SPI运动控制模块专用*/
inp_move2(1,2 ,1 ,6400 ,32000 ,1);
wait_delay(1 ,3000); //模块内部指令间延时3S
write_bit(1 , 0, 1);
inp_move2(1,2 ,1 ,6400 ,32000 ,1);
wait_delay(1 ,3000);
inp_move2(1,2 ,1 ,6400 ,32000 ,1); //2轴直线插补
inp_move1(1,3 ,10 ,1) ;
inp_move2(1,2 ,1 ,6400 ,32000 ,1);
inp_move2(1,2 ,1 ,6400 ,32000 ,1);
inp_move3(1,2,3,1 ,3000000,3000000 ,3000000 ,1); // 3轴直线插补
wait_delay(1 ,1000);
inp_move2(1,1 ,2 ,1000 ,1000 ,1);
write_bit(1 , 0, 1); // 0输出口为高
inp_move1(1,1 ,1000 ,1) ; // 1轴运行
inp_arc(1 ,2,3, -200, 200, -200, 0,0,1) ; // 2轴圆弧插补
/*上面的指令会直接发到缓存区自动排队运行。mpc014串口SPI运动控制模块专用*/
// set_inp_speed(1 ,5000,5000,100);
// pmove(1,1,1000, 1); // pmove只有mpc013能用
// wait_stop(1 ,1);
// pmove(1,2,-100, 1);
while(!b1);
}
}
else
led=1;
if((!b1)&&(b1_state))
{
delay_nms(10) ;
if((!b1)&&(b1_state))
{
led=0;
//sudden_stop(1,1); // 立即停止独立轴1轴 ,只适用于mpc013
//sudden_stop(1,6); // 立即停止所有插补轴
get_inp_state( 1, 20,inbuf); //读出20个字节数据放入数组
USRAT_transmit(inbuf,20); // 串口将数组数据发送出去查看
// if(inbuf[1]==0) //inbuf[1]数据为0表示所有轴都停
//set_special(1,0xfd);
// else
// set_special(1,0xfc);
//b1_state=0;
while(!b1);
}
}
}
}
串口G代码控制
Mpc014g模块可通过串口 G代码控制模块,串口通讯速率为115200bps,数据位为8位,停止位1位,无校验。
模块通讯协议完全兼容标准G代码,G代码详细的格式与用法请参考标准文档。上电芯片会主动发送字符“>”,工作时上位机每发送一条指令,会回复字符“ok”,发 M114会回复坐标。上位机只有当收到回复后,才可发送下一条指令。目前支持如下指令:
G0-快速定位 坐标,单位mm。速度F表示mm/s。
如:G0 X10 Y10 F30000
G1 - 直线插补 世界坐标,单位mm。
如:G1 X10 Y10 F30000
G2 - 正圆插补 X,Y为终点坐标,I,J为圆心相对起点坐标。
如:G2 X-20 Y20 I-20 J0 F30000
G3 - 逆圆插补
如:G2 X-20 Y20 I-20 J0 F30000
G90 - 绝对坐标
如:G90
G91 - 相对坐标
如:G91
G92 - 设置坐标
如:G92 X0 Y0
M92 - 脉冲系数 每MM多少脉冲,模块默认系数为1。
如:M92 X200 Y200 Z200 E200
M109 - 等待延时,单位MS
如:M109 S2000
M110 - 端口输出 ,T为端口号,Z为值
如:M110 T6 Z1
M112 -急停 ,停所有轴,并清空缓存
如:M112
M114 -读取当前坐标 ,返回轴坐标
如:M114
M115返回轴状态
如:M115
M116返回剩余缓存数量
如:M116
M204 - 设置加速度S,单位mm/s2。
如:M204 S5000
-
mpc003,mpc004,mpc006运动控制芯片模块DIP-30封装,体积小巧,可与普通单片机通过串口通讯对步进电
机或伺服电机进行控制。单模块最高六轴输出,最大脉冲输出频率为2MHz,最高二路正交编码输入,多个
模块组网工作可达120轴,任意两轴直线插补,任意两轴圆弧插补,指令自动缓存式连续执行,简单的17
条指令配合可实现强大的运动控制功能。价格90元
-
mpc003,mpc004,mpc006运动控制芯片模块DIP-30封装,体积小巧,可与普通单片机通过串口通讯对步进电
机或伺服电机进行控制。单模块最高六轴输出,最大脉冲输出频率为2MHz,最高二路正交编码输入,多个
模块组网工作可达120轴,任意两轴直线插补,任意两轴圆弧插补,指令自动缓存式连续执行,简单的17
条指令配合可实现强大的运动控制功能。价格90元起!
mpc014外置运动控制卡集成普通IO,模拟量输出,步进电机和伺服电机控制。RS485通讯,可多控制卡组
网工作。7路光耦隔离输入,9路晶体管集电极开路输出。最大脉冲输出频率为2MHz,四轴独立运动控制,
任意两轴直线插补,任意两轴圆弧插补,提供DLL动态链接函数库和mpc上位机软件调试,可用于
Window2000/XP/7平台二次开发。控制卡仅有22条函数指令,指令自动缓存式连续执行,与控制端无需高
速实时通讯,可靠替代PCI运动控制卡用于各中小型机械设备。价格590元!
mpc034四轴运动控制器集成普通IO,模拟量输出,步进电机和伺服电机控制。7路光耦隔离输入,9路晶体
管集电极开路输出。最大脉冲输出频率为2MHz,四轴独立运动控制,任意两轴直线插补,任意两轴圆弧插
补。使用简单易用的MPC上位机软编程,调试指令,支持变量参数。可连接触摸屏给变量参数赋值并监控
和控制控制器。简单的15条指令配合可实现强大的运动控制功能。可用于各中小型机械设备。价格390元
!
联系电话:0755-32912587 ,技术支持QQ:379741343 。详细资料请到产品官方网站www.mpc000.com下载
。
-
这种应用可以用mpc006六轴运动控制芯片模块
-
mpc003,mpc004,mpc006运动控制芯片模块DIP-30封装,体积小巧,可与普通单片机通过串口通讯对步进电
机或伺服电机进行控制。单模块最高六轴输出,最大脉冲输出频率为2MHz,最高二路正交编码输入,多个
模块组网工作可达120轴,任意两轴直线插补,任意两轴圆弧插补,指令自动缓存式连续执行,简单的17
条指令配合可实现强大的运动控制功能。价格90元起!
mpc014外置运动控制卡集成普通IO,模拟量输出,步进电机和伺服电机控制。RS485通讯,可多控制卡组
网工作。7路光耦隔离输入,9路晶体管集电极开路输出。最大脉冲输出频率为2MHz,四轴独立运动控制,
任意两轴直线插补,任意两轴圆弧插补,提供DLL动态链接函数库,可用于Window2000/XP/7平台二次开发
。控制卡仅有21条函数指令,指令自动缓存式连续执行,与控制端无需高速实时通讯,可靠替代PCI运动
控制卡用于各中小型机械设备。价格590元起!
mpc034四轴Modbus运动控制器集成普通IO,模拟量输出,步进电机和伺服电机控制。标准RS485 Modbus通
讯,可多模块组网工作。7路光耦隔离输入,9路晶体管集电极开路输出。最大脉冲输出频率为2MHz,四轴
独立运动控制,任意两轴直线插补,任意两轴圆弧插补。既能连接PLC或工控机在线运行,又能使用MPC上
位机软件或其它支持Modbus输入的系统下载指令脱机运行。指令在线运行自动缓存并连续执行,与控制端
无需高速实时通讯。简单的15条指令配合可实现强大的运动控制功能。可连接PLC,触摸屏或其它支持
Modbus通讯的系统用于各中小型机械设备。价格390元起!!
联系电话:0755-32912587 ,详细资料请到产品官方网站下载。
-
直接用运动控制芯片模块就行了,串口通信,带直线圆弧插补,多简单。三轴应用用mpc003,六轴应用用mpc006,价格就几十块钱。
-
直接用运动控制芯片模块就行了,串口通信,带直线圆弧插补,多简单。三轴应用用mpc003,六轴应用用mpc006,价格就几十块钱。