智能小车设计文档.docx
《智能小车设计文档.docx》由会员分享,可在线阅读,更多相关《智能小车设计文档.docx(16页珍藏版)》请在冰点文库上搜索。
智能小车设计文档
智能小车设计文档
1、引言
智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
智能电动车就是其中的一个体现。
本次设计的简易智能电动车,采用AT89C52单片机作为小车的检测和控制核心;采用红外感应器来检测路上感应到的黑线,从而把反馈到的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,并且单片机选择的工作模式不同也可控制小车顺着S形铁片行驶;采用霍尔元件A44E检测小车行驶速度;采用LCD实时显示小车行驶的时间,小车停止行驶后,轮流显示小车行驶时间、行驶距离、平均速度以及各速度区行驶的时间。
本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。
2、系统功能要求
利用单片机作为控制核心设计并制作一个只能电动车。
具体要求如下:
(1)识别地上的黑线;
(2)自动根据黑线数加减速;
(3)能够记录速度与行驶的距离;
(4)显示相应的记录。
3、方案比较
根据设计要求,我认为此设计属于多输入量的复杂程序控制问题。
据此,拟定了以下两种方案并进行了综合的比较论证,具体如下:
方案一:
选用一片CPLD(如EPM7128LC84-15)作为系统的核心部件,实现控制与处理的功能。
CPLD具有速度快、编程容易、资源丰富、开发周期短等优点,可利用VHDL语言进行编写开发。
但CPLD在控制上较单片机有较大的劣势。
同时,CPLD的处理速度非常快,而小车的行进速度不可能太高,那么对系统处理信息的要求也就不会太高,在这一点上,MCU就已经可以胜任了。
若采用该方案,必将在控制上遇到许许多多不必要增加的难题。
为此,我们不采用该种方案,进而提出了第二种设想。
方案二:
采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。
根据这些分析,我选定了STC89C52单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC89C52单片机的资源。
4、硬件电路
4.1CPU控制部分设计框图
智能小车采用前后轮同时驱动,前后轮左右两边各用一个电机驱动,调制左右两边两个轮子的转速从而达到控制转向的目的。
将循迹光电对管装在车体下的右边。
当车身下边的传感器检测到黑线时,主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。
避障的原理和循线一样,在车身右边装一个光电对管,当其检测到障碍物时,主控芯片给出信号报警并控制车子倒退,转向,从而避开障碍物。
计速模块安装在后车轮的左侧,根据车轮旋转的圈数,计算出车行走的速度。
图1主板设计框图
4.2CPU控制部分电路图
图2CPU控制部分电路图
5、各部件工作原理
5.1黑线检测模块
采用红外对管,分别置于小车中部车底,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好两只光电开关的位置就可以很好的实现循迹的功能。
电路原理图如下:
图3黑线检测模块
5.2LCD显示模块
采用LCD,由单片机的总线模式连接。
为节约电源电量并且不影响LCD的功能,LCD的背光用单片机进行控制,使LCD的背光在小车行驶的过程中不亮,因为我们不必看其显示;在其它我们需要看显示的内容的时候LCD背光亮。
电路原理图如下:
图4数码管显示模块
5.3计速模块
采用采用霍尔开关元器件A44E检测轮子上的小磁铁从而给单片机中断脉冲,达到测量速度的作用。
霍尔元件具有体积小,频率响应宽度大,动态特性好,对外围电路要求简单,使用寿命长,价格低廉等特点,电源要求不高,安装也较为方便。
霍尔开关只对一定强度的磁场起作用,抗干扰能力强,因此可以在车轮上安装小磁铁,而将霍尔器件安装在固定轴上,通过对脉冲的计数进行车速测量。
原理图接线如下所示:
图5计速模块
5.4电机驱动
采用功率三极管作为功率放大器的输出控制直流电机。
线性型驱动的电路结构和原理简单,加速能力强,采用由达林顿管组成的H型桥式电路。
用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。
这种电路由于工作在管子的饱和截止模式下,效率非常高,H型桥式电路保证了简单的实现转速和方向的控制,电子管的开关速度很快,稳定性也极强,是一种广泛采用的PWM调速技术。
现市面上有很多此种芯片,我选用了L298N。
这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。
因此决定采用使用功率三极管作为功率放大器的输出控制直流电机。
图6电机驱动电路图
5.5电源模块
采用6支1.5V电池作为电源给单片机与电机供电可解决方案二的问题且能让小车完成其功能。
6、软件程序设计
6.1主程序流程图
流程图说明:
单片机上电后,自动装载程序,初始化数据,然后进入while循环;当检测到有黑线时,判断是第几次,再根据相应的次数判断是减速、加速还是匀速前行;并在while循环里实时监控速度,累加相应的路程,并在数码管上显示。
主程序代码:
voidmain(void)
{
//初始化模块
display_init();
bianliang_init();
int0_init();
timer_init();
count_init();
motor_init();
motor_zhengzhuan();
while(second<=4)
{uchari=4-second;
display_countdown(i);//倒计时显示
}
//循环控制模块
while
(1){
while(blackline_1==0)//未到起跑线是加速
{speed_display(0xff);}
while(blackline_1==1)//起跑线全速
{speed_display(0xff);}
while(blackline_1+blackline_2<=2);
p=0;
while(p<10)
{if(blackline_1==blackline_2)sign=0;
elseif(blackline_1>blackline_2)sign=1;
elseif(blackline_1}
if(sign==1)
{turn_left();
turn_left();
turn_left();
turn_left();}
if(sign==2)
{turn_right();
turn_right();
turn_right();
turn_right();}
while(blackline_1==2)//到限速线有3~6M的距离,故先全速,再中速,然
//过渡到低速,从而能在限速线上顺利减速
{speed_display(0xff);
speed_display(0xff);
speed_display(0xff);
speed_display(0xcc);
}
while(blackline_1==2&&blackline_2==2);
p=0;
while(p<10)
{if(blackline_1==blackline_2)sign=0;
elseif(blackline_1>blackline_2)sign=1;
elseif(blackline_1}
if(sign==1)
{turn_left();
turn_left();
turn_left();
turn_left();}
if(sign==2)
{turn_right();
turn_right();
turn_right();
turn_right();}
while(blackline_1==3)//限速线到达,低速
{speed_display(0x88);}
while(blackline_1==3&&blackline_2==3);
p=0;
while(p<10)
{if(blackline_1==blackline_2)sign=0;
elseif(blackline_1>blackline_2)sign=1;
elseif(blackline_1}
if(sign==1)
{turn_left();
turn_left();
turn_left();
turn_left();}
if(sign==2)
{turn_right();
turn_right();
turn_right();
turn_right();}
while(blackline_1==4)//加速离开限速区
{speed_display(0xff);}
while(blackline_1==5)//中低速结合,便于终点线快速刹车
{speed_display(0xcc);
speed_display(0x88);
}
while(blackline_1!
=6);//到达终点线,先刹车,再关使能ENA和ENB
motor_stop();
speed_display(0x00);//关使能
second=0;//在定时器0中1s自增
while(second<=10)//10秒倒计时且数码管显示
{uchari=10-second;
display_countdown(i);//倒计时显示
}
motor_fanzhuan();
speed_display(0xff);//全速倒行
while(blackline_1!
=7);
while(blackline_1==7)
{speed_display(0xff);}
while(blackline_1==7&&blackline_2==7);
p=0;
while(p<10)
{if(blackline_1==blackline_2)sign=0;
elseif(blackline_1>blackline_2)sign=1;
elseif(blackline_1}
if(sign==1)
{turn_left();
turn_left();
turn_left();
turn_left();}
if(sign==2)
{turn_right();
turn_right();
turn_right();
turn_right();}
while(blackline_1==8)
{speed_display(0xff);
speed_display(0xff);
speed_display(0xcc);}
while(blackline_1==8&&blackline_2==8);
p=0;
while(p<10)
{if(blackline_1==blackline_2)sign=0;
elseif(blackline_1>blackline_2)sign=1;
elseif(blackline_1}
if(sign==1)
{turn_left();
turn_left();
turn_left();
turn_left();}
if(sign==2)
{turn_right();
turn_right();
turn_right();
turn_right();}
while(blackline_1==9){speed_display(0x88);}
while(blackline_1==9&&blackline_2==9);
p=0;
while(p<10)
{if(blackline_1==blackline_2)sign=0;
elseif(blackline_1>blackline_2)sign=1;
elseif(blackline_1}
if(sign==1)
{turn_left();
turn_left();
turn_left();
turn_left();}
if(sign==2)
{turn_right();
turn_right();
turn_right();
turn_right();}
while(blackline_1==10){speed_display(0xff);}
while(blackline_1==11){speed_display(0xcc);speed_display(0x88);}
while(blackline_1!
=12);//终点线上停车,3S间隔轮流显示总时间和总路程
motor_stop();
speed_display(0x00);
total_time=time;
while
(1)
{second=0;
while(second<=3)
{display_time();}
second=0;
while(second<=3)
{display(distance);}
}
}//接下来的控制同上
//倒回到起点线上时刹车,然后轮流显示总时间t和总路程s
}
7、电路设计图
7.1总电路图
7.2PCB电路图
7.3智能小车实物图