智能循迹小车设计.docx
《智能循迹小车设计.docx》由会员分享,可在线阅读,更多相关《智能循迹小车设计.docx(27页珍藏版)》请在冰豆网上搜索。
智能循迹小车设计
智能寻迹小车设计与实现
摘要:
本课题是基于AT89C52单片机的智能小车的设计与实验,设计主要有三个模块,包括信号检测模块、主控模块、电机驱动模块。
小车完成的主要功能是能够自主识别黑色引导线并根据黑线走向实现快速稳定的寻线行驶。
采用L298电机驱动及PWN电机调速,利用红外对管传感器检测黑线达到循迹目的,以及自动停车,自动循迹。
整体系统的电路结构简单,可靠性高。
关键词:
AT89C52单片机L298电机驱动及PWN电机调速自动循迹
Smartcartracing
Abstract:
ThissubjectisthedesignandexperimentofintelligentcarbasedonAT89C52single-chipmicrocomputer,thedesignhasthreemainmodules,includingthemoduleofsignaldetectionmodule,maincontrolmodule,motor.Themainfunctionofthecarisabletoindependentlyidentifyblackguidelineandaccordingtotheblacklinetoachieverapidandstablelinerunning.UsingL298motorandPWNmotor,thetubesensortodetectblacklinetotrackingobjectiveusinginfrared,andautomaticstop,automatictracking.Thecircuitconstructionofwholesystemissimple,highreliability.
Keyword:
AT89S52MicrocomputerL298motorandPWNmotorautomatictracking
目录
第一章前言.1
1.1设计目的2
1.2设计要求2
第二章智能小车的总体方案设计3
2.1总体方案的思路3
2.2总体设计方案和框图3
第三章系统硬件设计与实现5
3.1单片机单元5
3.2电机控制单元6
3.3串口通讯单元8
3.4按键中断单元9
3.5蜂鸣器单元9
第四章系统软件设计与实现10
4.1程序流程图10
4.2程序11
总结23
致谢24
参考文献25
附录电路原理图26
前言
科学技术的发展,机器人的感系统,对于视觉的各种技术而言图像处理技术已相当发达,而基于图像的理解技术还很落后,机器视觉需要通过大量的运算也只能识别一些结构化环境简单的目标。
视觉传感器的核心器件是摄像管或CCD,目前的CCD已能做到自动聚焦。
但CCD传感器的价格、体积和使用方式上并不占优势,因此在不要求清晰图像只需要粗略感觉的系统中考虑使用接近觉传感器是觉传感器种类越来越多,其中视觉传感器成为自动行走和驾驶的重要部件。
视觉的典型应用领域为自主式智能导航一种实用有效的方法。
该智能小车可以作为机器人的典型代表。
它可以分为三大组成部分:
传感器检测部分、CPU、执行部分。
机器人要实现自动避障功能,还可以扩展循迹等功能,感知导引线和障碍物。
可以实现小车自动识别路线,选择正确的行进路线,并检测到障碍物自动躲避。
基于上述要求,传感检测部分考虑到小车一般不需要感知清晰的图像,只要求粗略感知即可,所以可以舍弃昂贵的CCD传感器而考虑使用价廉物美的红外反射式传感器来充当。
智能小车的执行部分,是由直流电机来充当的,主要控制小车的行进方向和速度。
单片机驱动直流电机一般有两种方案:
第一,勿需占用单片机资源,直接选择有PWM功能的单片机,这样可以实现精确调速;第二,可以由软件模拟PWM输出调制,需要占用单片机资源,难以精确调速,但单片机型号的选择余地较大。
考虑到实际情况,本文选择第二种方案。
CPU使用STC89C52单片机,配合软件编程实现。
第1章设计指导
1.1设计目的
(1)掌握小车的基本构件;
(2)掌握电动机齿轮箱的构件;
(3)掌握各电子元器件的基本形状及其功能;
(4)掌握各电子元器件的焊接步骤与工作原理;
(5)掌握单片机内部结构与程序编制方法;
(6)掌握LED灯驱动方法,全面掌握流水灯/跑马灯编程技术;
(7)掌握数码管内部结构,掌握数码显示技术;
(8)掌握键盘结构原理,掌握中断查询技术原理;
(9)掌握话筒电路结构,掌握话筒输入技术原理;
(10)掌握蜂鸣器驱动技术,实现蜂鸣报警功能;
(11)掌握光敏电阻原理,实现光照对小车的控制;
(12)掌握红外发射与接收技术,实现小车自动寻迹;
(13)掌握R232通信协议,掌握串口通信技术;
(14)通过本次设计实验,对自己的专业知识掌握和运用有一个系统的考核;
1.2设计要求
当前的电动小汽车基本上采取的是基于纯硬件电路的一种开环控制方法,或者是直线行使,或者是在遥控下作出前进、后退、转弯、停车等基本功能。
但是它们不能实现在某些特殊的场合下,我们需要能够自动控制的小型设备先采集到一些有用的信息的功能。
本文正是在这种需要之下开发设计的一种智能的电动小车的自动控制系统。
它以单片机AT89C52为控制核心,附以外围电路,在画有黑线的白纸“路面”上行使,由于黑线和白线对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”——黑线。
判断信号可通过单片机控制驱动模块修正前进方向,以使其保持沿着黑线行进。
轨迹探测用两对红外探头,当小车脱离轨道时,即当置于两边的任何一只红外发射探头脱离轨道时,相对应的接收探头便会接收到反射的红外线,系统便做出相应的转向调整,直到中间的光电管接收不到反射的红外线(即回到轨道),再恢复正向行驶等智能控制系统。
第2章智能小车的总体方案设计
2.1总体方案的思路
智能寻迹小车寻迹主要是由前方的两对红外发射与接收探头来完成的。
根据光有反射的特性。
所以说当红外发射出来的光线遇到物体时,就会形成反射的光线,而这个经反射的红外光线刚好被红外接收探头接收到。
当红外接收探头接收到信号后,再将信号送到单片机由单片机内部程序来控制电机,由两个电机正转反转来完成小车的前进,转向。
2.2总体设计方案和框图
整个路系统分为检测、控制、驱动三个模块。
首先利用红外探头对路面信号进行检测,经过比较器处理之后,送给软件控制模块进行实时控制,输出相应的信号给驱动芯片驱动电机转动,从而控制整个小车的运动。
系统方案方框图如图所示:
图2-1智能小车寻迹系统框
2.2.1驱动模块
由于直流电机的控制方法比较简单,只需给电机的两根控制线加上适当的电压即可使电机转动起来,电压越高则电机转速越高。
对于直流电机的速度调节,可以采用改变电压的方法,也可采用PWM调速方法。
PWM调使加在直流电机两端的速就是电压为方波形式,通过改变方波的占空比实现对电机转速的调节。
2.2.2传感器单元
由于使用CCD传感器需要有大量图像处理的工作,需要进行大量数据的存储和计算。
而本次是以实现小车视觉为目的,实现起来工作量较大,电路相对比较复杂,所以我们使用光电传感器来采集路面信息。
使用红外传感器最大的优点就是结构简明,实现方便,成本低廉,免去了复杂的图像处理工作,反应灵敏,响应时间低,便于近距离路面情况的检测。
但红外传感器的缺点是,它所获取的信息是不完全的,只能对路面情况作简单的黑白判别,检测距离有限,而且容易受到诸多扰动的影响,抗干扰能力较差,背景光源,器件之间的差异,传感器高度位置的差异等都将对其造成干扰。
但在本次设计中,赛道为黑色与白色两种颜色,小车只要能区分黑色就可以采集到准确的路面信息,所以本设计中我们采用了红外光电传感器作为信息采集元件。
图2-2红外传感器分布图
其中X1与Y1为第一级方向控制传感器,一般中间的一个传感器XY在黑线上并且黑线同一边的两个传感器之间的宽度不得大于黑线的宽度。
小车前进时,X1、X2在黑线上,当小车偏离黑线时,第一级传感器X1或Y1就能检测不到黑线时,把检测的信号送给小车的处理、控制系统,控制系统发出信号对小车轨迹予以纠正。
这次设计智能小车,可以按指定路线运行,自动区分直线轨道和弯路轨道,在指定弯路处拐弯,实现灵活前进、转弯、倒退等功能,在轨道上划出设定的地图,并且车速自动可调。
主要是以AT89C52为核心,红外传感器进行目标识别与避障,使自动寻迹小车准确跟踪轨迹路线;采用直流电机对车的转向进行控制,由软件实现了小车自动行驶、自动避障,并发出指示信息等功能。
图2-1-1智能小车原理图
第3章系统硬件设计与实现
3.1单片机单元
AT89C52提供以下标准功能:
8k字节Flash闪速存储器,256字节内部RAM,32个I/O口线,3个16位定时/计数器,一个6向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。
同时,AT89C52可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。
空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。
掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位,AT89C52除了与AT89C51所有的定时/计数器0和定时/计数器l外,还增加了一个定时/计数器2。
定时/计数器2的控制和状态位位于T2CON。
T2MOD,寄存器对(RCA02H、RCAP2L)是定时器2在16位捕获方式或16位自动重装载方式下的捕获/自动重装载寄存器。
图3-2AT89C52各引脚
P0口是一组8位漏极开路型双向I/O口也即地址/数据总线复用口。
作为输出口用时,每位能吸收电流的
P1是一个带内部上拉电阻的8位双向I/O口,P1的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑
P2是一个带有内部上拉电阻的8位双向I/O口,P2的输出缓冲级可驱动(吸收或输出电流)4个TTL逻辑
P3口是一组带有内部上拉电阻的8位双向I/O口。
P3口输出缓冲级可驱动(吸收或输出电流)4个TTL逻
RST复位输入。
当振荡器工作时,RST引脚出现两个机器周期以上高电平将使单片机复位。
ALE/PROG当访问外部程序存储器或数据存储器时,ALE(地址锁存允许)输出脉冲用于锁存地址的低8位字节
PSEN程序储存允许(PSEN)输出是外部程序存储器的读选通信号,当AT89C52由外部程序存储器取指令
EA/VPP外部访问允许。
欲使CPU仅访问外部程序存储器(地址为0000H—FFFFH),EA端必须保持低电平
XTAL1振荡器反相放大器的及内部时钟发生器的输入端。
XTAL2振荡器反相放大器的输出端。
3.2电机控制单元
从单片机输出的信号功率很弱,即是在没有其他外在负载时也无法带动电机,所以在实现电路中我们加入了电机驱动芯片提高输入电机信号的功率,从而能够根据需要控制电机转动
L9110是为控制和驱动电机设计的两通道推挽式功率放大专用集成电路器件,将分立电路集成在单片IC之中,使外围器件成本降低,整机可靠性提高。
该芯片有两个TTL/CMOS兼容电平的输入,具有良好的抗干扰性;两个输出端能直接驱动电机的正反向运动,它具有较大的电流驱动能力,每通道能通过750~800mA的持续电流,峰值电流能力可达1.5~2.0A;同时它具有较低的输出饱和压降;内置的钳位二极管能释放感性负载的反向冲击电流,使它在驱动继电器、直流电机、步进电机或开关功率管的使用上安全可靠。
L9110被广泛应用于玩具汽车电机驱动、步进电机驱动和开关功率管等电路上。
LG9110特点
低静态工作电流
宽电源电压范围:
2.5V-12V
每通道具有800mA连续电流输出能力
较低的饱和压降
输出内置钳位二极管适用于感性负载
控制和驱动集成于单片IC之中
具备管脚高压保护功能
工作温度:
0℃-80℃
TTL/CMOS输出电平兼容,可直接连CPU
3.3串口通讯单元
MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
引脚图片
引脚介绍
主要分为几部分
电荷泵电路:
由1、2、3、4、5、6脚和4只电容构成。
功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。
数据转换通道:
由7、8、9、10、11、12、13、14脚构成两个数据通道。
其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。
8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。
TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。
供电:
15脚GND、16脚VCC(+5v)。
由于RS232电平较高,在接通时产生的瞬时电涌非常高,很有可能击毁max232,所以在使用中应尽量避免热插拔。
3.4按键中断单元
S1接通后,P3.4端接入低电平,小车中断所进行的动作。
S2接通后使P3.4接入低电平,这时会有一个外部输入进入到单片机中,从而使小车停止所进行的动作进行下一个动作。
3.5蜂鸣器单元
在单片机应用的设计上,很多方案都会用到蜂鸣器,大部分都是使用蜂鸣器来做提示或报警,比如按键按下、开始工作、工作结束或是故障等等。
这里对单片机在蜂鸣器驱动上的应用作一下描述。
图3--7为蜂鸣器发声
电路原理图。
图3-7蜂鸣器发声电路原理图
由于自激蜂鸣器是直流电压驱动的,不需要利用交流信号进行驱动,只需对驱动口输出驱动电平并通过三极管放大驱动电流就能使蜂鸣器发出声音,由于蜂鸣器的工作电流一般比较大,以致于单片机的I/O口是无法直接驱动的,所以要利用放大电路来驱动,一般使用三极管来放大电流就可以了。
第4章系统软件设计与实现
4.1程序流程图
图4-1系统总流程图
该系统配套的软件程序采用模块结构,由C语言编写完成。
主要由初始化程序、偏道调整程序、偏离光源调整程序、声光指示子程序、读传感器状态、显示程序、定时器0的中断服务程序、定时器1的中断服务程序、外部中断0的服务程序、停车处理等模块组成。
系统的主体流程如图3-4所示。
4.2程序
#include//包含51单片机相关的头文件
#defineuintunsignedint//重定义无符号整数类型
#defineucharunsignedchar//重定义无符号字符类型
ucharcodeLedShowData[]={0x03,0x9F,0x25,0x0D,0x99,//定义数码管显示数据
0x49,0x41,0x1F,0x01,0x19};//0,1,2,3,4,5,6,7,8,9
ucharcodeRecvData[]={0x07,0x0A,0x1B,0x1F,0x0C,0x0D,0x0E,0x00,0x0F,0x19};
ucharIRCOM[7];
staticunsignedintLedFlash;//定义闪动频率计数变量
unsignedcharRunFlag=0;//定义运行标志位
bitEnableLight=0;//定义指示灯使能位
/***********完成基本数据变量定义**************/
sbitS1State=P1^0;//定义S1状态标志位
sbitS2State=P1^1;//定义S2状态标志位
sbitB1State=P1^2;//定义B1状态标志位
sbitIRState=P1^3;//定义IR状态标志位
sbitRunStopState=P1^4;//定义运行停止标志位
sbitFontIRState=P1^5;//定义FontIR状态标志位
sbitLeftIRState=P1^6;//定义LeftIR状态标志位
sbitRightIRState=P1^7;//定义RightIRState状态标志位
/*************完成状态指示灯定义*************/
sbitS1=P3^2;//定义S1按键端口
sbitS2=P3^4;//定义S2按键端口
/*************完成按键端口的定义*************/
sbitLeftLed=P2^0;//定义前方左侧指示灯端口
sbitRightLed=P0^7;//定义前方右侧指示灯端口
/*************完成前方指示灯端口定义*********/
sbitLeftIR=P3^5;//定义前方左侧红外探头
sbitRightIR=P3^6;//定义前主右侧红外探头
sbitFontIR=P3^7;//定义正前方红外探头
/*************完成红外探头端口定义***********/
sbitM1A=P0^0;//定义电机1正向端口
sbitM1B=P0^1;//定义电机1反向端口
sbitM2A=P0^2;//定义电机2正向端口
sbitM2B=P0^3;//定义电机2反向端口
/*************完成电机端口定义***************/
sbitB1=P0^4;//定义话筒传感器端口
sbitRL1=P0^5;//定义光敏电阻端口
sbitSB1=P0^6;//定义蜂鸣端口
/*********完成话筒,光敏电阻,蜂鸣器.端口定义**/
sbitIRIN=P3^3;//定义红外接收端口
/*********完成红外接收端口的定义*************/
#defineShowPortP2//定义数码管显示端口
externvoidControlCar(ucharCarType);//声明小车控制子程序
voiddelay(unsignedcharx)//0.14mS延时程序
{
unsignedchari;//定义临时变量
while(x--)//延时时间循环
{
for(i=0;i<13;i++){}//14mS延时
}
}
voidDelay()//定义延时子程序
{uintDelayTime=5000;//定义延时时间变量
while(DelayTime--);//开始进行延时循环
return;//子程序返回
}
voidControlCar(ucharCarType)//定义小车控制子程序
{
M1A=0;//将电机1正向电平置低
M1B=0;//将电机1反向电平置低
M2A=0;//将电机2正向电平置低
M2B=0;//将电机2反向电平置低
LeftLed=1;//关闭前方左侧指示灯
RightLed=1;//关闭前方右侧指示灯
Delay();//将此状态延时一段时间
switch(CarType)//判断小车控制指令类型
{
case1:
//前进//判断是否是前进
{M1A=1;//将电机1正向端口置高
M2A=1;//将电机2正向端口置高
ShowPort=LedShowData[1];//数码管显示前进状态
break;//退出判断
}
case2:
//后退//判断是否是后退
{M1B=1;//将电机1反向端口置高
M2B=1;//将电机2反向端口置高
ShowPort=LedShowData[2];//数码管显示后退状态
RightLed=0;//将前方右侧指示灯置低(亮)
LeftLed=0;//将前方左侧指示灯置低(亮)
break;//退出判断
}
case3:
//左转//判断是否是左转
{M1B=1;//将电机1反向端口置高
M2A=1;//将电机2正向端口置高
ShowPort=LedShowData[3];//数码管显示左转状态
LeftLed=0;//将前方左侧指示灯置低(亮)
break;//退出判断
}
case4:
//右转//判断是否是右转
{M1A=1;//将电机1正向端口置高
M2B=1;//将电机2反向端口置高
ShowPort=LedShowData[4];//数码管显示右转状态
RightLed=0;//将前方右侧指示灯置低(亮)
break;//退出判断
}
case5:
{M1A=1;//将电机1反向端口置高
M2A=1;//将电机2正向端口置高
ShowPort=LedShowData[5];//数码管显示前进状态
break;//退出判断
}
case8:
{M1A=0;//将电机1正向端口置低
M2A=0;//将电机2反向端口置低
ShowPort=LedShowData[8];//数码管显示右转状态
RightLed=0;//将前方右侧指示灯置低(亮)
LeftLed=0;//将前方左侧指示灯置低(亮)
break;//退出判断
}
default:
//默认情况下的判断
{
break;//直接退出判断
}
}
}
voidComBreak()interrupt4//定义串口通信子程序
{unsignedcharRecvData;//定义串口数据接收变量
if(RI==1)//判断是否接收数据
{RecvData=SBUF;//将接收到的数据放入暂时变量
if(RecvData<10)//判断接收到的数据是否小于10
{
ShowPort=LedShowData[RecvData];//将接收到的数据通过数码管显示出来
ControlCar(RecvData);//将串口数据置于小于状态
}
SBUF=RecvData;//向电脑返回当前接收到的数据
RI=0;//清除接收中断标志位
}
if(TI==1)//判断是否是发送中断
{
TI=0;//清除发送中断标志位
}
}
voidIR_IN()interrupt2using0//定义INT2外部中断函数
{
unsignedcharj,k,N=0;//定义临时接收变量
EX1=0;//关闭外部中断,防止再有信号到达
delay(15);//延时时间,进行红外消抖
if(IRIN==1)//判断红外信号是否消失
{
EX1=1;//外部中断开
return;//返回
}
while(!