推荐智能机器人课程设计总结报告 精品Word格式文档下载.docx
《推荐智能机器人课程设计总结报告 精品Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《推荐智能机器人课程设计总结报告 精品Word格式文档下载.docx(17页珍藏版)》请在冰豆网上搜索。
并为计算方便,记录网格所在迷宫中行号、列号。
并机器人探索过程中设置一个回溯网格栈记录机器人经过的迷宫网格序号及方向,此方向是从一个迷宫网格到下一个迷宫网格经过的方向。
设置一个方向队列记录机器人在某网格内探测方向的顺序。
设置一个回溯路径数组记录需要回溯时从回溯起点到回溯终点的迷宫网格序号及方向。
考虑到迷宫比较简单,且主要为纵横方向的直线,可采用让小车在路口始终左转或者始终右转的方法走迷宫,也就是让小车沿迷宫的边沿走。
这样最终也能走出迷宫。
本次课程设计采用此方法。
即控制策略为机器人左侧有缺口时,向左进入缺口,当机器人前方有障碍是,向右旋转180°
,其余情况保持前进。
2.2传感器的选择
由于需要检测机器人左侧和前方是否有通路,采用红外传感器对机器人行进方向和左侧进行感知。
红外避障传感器是依据红外线的反射来工作的。
当遇到障碍物时,发出的红外线被反射面反射回来,被传感器接收到,信号输出引脚就会给出低电平提示信号。
本机器人系统的红外避障信号采用直接检测的方式进行,直接读取引脚电平。
传感器感应障碍物的距离阈值可以通过调节传感器上的变阻器来改变。
行进过程中,机器人可能会偏绿迷宫的横轴或纵轴的方向。
碰触传感器利用外力的作用传递给单片机信息,当碰触传感器碰到迷宫墙壁后,传感器检测到信号就可以判断小车碰壁。
经过电路处理后,信号输出接口输出数字信号送给控制器,从而让控制器进行决策调整小车姿态。
本机器人系统共使用了2个碰触传感器,分别安装在小车的左前方和右前方,使得机器人在偏离航向撞击迷宫侧面后可以立即对航向进行修正。
四个传感器一共占用四个外部中断。
3.3总体结构设计
三、具体实现
3.1芯片选择
最小系统已经设计好,本次课程设计采用的控制芯片为STM32F103RBT6
它是32位的Cortex-M3内盒的控制芯片,主频达到72MHz,拥有128kB闪存,20kBSRAM,
锁相环,内置8MHzand32kHz时钟电路,具有PWM模块,方便电机转速的控制。
3.2控制电路设计
(1)电机驱动:
电机驱动电路原理图如图所示,采用BTS7960芯片驱动电机,以控制机器人的两个驱动轮,利用PWM控制方法,通过改变PWM波的占空比,达到调节电机转速的目的,实现机器人的前进,后退,转向,刹车等功能。
每个电机都由一个H桥电路驱动,由两个输入信号共同控制。
两个电机共由4路PWM波进行控制,结合上述的电机驱动原理,小车运动方式可以通过如下方式实现:
四个控制信号均为低电平时,电机停转,小车停止;
电机的左右轮电机同向等速运行时,可以实现前行或后退的动作;
小车的左右转向通过两轮差速来实现。
在本机器人的设计中,需要实现的90°
角度转弯,是通过电机定速运动和延时的配合完成的,通过不断调试确定出最佳的旋转时间。
(2)电源模块:
采用电池供电,可行的供电方案原理图如下
(3)引脚(外部中断)分配:
PA0,PA4,PA5,PA15为中断输入引脚。
PA0引脚对应的外部中断由机器人前向红外传感器触发,PA4,PA5分别连接机器人前进方向的左侧和右侧的碰撞开关,PA4,PA5的上升沿信号代表机器人与迷宫的左,右侧发生碰撞,触发相应地终端服务程序,调整航向。
PA15接收左侧红外传感器产生的触发信号,当机器人左侧出现缺口时,触发中断服务程序,机器人向左转向进入缺口。
3.3程序设计部分
(1)机器人的移动:
机器人靠两个驱动轮,一个从动轮进行移动,每个驱动轮由一个电机,两个驱动芯片进行控制。
驱动芯片输出电平的高低决定电机的转向,占空比决定了电机的转速。
首先应配置芯片的PWM模块,具体过程如下:
#include"
pwm.h"
floatmo1,mo2,mo3,mo4;
voidPWM_Init(u16arr,u16psc)
{
RCC->
APB1ENR|=1<
<
1;
GPIOA->
CRL&
=0X00FFFFFF;
CRL|=0XBB000000;
ODR|=1<
6|1<
7;
GPIOB->
=0XFFFFFF00;
CRL|=0X000000BB;
0|1<
TIM3->
ARR=arr;
PSC=psc;
CCER|=1<
1|1<
5|1<
9|1<
13;
CCMR1|=7<
12|7<
4;
CCMR1|=1<
11|1<
3;
CCMR2|=7<
CCMR2|=1<
12|1<
8|1<
4|1<
0;
CR1=0x0080;
//ARPEÊ
¹
Ä
Ü
CR1|=1<
EGR|=1<
CR1|=0x01;
}
本段代码使能TIM3时钟,启用PA6,PA7,PB0,PB1引脚的复用功能,并对计数器进行相应设置(向下计数),使得芯片能在这四个引脚上输出所需的PWM波。
由于前进,后退,转向,都是重复性的动作,直接对这些操作进行宏定义,需要的时候直接调用,能减轻程序编写的负担:
#defineMoto_PwmMax899//
#defineLEFT_MOTOR_FTIM3->
CCR1
#defineLEFT_MOTOR_BTIM3->
CCR2
#defineRIGHT_MOTOR_BTIM3->
CCR3
#defineRIGHT_MOTOR_FTIM3->
CCR4
注:
TIM3产生PWM波相应寄存器的宏定义如下
#definego_forward
{
LEFT_MOTOR_F=3500;
LEFT_MOTOR_B=0;
RIGHT_MOTOR_F=3500;
RIGHT_MOTOR_B=0;
#definego_back
{LEFT_MOTOR_F=0;
LEFT_MOTOR_B=3500;
RIGHT_MOTOR_F=0;
RIGHT_MOTOR_B=3500;
#defineturn_left
LEFT_MOTOR_F=0;
RIGHT_MOTOR_F=4000;
#defineturn_left_90
LEFT_MOTOR_B=0;
RIGHT_MOTOR_F=4000;
RIGHT_MOTOR_B=0;
delay_ms(800);
delay_ms(600);
RIGHT_MOTOR_F=0;
#defineturn_right
LEFT_MOTOR_F=4000;
RIGHT_MOTOR_F=0;
delay_ms(200);
#defineturn_back_righ
LEFT_MOTOR_F=4000;
RIGHT_MOTOR_B=4000;
delay_ms(400);
LEFT_MOTOR_F=0;
#defineturn_back_left
LEFT_MOTOR_B=4000;
#definestop
//几个机器人基本动作的宏定义
由于采用向下计数的方式,CCR中的值代表相应引脚高电平持续时间长度,响应值越大,PWM占空比越大,驱动电机转速越快。
(2)机器人对外界的感知及相应中断服务程序的编写:
#include"
exti.h"
voidEXTIX_Init(void)
RCC->
APB2ENR|=1<
2;
JTAG_Set(JTAG_SWD_DISABLE);
GPIOA->
=0XFF00FFF0;
CRL|=0X00880008;
CRH&
=0X0FFFFFFF;
CRH|=0X80000000;
ODR|=(1<
0);
Ex_NVIC_Config(GPIO_A,0,FTIR);
Ex_NVIC_Config(GPIO_A,4,RTIR);
Ex_NVIC_Config(GPIO_A,5,RTIR);
Ex_NVIC_Config(GPIO_A,15,RTIR);
MY_NVIC_Init(2,1,EXTI0_IRQChannel,4);
MY_NVIC_Init(3,1,EXTI4_IRQChannel,4);
MY_NVIC_Init(4,1,EXTI9_5_IRQChannel,4);
MY_NVIC_Init(1,1,EXTI15_10_IRQChannel,4);
GPIOA的配置,使能相关时钟,并将PA0,PA4,PA5,PA1设为输入引脚,并设置好中断优先级。
voidEXTI0_IRQHandler(void)
delay_ms(100);
if(KEY0==0)
{
LED1=0;
LED2=0;
go_back;
delay_ms(800);
turn_back_right;
}
LED1=1;
LED2=1;
EXTI->
PR=1<
}
前向红外传感器触发的中断服务程序,当PA0出现下降沿时,代表机器人前方已经出现了障碍物,此时执行向右掉头的动作。
voidEXTI4_IRQHandler(void)
if(KEY4==1)
{
flag=1;
turn_left;
右侧碰撞开关触发外部中断,消抖后判断是否确实发生碰撞,如果是,则机器人应向左校正航向。
voidEXTI9_5_IRQHandler(void)
if(KEY5==1)
flag=2;
turn_right;
5;
左侧碰撞开关触发外部中断,消抖后判断是否确实发生碰撞,如果是,则机器人应向右校正航向。
voidEXTI15_10_IRQHandler(void)
if(KEY15==1)
turn_left_90;
while(KEY0==1)
{
go_forward;
}
delay_ms(600);
while(KEY15==1)
if(KEY5==1)
turn_right;
if(KEY4==1)
turn_left;
else{go_forward;
delay_ms(1000);
15;
}//PA15出现下降沿,代表机器人前进方向的左侧出现了缺口,应当执行向左转向的操作。
中断程序中部分变量的宏定义如下
#defineKEY0PAin(0)
#defineKEY4PAin(4)
#defineKEY5PAin(5)
#defineKEY15PAin(15)
(3)主程序设计:
首先进行初始化,调用实现写好的函数使能相关时钟,配置相关引脚的功能,使得PWM模块能正常工作,对NVIC进行设置,使得四个由传感器触发外部中断能共正常工作。
进行初始化后,在没有碰撞开关,机器人前方没有障碍,左侧没有缺口的情况下,外部中断都不触发,机器人应该保持向前行走的状态,程序如下:
test.h"
intflag=0;
u8mode='
0'
;
floatdistance=0;
intmain(void)
{
Stm32_Clock_Init(9);
delay_init(72);
uart_init(72,9600);
PWM_Init(10000,0);
EXTIX_Init();
led_int();
while
(1)
(4)程序流程图说明:
附件:
程序
////////////////主程序
#defineLED2PCout(11)//PA8板子上的红灯,上面的
#defineLED1PCout(12)//PD2
{
//主频72M
//延时初始化
//初始化串口1(PA9,PA10)、串口2(PA2,PA3)、串口3(PB10,PB11)
//////////////////////中断程序
//外部中断初始化程序
//初始化PA0,PA4,PA5,PA15为中断输入.
//使能PORTA时钟
JTAG_Set(JTAG_SWD_DISABLE);
//关闭JTAG和SWD
//PA0,4,5设置成输入
//PA15设置成输入
//PA0,4上拉
Ex_NVIC_Config(GPIO_A,0,FTIR);
//下降沿触发,反转
Ex_NVIC_Config(GPIO_A,4,RTIR);
//上升沿触发,左转
Ex_NVIC_Config(GPIO_A,5,RTIR);
//上升沿触发,右转
Ex_NVIC_Config(GPIO_A,15,RTIR);
//上升沿触发,缺口
//抢占2,子优先级1,组4
MY_NVIC_Init(4,1,EXTI9_5_IRQChannel,4);
MY_NVIC_Init(1,1,EXTI15_10_IRQChannel,4);
//外部中断0服务程序PA.0PB.0PC.0.......PG.0都对应到中断线0
//消抖
if(KEY0==0)//按键2
//指示灯亮起
//清除LINE0上的中断标志位
if(KEY4==1)//按键2
if(KEY5==1)//按键2
if(KEY15==1)//按键2
turn_left_60;