- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
利用红外发射接收传感器进行距离检测
一、实验要求
对红外的发射接收作进一步的探讨。红外可以用来测距离,理解红外测距的基本原理,能够掌握简单的比例控制方法,以及编程。掌握定时/计数器的使用。对循迹效果作分析。
二、实验概要
本实验将探讨红外测距的内容。利用红外检测器的内置电子滤波功能,调节发射红外的载波频率,而检测器对不同频率的信号有不同的“敏感度”,这样,就能大概的知道距离。
1.测试红外的扫描频率。记录红外发射接收的距离。
2.尾随小车。让一个小车跟着另一个小车前行。要将前后距离控制在一定的范围内,若前后距离较大,后面跟随的小车应该加速,跟上去;若距离小于预定值,则减速。
3.跟踪黑色条纹带。红外测距的另一种形式的应用。也能让小车实现循迹功能。
三、实验内容
红外技术发展到现在,已经为大家所熟知,这种技术已经在现代科技、国防和工农业等领域获得了广泛的应用。红外传感系统是用红外线为介质的测量系统,按照功能能够分成五类:(1)辐射计,用于辐射和光谱测量;(2)搜索和跟踪系统,用于搜索和跟踪红外目标,确定其空间位置并对它的运动进行跟踪;(3)热成像系统,可产生整个目标红外辐射的分布图像;(4)红外测距和通信系统;(5)混合系统,是指以上各类系统中的两个或者多个的组合。红外传感器根据探测机理可分成为:光子探测器(基于光电效应)和热探测器(基于热效应)。
本次试验将尝试用红外来测距。
1.测试扫描频率
下图9-1显示的是一个特殊品牌的红外线探测器数据表(Panasonic PNA4602M)的部分摘录。这个摘录显示了红外线探测器在接收到频率不同于38.5 kHz时红外线信号时其敏感程度随频率变化的曲线图。
例如,当你发送频率为40 kHz的信号给探测器时,它的灵敏度是频率为38.5 kHz的50%。如果红外LED发送频率为42 kHz,探测器的灵敏度是频率为38.5 kHz的20%左右。尤其是对于让探测器的灵敏度很底的频率,为了让探测器探测到红外线的反射,物体必须离探测器更近让反射的红外光更强。
另一个角度来考虑就是最高灵敏度的频率可以探测最远距离的物体,较低灵敏度的频率可以探测距离较近的物体。这使得距离探测就简单了。选择5个不同频率,然后从最高灵敏度到最低灵敏度进行测试。首先尝试最高灵敏度频率,如果物体被探测到了,就让仅次于它的高灵敏度频率测试,观察是否可以探测到。依赖于探测器不能再检测到物体的红外线频率,我们就可以推断物体的大概位置。
图 9-1 滤波器灵敏度由载波频率决定
图 9-2 探测区域
例程:TestLeftFrequencySweep.c
例程要做两件事情:首先,测试IR LED/探测器(分别与P1_3和P1_2连接)以确认它们的距离探测功能正常;然后,完成图9-2所示的频率扫描。
#includeBoeBot.h
#includeuart.h
#define LeftIR P1_2 //左边红外接受连接到P1_2
#define LeftLaunch P1_3 //左边红外发射连接到P1_3
unsigned int time; //定时时间值
int leftdistance; //左边的距离
int distanceLeft, irDetectLeft;
unsigned int frequency[5]={29370,31230,33050,35700,38460};
void timer_init(void)
{
IE=0x82; //开总中断EA,允许定时器0中断ET0
TMOD |= 0X01; //定时器0工作在模式1:16位定时器模式
}
void FreqOut(unsigned int Freq)
{
time = 256 - (500000/Freq); //根据频率计算初值
TH0 = 0XFF; //高八位设FF
TL0 = time; //低八位根据公式计算
TR0 = 1; //启动定时器
delay_nus(800); //延时
TR0 = 0; //停止定时器
}
void Timer0_Interrupt(void) interrupt 1 //定时器中断
{
LeftLaunch = ~LeftLaunch; //取反
TH0 = 0xFF; //重新设值
TL0 = time;
}
void Get_lr_Distances()
{
unsigned int count;
leftdistance = 0; //初始化左边的距离
for(count = 0;count5;count++)
文档评论(0)