而U1变化经过Ur时,比较器的输出将从一个电压跳变到另一个电平。
比较器有各种不同的类型。
对它的要求是:
鉴别要准确,反应要灵敏,动作要迅速,抗干扰能力要强,还应有一定的保护措施,以防止因过电压或过电流而造成器件损坏。
比较器的特点:
(1)工作在开环或正反馈状态。
放大、运算电路为了实现性能稳定并满足一定的精度要求,这些电路中的运放均引入了深度负反馈;而为了提高比较器的反应速度和灵敏度,它所采用的运放不但没有引入负反馈,有时甚至还加正反馈。
因此比较器的性能分析方法与放大、运算电路是不同的。
(2)非线性。
由于比较器中运放处于开环或正反馈状态,它的两个输入端之间的电位差与开环电压放大倍数的乘积通常超过最大输出电压,使其内部某些管子进入饱和区或截止区,因此在绝大多数情况下输出与输入不成线性关系,即在放大、运算等电路中常用的计算方法对于比较器不再适用。
(3)开关特性。
比较器的输出通常只有高电平和低电平两种稳定状态,因此它相当与一个受输入信号控制的开关,当输入电压经过阈值时开关动作,使输出从一个电平跳变到另一个电平。
由于比较器的输入信号是模拟量,而它的输出电平是离散的,因此电压比较器可作为模拟电路与数字电路之间的过渡电路。
由于比较器的上述特点,在分析时既不能像对待放大电路那样去计算放大倍数,也不能像分析运算电路那样去求解输出与输入的函数关系,而应当着重抓住比较器的输出从一个电平跳变到另一个电平的临界条件所对应的输入电压值(阈值)来分析输入量与输出量之间的关系。
如果在比较器的输入端加理想阶跃信号,那么在理想情况下比较器的输出也应当是理想的阶跃电压,而且没有延迟。
但实际集成运放的最大转换速率总是有限的,因此比较器输出电压的跳变不可能是理想的阶跃信号。
电压比较器的输出从低电平变为高电平所须的时间称为响应时间。
响应时间越短,响应速度越快。
减小比较器响应时间的主要方法有:
(1)尽可能使输入信号接近理想情况,使它在阈值附近的变化接近理想阶跃且幅度足够大。
(2)选用集成电压比较器。
(3)如果选用集成运放构成比较器,为了提高响应速度可以加限幅措施,以避免集成运放内部的管子会进入深饱和区。
具体的措施多为在集成运放的两个输入端并联二极管。
2.4避障方案
方案一:
采用超声波避障,超声波受环境影响较大,电路复杂,而且地面对超声波的反射,会影响系统对障碍物的判断。
方案二:
采用红外线避障,利用单片机来产生38KHz信号对红外线发射管进行调制发射,发射出去的红外线遇到避障物的时候反射回来,红外线接收管对反射回来信号进行解调,输出TTL电平。
此方案虽价格比较便宜,但外界对红外信号有一定的干扰。
方案三:
集成F&G公司的DR-100N光电开光,工作距离合适,稳定,受外界环境影响小,结构简单,故采用此方案。
2.5寻光方案
方案一:
在小车前面装上几个光电开关,通过不同方向射来的光使光电开关工作,从而对小车行驶方向进行控制,根据光电开关特性,只有当光达到一定强度时才能够导通,因此带有一定的局限性。
方案二:
在小车前面装上参数一致的光敏电阻,再通过比较电路转换成数字量送入单片机,单片机再对读入的数据进行处理,对外围进操作。
对方案一、二进行比较,方案二硬件稍为复杂,但能够对不同强度的光进行采集以及比较,操作灵活,所以采用方案二。
2.6停车方案
方案一:
利用红外线发射管发射红外线,红外线二极管进行接收。
当车子到达终点的时候,发射管检测到黑线,电路电平发生变化,再输入单片机处理,控制车子停车。
此方案需要车子后退一段距离,而且之前的黑线也回对其造成一定得影响。
方案二:
一个连接有光敏电阻的比较电路,当靠近车库的时候,光敏电阻达到一定得变化,从而输出电平变化,再经单片机控制小车停。
此方案稳定性高,故采用。
2.7行车距离检测方案
方案一:
由于红外检测具有反应速度快、定位精度高,可靠性强故采用红外光电码盘测速方案。
红外测距仪由测距轮,遮光盘,红外光电耦合器及凹槽型支架组成的。
测长轮的周长为记数的单位,最好取有效值为单一的数值,精度根据电动车控制的需要确定。
测距轮安装在车轮上,这样能使记数值准确一些。
遮光盘有一缺口,盘下方的凹形物为槽型光电耦合器,其两端高出部分的里面分别装有红外发射管和红外接收管。
遮光盘在凹槽中转动时,缺口进入凹槽时,红外线可以通过,缺口离开凹槽红外线被阻挡。
由此可见,测距轮每转一周,红外光接收管均能接收到一个脉冲信号经过整形器后送入计数器或直接送入单片机中。
测距原理:
将光栅安装在电机轴上,当电机转动时,光栅也随之转动,同时安装在光栅一侧的红外发光二极管点亮,在光栅的另一侧设有红外三极管,用于接收红外发光二极管发出的红外线信号。
由于光栅随电机高速转动,则红外线三极管接收到的就是一系列脉冲信号。
将该信号传输到89S51单片机的内部计数器计数,根据预先实测的数据换算关系即可计算出电动机车的行车距离。
方案二:
采用霍尔传感器测距与测速,使用霍尔器件检测磁场的方法极为简单,将霍尔器件做成各种形式的探头,放在被测磁场中,因霍尔器件只对垂直于霍尔片的表面的磁感应强度敏感,因而必须令磁力线和器件表面垂直,通电后即可由输出电压得到被测磁场的磁感应强度。
每次车轮转动一周探头和磁片垂直一次,霍尔传感器将检测到的信号传递给单片机,单片机将小车转动的次数记录下来,小车车轮的周长测试后写入单片机程序后,小车行驶的距离就等于转动的次数与周长的乘积,因单片机有计数功能,故可测试小车开始运动到停止时的时间间隔,由此可以知道小车的行驶速度。
综上所述,由于霍尔传感器原理简单易行,经济实惠,设计要求的精度不高,采用霍尔传感器既简化电路结构又能达到设计要求,故采用了霍尔传感器作为测距装置。
2.8声音提示方案
方案一:
采用DS1420可分段录放音模块,能够给人以直观的提示,但DS1420录放音模块价格比较高,也可以采用此方案来处理。
方案二:
采用蜂鸣器,在一定程度上能满足要求,而且易于实现,成本也不高,故采用方案二。
2.9显示部分方案
方案一:
采用LED七段数码管,驱动电路比较复杂,占用单片机资源较多,不容易调试。
方案二:
采用LCD显示,用单片机可实现显示数据,容易驱动,故采用LCD显示。
第三部分设计成果
根据设计的要求,确定如下方案:
设计符合能自动循迹行走、能自动躲避前方障碍物等要求的小车,将控制程序编写正确,KEil软件软件进行编程,设计部分为七个独立的部分,这样能将低设计的复杂性,避免出现错误,整体的条理更为清晰,分别为电源模块、单片机最小系统、循迹模块、寻光模块、避障模块、声光报警模块、电机驱动模块。
1.电源模块
系统电路采用L7805和L7812三端稳压管对电源进行稳压,输出的5V给芯片和红外提供电压,12V为电机、TL-Q5MCL和DR-100N提供足够电压。
如图3-2所示,L7805与L7812的接法一样,输入电压与地、输出电压与地分别接电容滤波和去耦。
电源电路图如图3-1所示。
图3-1电源电路图
2.单片机最小系统
单片机最小系统由单片机,时钟电路,复位电路,电源构成。
是智能小车的大脑。
小车的智能反应,由其指挥。
本电路单片机为AT89S52,晶振频率为11.0592MHZ。
最小系统电路如图3-2所示。
图3-2单片机最小系统
3.寻迹模块
本电路利用TCRT5000对两厘米宽的轨道循迹,小车底部装有5个TCRT5000,由于黑色物体和白色物体反射系数不同,调节红外对管和被测物体之间的距离使光敏三极管只能接收到白色物体反射回来的光束。
此时接收管关断相当于一个很大电阻,因此3端输入为高电平,所以电路输出高电平,反之在白纸上方时,接收管接收光源导致接收管导通,电阻极小,相当于3端与地相连,即3端输入低电平,因此电路输出低电平。
由此可根据高低电平控制小车做出智能反应,使其循迹。
其中LM324起放大信号作用,可调电阻可改变探测垂直距离。
寻迹程序流程图如图3-3所示。
寻迹程序电路图如图3-4所示。
(1)寻迹程序流程图
图3-3循迹程序流程图
(2)寻迹程序电路图
图3-4寻迹程序电路图
4.寻光模块
光敏电阻在光照条件阻值会迅速变小,与光照成反比,而在黑暗条件下电阻值很大。
黑暗条件下光敏电阻阻值很大,相当于放大器反向输入端和电源正极相连,所以输出低电平,此时LED灯点亮;当遇到光时,光敏电阻变得极小,相当于放大器反向输入端接地,所以放大器输出高电平,此时LED灯灭。
所以为了创造出黑暗条件光敏电阻需用纸筒包裹起来,根据各电阻感应到光的情况而使小车做出智能反应,达到设计要求。
寻光程序流程图如图3-5所示。
寻光程序电路图如图3-6所示。
(1)寻光程序流程图
N
Y
N
图3-5寻光程序流程图
(2)寻光程序电路图
图3-6寻光程序电路图
5.避障模块
本设计避障模块由红外对管做探测头,红外对管由发射管(发射红外线)和接收管(功能与光敏接收管相似只是不受可见光的干扰,属于光敏二极管,只对红外线有反应,接收红外线时电阻变小,反之电阻很大)。
当遇到障碍物时,红外接收管接收到反射回来的红外线,接收管电阻变得很小,相当于放大器同向输入端和地导通,因此放大器输出为低电平,LED灯点亮。
当无障碍物时,接收不到红外线,接收管电阻很大,相当于放大器同向输入端和电源正极相连,所以放大器输出高电平LED灯灭。
避障程序流程图如图3-7所示,避障程序电路图3-8所示。
(1)避障程序流程图
图3–7避障程序流程图
(2)避障程序电路图
图3-8避障程序电路图
6.声光报警系统
电路分析:
电阻R1起限流作用,防止电流过大烧坏二极管,图中蜂鸣器为有源蜂鸣器,只需通电蜂鸣器就会鸣叫,三极管起放大电流的作用。
设计电路如图3-9所示。
图3-9声光报警系统
7.电机驱动模块
本设计采用L298驱动电机(L298包含四通道逻辑驱动电路内含2个H桥的高电压大电流双桥式驱动器),OUT1,OUT2分别与小车的一个电机的正负极相连;OUT3,OUT4分别与小车的另一个电机的正负极相连;L298的IN1、IN2、IN3、IN4分别与单片机P00~P03连接,通过单片机编程控制电机的转向:
IN1=0IN2=1IN3=0IN4=1,两电机分别正转;IN1=1IN2=0IN3=1IN4=0,两电机反转。
ENA,ENB为控制使能端,控制电机停转:
高电平正转,低电平停转,通过简单的延时函数,不断赋高低电平可以简单的调速。
通过控制两电机的转速可控制小车转弯,通过IN输入端可控制小车前进或后退。
电机驱动电路如图3-10所示。
L298真值表如表3-1所示。
图3-10 电机驱动电路
表3-1L298真值表
L298
真值表
ENA
IN1
IN2
电机运行情况
H
H
H
正转
H
H
L
反转
H
H(L)
H(L)
快速停转
L
X
X
不转
8.程序清单
#include
#define uchar unsigned char
#define uint unsigned int
/***********************
控制使能端调速
************************/
sbit en1=P1^4;
sbit en2=P1^5;
/***********************
电机输入控制端
************************/
sbit in1=P1^0;
sbit in2=P1^1;
sbit in3=P1^2;
sbit in4=P1^3;
/***********************
报警控制端
************************/
sbit P16=P1^6; //光警报
sbit P17=P1^7; //声音警报
uchar temp3,temp0,temp2;
uint t;
void dmot(); //直走
void lmot(); //左拐
void rmot(); //右拐
void tmot(); //后退
void smot(); //停止
void xgt(); //寻光调试
void bzt(); //避障调试
void xjt(); //循迹调试
void init() //初始化函数
{
P1=0X7F;
P2=0XFF;
P0=0XFF;
en1=0;
en2=0;
P3=0XFF;
temp0=P3;
/*******************************
定时器初始化
********************************/
TMOD=0X01; //设臵定时器0为工作方式1
TH0=(65536-46080)/256; //装初值
TL0=(65536-46080)%256;
EA=1; //开总中断
ET0=1; //开定时器0中断
TR0=1; //启动定时器0
}
void delay(uint z) //延时调速函数
{
uint x;
for(x=z;x>0;x--);
}
void main() //主函数
{
init();
while
(1)
{
P16=1; //灯灭
P17=0; //声音关
if(t<2400)
{
P16=1; //灯灭
P17=0; //声音关
if(P3!
=0XF8)
{
xgt(); //寻光调试
}
else
{
if(P2!
=0xff)
{
bzt(); //避障调试
}
else
{
xjt(); //循迹调试
}
}
}
else
smot();
}
}
void dmot() //直进走程序
{
en1=1;
en2=1;
in1=0;
in2=1;
in3=0;
in4=1;
delay(150);
en1=0;
en2=0;
delay(150);
}
void lmot() //前左拐
{
en1=1;
en2=0;
in1=0;
in2=1;
in3=0;
in4=1;
delay(300);
en1=0;
en2=0;
delay(300);
}
void rmot() //前右拐
{
en1=0;
en2=1;
in1=0;
in2=1;
in3=0;
in4=1;
delay(300);
en1=0;
en2=0;
delay(300);
}
void tmot() //后退
{
en1=1;
en2=1;
in1=1;
in2=0;
in3=1;
in4=0;
delay(300);
en1=0;
en2=0;
delay(300);
}
void smot() //停
{
en1=0;
en2=0;
}
void xgt() //寻光调试
{
temp3=P3;
switch(temp3)
{
case 0xf9:
rmot();break;
case 0xfa:
dmot();break;
case 0xfb:
rmot();break;
case 0xfc:
lmot();break;
case 0xfe:
lmot();break;
case 0xff:
smot();break;
}
}
void bzt() //避障调试
{
P16=0; //灯亮
P17=1; //警报
temp2=P2;
switch(temp2)
{
case 0xff:
dmot();break;
case 0xfb:
rmot();break;
case 0xfe:
lmot();break;
case 0xf9:
rmot();break;
case 0xfc:
lmot();break;
case 0xfd:
lmot();break;
case 0xf8:
tmot();break;
case 0xfa:
tmot();break;
}
}
void xjt() //循迹调试
{
temp0=P0;
switch(temp0)
{
case 0xe0:
dmot();break;
case 0xe4:
dmot();break;
case 0xe8:
lmot();break;
case 0xec:
lmot();break;
case 0xf0:
lmot();break;
case 0xf8:
lmot();break;
case 0xe6:
rmot();break;
case 0xe2:
rmot();break;
case 0xe1:
rmot();break;
case