湖南科技大学电子设计竞赛物理与电子科学学院.docx
《湖南科技大学电子设计竞赛物理与电子科学学院.docx》由会员分享,可在线阅读,更多相关《湖南科技大学电子设计竞赛物理与电子科学学院.docx(26页珍藏版)》请在冰豆网上搜索。
湖南科技大学电子设计竞赛物理与电子科学学院
湖南科技大学2014年电子设计竞赛
(物理与电子科学学院)
参赛学院:
物理与电子科学学院
参赛专业:
电子信息科学与技术
参赛班级:
电子三班
参赛队员:
刘保路何隆应周宇
目录
系统的基本方案
系统各模块的基本组成的最终方案
系统硬件的基本组成部分
主要单元电路的设计
电源电路的设计
控制电路的设计
循迹模块设计
电机驱动电路
一、研究内容
智能作为现代的新发明,是以后的发展方向,他可以按照预先设定的模式在一个环境里自动的运作,不需要人为的管理,可应用于科学勘探等等的用途。
智能电动车就是其中的一个体现。
本次设计的简易智能电动车,采用AT89S52单片机作为小车的检测和控制核心;采用金属感应器TL-Q5MC来检测路上感应到的铁片,从而把反馈到的信号送单片机,使单片机按照预定的工作模式控制小车在各区域按预定的速度行驶,并且单片机选择的工作模式不同也可控制小车顺着S形铁片行驶;采用霍尔元件A44E检测小车行驶速度;采用1602LCD实时显示小车行驶的时间,小车停止行驶后,轮流显示小车行驶时间、行驶距离、平均速度以及各速度区行驶的时间。
本设计结构简单,较容易实现,但具有高度的智能化、人性化,一定程度体现了智能。
二、研究方案与技术路线
根据题目要求,我们将系统划分为电源部分、信号检测部分、控制部分。
其中信号检测部分包括循迹探测模块、树木计数模块、隧道长度测量模块;控制部分包括电机驱动模块、单片机模块。
为实现各模块的功能,分别作了几种不同的设计方案并进行了论证证。
电源模块
方案一:
采用蓄电池供电,蓄电池具有较强的电流驱动能力和较好的电压稳定性能,且成本低廉。
可采用蓄电池经7812芯片稳压后给电机供电,再经过降压接7805芯片给单片机及其他逻辑单元供电。
但蓄电池体积相对庞大,且重量过大,造成电机负载过大,不适合我们采用的小车车架(玩具电动车车架)。
故我们放弃了这一方案。
方案二:
采用干电池组进行供电
采用四节干电池降压至5V后给单片机及其他逻辑单元供电,另取六节干电池为电机及光电开关供电。
这样电机启动及制动时的短暂电压干扰不会影响到逻辑单元和单片机的工作。
干电池用电池盒封装,体积和重量较小,同时玩具车底座可以安装四节干电池,正好可为单片机及其他逻辑单元供电。
在稳压方面,起始时考虑使用7805芯片对6V的电池电压进行降压稳压。
但考虑到这样使得7805芯片消耗大量能量,降低电池寿命;同时,由于mega16、光电开关、小车电机对于供电电压要求并不苛刻,故我们将6V电池电压接一个二极管降压后直接给单片机及其他逻辑单元供电。
而电机和光电开关的电源不做稳压处理。
这样只需在小车主板上加两个调速按钮,根据电池电量选择合适功率即可,甚至于可直接在软件里设置自动换挡。
这里我们选用方案二。
复位电路模块:
单片机的复位电路通过手动来实现,复位电路图如(图8)所示。
电机驱动模块
方案一:
采用电机驱动芯片L298N。
L298N为单块集成电路,高电压,高电流,四通道驱动,可直接的对电机进行控制,无须隔离电路。
通过单片机的I/O输入改变芯片控制端的电平,即可以对电机进行正反转,停止的操作,非常方便,亦能满足直流减速电机的大电流要求。
方案二:
采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整。
这个方案的优点是电路较为简单。
缺点是继电器的响应时间慢、机械结构易损坏、寿命较短、可靠性不高。
。
方案一:
MC33886(电机驱动)的应用示意图如图2所示。
图中,V+是为直流电机供电的电源。
IN1和IN2两个逻辑电平输入端分别控制输出端OUT1和OUT2。
当IN1输入高电平时,OUT1输出也为高电平——即通过H桥与V+导通;当IN1输入低电平时,OUT1输出也为低电平——即通过H桥与GND导通。
IN2和UT2的关系与此相同。
FS为故障信号开漏极输出,低电平有效。
当D1是高电平或者D2是低电平时,同时禁用OUT1和OUT2的输出,使OUT1和OUT2同时变为高阻态。
通过控制IN1和IN2的电平,即可控制电机正转、反转、停转。
对IN1和IN2的电平信号进行脉宽调制,即可控制电机的转速
方案一:
采用直流减速电机。
直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便,小车电机内部装有减速齿轮组,所以并不需要考虑调速功能,很方便的就可以实现通过单片机对直流减速电机前进、后退、停止等操作,
方案二:
采用步进电机作为该系统的驱动电机,由于其转动的角度可以精确定位,可以实现小车前进距离和位置的精确定位。
虽然采用步进电机有诸多优点,但步进电机的输出力矩较低,随转速的升高而下降,且在较高的转速时会急剧下降,其转速较低时不适于小车等对速度有一定要求的系统。
控制器模块选择
采用STC公司的STC89C系列芯片作为系统控制器的CPU方案。
单片机算术运算功能强,软件编程灵活、自由度大,可用软件编程实现各种算法和逻辑控制,并且由于其功耗低、体积小、技术成熟和成本低等优点,使其在各个领域应用广泛。
循迹探测模块
方案一:
用光敏电阻组成光敏探测器。
光敏电阻的阻值可以跟随周围环境光线的变化而变化。
比较器就可以输出高低电平。
单片机据此来判断小车是否偏离轨道或是否到达转弯标志,并根据反馈来不同的电平信号,发出相应的控制操作命令来控制小车当光线照射到白纸上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。
因此光敏电阻在木板轨迹上方和黑色轨迹上方时,阻值会发生明显的变化。
将阻值的变化值经过。
但是这种方案的缺点是受环境中光线的影响很大,且由于电压变化不是很大,不能够稳定的工作。
方案二:
采用光电传感器ST188,即利用红外线遇到障碍物会反射回来红外接收管可以接受到,在小车行驶过程中红外发射管不断发出红外线,当发出的红外线射入黑线时,没有反射,红外输出低电平,若红外接收管没有在黑线上方则可以接收到经轨道地板反射回的光线则输出高电平。
此光电传感器调理电路简单,工作性能稳定。
是在黑暗或者是强光照射下,小车系统均可以很稳定的工作,对环境的适应能力较强。
方案三:
三只光电开关。
一只置于轨道中间,两只置于轨道外侧,当小车脱离轨道时,即当置于中间的一只光电开关脱离轨道时,等待外面任一只检测到黑线后,做出相应的转向调整,直到中间的光电开关重新检测到白线(即回到轨道)再恢复正向行驶。
图10所示电路中,R1起限流电阻的作用,当有光反射回来时,光电对管中的三极管导通,R2的上端变为高电平,此时VT1饱和导通,三极管集电极输出低电平。
当没有光反射回来时,光电对管中的三极管不导通,VT1截至,其集电极输出高电平。
VT1在该电路中起到滤波整形的作用。
经试验和示波器验证,该电路工作性能一般,输出还有杂散干扰波的成分。
如果输出加施密特触发器就可以实现良好的输出波形。
但是这种电路用电量比较大,给此种传感器调理电路供电的电池压降较快。
究其原因,是因为光敏三极管和三极管VT1导通时的导通电流较大。
因此我们考虑用比较器的方案。
可调电阻R3可以调节比较器的门限电压,经示波器观察,输出波形相当规则,可以直接够单片机查询使用。
而且经试验验证给此电路供电的电池的压降较小。
因此我们选择此电路作为我们的传感器检测与调理电路。
检测到白纸有接收到反射光LM3242脚比较器反向端T1=0V3脚比较器同向端=3V同向端大于反向端则OUT1输出1
检测到黑线没接收到反射光了LM3242脚比较器反向端T1=5V3脚比较器同向端=3V
数据显示模块
采用LCD和数码管显示,显示分为两部分:
数量显示与隧道长度显示,显示的数据来自外部存储器中存储的值,实时刷新,,树木的数目依次增加,而隧道长度依次显示在LCD上。
结语
软件设计
接线的说明:
VCC接VCC
GND接GND
L298驱动模块接法:
INT1接P2^0
INT2接P2^1
INT3接P2^2
INT4接P2^3
寻迹模块接法:
OUT5接P1^0
OUT4接P1^1
OUT3接P1^2
OUT2接P1^3
OUT1接P1^4
***********************************************************************/
#include//调用单片机头文件
#defineucharunsignedchar//无符号字符型宏定义变量范围0~255
#defineuintunsignedint//无符号整型宏定义变量范围0~65535
#include
#defineL3//左转90度的宏定义
#defineR4//右转90度的宏定义
/********************寻迹模块IO口定义*********************************/
sbitxun_ll=P1^4;//从左到右第1个
sbitxun_l=P1^3;//从左到右第2个
sbitxun_z=P1^2;//从左到右第3个
sbitxun_r=P1^1;//从左到右第4个
sbitxun_rr=P1^0;//从左到右第5个
/********************LN298电机驱动IO口定义*********************************/
sbitqu_ll=P2^0;//左边电机控制IN1
sbitqu_zl=P2^1;//左边电机控制IN2
sbitqu_zr=P2^2;//右边电机控制IN1
sbitqu_rr=P2^3;//右边电机控制IN2
sbitc_send=P3^3;//超声波发射
sbitc_recive=P3^4;//超声波接收
ucharflag_hc_value;//超声波中间变量
longdistance=888;//距离
uintset_d;//距离
bitflag_csb_juli;//超声波超出量程
uintflag_time0;//用来保存定时器0的时候的
bitflag_300ms;
bitflag_1s;
uintshudu_l,shudu_ll;
uintjuli;
#include"lcd1602.h"
/*****************1ms延时函数*********************************/
voiddelay_1ms(uintq)
{
uinti,j;
for(i=0;ifor(j=0;j<115;j++);
}
/***********************小车前进函数************************/
voidgo()
{
qu_ll=1;
qu_zl=0;
qu_zr=0;
qu_rr=1;
}
/***********************小车后退函数************************/
voidback()
{
qu_ll=0;
qu_zl=1;
qu_zr=1;
qu_rr=0;
}
/***********************小车左转函数只有一个轮子动************************/
voidleft()
{
qu_ll=0;
qu_zl=0;
qu_zr=0;
qu_rr=1;
}
/***********************小车左转函数左边轮子后退右边轮子前进************************/
voidleft_s()
{
qu_ll=0;
qu_zl=1;
qu_zr=0;
qu_rr=1;
}
/***********************小车停下函数************************/
voidstop()
{
qu_ll=0;
qu_zl=0;
qu_zr=0;
qu_rr=0;
}
/*****************小车右转函数只有一个轮子动***************/
voidright()
{
qu_ll=1;
qu_zl=0;
qu_zr=0;
qu_rr=0;
}
/*************小车右转函数左边轮子前进右边轮子后退***********/
voidright_s()
{
qu_ll=1;
qu_zl=0;
qu_zr=1;
qu_rr=0;
}
/********************左右转90度结束程序**********************/
voidche_90_180_break(uchardat)
{
uchari_z=0;
while
(1)//循环等待中间寻迹传感器到黑线上
{
if(xun_z==0)//如果中间那寻迹传感器到了黑线上,要让小车停下来前进了
{
i_z++;//消去干扰
if(i_z>=10)//10次之后就确定寻迹模块的中间传感器到黑线上了
{
if(dat==L)//如果是左转90度就让右转的方法制动
right_s();
else
left_s();//如果是右转90度就让左转的方法制动
delay_1ms
(2);
stop();
delay_1ms(100);
go();
break;//break退出while
(1)这个死循环
}
}
else//没有在黑钱上就给i_z变量清零
{
i_z=0;
}
}
}
/***********************小车左转90度************************/
voidleft_s_90_while()//小车向左转90度
{
go();//前进一小会让小车转90度时刚好让黑线在小车的中间
delay_1ms(120);
left_s();//左转90度注意这个延时不能太长只要能让寻迹模块中间的传感离开黑线就好
delay_1ms(180);
che_90_180_break(L);
}
/***********************小车向右转90度************************/
voidright_s_90_while()//
{
go();//前进一小会让小车转90度时刚好让黑线在小车的中间
delay_1ms(120);
right_s();//左转90度注意这个延时不能太长只要能让寻迹模块中间的传感离开黑线就好
delay_1ms(180);
che_90_180_break(R);
}
/***********************小车左转90度************************/
voidleft_90()
{
left_s();
delay_1ms(280);
//right_s();
//delay_1ms(30);
stop();
delay_1ms(150);
go();
}
/***********************小车右转90度************************/
voidright_90()
{
right_s();
delay_1ms(270);
//left_s();
//delay_1ms(30);
stop();
delay_1ms(150);
go();
}
/******************寻迹小车程序***********************/
//白线为1黑线为0
voidxunji()
{
if((xun_ll==1)&&(xun_l==1)&&(xun_z==0)&&(xun_r==1)&&(xun_rr==1))
{//xunji:
11011
go();//小车前进
}
if((xun_ll==0)&&(xun_l==0)&&(xun_z==0)&&(xun_r==0)&&(xun_rr==0))
{//xunji:
00000
stop();//小车停下
}
if(((xun_ll==1)&&(xun_l==1)&&(xun_z==0)&&(xun_r==0)&&(xun_rr==1))||
((xun_ll==1)&&(xun_l==1)&&(xun_z==1)&&(xun_r==0)&&(xun_rr==1))||
((xun_ll==1)&&(xun_l==1)&&(xun_z==1)&&(xun_r==0)&&(xun_rr==0))||
((xun_ll==1)&&(xun_l==1)&&(xun_z==1)&&(xun_r==1)&&(xun_rr==0)))
{
//xunji:
11001//把从左到右把每一个会让右转的情况写出来
//xunji:
11101
//xunji:
11100
//xunji:
11110
right();//小车右转
}
if(((xun_ll==1)&&(xun_l==0)&&(xun_z==0)&&(xun_r==1)&&(xun_rr==1))||
((xun_ll==1)&&(xun_l==0)&&(xun_z==1)&&(xun_r==1)&&(xun_rr==1))||
((xun_ll==0)&&(xun_l==0)&&(xun_z==1)&&(xun_r==1)&&(xun_rr==1))||
((xun_ll==0)&&(xun_l==1)&&(xun_z==1)&&(xun_r==1)&&(xun_rr==1)))
{
//xunji:
10011//把从右到左把每一个会让左转的情况写出来
//xunji:
10111
//xunji:
00111
//xunji:
01111
left();//小车左转
}
if((xun_ll==1)&&(xun_z==0)&&(xun_r==0)&&(xun_rr==0))
{//xunji:
1X000
go();
delay_1ms
(1);
if((xun_ll==1)&&(xun_z==0)&&(xun_r==0)&&(xun_rr==0))
{//xunji:
1X000
right_s_90_while();//小车右转90度
}
}
if((xun_ll==0)&&(xun_l==0)&&(xun_z==0)&&(xun_rr==1))
{//xunji:
000X1
go();
delay_1ms
(1);
if((xun_ll==0)&&(xun_l==0)&&(xun_z==0)&&(xun_rr==1))
{//xunji:
000X1
left_s_90_while();//小车左转90度
}
}
}
/******************小延时函数*****************/
voiddelay()
{
_nop_();//执行一条_nop_()指令就是1us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/*********************超声波测距程序*****************************/
voidsend_wave()
{
c_send=1;//10us的高电平触发
delay();
c_send=0;
TH0=0;//给定时器0清零
TL0=0;
TR0=0;//关定时器0定时
while(!
c_recive);//当c_recive为零时等待
TR0=0;
while(c_recive)//当c_recive为1计数并等待
{
flag_time0=TH0*256+TL0;
if((flag_time0>40000))//当超声波超过测量范围时,显示3个888
{
TR0=0;
flag_csb_juli=2;
distance=888;
break;
}
else
{
flag_csb_juli=1;
}
}
if(flag_csb_juli==1)
{
TR0=0;//关定时器0定时
distance=flag_time0;//读出定时器0的时间
distance*=0.017;//0.017=340M/2=170M=0.017M算出来是米
if((distance>500))//距离=速度*时间
{
distance=888;//如果大于3.8m就超出超声波的量程
}
}
}
/******************避障程序**********************/
voidbizhang()
{
staticucharvalue;
if(distance<20)
{
value++;
if(value>=7)
{
stop();
delay_1ms(200);
right_90();//右转90度
go();
delay_1ms(200);
stop();
delay_1ms(200);
left_90()