梁炯名自动往返小汽车设计论文.docx
《梁炯名自动往返小汽车设计论文.docx》由会员分享,可在线阅读,更多相关《梁炯名自动往返小汽车设计论文.docx(31页珍藏版)》请在冰豆网上搜索。
梁炯名自动往返小汽车设计论文
题目(自动往返小汽车)
完成日期:
2012年12月13日
学校:
中山市技师学院
系 别:
电子应用系
专业名称:
电子技术应用
学生姓名:
梁炯名刘贤谢南南
组别:
基础组
指导教师姓名、职称:
黄江(教师)
摘要………………………………………………………………………………1
Abstract…………………………………………………………………………2
第一章设计实验任务和要求…………………………………………………2
1.1任务…………………………………………………………………………3
1.2要求…………………………………………………………………………3
第二章设计方法与论证………………………………………………………4
2.1总体设计方案………………………………………………………………4
2.2驱动模块……………………………………………………………………5
2.3黑线检测模块………………………………………………………………6
2.4码盘测距设计………………………………………………………………7
第三章系统理论分析与计算…………………………………………………8
3.1单片机最小系统……………………………………………………………9
3.3黑线检测模块设计与实现…………………………………………………9
3.4系统供电单元设计与实现…………………………………………………10
第四章系统软件设计…………………………………………………………11
4.1系统控制流程………………………………………………………………11
4.2系统电路图…………………………………………………………………11
第五章系统测试与结论………………………………………………………12
5.1硬件测试……………………………………………………………………12
5.2结论13
5.3程序…………………………………………………………………………13
摘要
通过仔细的分析和论证,本电路系统可分为检测、驱动和显示模块,首先利用反射式光电传感器检测路面的黑线个数,将其传给控制模块,这里我们主控芯片采用的是STC89C52芯片,小车装载了红外壁障光电传感器,实时检测车身两侧黑线,单片机将根据实际情况来控制小车的驱动模块,精确的控制小车的转速。
小车前行过程中所有信息包括检测黑线个数.。
关键词:
PWM黑线检测STC89C52
Abstract
Throughthecarefulanalysisandargumentation.Thiscircuitsystemcanbedividedintodetection,drive,obstacleavoidance,driveranddisplaymodule.
First,thereflectingphotoelectricsensortotestthepavementoftheblacklinenumber,passingitontocontrolmodule.HerewemastercontrolchipUSESisSTC12C5A60S2chip.Aloadofinfraredbarrierandphotoelectricsensor.Real-timedetectionbodyonbothsidesoftheobstacles.SCMwillaccordingtoactualconditiontocontrolthecardrivermodule.Intheprocessofcarforwardallinformationincludingdetectionlinenumber,。
Keywords:
PWMLinedetectionSTC89C52
第一章,设计实验任务和要求
一、任务
设计并制作一个能自动往返于起跑线与终点线间的小汽车。
允许用玩具汽车改装,但不能用人工遥控(包括有线和无线遥控)。
跑道宽度0.5m,表面贴有白纸,跑道用地面,贴上白纸。
在跑道的B、C、D、E、F、G各点处画有2cm宽的黑线(用黑色电工胶布),各段的长度如图1所示。
1.2要求
1.基本要求
(1)车辆从起跑线出发(出发前,车体不得超出起跑线),到达终点线后停留10秒,然后自动返回起跑线(允许倒车返回)。
往返一次的时间应力求最短(从合上汽车电源开关开始计时)。
(2)到达终点线和返回起跑线时,停车位置离起跑线和终点线偏差应最小(以车辆中心点与终点线或起跑线中心线之间距离作为偏差的测量值)。
(3)D~E间为限速区,车辆往返均要求以低速通过,通过时间不得少于4秒,但不允许在限速区内停车。
第2章设计方法与论证
方案一:
本设计选用两块单片机(89C52和89C2051)作为自动往返小汽车的检测和控制核心。
路面黑线检测使用反射式红外传感器,车速和距离检测使用断续式光电开关,利用PWM技术动态控制电动机的转速。
基于这些完备而可靠的硬件设计,使用了一套独特的软件算法,实现了小车在限速和压线过程中的精确控制。
本设计的主要特色:
高效的H型PWM电路,提高电源利用率; 控制电路电源和电动机电源隔离,信号通过光电祸合器传输;脉冲调制路面检测,超强纠错,免受路面杂质干扰; 优化的软件算法,智能化的自动控制,定位精确;后置式红、绿方向灯行驶状态一目了然。
方框图如1-2所示。
图1-2方案一方框图
方案二:
系统采用单片机AT89C51作为核心器件实现小车行驶的自动控制。
控制过程是利用反射式光电检测器采集的数据,通过软件完成对小车在不同路段的行驶速度实时控制,用数码管实现对指定行程和所用时间显示,同时利用红外数据传输方式将在限速区、终点区和返回到起点区后的时间和距离数据向手持显示装置单相传送。
键盘设置在小车中,对速度的控制调整更加方便、精确。
方框图如1-3所示。
图1-3方案二方框图
方案三:
采
用单片机STC89C52作为系统的控制中心。
电机采用饲服控制电机来驱动;检测电路采用红外对管来控制小车的快行,慢行,停止;用LCD1602液晶实现对指定行程和所用时间的显示。
方框图如1-4所示。
方案一,方案二材料较多。
故选用方案三。
2.2电机控制模块
为了实现电动小车对行走路径的准确定位和精确测量,可以考虑一下两种方案:
方案一:
采用饲服电机。
饲服电机转动力矩大,体积小,重量轻,转配简单,使用方便。
方案二:
采用步进电机。
步进电机是数字控制电机,控制也比较简单,具有瞬时启动和急速停止的优越性,比较适合本系统控制精度高的特点。
总上分析,但由于实际原材料考虑,本设计使用方案一。
2.3、黑线检测模块
图2.3黑线检测模块
方案一:
使用发光二极管和光敏二极管。
此方案缺点在于环境的其他光源对光敏二极管的工作产生很大的干扰,一旦外界光强改变,很可能造成误判和漏判,即使采用超高亮发光管可以降低一定的干扰,但这又增加额外的功耗。
方案二:
反射式红外发射—接收管。
此方案可以降低可见光的干扰,灵敏度高,同时其尺寸小、质量轻、价格也低廉。
外围电路简单,安装起来方便,电源要求不高,用它作为近距离传感器是最理想的。
方案三:
利用激光。
此方案虽然抗干扰性强、可靠性高,但其缺点在于体积大、功耗大、价格高。
一般用在要求场合非常高的场合,
本系统采用方案二已经能够胜任,无须采用其它方案。
2.4、码盘测距模块
方案一:
采用霍尔器件。
该器件内部由一片霍尔金属板组成,当磁钢正对金属片时,由于霍尔效应,金属板发生横向导通,因此可在电机轴上安装固定有磁片的圆片,而将霍尔器件固定在距圆片上方1cm3的范围,通过对脉冲的记数来实现对速度的检测。
方案二:
采用码盘。
由于该器件是沟槽结构,可以将其置于固定轴上,再在电机轴上安装圆片,均匀地固定多个遮光片,让其恰好通过沟槽,产生一个个脉冲。
通过脉冲的计数实现对速度的检测。
两种方案都是可行性的转速检测方案。
采用方案—。
第三章系统理论分析与计算
3.1单片机最小系统
本系统采用的是STC89C52芯片作为控制核心,4个16位定时器。
内部就含有PWM调制,而本实验用到的电机驱动的所需的PWM信号就是由该芯片产生的。
下面是它的引脚图和电路图。
图3.1STC89C52的引图
图3.2单片机最小系统电路图
3.2黑线检测设计与实现
该智能小车在跑道是上共设有6道黑线,路面可看做白色。
由于黑线和白色路面对光线的反射系数不同,可以根据接收的反射光的强弱来判断道路的“障碍”—黑线。
本设计利用红外线在不同颜色的物表面具有不同的反射性质的特点。
在小车行驶过程中不断地向地面发射红外光,当红外线遇到白色地面时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑纸则红外光被吸收,小车上的接收管接收不到信号。
考虑到集成红外探测头体积小、简便易用,性能可靠。
所以本设计选择了反射式红外线光电传感器作为红外光的发射和接受器件,一般检测距离可达4~10厘米cm,其内部结构和外接电路均较为简单.鉴于小车底部聚地面的距离不超过五厘米,故用红外光电传感器足以满足要求。
其内部结构和外接电路均较为简单,检测电路如下图所示。
图黑线检测电路
3.3.系统供电单元设计与实现
智能车控制系统中,芯片需要提供5V的工作电压,而电机所需的电压为12V,本设计中用到的是12V的电源供电,然后通过三端稳压器LM317将电压变换为5V电压供给电路系统。
电源系统的电路图如图3.7所示。
图3.7稳压电源提供电路
系统的软件设计
4.1程序流程图
4.2系统电路图
测试数据、测试结果分析及结论
测试方法与仪器:
1、测试仪器
测试仪器包括秒表、数字万用表、示波器、MCS51仿真机、直流稳压电源等。
2、测试方法
数字万用表主要用来测试分立元件的电阻、压降、漏电流、截止/导通状态等参数;
信号发生器与示波器用于测试各光电传感器信号的接收与传输;
MCS51仿真机用于测试软件;
直流稳压电源在测试期间为各待测系统供电;
秒表用于产品测试,按照任务书的基本要求对制成的电动车进行产品测试。
测试数据及测试结果分析:
计时精度分析计时系统采用了新型显示芯片。
理论上的误差不到1秒/年。
测距精度分析测速系统采用了电机轴光电码盘检测技术。
电机轴与车轮轴之间采用了齿轮箱二级减速,变比1/16。
车轮周长135mm,光电码盘与电机轴安装在一起,电机轴每一转产生2个脉冲,车轮每转产生32个脉冲,理论测量精度可达135mm/32=4.22mm<4.5mm
定位精度分析本设计采用实际测量与软件补偿技术,理论上可使定位精度提高到误差<10mm。
3、结论
历时一个月的设计过程中,我首先边查资料,边在实验室焊接小车的线路板。
在焊接过程中,我感觉到即使是一个简单的电路,要想很轻松的焊好,也不是很容易的事情。
有时是“虚焊”的原因,有时可能是阻值选错。
在焊接显示电路时,我就错将680欧的电阻焊成了6.8千欧。
这使我深深感受到理论与实际间的差距。
通过这样的设计,提高了我的动手能力。
每天在实验室除了焊接线路板,还可以上机编程,使我软件调试知识也提高了。
致谢
通过这次设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了学校的学习成果。
虽然在这次设计中对于知识的运用和衔接还不够熟练。
但是我将在以后的工作和学习中继续努力、不断完善。
这几个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。
由于自身水平有限,设计中一定存在很多不足之处,敬请各位老师批评指正。
、参考文献
1何立民,单片机应用系统设计,北京:
航天航空大学出版社,2~5,46~50
2李广弟,单片机基础,北京:
北京航空航天大学出版社,2001,56~64
3何希才,新型实用电子电路400例,电子工业出版社,2000年,60~65
4赵负图,传感器集成电路手册,第一版,化学工业出版社,2004,590~591
5陈伯时,电力拖动自动控制系统,第二版,北京:
机械工业出版社,2000年6月,127~130
6张毅刚,彭喜元,新编MCS-51单片机应用设计,第一版,哈尔滨工业大学出版社,2003,25~27,411~417
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitMOTOR_PORT_L=P3^6;
sbitMOTOR_PORT_R=P3^7;
#defineMOTOR_PORT_L_SET(x)MOTOR_PORT_L=x
#defineMOTOR_PORT_R_SET(x)MOTOR_PORT_R=x
//电机修正
#defineMOTOR_WAIT_OFFSET-5
//电机停止参数
#defineMOTOR_STOP(1500+MOTOR_WAIT_OFFSET)
//前进速度参数
#defineMOTOR_UP_H(MOTOR_STOP+500)
#defineMOTOR_UP_L(MOTOR_STOP+40)
//后退速度参数
#defineMOTOR_DOWN_H(MOTOR_STOP-500)
#defineMOTOR_DOWN_L(MOTOR_STOP-40)
typedefunion_U16_U8_{
unsignedintu16;
unsignedcharu8[2];
}U16_U8;
voidtimer_config(void)
{
EA=1;
TMOD=(TMOD&0xf0)|0x01;
ET0=1;
}
voidtimer_start(void)
{
TH0=0x00;
TL0=0x00;
TR0=1;
}
voidtimer_stop(void)
{
TR0=0;
}
unsignedchartimer_wait(unsignedintwait)
{
U16_U8buf;
buf.u8[0]=TH0;
buf.u8[1]=TL0;
if(buf.u16>=wait)
{
return1;
}
return0;
}
voidmotor_inital(void)
{
MOTOR_PORT_L_SET(0);
MOTOR_PORT_R_SET(0);
timer_config();
}
voidmotor_move(unsignedintml,unsignedintmr)
{
bitflag_l=0;
bitflag_r=0;
timer_start();
MOTOR_PORT_L_SET
(1);
MOTOR_PORT_R_SET
(1);
if(ml==mr)
{
while(!
flag_l)
{
if(timer_wait(ml)==1)
{
MOTOR_PORT_L_SET(0);
MOTOR_PORT_R_SET(0);
flag_l=1;
}
}
}
else
{
while(!
flag_l||!
flag_r)
{
if(!
flag_l)
{
if(timer_wait(ml)==1)
{
MOTOR_PORT_L_SET(0);
flag_l=1;
}
}
if(!
flag_r)
{
if(timer_wait(mr)==1)
{
MOTOR_PORT_R_SET(0);
flag_r=1;
}
}
}
}
while(timer_wait((20000+MOTOR_WAIT_OFFSET))==0);
timer_stop();
}
sbitRS=P2^4;
sbitRW=P2^5;
sbitEN=P2^6;
#defineLCD1602_PORTP0
#defineRS(x)RS=x;_nop_();_nop_();
#defineRW(x)RW=x;_nop_();_nop_();
#defineEN(x)EN=x;_nop_();_nop_();
voidbusy(void)
{
LCD1602_PORT=0xff;
RS(0);
RW
(1);
EN
(1);
while((LCD1602_PORT&0x80)==0x80);
EN(0);
}
voidLCD1602_Write_Data(ucharselect,ucharwdata)
{
busy();
if(select)//writedata
{
RS
(1);
RW(0);
LCD1602_PORT=wdata;
EN
(1);
EN(0);
}
else//writeins
{
RS(0);
RW(0);
LCD1602_PORT=wdata;
EN
(1);
EN(0);
}
}
voidLCD1602_Prints(ucharline,uchar*str)
{
if(line)
{
LCD1602_Write_Data(0,0x80+0x40);//设定坐标第2行第1格
}
else
{
LCD1602_Write_Data(0,0x80);//设定坐标第1行第1格
}
while(*str!
='\0')
{
LCD1602_Write_Data(1,*str);
str++;
}
}
voidLCD1602_Inital(void)
{
LCD1602_Write_Data(0,0x38);
LCD1602_Write_Data(0,0x08);
LCD1602_Write_Data(0,0x01);
LCD1602_Write_Data(0,0x06);
LCD1602_Write_Data(0,0x0c);
}
sbitMEDIAN_PORT=P3^2;//中线
sbitGO_Left_PORT=P1^1;
sbitGO_Righ_PORT=P1^0;
sbitWai=P3^3;
sbitP15=P1^5;
sbitP16=P1^6;
sbitP17=P1^7;
voidControl_Manage(void)
{
staticucharstate=0;
uchari;
staticbitflag=0;
staticucharnum;
staticuintcount=0;
staticuchartimer=0;
staticuintmiao=0;
staticuintJiance=0;
staticucharJuli=0;
if(state<7)
{
if(++timer>=50)
{
timer=0;
miao++;
}
}
if(Wai==0)
{
Jiance++;
}
LCD1602_Write_Data(0,0x85);
LCD1602_Write_Data(1,0x30|Juli/100%10);
LCD1602_Write_Data(1,0x30|Juli/10%10);
LCD1602_Write_Data(1,'.');
LCD1602_Write_Data(1,0x30|Juli%10);
LCD1602_Write_Data(1,'');
LCD1602_Write_Data(1,0x30|miao/60%10);
LCD1602_Write_Data(1,':
');
LCD1602_Write_Data(1,0x30|miao%60/10);
LCD1602_Write_Data(1,0x30|miao%60%10);
LCD1602_Write_Data(0,0x80);
LCD1602_Write_Data(1,0x30|Jiance/100%10);
LCD1602_Write_Data(1,0x30|Jiance/10%10);
LCD1602_Write_Data(1,0x30|Jiance%10);
switch(state)
{
case0:
count=0;
if(MEDIAN_PORT)
{
state=1;
Juli+=0;
motor_move(MOTOR_DOWN_L,MOTOR_UP_L);
}
else
{
if(GO_Left_PORT)
{
motor_move(MOTOR_STOP,MOTOR_UP_H);
}
elseif(GO_Righ_PORT)
{
motor_move(MOTOR_DOWN_H,MOTOR_STOP);
}
elsemotor_move(MOTOR_DOWN_L,MOTOR_UP_L);
}
break;
case1:
count=0;
if(MEDIAN_PORT==1&&num>=30)
{
state=2;
Juli+=5;
num=0;
break;
}
else
{
if(++num>=30)num=31;
}
if(GO_Left_PORT)
{
motor_move(MOTOR_STOP,MOTOR_UP_H);
}
elseif(GO_Righ_PORT)
{
motor_move(MOTOR_DOWN_