当然是单片机啦!
直接使用国产的双轴驱动器和控制器最便宜、最快。
深圳正运动技术的多轴脉冲、EtherCAT总线运动控制器ZMC432系列、XPLC系列,4-8轴网络zhi型运动控制卡daoECI2418和ECI2828系列
支持Basic,PLC梯形图,HMI组态三种编程环境,易于仿真,调试与诊断,支持电子凸轮,直线,圆弧,小线段前瞻,多种机械手算法等复杂的运动轨迹控制,
同时支持C#,C++,LabVIEW, VB,.NET,python等多种PC上位机软件开发,广泛应用于3C电子、视觉点胶、半导体、激光加工、木工加工、绕线、印刷包装、机械人delta/SCARA/码垛/五轴加工等行业领域。
还有他们家的EtherCAT IO模块也蛮好用的,具体资料可以上官网找到。
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运动控制模块专用
set_inp_speed(1 ,200,300,100); //设加速度50000Hz/s2, 运行速度30000Hz
inp_move4(1,1,2,3,4 ,-1000000,-1000000,-1000000,-1000000 ,1); // 多轴多脉冲插补负方向运动,碰到原点限位自动停止
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 ,500,500,100);
/*下面的指令会直接发到缓存区自动排队运行。mpc014专用*/
inp_move2(1,2 ,3 ,5000 ,5000 ,1);
inp_move2(1,2 ,3 ,5000 ,5000 ,1);
inp_move3(1,2,3,1 ,500,1000 ,2000 ,1);
wait_delay(1 ,1000);
inp_move2(1,1 ,2 ,1000 ,1000 ,1);
write_bit(1 , 0, 1);
inp_move1(1,2 ,10000 ,1 ) ;
inp_move1(1,1 ,1000 ,1) ;
inp_arc(1 ,2,3, -200, 200, -200, 0,0,1) ;
/*上面的指令会直接发到缓存区自动排队运行。mpc014专用*/
// 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表示所有轴都停
b1_state=0;
while(!b1);
}
}
}
}