全国大学生机器人搬运比赛部分程序aw60.docx
- 文档编号:14718728
- 上传时间:2023-06-26
- 格式:DOCX
- 页数:48
- 大小:52.63KB
全国大学生机器人搬运比赛部分程序aw60.docx
《全国大学生机器人搬运比赛部分程序aw60.docx》由会员分享,可在线阅读,更多相关《全国大学生机器人搬运比赛部分程序aw60.docx(48页珍藏版)》请在冰点文库上搜索。
全国大学生机器人搬运比赛部分程序aw60
图1比赛场地示意图
图2机器人出发区示意图4
//-------------------------------------------------------------------------*
//机器人搬运比赛程序如下:
//项目名:
基于FreescaleAW60的*
//硬件连接:
*
//程序描述:
定时器2作为颜色传感器计数器;定时器1通道0-1作为PWM输出;通道2作为颜色传感器的定时器溢出中断
//超声波计数用定时器1*
//说明:
*
//?
*
//*
//作者信息?
*
//版本信息?
*
//完成时间?
*
//修订记录:
*
//时间:
*
//内容:
?
*
//-------------------------------------------------------------------------*
//调用头文件
#include"Includes.h"
voidmain(void)
{
//定义变量,不管在主程序还是子函数,都需要把变量的定义放在最前面,否则会报错
intD=0;
intm=0;
charnum1=0;//用于计数用
charnum2=0;//用于转弯计数用
charflag_forward=1;//前进的标志位
charflag_backward=1;//后退的标志位
//用到的端口,一定要记得初始化端口数据方向寄存器
//液晶模块
//PTGDD|=0b00011111;//液晶模块IO的输入输出配置
//颜色传感器模块
//PTCDD|=0b00101100;//配置颜色传感器模块
//PTFDD&=0b11111110;
//红外传感器模块及驱动模块
PTDDD=0b00000111;//PTDD4作为定时器2的外部时钟输入
PTBDD=0b01000000;//前五个是红外传感器,最后两个是超声波的发送和接收
PTEDD|=0b11111100;//配置驱动模块
//PTEDD&=0b11111110;//配置红外接近传感器
PTADD=0xFF;//
PTFDD=0b00111111;//前两个口左右计数的口
//2关总中断
DisableInterrupt();//禁止总中断
//3芯片初始化
MCUInit();
//4模块初始化
PWM_Init(1,0x0fa0);//用作PWM输出控制电机周期最佳控制大概400ms左右(控制舵机用TPM_NUM_1,CH_2)
//TPMinit
(2);//用来作为颜色传感器的计数用外部时钟
/*rb=0;//值的初始化
bb=0;//值的初始化
gb=0;//值的初始化
ryz=0;//值的初始化
byz=0;//值的初始化
gyz=0;//值的初始化
flag=0;//值的初始化*/
num_black=0;num_left=0;num_right=0;D=60;
//baipingheng();
//EnableInterrupt();////开总中断*/
while
(1)
{
//-------------------------------------------------------------------------*
//文件名:
无*
//说明:
完成直推三个目标*
//作者:
*
//初始时间:
*
//修订记录:
*
//备注:
程序顺序执行一遍就走完了全程,回到出发区*
//-------------------------------------------------------------------------*
/*
while(num_black<2)
{
num_black=black_num(0);
xunji_forward_3();
}
if(num_black==2)
{
stop(0);
DelayMs(100);
while(num_right<=1)
{
num_right=black_num
(1);
xunji_forward_3();
}
stop(0);//到达目的地
num_right=0;
num_black=0;
flag_backward==0;//作为后退的准备
}
while(flag_backward==0)//后退到赛道中心的程序
{
back_faward();
DelayMs(1000);//等待黑线的过去
if(COUNT_RIGHT==1)
{
flag_backward=1;
}
}
turn_left
(2);//左转90角度.推第二个目标
while(flag_forward==0)
{
xunji_forward_3();
if(COUNT_RIGHT==1)
{
flag_forward=1;//直推完成
flag_backward=0;//开始后退的旅程
}
}
while(flag_backward==0)
{
back_faward();
if(COUNT_RIGHT==1)
{
flag_backward=1;
}
}
middle_faward(70);
DelayMs(100);//避免再碰到黑线
stop(0);
DelayMs
(2);//减缓电机的抖动
Eleft(70);
while(num_left<=3)//左转180度推第三个目标
{
num_left=black_num
(1);
}
if(num_left==3)
{
num_left=0;
num_black=0;//黑线数清零?
}
DelayMs(10);
while(flag_forward==0)
{
xunji_forward_3();
if(COUNT_RIGHT==1)
{
flag_forward=1;//直推完成
flag_backward=0;//开始后退的旅程
}
}
while(flag_backward==0)
{
back_faward();
if(COUNT_RIGHT==1)
{
flag_backward=1;
}
}
turn_left(3);
back_faward();
while(num_black<2)
num_black=black_num(0);
back_faward();
DelayMs(1000);
*/
//-------------------------------------------------------------------------*
//文件名:
无*
//说明:
直走90度弯的程序*
//作者:
*
//初始时间:
*
//修订记录:
*
//备注:
在碰到第二根黑线之前程序要循环扫描,执行完程序就刚转90度弯,推物块到目的地,然后返回到中心停住的程序*
//-------------------------------------------------------------------------*
/*
black_num(0);
if(num_black==2)
{
turn_left(4);
num_black=0;//黑线数清零?
flag_forward=0;//为直推做好准备,必须写的程序
}
elsexunji_forward_3();
}
while(flag_forward==0)
{
xunji_forward_3();
if(COUNT_RIGHT==1)
{
flag_forward=1;//直推完成
flag_backward=0;//开始后退的旅程
}
}
while(flag_backward==0)
{
back_faward();
if(COUNT_RIGHT==1)
{
flag_backward=1;
while
(1);
}
}*/
//-------------------------------------------------------------------------*
//文件名:
无*
//说明:
直走90度弯的程序*
//作者:
*
//初始时间:
*
//修订记录:
*
//备注:
在碰到第二根黑线之前程序要循环扫描,执行完程序就刚转90度弯而已,后面num1是被清零的,所以还是在执行循迹*
//-------------------------------------------------------------------------*
/*
if(sensor_inp_forward()==0x1f)
num1++;
while(sensor_inp_forward()==0x1f);
if(num1==2)
{
Eleft(70);
while(num2<4)
{
if(num_right==1)
num2++;
//DelayMs(1000);
while(num_right==1);
}
num1=0;
//DelayMs(3000);
}
elsexunji_forward_3();
*/
//-------------------------------------------------------------------------*
//文件名:
Robot_Run.c*
//说明:
双足机器人运动函数文件*
//作者:
*
//初始时间:
*
//修订记录:
*
//备注:
*
//-------------------------------------------------------------------------*
#include"Robot_Run.h"
//不同的车,因为电机接线不一样,对应的这些设置也会有变动,最好自己先测试这几个最基本的动作
uint8flag_black=0,flag_right=0,flag_left=0;
//车前的传感器
uint8sensor_inp_forward()
{
unsignedcharsensor_forward;
sensor_forward=PTBD;
sensor_forward&=0x1F;
returnsensor_forward;
}
//车后的传感器
uint8sensor_inp_backward()
{
unsignedcharsensor_backward;
sensor_backward=PTDD;
sensor_backward&=0x07;
returnsensor_backward;
}
//此段为前进程序启动
voidmiddle_faward(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed+4);//已经调整好的参数占空比百分之78
IN1=1;
IN2=0;
IN3=1;
IN4=0;
DelayMs
(2);//设置PWM设置的时间间隔
}
//此段为旋转左转程序程序启动
voidleft(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed-40);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=1;
IN2=0;
IN3=1;
IN4=0;
DelayMs
(2);
}
//此段为旋转大左转程序程序启动
voidEleft(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed-20);
IN1=1;
IN2=0;
IN3=0;
IN4=1;
DelayMs
(2);
}
//此段为旋转右转启动程序
voidright(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=1;
IN2=0;
IN3=1;
IN4=0;
DelayMs
(2);
}
//此段为旋转大右转启动程序
voidEright(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=0;
IN2=1;
IN3=1;
IN4=0;
DelayMs
(2);
}
//此段为后退直走序程序启动
voidback_faward(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed+4);//已经调整好的参数占空比百分之78
IN1=0;
IN2=1;
IN3=0;
IN4=1;
DelayMs
(2);
}
//此段为旋转左转程序程序启动
voidbackleft(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed-40);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=0;
IN2=1;
IN3=0;
IN4=1;
DelayMs
(2);
}
//此段为旋转大左转程序程序启动
voidbackEleft(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=0;
IN2=1;
IN3=1;
IN4=0;
DelayMs
(2);
}
//此段为旋转右转启动程序
voidbackright(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=0;
IN2=1;
IN3=0;
IN4=1;
DelayMs
(2);
}
//此段为旋转大右转启动程序
voidbackEright(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=1;
IN2=0;
IN3=0;
IN4=1;
DelayMs
(2);
}
//此段为停止启动程序
voidstop(uint8speed)
{
PWM_Set(TPM_NUM_2,TPM1_CH_0,speed);
PWM_Set(TPM_NUM_2,TPM1_CH_1,speed);
IN1=0;
IN2=0;
IN3=0;
IN4=0;
DelayMs
(2);
}
//-------------------------------------------------------------------------*
//函数名:
xunji_backward_3*
//功能:
后退五路循迹
//参数:
无*
//返回:
无*
//说明:
1、执行该循迹程序时在不断地设置定时器PWM模块;
//2、使用时要注意一定要每隔一段时间执行此程序一次(两者是缺一不可的),才能达到循迹的功能。
*
//-------------------------------------------------------------------------*
voidxunji_backward_3()//五路循迹
{
switch(sensor_inp_backward())
{
case0x04:
back_faward(80);break;//中间的灯碰到黑线直走
case0x02:
backEleft(80);break;
case0x03:
backleft(80);break;
case0x08:
backEright(80);break;
case0x18:
backright(80);break;
default:
back_faward(80);break;//其他的灯的情况直走
}
}
voidxunji_forward_5()//五路循迹
{
switch(sensor_inp_forward())
{
case0x04:
middle_faward(80);break;//中间的灯碰到黑线直走
case0x02:
Eleft(80);break;//右边的灯碰到黑线右转
case0x01:
Eleft(80);break;
case0x03:
left(80);break;
case0x08:
Eright(80);break;//左边的灯碰到黑线左转
Eright(80);break;
case0x18:
right(80);break;
default:
middle_faward(80);break;//其他的灯的情况直走
}
}
//-------------------------------------------------------------------------*
/函数名:
xunji_forward_3*
//功能:
三路循迹
//参数:
无*
//返回:
无*
//说明:
1、执行该循迹程序时在不断地设置定时器PWM模块;
//2、使用时要注意一定要每隔一段时间执行此程序一次(两者是缺一不可的),才能达到循迹的功能。
*
//-------------------------------------------------------------------------*
voidxunji_forward_3()//三路循迹
{
switch(sensor_inp_forward())
{
case0x04:
middle_faward(80);break;//中间的灯碰到黑线直走
case0x02:
Eright(80);break;//右边的灯碰到黑线右转
case0x03:
right(80);break;
case0x08:
Eleft(80);break;//左边的灯碰到黑线左转
case0x18:
left(80);break;
default:
middle_faward(80);break;//其他的灯的情况直走
}
}
//-------------------------------------------------------------------------*
//函数名:
black_num*
//功能:
进行计数
//参数:
//se==0输出为传感器全黑计数,num_black
//se==1输出右边传感器计数,num_right
//se==2输出对左边传感器计数,num_left*
//返回:
见参数*
//说明:
程序每隔一段要进入这一段函数,才能计数,还有计数值会一直保留,
//想清除的时候可以对num_black,num_left,num_right进行清零*
//-------------------------------------------------------------------------*
uint8black_num(uint8se)
{
if(se==0)
{
if(sensor_inp_forward()==0x1f)
{
flag_black=1;
}
else
{if(flag_black==1)
num_black++;
flag_black=0;
}
returnnum_black;
}
if(se==1)
{
if(COUNT_RIGHT==1)
{
flag_right=1;
}
else
{if(flag_right==1)
num_right++;
flag_right=0;
}
returnnum_right;
}
if(se==2)
{
if(COUNT_LEFT==1)
{
flag_left=1;
}
else
{if(flag_left==1)
num_left++;
flag_left=0;
}
returnnum_left;
}
}
//-----------------------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国大学生 机器人 搬运 比赛 部分 程序 aw60