智能循迹小车设计.docx

上传人:b****1 文档编号:1211401 上传时间:2023-04-30 格式:DOCX 页数:24 大小:185.05KB
下载 相关 举报
智能循迹小车设计.docx_第1页
第1页 / 共24页
智能循迹小车设计.docx_第2页
第2页 / 共24页
智能循迹小车设计.docx_第3页
第3页 / 共24页
智能循迹小车设计.docx_第4页
第4页 / 共24页
智能循迹小车设计.docx_第5页
第5页 / 共24页
智能循迹小车设计.docx_第6页
第6页 / 共24页
智能循迹小车设计.docx_第7页
第7页 / 共24页
智能循迹小车设计.docx_第8页
第8页 / 共24页
智能循迹小车设计.docx_第9页
第9页 / 共24页
智能循迹小车设计.docx_第10页
第10页 / 共24页
智能循迹小车设计.docx_第11页
第11页 / 共24页
智能循迹小车设计.docx_第12页
第12页 / 共24页
智能循迹小车设计.docx_第13页
第13页 / 共24页
智能循迹小车设计.docx_第14页
第14页 / 共24页
智能循迹小车设计.docx_第15页
第15页 / 共24页
智能循迹小车设计.docx_第16页
第16页 / 共24页
智能循迹小车设计.docx_第17页
第17页 / 共24页
智能循迹小车设计.docx_第18页
第18页 / 共24页
智能循迹小车设计.docx_第19页
第19页 / 共24页
智能循迹小车设计.docx_第20页
第20页 / 共24页
亲,该文档总共24页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

智能循迹小车设计.docx

《智能循迹小车设计.docx》由会员分享,可在线阅读,更多相关《智能循迹小车设计.docx(24页珍藏版)》请在冰点文库上搜索。

智能循迹小车设计.docx

智能循迹小车设计

摘要:

本课题是基于AT89C52单片机的智能小车的设计与实现,小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。

小车系统以AT89S52单片机为系统控制处理器;

采用红外传感获取赛道的信息,来对小车的方向和速度进行控制。

此外,对整个控制软件进行设计和程序的编制以及程序的调试,并最终完成软件和硬件的融合,实现小车的预期功能。

 

引言

当今世界,传感器技术和自动控制技术正在飞速发展,机械、电气和电子信息已经不再明显分家,自动控制在工业领域中的地位已经越来越重要,“智能”这个词也已经成为了热门词汇。

现在国外的自动控制和传感器技术已经达到了很高的水平,特别是日本,比如日本本田制作的机器人,其仿人双足行走已经做得十分逼真,而且具有一定的学习能力,还据说其智商已达到6岁儿童的水平。

作为机械行业的代表产品—汽车,其与电子信息产业的融合速度也显著提高,呈现出两个明显的特点:

一是电子装置占汽车整车(特别是轿车)的价值量比例逐步提高,汽车将由以机械产品为主向高级的机电一体化方向发展,汽车电子产业也很有可能成为依托整车制造业和用车提升配置而快速成为新的增长点;二是汽车开始向电子化、多媒体化和智能化方向发展,使其不仅作为一种代步工具、同时能具有交通、娱乐、办公和通讯等多种功能。

无容置疑,机电一体化人才的培养不论是在国外还是国内,都开始重视起来,主要表现在大学生的各种大型的创新比赛,比如:

亚洲广播电视联盟亚太地区机器人大赛(ABUROBCON)、全国大学生“飞思卡尔”杯智能汽车竞赛等众多重要竞赛都能很好的培养大学生对于机电一体化的兴趣与强化机电一体化的相关知识。

但很现实的状况是,国内不论是在机械还是电气领域,与国外的差距还是很明显的,所以作为机电一体化学生,必须加倍努力,为逐步赶上国外先进水平并超过之而努力。

为了适应机电一体化的发展在汽车智能化方向的发展要求,提出简易智能小车的构想,目的在于:

通过独立设计并制作一辆具有简单智能化的简易小车,获得项目整体设计的能力,并掌握多通道多样化传感器综合控制的方法。

所以立“智能循迹小车”一题作为尝试。

此项设计是在以杨老师提供的小车为基础上,采用AT89C52单片机作为控制核心,实现能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。

一、实验目的:

通过设计进一步掌握51单片机的应用,特别是在嵌入式系统中的应用。

进一步学习51单片机在系统中的控制功能,能够合理设计单片机的外围电路,并使之与单片机构成整个系统。

二、设计方案:

该智能车采用红外传感器对赛道进行道路检测,单片机根据采集到的信号的不同状态判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。

三、报告内容安排:

本技术报告主要分为三个部分。

第一部分是对整个系统实现方法的一个概要说明,主要内容是对整个技术原理的概述;第二部分是对硬件电路设计的说明,主要介绍系统传感器的设计及其他硬件电路的设计原理等;第三部分是对系统软件设计部分的说明,主要内容是智能模型车设计中主要用到的控制理论、算法说明及代码设计介绍等。

 

 

技术方案概要说明

本模型车的电路系统包括电源管理模块、单片机模块、传感

器模块、电机驱动模块。

工作原理:

Ø利用红外采集模块中的红外发射接收对管检测路面上的轨迹

Ø将轨迹信息送到单片机

Ø单片机采用模糊推理求出转向的角度和行走速度,然后去控制

行走部分

Ø最终完成智能小车可以按照路面上的轨迹运行。

 

硬件电路的设计

1、最小系统:

小车采用atmel公司的AT89C52单片机作为控制芯片,图1是其最小系统电路。

主要包括:

时钟电路、电源电路、复位电路。

其中各个部分的功能如下:

1、时钟电路:

给单片机提供一个外接的16MHz的石英晶振。

2、电源电路:

给单片机提供5V电源。

3、复位电路:

在电压达到正常值时给单片机一个复位信号。

图1单片机最小系统原理图

 

2、电源电路设计:

模型车通过自身系统,采集赛道信息,获取自身速度信息,加以处理,由芯片给出指令控制其前进转向等动作,各部分都需要由电路支持,电源管理尤为重要。

在本设计中,51单片机使用5V电源,电机及舵机使用6V电源。

考虑到电源为充电电池组,额定电压为7.2V,实际充满电后电压则为6.5-6.8V,所以单片机及传感器模块采用7805稳压后的5V电源供电,舵机及电机直接由电池供电。

 

3、传感器电路:

光电寻线方案一般由多对红外收发管组成,通过检测接收到的反射光强,判断黑白线。

原理图由红外对管和电压比较器两部分组成,红外对管输出的模拟电压通过电压比较器转换成数字电平输出到单片机。

 

图2赛道检测原理图:

4、电机驱动电路:

电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动

电路。

是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。

其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。

L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。

5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。

也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。

L298N的逻辑功能:

表1SHARPGP2D12实物图

 

外形及封装:

图3L298N实物图

L298N电路原理图:

由于一片L298N可以直接驱动两个电机,但是为了加大驱动力,我们采用两路并联的方式来驱动电机。

图3.3L298N电路图

 

软件系统的实现

小车循迹规则:

若小车偏左的时候,车轮将向右偏转;若小车偏右,车轮将向左偏转;若没有偏移,小车将继续向前;若小车完全偏离黑色轨迹,小车后退以寻找黑色轨迹。

小车程序:

#include"reg52.h"

#definedet_Dist2.55//单个脉冲对应的小车行走距离,其值为车轮周长/4

#defineRD9//小车对角轴长度

#definePI3.1415926

#defineANG_9090

#defineANG_90_T102

#defineANG_180189

/*============================全局变量定义区============================*/

sbitP10=P1^0;//控制继电器的开闭

sbitP11=P1^1;//控制金属接近开关

sbitP12=P1^2;//控制颜色传感器的开闭

sbitP07=P0^7;//控制声光信号的开启

sbitP26=P2^6;//接收颜色传感器的信号,白为0,黑为1

sbitP24=P2^4;//左

sbitP25=P2^5;//右接收左右光传感器的信号,有光为0

unsignedcharmType=0;//设置运动的方式,0向前1向左2向后3向右

unsignedcharDirection=0;//小车的即时朝向0朝上1朝左2朝下3朝右

unsignedsX=50;unsignedcharsY=0;//小车的相对右下角的坐标CM(sX,sY)

unsignedcharStartTask=0;//获得铁片后开始执行返回卸货任务,StartTask置一

unsignedcharInter_EX0=0;//完成一个完整的任务期间只能有一次外部中断

//Inter_EX0记录外部中断0的中断状态

//0动作最近的前一次未中断过,

//1动作最近的前一次中断过

unsignedcharcntIorn=0;//铁片数

unsignedcharbkAim=2;//回程目的地,0为A仓库,1为B仓库,2为停车场,

//(在MAIN中接受铁片颜色判断传感器的信号来赋值)

unsignedcharLight_Flag=0;//进入光引导区的标志

(1)

unsignedintcntTime_5Min=0;//时间周期数,用于T0精确定时

unsignedintcntTime_Plues=0;//霍尔开关产生的脉冲数

/*============================全局变量定义区============================*/

 

/*------------------------------------------------*/

/*-----------------通用延迟程序-------------------*/

/*------------------------------------------------*/

voiddelay(unsignedinttime)//time*0.5ms延时

{

unsignedinti,j;

for(j=0;j

{

for(i=0;i<60;i++)

{;}

}

}

 

/*-----------------------------------------------*/

/*-------------------显示控制模块----------------*/

/*-----------------------------------------------*/

 

/*数码管显示,显示铁片的数目(设接在P0,共阴)*/

voidDisplay(unsignedcharn)

{

charNumb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77};

P0=Numb[n];

}

 

/*-----------------------------------------------*/

/*-------------------传感器模块------------------*/

/*-----------------------------------------------*/

 

/*光源检测程序:

*/

/*用于纠正小车运行路线的正确性*/

unsignedcharLightSeek()

{voidDisplay(unsignedchar);

bitl,r;

l=P24;

r=P25;

if(l==0&&r==1)

{

//Display

(1);

return(3);//偏左,向右开

}

if(r==0&&l==1)

{

//Display(3);

return

(1);//偏右,向左开

}

if((l==1&&r==1)||(l==0&&r==0))

{//Display(9);

return(0);//没有偏离,前进

}

}

 

/*铁片检测程序:

*/

/*判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场*/

voidIornColor()

{

delay(4000);

bkAim=(int)(P26);

Display((int)(P26)+2);

}

 

/*-----------------------------------------------*/

/*------------------运动控制模块-----------------*/

/*-----------------------------------------------*/

 

/*====基本动作层:

完成基本运动动作的程序集====*/

/*运动调整程序:

*/

/*对小车的运动进行微调*/

voidctrMotor_Adjust(unsignedchart)

{

if(t==0)

{

P2=P2&240|11;//用来解决两电机不对称的问题

delay(6);

}

if(t==3)

{

P2=P2&250;//向左走

delay

(1);

}

if(t==1)

{

P2=(P2&245);

delay

(1);//向右走

}

P2=((P2&240)|15);

delay(10);

}

/*直走程序:

*/

/*控制小车运动距离,dist为运动距离(cm),type为运动方式(02)*/

/*只改变小车sX和sY的值而不改变Direction的值.*/

voidctrMotor_Dist(floatdist,unsignedchartype)

{unsignedchart=0;

mType=type;

P2=((P2&240)|15);

cntTime_Plues=(int)(dist/det_Dist);

while(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0;

break;

}

if(Light_Flag==1)t=LightSeek();

if(type==0)//向前走

{

P2=P2&249;

delay(40);

ctrMotor_Adjust(t);

}

if(type==2)//向后退

{

P2=P2&246;

delay(50);

ctrMotor_Adjust(t);

}

P2=((P2&240)|15);

if(mType==2)delay(60);//刹车制动0.5ms

elsedelay(75);

}

 

}

 

/*拐弯程序:

*/

/*控制小车运动角度,type为运动方式(13)*/

/*只改变小车Direction的值而不改变sX和sY的值*/

voidctrMotor_Ang(unsignedcharang,unsignedchartype,unsignedchardir)

{

unsignedchari=0;

mType=type;

P2=((P2&240)|15);

cntTime_Plues=(int)((PI*RD*90/(180*det_Dist)*1.2)*ang/90);

while(cntTime_Plues)

{

if(Inter_EX0==1&&StartTask==0)

{

cntTime_Plues=0;

break;

}

if(type==1)//向左走

{

P2=P2&250;

delay(100);

ctrMotor_Adjust(0);

}

if(type==3)//向右走

{

P2=P2&245;

delay(100);

ctrMotor_Adjust(0);

}

P2=((P2&240)|15);

delay(50);//刹车制动0.5ms

}

if(!

(Inter_EX0==1&&StartTask==0))

{

Direction=dir;

}

}

 

/*====基本路线层:

描述小车基本运动路线的程序集====*/

/*当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)*/

voidrchPlace()

{unsignedinttime,b,s,g;

time=(int)(cntTime_5Min*0.065535);//只有一个数码管时,轮流显示全过程秒数个十百

b=time%100;

s=(time-b*100)%100;

g=(time-b*100-s*10)%10;

if(bkAim==2)

{

//到达停车场了,停车

EA=0;

P2=((P2&240)|15);

while

(1)

{

Display(10);//N

delay(2000);

Display(cntIorn);

delay(2000);

Display(11);//A

delay(2000);

Display(b);

delay(2000);

Display(s);

delay(2000);

Display(g);

delay(2000);

}

}

else

{

if(Inter_EX0==1&&StartTask==1)P10=0;//到达仓库,卸下铁片

}

}

 

/*无任务模式:

*/

/*设置小车的固定运动路线,未发现铁片时的运动路线*/

voidBasicRoute()

{//Light_Flag=1;

ctrMotor_Dist(153,0);

//Light_Flag=0;

ctrMotor_Ang(ANG_90,1,1);

ctrMotor_Dist(100-sX,0);

ctrMotor_Dist(125,2);

ctrMotor_Dist(73,0);

ctrMotor_Ang(ANG_90,1,2);

//Light_Flag=1;

ctrMotor_Dist(153,0);

//Light_Flag=0;

ctrMotor_Ang(ANG_180,1,0);

rchPlace();

}

 

/*任务模式:

*/

/*设置小车的发现铁片后的运动路线*/

voidTaskRoute()

{

//基本运行路线表,记载拐弯0向前1左拐2向后3右拐,正读去A区;反读去B区

StartTask=1;

ctrMotor_Ang(ANG_90_T,1,2);

if(bkAim==1)//仓库A

{

ctrMotor_Dist(10,0);

P2=((P2&240)|15);

delay(60);

ctrMotor_Ang(ANG_90_T,1,3);

ctrMotor_Dist(100-sX,2);

ctrMotor_Ang(ANG_90_T,1,2);

Light_Flag=1;

ctrMotor_Dist(153,2);

Light_Flag=0;

//ctrMotor_Ang(208,1,0);

}

elseif(bkAim==0)//仓库B

{

ctrMotor_Dist(10,0);

P2=((P2&240)|15);

delay(60);

ctrMotor_Ang(ANG_90_T,1,3);

ctrMotor_Dist(100-sX,0);

ctrMotor_Ang(ANG_90_T,1,0);

Light_Flag=1;

ctrMotor_Dist(153,2);

Light_Flag=0;

//ctrMotor_Ang(208,1,0);

}

delay(5000);

rchPlace();

}

 

/*---------------------------------------------*/

/*-------------------主程序段------------------*/

/*---------------------------------------------*/

voidmain()

{

delay(4000);

P2=0xff;//初始化端口

P07=0;

P1=0;

TMOD=0x01;//初始化定时器0/1及其中断

TL0=0;

TH0=0;

TR0=1;

ET0=1;

ET1=1;

IT0=1;//初始化外部中断

EX0=1;

IT1=1;

EX1=1;

EA=1;

P11=1;

while

(1)

{

Display(cntIorn);

bkAim=2;

BasicRoute();

if(Inter_EX0==1)

{

TaskRoute();//按获得铁片后的路线运动

IE0=0;

EX0=1;

}

Inter_EX0=0;

}

}

/*----------------------------------------------------*/

/*----------------------中断程序段--------------------*/

/*----------------------------------------------------*/

 

/*定时器0中断程序:

*/

/*当时间过了5分钟,则就地停车并进入休眠状态*/

voidtmOver(void)interrupt1

{

cntTime_5Min++;

TL0=0;

TH0=0;

if(cntTime_5Min>=4520)

{

Display(5);

P2=((P2&240)|15);

EA=0;//停车程序

P07=1;

delay(4000);

PCON=0X00;

while

(1);

}

}

 

/*外部中断0中断程序:

*/

/*发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器*/

/*并联在一起(设接在P07).0为A仓库,1为B仓库,2为停车场*/

voidfndIorn(void)interrupt0

{

unsignedchari;

P10=1;

P2=((P2&240)|15);//停车

P07=1;

delay(1000);//刹车制动0.5ms

P07=0;

Inter_EX0=1;

cntIorn++;

Display(cntIorn);

for(i=0;i<40;i++)

{

P2=P2&249;

delay

(2);

P2=((P2&240)|15);

delay

(2);

}

P2=P2&249;

delay(100);

P2=((P2&240)|15);//停车

IornColor();//判断铁片黑白,设置bkAim

for(i=0;i<95;i++)

{

P2=P2&249;

delay(3);

P2=((P2&240)|15);

delay

(2);

}

P2=((P2&240)|15);//停车

delay(4000);//把铁片吸起来

EX0=0;

}

 

/*外部中断1中断程序:

*/

/*对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位*/

voidstpMove(void)interrupt2

{

cntTime_Plues--;

if(Direction==0)//向上

{

if(mType==0)sY+=det_Dist;

elseif(mType==2)

sY-=det_Dist;

}

elseif(Direction==1

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2