光电智能小车设计说明书.docx
《光电智能小车设计说明书.docx》由会员分享,可在线阅读,更多相关《光电智能小车设计说明书.docx(23页珍藏版)》请在冰豆网上搜索。
光电智能小车设计说明书
光电智能小车设计说明书
设计题目:
光电智能小车
参赛组员:
2013年5月2日
目录
第一章绪论
1.1摘要…………………………………………………………………………3
第二章硬件设计
2.1光电传感器模块
2.1.1设计思路………………………………………………………………...5
2.1.2原理及设计………………………………………………………………6
2.2电机驱动模块……………………………………………………………….8.
2.3电机测速模块………………………………………………………………11
2.4液晶显示模块………………………………………………………………12.
2.5电源稳压模块……………………………………………………………………….13
第三章软件设计
3.1程序流程图…………………………………………………………………14
第四章个人总结……………………………………………………………….15
参考文献…………………………………………………………………………15
附录一……………………………………………………………………………16
附录二……………………………………………………………………………17
第一章绪论
1.1摘要
近年来,随着我国经济建设的高速发展,机动车辆拥有量也在急剧增长,交通事故也日益增多,车辆超速成为了越来越严重的问题。
而我国生产的汽车、摩托车电机转速测量系用动圈式模拟测试。
这种测量系统存在精度差、过载能力弱等缺点。
本次题目的主要任务是设计一个智能小车,要求实现小车能够沿着跑道走、通过光电传感器进行测速、通过PWM电路模块进行调速以及通过LCD1602液晶模块进行速度、时间参数的显示。
控制板的设计以8位的STC89C52单片机为控制核心,驱动办则以L298N驱动芯片位核心,应用光电传感器和LCD液晶模块,成功的实现了小车的沿跑道行驶、测速、调速和显示等功能。
课题完成了光电传感器、单片机、主板整个硬件的安装,除此之外,还对整个控制软件进行设计的程序的编写及调试,并最终完成了软件和硬件的融合,实现了智能小车的要求。
关键词:
智能小车光电传感器驱动芯片LCD液晶显示单片机
Abstract
Inrecentyears,withtherapiddevelopmentofChina’seconomicconstruction,withtheamountofmotorvehiclesisincreasingsharply,trafficaccidentarealsoincreasing,theoverspeedvehiclebecomemoreandmoreseriousproblem.Automobile,motorcyclemotorspeedmeasurementsystemofourcountryproducedbythemovingcoilsimulationtest.Thismeasurementsystemhaspooraccuracy,overloadcapabilityisweak.
Themaintaskofthistopicistodesignasmartcar,displayrequirementstoachievethecarcangodowntherunway,thephotoelectricsensorspeed,speedthroughthePWMcircuitmoduleandspeed,throughtheLCD1602moduletimeparameter.Designofcontrolboardwith8bitmicrocontrollerSTC89C52asthecontrolcore,thedrivetodothedrivingchipL298Ncore,applicationofphotoelectricsensorandLCDmoduleLCD,thesuccessfulrealizationofthedrivingspeed,alongthetrack,control
anddisplayfunctions.Thephotoelectricsensor,microcontroller,boardthehardwareinstallation,inaddition,compilingangfinallycompletedtheintergrationofsoftwareandhardware,realizestheintelligentcarrequirements.
Keywords:
driverLCDLCDmicrocontrollersmartcarphotoelectricsensor
第二章系统硬件设计
【2.1光电传感器模块】
2.1.1设计思路
光电传感器是通过把光强度的变化转化成电信号的变化来实现控制的。
光电传感器在在一般情况下,有三部分构成,他们分为:
发射器、接收器和检测器。
用一个红外发光二极管和一个接受红外光的二极管组成一套光电管。
当检测到物体表面为黑色时,反射光很弱,接受端检测到的光可以忽略,使接收端呈现一种状态,例如开关管截止;当被检测表面为白色时,反射光强烈,发射端发射的红外线被接收端全部接收,使接收端呈现一种状态,
例如开关管开通。
这两种相反的状态表现在电路中,就是高低电平组成的脉冲信号。
由此,我们想到用到一个比较器来比较两种接收的信号,从而输出“0”和“1”两种高低电平,并把两种信号传给单片机进行统计,然后利用设定算法进行计算输出。
2.1.2原理及设计
本光电模块共有两个部分组成,一个为光电传感器,一个为运放比较器LM324。
LM324比较器有两个输入端和一个输出端,两个输入端一个为同相输入端,用“+”表示,另一个为反相输入端,用“—”表示,当用作比较两个电压时,任意一个输入端加一个固定电压做参考电压,另一个为待比较的信号电压,当“+”端电压高于“—”端时,输出端接高电位,当“—”端电压高于“+”端时,输出端接低电位。
两个输入端电压差大于10mv就能确保输出能从一种状态可靠地转换到另一种状态,因此,把LM324用在弱信号检测等场合是比较理想的。
LM324的输出端相当于一只不接集电极电阻的晶体三极管,在使用时输出端到正电源一般需接一只电阻,称为上拉电阻,不同的阻止会影响输出端电位的值,本次设计中用5.1k的上拉电阻。
在本次小车循迹时,若检测到白色区域,发射管发射的红外有反射到接收管;若检测到黑色区域,管接收到发射管发射的红外线,电阻发生变化,所得的分压也就随之发生变化。
判断有无黑线我们用比较器LM324,比较基准由电位器调节,各个接收管的参数都不一致,每个传感器的比较基准也尽不相同,我们为每个传感器配备了一个10k的变阻器。
传感器原理图
管脚图
整体电路图
光电传感器输出的电压接运放的3引脚正向输入端,电位器的中间引脚接运放的反相输入端,当检测到黑线时输出为高电平,检测到白线时为低电平。
I=U/R=5V/220=22mA。
【2.2电机驱动模块】
本次实验我们有如下几个方案来实现驱动电机。
方案一:
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整。
这个方案的优点是电路比较简单,缺点是继电器的响应时间慢、机械结构易损坏、寿命较短可靠性不高。
方案二:
采用功率管组成H桥型电机驱动电路,并利用PWM波来实现对输出电压的有效值大小和极性进行控制。
这种调速方式具有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,能耗小等优点,还可以实现频繁的无级快速启动和反转等优点。
方案三:
采用L298专用芯片进行驱动。
L298芯片的工作原理和方案二一致,但是其工作时较方案二稳定,且编程较为简单,便于调试。
另外L298内部集成了两个H桥,能同时驱动两个电机,硬件实现较方案二简单。
基于上述理论分析,拟定方案三,采用芯片L298N来驱动直流电机。
L298N是SGS公司的产品,内部包含4道逻辑驱动电路,是一种二相和四相电机的专用驱动器,即内含两个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46v、2A以下的电机。
管脚图
L298芯片管脚说明:
(1)SENSA:
电流监测端,H桥的电流反馈脚,不用时可直接接地。
(2)OUT1:
输出端,与M1对应。
(3)OUT2:
输出端,与M2对应。
(4)VS:
电源,用来给电动机供电。
(5)IN1:
输入端。
(6)ENA:
使能端,和M1、M2配合使用。
(7)IN2:
输入端。
(8)GND:
接地。
(9)VCC:
电源,用来给芯片供电。
(10)IN3:
输入端
(11)ENB:
使能端,和M3、M4配合使用。
(12)IN2:
输入端。
(13)OUT3:
输出端,与M3对应。
(14)OUT4:
输出端,与M4对应。
(15)SENSB:
电流监测端,H桥的电流反馈脚,不用时可直接接地。
原理图
主要采用L298N通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转。
OUT1、OUT2和OUT3、OUT4之间分别接两个电机,ENA、ENB接控制使能端,控制电机的停转。
逻辑功能如下:
左电机
右电机
左电机
右电机
电机运转状态
IN1
IN2
IN3
IN4
1
0
1
0
正转
正转
前进
1
0
0
1
正转
反转
左转
1
0
1
1
正转
停
以左电机为中心原地左转
0
1
1
0
反转
正转
右转
1
1
1
0
停
正转
以右电机为中心原地左转
0
1
0
1
反转
反转
后退
对于电机的调速,我们采用PWM调速的方法。
其原理就是开关管在一个周期内的导通时间为t,周期为T,则电机两端的平均电压U=VCC*(t/T)=aVCC。
其中,a=t/T(占空比),VCC是电压源。
电机的转速与电机两端的电压成比例,而电机两端的电压与控制波形的占空比成正比,因此电机的速度与占空比成正比,占空比越大,电机转速越快。
在硬件电路的连接上,我们将单片机P2.7~P2.4口分别接到L298的IN1~IN4上,通过改变P2.7~P2.4口的高低电平来控制小车的前进方向,通过改变P2.7~P2.4口上的高低电平的占空比来控制电机的速度。
其中八个二极管是当电机反转时用来起泄流的作用。
【2.3电机测速模块】
采用槽型光电传感器测量电机的转速,在电机轴承上分别安装两个码盘,电机转轴每转一圈,发射二极管发出的光便通过码盘上的孔隙到达接受管上,就可在接收管上产生相应的脉冲信号。
计算下1s内输出的脉冲信号的个数,把计数的结果进行运算,就可得到电机的转动速度。
为提高精度,将输出的信号经LM324整流后再输入单片机INT0、INT1口。
测速原理如图所示
【2.4液晶显示模块】
将所测速度及时间显示在1602液晶屏上,1602液晶简介及电路图
引脚
符号
引脚说明
引脚
符号
引脚说明
1
VSS
电源地
9
D2
数据口
2
VDD
电源正极
10
D3
数据口
3
VO
对比度调节
11
D4
数据口
4
RS
数据/命令选择端
12
D5
数据口
5
R/W
读写选择端
13
D6
数据口
6
E
使能信号
14
D7
数据口
7
D0
数据口
15
BLA
背光电源正极
8
D1
数据口
16
BLK
背光电源负极
【2.5稳压模块】
所加电压为7~8.5v,所以需稳压到5v给单片机等其他模块供电。
电路图如下
第三章软件设计
3.1程序流程图如下
第四章个人总结
学习本专业已有两年,但学习了好久理论也没有实践做过什么,借这次校内比赛的机会,我想检验下自己的实践操作能力。
通过这次比赛,使我们受益匪浅。
通过本次比赛设计,不仅是对我们课程所学知识的考查,更是对我们的自学能力和收集资料能力及动手能力的考验。
根据本次设计,我们系统的阅读了大量的资料,并认真分析了光电循迹小车的原理,最终采用了这个设计方案。
在设计与焊接的过程中,认识和掌握了红外传感器、驱动等许多元器件及芯片,并熟练运用了AD软件,了解了7805稳压芯片、LM324比较器的工作原理,本次设计使我们意识到了实验的重要性,在小车调试的过程中出现了许多问题,都是通过实验测试解决的。
再者,让我们深切体会到团队的合作是非常重要的,总之,在制作的过程中,无论是对于学习方法还是理论基础知识,我们都有了新的认识,受益匪浅,这将激励我们在今后再接再厉,不断完善自己的理论知识,提高实践运作能力。
参考文献
【1】51单片机C语言教程——入门、提高、开发、拓展全攻略郭天祥
【2】单片微机原理及应用上海丁元杰
【3】谭浩强.C程序设计北京:
清华大学出版社
【4】求是科技.8051系列单片机C语言程序设计北京:
人民邮电出版社
附录二
程序
#include
#defineucharunsignedchar
#defineuintunsignedint
ucharcodetable[]="speed:
mm/s";
ucharcodetable1[]="run_time:
s";
sbitlcden=P3^4;
sbitlcdrs=P3^5;
sbitIN1=P2^7;
sbitIN2=P2^6;
sbitIN3=P2^5;
sbitIN4=P2^4;
sbitENA=P2^3;
sbitENB=P2^2;
sbitL1=P1^0;
sbitL2=P1^1;
sbitL3=P1^2;
sbitR1=P1^3;
sbitR2=P1^4;
sbitR3=P1^5;
sbitzhong=P1^6;
longintM1=0,M2=0,s1=0,s2=0,s=0,run_time=0;
ucharaa,n,bai,shi,ge,bai1,shi1,ge1;
unsignedintnum1=10,num2=10;//赋值确定周期
voiddelay(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=5;j>0;j--);
}
voidwrite_com(ucharcom)//LCD写命令子函数
{lcdrs=0;
P0=com;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
voidwrite_data(uchardate)//LCD写数据子函数
{lcdrs=1;
P0=date;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
/***************LCD初始化函数*******************/
voidlcd_init()
{
lcden=0;
write_com(0x38);//设置16×2显示,5×7点阵,8位数据接口
write_com(0x06);//写一个字符后地址指针加一
write_com(0x0c);//设置开显示,不显示光标
write_com(0x01);//显示清零,数据指针清零
}
/*************外部中断初始化***************/
voidINT_init()
{IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
}
/***************外部中断函数***************/
voidmy_INT0(void)interrupt0
{
M1++;
}
voidmy_INT1(void)interrupt2
{
M2++;
}
/***************定时器1初始化、********************/
voidT1_init()
{TMOD=0x11;//设定时器1工作方式1
TH1=(65536-50000)/256;//装初值
TL1=(65536-50000)%256;
EA=1;//开总中断
ET1=1;
//开定时器1中断
}
/*******************定时器1中断函数************/
voidtime_1()interrupt3
{TR1=0;
TH1=(65536-50000)/256;
TL1=(65536-50000)%256;
n++;
if(n==20)
{s1=M1/20*3.14*65;
s2=M2/20*3.14*65;
s=(s1+s2)/2;
bai=(s/100)+48;
shi=(s%100/10)+48;
ge=(s%100%10)+48;
n=0;
s1=0;
s2=0;
M1=0;
M2=0;
}
TR1=1;
}
/*****************定时器0初始化函数*****************/
voidT0_init()
{TMOD=0x01;//设定时器0工作方式1
TH0=(65536-1000)/256;//装初值定时1ms
TL0=(65536-1000)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
}
/*****************定时器0中断函数****************/
voidt0_time()interrupt1
{TH0=(65536-1000)/256;
TL0=(65536-1000)%256;
aa++;
run_time++;
if(aa==11)
aa=0;
if(aa{IN1=1;
IN2=0;
}
else{IN1=0;IN2=0;}
if(aa{IN3=1;
IN4=0;
}
else{IN3=0;IN4=0;}
}
/*************主函数*********************/
voidmain(void)
{ucharnum;
T0_init();
INT_init();
T1_init();
lcd_init();
TR1=1;
ENA=1;
ENB=1;
IN1=1;
IN2=1;
IN3=1;
IN4=1;
while
(1)
{if(L1==0&&L2==0&&L3==0&&R1==0&&R2==0&&R3==0)
{
num2=10;
num1=10;
}
elseif(L1==1&&L2==0&&L3==0&&R1==0&&R2==0&&R3==0)
{num1=7;
num2=5;
}
elseif(L1==1&&L2==1&&L3==0&&R1==0&&R2==0&&R3==0)
{num1=6;
num2=2;
}
elseif(L1==1&&L2==1&&L3==1&&R1==0&&R2==0&&R3==0)
{num1=8;
num2=1;
}
elseif(R1==1&&R2==0&&R3==0&&L1==0&&L2==0&&L3==0)
{num2=7;
num1=5;
}
elseif(R1==1&&R2==1&&R3==0&&L1==0&&L2==0&&L3==0)
{num2=6;
num1=2;
}
elseif(R1==1&&R2==1&&R3==1&&L1==0&&L2==0&&L3==0)
{num2=8;
num1=1;
}
elseif(L1==1&&L2==1&&L3==1&&R1==1&&R2==1&&R3==1)
{
ENA=0;
ENB=0;
}
write_com(0x80);
for(num=0;num<13;num++)
{write_data(table[num]);
delay
(1);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{write_data(table1[num]);
delay
(1);
}
write_com(0x86);
write_data(bai);
delay
(1);
write_com(0x87);
write_data(shi);
delay
(1);
write_com(0x88);
write_data(ge);
delay
(1);
bai1=run_time/1000/100+48;
shi1=run_time/1000%100/10+48;
ge1=run_time/1000%100%10+48;
write_com(0x80+0x49);
write_data(bai1);
delay
(1);
write_com(0x80+0x4a);
write_data(shi1);
delay
(1);
write_com(0x80+0x4b);
write_data(ge1);
delay
(1);
}
}