第4个回答 2019-09-30
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