全国大学生机器人搬运比赛部分程序(aw60)gkkd.docx
图1比赛场地示意图 图2机器人出发区示意图4/-*/机器人搬运比赛程序如下:/ 项 目 名: 基于Freescale AW60的 */ 硬件连接: */ 程序描述: 定时器2作为颜色传感器计数器;定时器1通道0-1作为PWM输出;通道2作为颜色传感器的定时器溢出中断/ 超声波计数用定时器1 */ 说 明: */ ? */ */ 作者信息? */ 版本信息? */ 完成时间? */ 修订记录: */ 时间: */ 内容:? */-*/调用头文件#include "Includes.h"void main(void) /定义变量,不管在主程序还是子函数,都需要把变量的定义放在最前面,否则会报错 int D=0; int m=0; char num1=0; /用于计数用 char num2=0; /用于 转弯计数用 char flag_forward=1; /前进的标志位 char flag_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; /为直推做好准备,必须写的程序 else xunji_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); else xunji_forward_3();*/-*/文件名: Robot_Run.c */说 明: 双足机器人运动函数文件 */作者: */初始时间: */修订记录: */备注: */-*#include "Robot_Run.h" /不同的车,因为电机接线不一样,对应的这些设置也会有变动,最好自己先测试这几个最基本的动作 uint8 flag_black=0,flag_right=0,flag_left=0; /车前的传感器uint8 sensor_inp_forward() unsigned char sensor_forward; sensor_forward=PTBD; sensor_forward&=0x1F; return sensor_forward;/车后的传感器uint8 sensor_inp_backward() unsigned char sensor_backward; sensor_backward=PTDD; sensor_backward&=0x07; return sensor_backward;/此段为前进程序启动void middle_faward(uint8 speed) 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设置的时间间隔/此段为旋转左转程序程序启动void left(uint8 speed) 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);/此段为旋转大左转程序程序启动void Eleft(uint8 speed) 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); /此段为旋转右转启动程序 void right(uint8 speed) 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); /此段为旋转大右转启动程序 void Eright(uint8 speed) 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); /此段为后退直走序程序启动void back_faward(uint8 speed) 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);/此段为旋转左转程序程序启动void backleft(uint8 speed) 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);/此段为旋转大左转程序程序启动void backEleft(uint8 speed) 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); /此段为旋转右转启动程序 void backright(uint8 speed) 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); /此段为旋转大右转启动程序 void backEright(uint8 speed) 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); /此段为停止启动程序 void stop(uint8 speed) 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、使用时要注意一定要每隔一段时间执行此程序一次(两者是缺一不可的),才能达到循迹的功能。 */-* void xunji_backward_3() /五路循迹 switch(sensor_inp_backward()case 0x04: back_faward(80);break;/中间的灯碰到黑线直走 case 0x02: backEleft(80);break;case 0x03: backleft(80);break; case 0x08: backEright(80);break; case 0x18: backright(80);break; default: back_faward(80);break; /其他的灯的情况直走void xunji_forward_5() /五路循迹 switch(sensor_inp_forward()case 0x04: middle_faward(80);break;/中间的灯碰到黑线直走 case 0x02: Eleft(80);break;/右边的灯碰到黑线右转 case 0x01:Eleft(80);break; case 0x03: left(80);break; case 0x08: Eright(80);break; /左边的灯碰到黑线左转Eright(80);break;case 0x18: right(80);break; default: middle_faward(80);break; /其他的灯的情况直走/-*/函数名: xunji_forward_3 */功 能: 三路循迹/参 数: 无 */返 回: 无 */说 明: 1、执行该循迹程序时在不断地设置定时器PWM模块; / 2、使用时要注意一定要每隔一段时间执行此程序一次(两者是缺一不可的),才能达到循迹的功能。 */-* void xunji_forward_3() /三路循迹 switch(sensor_inp_forward()case 0x04: middle_faward(80);break;/中间的灯碰到黑线直走case 0x02: Eright(80);break;/右边的灯碰到黑线右转 case 0x03: right(80);break; case 0x08: Eleft(80);break; /左边的灯碰到黑线左转case 0x18: 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进行清零 */-*uint8 black_num(uint8 se) if(se=0) if(sensor_inp_forward()=0x1f) flag_black=1; else if(flag_black=1) num_black+; flag_black=0; return num_black; if(se=1) if(COUNT_RIGHT=1) flag_right=1; else if(flag_right=1) num_right+; flag_right=0; return num_right; if(se=2) if(COUNT_LEFT=1) flag_left=1; else if(flag_left=1) num_left+; flag_left=0; return num_left; /-