柒布格子吧 关注:6贴子:718
  • 1回复贴,共1

【软件设计】六足机器人控制程序

取消只看楼主收藏回复


#include "main.h"
//电机反向运行的延时计数器
uword tiDelay1,tiDelay2,tiDelay3;
//电机运行的脉冲计数器
ulong ctPulse1,ctPulse2,ctPulse3;
//串口控制的电机方向、脉冲宽度和脉冲数量
ubyte MOT_direct1,MOT_direct2,MOT_direct3,RS_Status,a; //电机方向
ubyte MOT_PulseTime1,MOT_PulseTime2,MOT_PulseTime3;//电机脉冲宽度
uword MOT_PulseNum1,MOT_PulseNum2,MOT_PulseNum3;//电机脉冲数
//串口接收变量
ubyte RS_Data[RS_LENGTH]; //串口接收数组
ubyte RS_Indx;//串口接收数组指针
ubyte RS_Status; //串口接收状态标志
//定时器变量
ubyte B_TimerStart;//0.5ms定时器标志位
unsigned inti,j,t,d1,d2,d3,c=0;
unsigned int maxt,maxb;
//上盘抬起或下盘下降子程序
void shangpantaiqizichengxu()
编程思想:,在LabVIEW里面设置合适的转速,合适的转角,发出脉冲,子程序的计数脉冲,脉冲宽度都是由所发脉冲决定,根据计数脉冲,脉冲宽度的要求,编写程序,发出合适的脉冲,控制电机达到要求的转速与转角,通过控制P9_P0口、P9_P1口、P9_P2口来控制电机转向,实现我们想要的运动。
{
int NUM1=0,NUM2=0,NUM3=0;
int flag=0;
P9_P3=0;
P9_P4=0;
P9_P5=0;
P9_P0=1; // P9_P0口控制电机转向,将其置1,电机顺时针转动
P9_P1=1; // P9_P1口控制电机转向,将其置1,电机顺时针转动
P9_P2=1; // P9_P2口控制电机转向,将其置1,电机顺时针转动
while(NUM1!=MOT_PulseNum1||NUM2!=MOT_PulseNum2||NUM3!=MOT_PulseNum3)
//当电机一、二、三的计数次数都达到设定值时跳出while循环,否者继续执行
{ flag++; //用来记录走过多少个0.5ms
if(0==(flag-1)%(2*MOT_PulseTime1)) 0020 //第1个电机所需要的脉冲
//2*MOT_PulseTime1即MOT_PulseTime1/0.5,说明每个脉冲宽度有几个0.5ms。flag若能被2*MOT_PulseTime1则发出一个脉冲,高低电平互换
{ if(NUM1<MOT_PulseNum1*2)
//在满足上面的条件下,若计数次数未达到设定计数次数是,发出脉冲,高低互换,否这不执行
{ P9_P3=!P9_P3; //当满足上面两个条件时高低电平互换
NUM1++;}
}
if(0==(flag-1)%(2*MOT_PulseTime2)) //第2个电机所需要的脉冲解释同上
{ if(NUM2<MOT_PulseNum2*2)
{ P9_P4=!P9_P4;
NUM2++;}
}
if(0==(flag-1)%(2*MOT_PulseTime3)) //第3个电机所需要的脉冲解释同上
{ if(NUM3<MOT_PulseNum3*2)
{ P9_P5=!P9_P5;
NUM3++;}
}
while(B_TimerStart) ;//延时程序
}
P9_P3=0;
P9_P4=0;
P9_P5=0;
}
//下盘抬起或上盘下降子程序
void xiapantaiqizichengxu()
编程思想:三个电机同时逆时针转动可实现下盘抬起或上盘下降子程序,除了P9_P0口、P9_P1口、P9_P2口的状态不一样,其余都相同。
{
int NUM1=0,NUM2=0,NUM3=0;
int flag=0;
P9_P3=0;
P9_P4=0;
P9_P5=0;
P9_P0=0;
P9_P1=0;
P9_P2=0;
while(NUM1!=MOT_PulseNum1||NUM2!=MOT_PulseNum2||NUM3!=MOT_PulseNum3)
{ flag++;
if(0==(flag-1)%(2*MOT_PulseTime1)) //第1个电机
{ if(NUM1<MOT_PulseNum1*2)
{ P9_P3=!P9_P3;
NUM1++;}
}
if(0==(flag-1)%(2*MOT_PulseTime2)) //第2个电机
{ if(NUM2<MOT_PulseNum2*2)
{ P9_P4=!P9_P4;
NUM2++;}
}
if(0==(flag-1)%(2*MOT_PulseTime3)) //第3个电机
{ if(NUM3<MOT_PulseNum3*2)
{ P9_P5=!P9_P5;
NUM3++;}
}
while(B_TimerStart) ;
}
P9_P3=0;
P9_P4=0;
P9_P5=0;
}
//3号电机0轴正转
void yihaodianjizhouzhengzhuan()
编程思想:只要求3号电机转,则只给3号电机发送脉冲,一号二号电机不发送脉冲,则一号二号电机不动
{
int NUM1=0,NUM2=0,NUM3=0;
int flag=0;
P9_P3=0;
P9_P4=0;
P9_P5=0;
P9_P0=0;
P9_P1=0;
P9_P2=1; //使三号电机正转
while(NUM3!=MOT_PulseNum3) //给三号电机发送脉冲
{ flag++;
if(0==(flag-1)%(2*MOT_PulseTime3)) //第3个电机
{ if(NUM3<MOT_PulseNum3*2)
{ P9_P5=!P9_P5;
NUM3++;
}
}
while(B_TimerStart) ;
}
P9_P3=0;
P9_P4=0;
P9_P5=0;
}
//3号电机轴反转
void yihaodianjizhoufanzhuan()
编程思想:只要求3号电机转,则只给3号电机发送脉冲,一号二号电机不发送脉冲,则一号二号电机不动,除了三号电机转速不一样以外其余与三号电机正转程序相同
{
int NUM1=0,NUM2=0,NUM3=0;
int flag=0;
P9_P3=0;
P9_P4=0;
P9_P5=0;
P9_P0=0;
P9_P1=0;
P9_P2=0; //三号电机逆时针转动
while(NUM3!=MOT_PulseNum3)
{ flag++;
if(0==(flag-1)%(2*MOT_PulseTime3)) //第3个电机
{ if(NUM3<MOT_PulseNum3*2)
{ P9_P5=!P9_P5;
NUM3++;}
}
while(B_TimerStart) ;
}
P9_P3=0;
P9_P4=0;
P9_P5=0;
}
//机器人走一步程序
void zouyibu()//走一步
编程思想:通过研究机器人结构,发现让机器人走一步可分解为以下几个动作:
1、电机1、2、3同时顺时针转,实现下底盘抬起。
2、当三号电机顺时针转动,而一号二号电机不转动时下底盘前进
3、一号二号三号电机同时逆时针转动时,下底盘下降,当接触到地面继续下降时,上盘被抬起。
4、三号电机逆时针转动,一号二号电机不转动时实现上盘的前进。
5、一号二号三号电机同时顺时针转动,上盘下降,接触带地面时完成一步行走
通过调试在电机转速80,电机位置100的情况下:上盘抬起或下盘下降子程序执行两次,3号电机轴正转子程序执行三次,下盘抬起或上盘下降子程序执行七次,3号电机轴反转子程序执行三次,上盘抬起或下盘下降子程序执行五次可实现一步行走。
下面程序为为实现这一步行走所调用的子程序及其步骤。
{ for(j=0;j<2000;j++)//第一步延时1s
{
while(B_TimerStart) // 此程序是延时程序B_TimerStart=1时一
直执行while,0.5ms发出一个中断使
B_TimerStart变为1,跳出while,
再将B_TimerStart置1,一直循环2000次,实现延时一秒。
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第二步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第三步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
yihaodianjizhouzhengzhuan() ;//3号电机轴正转
for(j=0;j<2000;j++)//第四步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
yihaodianjizhouzhengzhuan() ;//3号电机轴正转
for(j=0;j<2000;j++)//第五步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
yihaodianjizhouzhengzhuan() ;//3号电机轴正转
for(j=0;j<2000;j++)//第六步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第七步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第八步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第九步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第十步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第十一步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第十二步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
xiapantaiqizichengxu() ; //下盘抬起或上盘下降子程序
for(j=0;j<2000;j++)//第十三步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
yihaodianjizhoufanzhuan();//三号电机轴反转
for(j=0;j<2000;j++)//第十四步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
yihaodianjizhoufanzhuan();//三号电机轴反转
for(j=0;j<2000;j++)//第十五步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
yihaodianjizhoufanzhuan();//三号电机轴反转
for(j=0;j<2000;j++)//第十六步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第十七步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第十八步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第十九步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第二十步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
shangpantaiqizichengxu() ;//上盘抬起或下盘下降子程序
for(j=0;j<2000;j++)//第二十一步延时1s
{
while(B_TimerStart)
B_TimerStart =1;
}
}
主程序
void MotorControl_0x5ms(void)
{
{
if(MOT_direct1==1&&MOT_direct2==1&&MOT_direct3==1)
{ for(t=0;t<40;t++) //应用于实现走一步的循环t<40说明循环40次
{
zouyibu(); //调用走一步子程序
}
}
MOT_PulseTime1 = 0;
MOT_PulseNum1 = 0;
MOT_PulseTime2 =0;
MOT_PulseNum2 = 0;
MOT_PulseTime3 = 0;
MOT_PulseNum3 = 0;
P9_P3=0;
P9_P4=0;
P9_P5=0;
}
MOT_direct1=0;
MOT_direct2=0;
MOT_direct3=0;
}
I


IP属地:四川1楼2013-10-10 22:31回复
    以上程序仅供参考
    具体效果视硬件而定,若出现问题本吧及文章不负责任I


    IP属地:四川本楼含有高级字体2楼2013-10-10 22:34
    回复