您的当前位置:首页正文

避障小车

2021-07-26 来源:易榕旅网
信科专业综合课程设计

题 目: 基于单片机的自动避障小车

专 业: 班 级:

姓 名:

学 号:

指导老师:

成 绩:

目录

第1节 引言。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3

1.1研究背景。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。3 1.2本设计任务和主要内容。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 3 第2节 系统主要硬件电路设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 2.1系统原理组成框图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 2.2 系统主控模块电路。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 2.2.1 STC89C52单片机性能优点。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。4 2.2.2 主控模块电路。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5 2.3 车体框架。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。5

2.4 电源及稳压模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。6 2.5 逻辑模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。7 2.6 感测模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。7 2.7 连接模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。8 2.8 电机驱动模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。9 2.9 显示模块。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。10 第3节 系统软件设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11

3.1程序设计流程图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。11 3.2系统主程序设计。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。12 3.3 PWM信号控制小车走向流程图。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。13 3.4 PWM信号控制电机流程序。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。13 3.5液晶初始化及显示子程序。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。15 第4节 结束语。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。18 参考文献。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。19

第1节 引言

本课程设计是以功耗低、抗干扰能力强的At89s51单片机为核心,外加路面

障碍物感测模块――光电开关组完成对路面情况的实时监测,并把所采集的信息传输给单片机,单片机根据路面情况做出恰当的处理,进而控制小车的走向。

1.1 研究背景

在科学探索及紧急抢险中经常要对一些危险或人类不能直接到达的地域进行探测,这就需要用机器人来完成。而机器人在复杂地形行进时自动避障是一项必不可少也是最基本的功能。因此,自动避障系统的研发就应运而生。自动避障小车就是基于这一系统开发而成的。随着科技的发展,对于未知空间和人类所不能直接到达的地域的探索逐步成为热门,这就使机器人自动避障功能的研发有了重大意义。自动避障小车就是自动避障机器人中的一类。自动避障小车可以作为地域探索机器人和紧急抢险机器人的运动系统,让机器人在行进中自动避过障碍物。

1.2 本设计任务和主要内容

本设计是对以单片机At89s51为核心的系统根据感测模块传输的前方路面信息控制小车行驶走向的软、硬件设计开发。系统要能够做到准确及时监测前方路面信息并传输给主控模块,做到根据前方路面信息及时调整小车的走向,做到显示小车的走向和小车已经行驶过的路程。

主要内容是:

① 感测模块实时监测路面情况并及时传输给单片机;

② 单片机核心模块根据感测模块给予的信息控制小车两电机转动; ③ 电机驱动模块驱动两电机转动,实现转向与行走;

第2节 系统主要硬件电路设计

2.1小车自动避障原理

小车车头处装有三个光电开关,中间一个光电开关对向正前方,两侧的光电开关向两边各分开30度,(如右图所示)。小车在行进过程中由光电开关向前方发射出红外线,当红外线遇到障碍物时发生漫反射,反射光被光电开关接收。小车根据三个光电开关接受信号的情况来判断前方障碍物的分布并做出相应的动作。光电开关的平均探测距离为30cm。

2.2模块方案比较及论证

根据设计要求,我们的自动避障小车主要由六个模块构成:车体框架、电源及稳压模块、主控模块、逻辑模块、探测模块、电机驱动模块组成。 各模块分述如下:

感测模块 逻辑模块 主 控 模 块 电机驱动模块 小车电机 图2-1 系统原理组成框图

2.2.1车体框架

在设计车体框架时,我们有两套起始方案,自己制作和直接购买玩具电动车。 方案一:自己设计制作车架 自己制作小车底盘,用两个直流减速电机作为主动轮,利用两电机的转速差完成直行、左转、右转、左后转、右后转、倒车等动作。减速电机扭矩大,转速较慢,易于控制和调速,符合避障小车的要求。而且自己制作小车框架,可以根据电路板及传感器安装需求设计空间,使得车体美观紧凑。但自己制作小车设计制作周期较长,且费用较高,因而我放弃这一方案。 方案二:购买玩具电动车 玩具电动车价格低廉,有完整的驱动、传动和控制单元,其中传动装置是我们所需的,缩短了开发周期。但玩具电动车采用普通直流电机驱动,带负载能力差,调速方面对程序要求较高。同时,玩具电动车转向依靠前轮电机带动前轮转向完成,精度低。 考虑到利用玩具电动小车做车架开发周期短,可留够充分的时间用于系统调试,且硬件上的不足我有信心用优良的算法来弥补,故我们选择方案二。 2.2.2电源及稳压模块

方案一:采用交流电经直流稳压处理后供电 采用交流电提供直流稳压电源,电流驱动能力及电压稳定性最好,且负载对电源影响也最小。但由于需要电线对小车供电,极大影响了壁障小车行动的灵活性及地形的适应能力。而且壁障小车极易把拖在地上的电线识别为障碍物,人为增加了不必要的障碍。故我放弃了这 一方案。

方案二:采用蓄电池供电 蓄电池具有较强的电流驱动能力和较好的电压稳定性能,且成本低廉。可采用蓄电池经7812芯片稳压后给电机供电,再经过降压接7805芯片给单片机及其他逻辑单元供电。但蓄电池体积相对庞大,且重量过大,造成电机负载过大,不适合我们采用的小车车架(玩具电动车车架)。故我放弃了这一方案。

方案三:采用干电池组进行供电 采用四节干电池降压至5V后给单片机及其他逻辑单元供电,另取六节干电池为电机及光电开关供电。这样电机启动及制动时的短暂电压干扰不会影响到逻辑单元和单片机的工作。干电池用电池盒封装,体积和重量较小,同时玩具车底座可以安装四节干电池,正好可为单片机及其他逻辑单元供电。在稳压方面,起始时考虑使用7805芯片对6V的电池电压进行降压稳压。但考虑到这样使得7805芯片消耗大量能量,降低电池寿命;同时,由于AT89s51、光电开关、小车电机对于供电电压要求并不苛刻,故我们将6V电池电压接一个二极管降压后直接给单片机及其他逻辑单元供电。而电机和光电开关的

电源不做稳压处理。这样只需在小车主板上加两个调速按钮,根据电池电量选择合适功率即可,甚至于可直接在软件里设置自动换挡。 综合考虑,我采用方案三。

2.2.3逻辑模块

在探测模块和单片机中断接口之间、独立按键与单片机中断接口之间,需要经过电平的逻辑处理进行连接。主要涉及到一个三输入或非门和一个二输入与门。这两个逻辑关系我们直接选用74HC系列的集成芯片实现。 由于三输入或非门在市场上很难购买到,我们采用了两个二输入或非门和一个二输入与门完成了三输入或非门。由于我们采用的74HC08(四二输入与门)、74HC02(四二输入或非门)均为四二输入的,各提供四个二输入与门和四个二输入或非门,我们用各用一片芯片即可实现所需逻辑功能。 2.2.4探测模块

方案一:使用超声波探测器 超声波探测器探测距离远,测距方便。但由于声波衍射现象较严重,且波包散面太大,易造成障碍物的错误判断。同时,超声波探测具有几厘米甚至几十厘米的盲区,这对于我的避障小车是个致命的限制。故我们放弃了这一方案。

方案二:使用光电对管探测 光电对关价格低廉,性能稳定,但探测距离过近(一般不超过3cm),使得小车必须制动迅速。而我们由于采用普通直流电机作为原动力,制动距离至少需要10cm。因此我放弃了这一方案。

方案三:使用视频采集处理装置进行探测 使用CCD实时采集小车前进路线上的图像并进行实时传输及处理,这是最精确的障碍物信息采集方案,可以对障碍物进行精确定位和测距。但是使用视频采集会大大增加小车成本和设计开发难度,而且考虑到我们小车行进转弯的精确度并未达到视频处理的精度,因而使用视频采集在实际应用中是个很大的浪费,所以我放弃了这一方案。

方案四:使用光电开关进行障碍物信息采集 使用三只E3F-DS30C4光电开关,分别探测正前方,前右侧,前左侧障碍物信息,在特殊地形(如障碍物密集地形)可将正前方的光电开关移置后方进行探测。E3F-DS30C4光电开关平均有效探测距离0~30cm可调,且抗外界背景光干扰能力强,可在日光下正常工作(理论上应避免日光和强光源的直接照射)。我们小车换档调速后的最大制动距离不超过30cm,一般在10~20cm左右,因而探测距离满足我们的小车需求。 综上考虑,我选用方案四。示意图如下:

光电开关1 光电开关2 光电开关3 电平转换 单 片 机 2.2.5电机驱动模块

方案一:原件搭建电机驱动电路 使用分立原件搭建电机驱动电路造价低廉,在大规模生产中使用广泛。但分立原件H桥电路工作性能不够稳定,较易出现硬件上的故障,故我放弃了这一方案。

方案二:使用L298N芯片驱动电机 L298N是一个具有高电压大电流的全桥驱动芯片,输出电压最高可达50V,可以直接通过电源来调节输出电压;可以直接用单片机的IO口提供信号,而且带有使能端,方便PWM调速,电路简单,性能稳定,使用比较方便。L298N芯片可以驱动两个二相电机,也可以驱动一个四相电机,正好符合我们小车两个二相电机的驱动要求。 综合考虑,我采用L298N芯片驱动小车电机。

最终方案如下: 使用干电池组对系统供电,改造玩具电动车作为小车底座,采用Mega16L作为主控芯片,采用E3F-DS30C4光电开关进行障碍物探测,使用L298N驱动直流电机。逻辑关系处理使用74HC系列芯片完成。

2.2.6总电路图

第3节 系统软件设计

3.1程序流程图

本系统设计流程图如下

INTO中断触发

反馈值是多少?有障碍物依据所测值选择避障函数执 行 前进 等待

图3-1 系统软件主流程图

感测模块传输前方信号无障碍物

3.2系统程序清单

#include #define uchar unsigned char #define uint unsigned int /******************** 端口定义

*********************/

sbit IN1=P1^0; //P10与电机驱动IN1相连 sbit IN2=P1^1 //P11与电机驱动IN2相连

sbit IN3=P1^2; //P12与电机驱动IN3相连 sbit IN4=P1^3; //P13与电机驱动IN4相连

uchar INS=P2; //P2端口的^0、P2^1、P2^2分别与左、中、右红外模块输出信号线线相连 uint D=200;//定义延迟函数的参数 /************************ 各个子函数定义

***********************/ void Go(void) {

IN1=0; IN2=0; IN3=1; IN4=0; }

void Back(void) {

IN1=0; IN2=0; IN3=0; IN4=1; }

void Go_left(void) {

IN1=1; IN2=0; IN3=1; IN4=0; }

void Go_right(void) {

IN1=0; IN2=1; IN3=1; IN4=0; }

void Stop(void) {

IN1=IN2=IN3=IN4=0; }

/***

void Back_left(void) {

IN1=1; IN2=0; IN3=0; IN4=1; }

void Back_right(void) {

IN1=0; IN2=1; IN3=0; IN4=1; } ***/

void Delay(uint n) {

uint i,j; i=j=n;

for(;i>0;i--) for(;j>0;j--); }

void Be_move(void) {

uchar temp;

temp=INS&0x07; switch(temp) {

case 0x01:Go_right();Go();Delay(D);break; case 0x02: case 0x03:

case 0x07:Back();Delay(D);Go_right();Go();Delay(D);break; case 0x06:Back();Delay(D);Go_left();Go();Delay(D);break; case 0x04:Go_left();Go();Delay();break; case 0x05:Go();Delay();break; default:Stop();Delay();break; } }

void main() {

uchar temp; while(1) {

temp=INS&0x07; if(temp==0x00) Go(); else Be_move(); } }

因篇幅问题不能全部显示,请点此查看更多更全内容