声光寻迹小车报告.docx
- 文档编号:6623577
- 上传时间:2023-01-08
- 格式:DOCX
- 页数:19
- 大小:184.91KB
声光寻迹小车报告.docx
《声光寻迹小车报告.docx》由会员分享,可在线阅读,更多相关《声光寻迹小车报告.docx(19页珍藏版)》请在冰豆网上搜索。
声光寻迹小车报告
摘要
本设计采用STC89C52RC单片机作为智能小车的控制中心,主要包括光源检测模块、电机驱动模块、时间距离显示模块、红外线检测模块、电源装置等。
小车可以实现寻找光源、显示小车的行驶时间和路程。
寻光源装置采用自制的光电传感器,时间距离显示模块采用自制的反射红外传感器和LCD1602。
电机驱动模块采用L298N电机驱动芯片来控制直流电机,电源装置采用单片机与电机单独供电的方式,避免了电源的相互干扰。
关键词:
单片机,智能小车,PWM脉宽调制,直流电机。
设计任务与要求
在半径为5米的圆形内,在任意地方放置一声源,要求小车在最短时间内自动走到声源处。
实现此功能的基础上,在任意地方放置一光源,要求小车在最短时间内自动走到光源处。
要求:
圆形区域用黑线做标记,小车运动不能超出圆形范围。
声源用频率为1KHz的正弦波信号。
光源为50瓦的电灯泡。
一.方案比较与论证:
1.主控系统
方案一:
采用高性能的嵌入式系统,比如ARM可以很好地解决数据处理和控制功能,但是ARM价格昂贵且很少接触,在短时间内完成困难较大。
方案二:
采用STC89C52来实现。
C51系列单片机接触较多,且其能够很好地提供我们所需的功能。
考虑到方案的可行性和性价比,我们采用STC89C52单片机。
2.车体的设计
方案一:
自己制作一个车体。
自制的车体总的来说是比较粗糙的,而且车体的机械强度不高,车身的重量和平衡都要有精确的测量。
方案二:
购买车体模型。
现成的车体由于装配紧凑,使得各种电路的安装十分方便,且比较美观。
车体是依靠直流电机与相关齿轮一起驱动,能适应题目中小车准确前进、后退、转弯的要求,而且这种电动车一般都价格适中。
鉴于以上分析,我们选择了方案二。
3.电机驱动模块
方案一:
通过晶体三极管等分立元件搭建H桥。
优点是价格便宜,结构简单,但由于晶体三极管的承载电流比较小,驱动能力受到限制,且稳定性得不到保证。
方案二:
采用集成芯片。
L298N款单片集成的高电压、高电流、双路全桥式电机驱动,设计用于连接标准TTL逻辑电平,驱动电感负载(诸如继电器、线圈、DC和步进电机)。
L298N供两个使能输入端,可以在不依赖于输入信号的情况下,使能或禁用L298N件。
L298N输出电压高达46V,输出电流为2A,具有过温保护功能。
其输入端可以与单片机直接相联,从而很方便地受单片机控制。
当驱动小型直流电机时,可以直接控制两路电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。
基于L298N优点,我们选择L298N电机控制芯片。
4.电机模块
方案一:
采用步进电机作为该系统的驱动电机。
由于其转过的角度可以精确的定位,可以实现小车前进路程和位置的精确定位。
虽然采用步进电机有诸多优点,步进电机的输出力矩较低,随转速的升高而下降,且在较高转速时会急剧下降,其转速较低,不适用于小车等有一定速度要求的系统。
经综合比较考虑,我们放弃了此方案。
方案二:
直流电机:
直流电机的控制方法比较简单,只需给电机的两根控制线加上适当的电压即可使电机转动起来,电压越高则电机转速越高。
对于直流电机的速度调节,可以采用改变电压的方法,也可采用PWM调速方法。
PWM调速就是使加在直流电机两端的电压为方波形式,通过改变方波的占空比实现对电机转速的调节。
基于以上分析,我们选择了方案二,使用直流电机作为电动车的驱动电机。
5.时间距离显示模块
方案一:
使用霍尔传感器获得脉冲信号。
其机械结构较为简单,只要在转轴的圆周上粘上一粒磁钢,让霍尔开关靠近磁钢,就有信号输出,转轴旋转时,就会不断产生脉冲信号输出,如果在圆周上粘多粒磁钢,就可以实现旋转一周就获得锁个脉冲输出,测速精度比较高。
但对于本设计,由于小车的车轮距离车体较近,不适合安装霍尔传感器。
方案二:
使用自制红外线传感器获得脉冲信号。
此时需要在小车车轮的内侧贴上黑白相隔的线条圆盘,当小车车轮旋转时,红外线传感器就就会输出相应的脉冲,旋转一周时,会产生多个脉冲,其测速精度也比较高。
对于显示部分,我们采用液晶显示屏。
因此我们采用方案二。
系统框图
二.系统的硬件设计与实现
1.单片机最小系统
STC89C52及外围电路构成的单片机最小系统。
2.电机驱动模块
电机驱动模块采用L298N来作为驱动芯片,L298N可以驱动两个两相电机,OUT1,OUT2和OUT3,OUT4之间分别接两个直流电机,在电机端接入了保护二极管,是为了防止电机换向时电流过大烧坏电机。
单片机的P1.6,P1.7分别接电机的使能端ENA,ENB;P1.2~P1.5分别接IN1~IN4用于控制两电机的转向。
L298N有两个电源输入端,一个是VSS是芯片的工作电压,另一个是VS是电机的工作电压,VSS、单片机及其他模块的电源和VS是独立供电的,这样可以避免电机工作时对控制电路部分的影响。
在电源的输入端接电容C1、C2、C3、C4来做电源的去耦(旁路)电容。
下面是L298N的功能逻辑图:
1298N的逻辑功能
ENA(B)
INl(IN3)
IN2(IN4)
电机运行情况
H
H
L
正转
H
L
H
反转
H
同IN2(IN4)
同INl(IN3)
快速停止
L
X
X
停止
3.液晶显示屏
采用LCD1602显示小车行驶的时间和路程。
电位器用于调节显示屏的对比度。
4.电源模块
采用两片L7805稳压芯片产生两个5V电压,分别供给单片机及其他电路和电机电源,保证电机电源和其他电源是独立的。
5.光源检测模块
方案一:
在小车前面装两个光电二极管,一左一右。
通过不同方向的光照使光敏二极管工作,从而对小车行驶方向进行控制,根据光敏二极管的特性,只有当光达到一定强度时才能够导通,导通后光敏二极管将光信号转化为电信号,电信号经电压比较器将模拟量转化为数字量送下单片机,经判别I/O口的数字量,再控制小车。
灵敏度还是可以的。
方案二:
在小车前面装上参数一致的光敏二极管,光敏二极管将光信号转化为电信号,电信号经电压比较器将模拟量转化为数字量送下单片机,单片机再对读入的几路数据进行存储,比较,然后发出命令以外围进行操作
方案二硬件很复杂,但方案一灵敏度还不错,故用方案一。
硬件电路图:
光敏二极管也叫光电二极管。
光敏二极管与半导体二极管在结构上是类似的,其管芯是一个具有光敏特征的PN结,具有单向导电性,因此工作时需加上反向电压。
无光照时,有很小的饱和反向漏电流,即暗电流,此时光敏二极管截止。
当受到光照时,饱和反向漏电流大大增加,形成光电流,它随入射光强度的变化而变化。
当光线照射PN结时,可以使PN结中产生电子一空穴对,使少数载流子的密度增加。
这些载流子在反向电压下漂移,使反向电流增加。
因此可以利用光照强弱来改变电路中的电流。
我们再经过LM311电压比较器电路处理后得到高低电平输出,高低电平再加以软件加以控制,从而达到要求。
6.红外线行走距离检测模块
方案一:
采用TCRT5000自制红外反射式光电传感器。
TCRT5000的核心部分为红外光电对管,红外光波长比可见光波长长,受可见光影响小,红外系统还具有尺寸小,质量轻等优点。
这种方案简单,价格便宜,灵敏度可调,抗干扰能力比较强,而且这个电路电池供电的压降较小。
方案二:
采用发光二极管发光,用光敏二极管接收。
但光敏二极管受可见光的影响比较大,稳定性差。
不适宜用于寻迹。
考虑到可靠性,我们选择方案一。
硬件电路图:
TCRT5000是一个红外发射管和一个红外接收管。
当发射管的戏外信号经反射被接收管接收后,接收管的电阻会发生变化,在电路上一般以电压的形式体现出来。
TCRT5000电阻的变化取决于接收管所接收的戏外信号强度,学表现在反射面的颜色和距离二方面。
反射面的颜色我们用黑胶布线和地面做对比,接收的距离可以通过电位器调灵敏度。
我们再经过LM311电压比较器电路处理后得到高低电平输出,高低电平再加以软件加以控制,从而达到要求。
7.红外线检测模块
黑线内就是范围区,小车检测到黑线就停止行走,避免小车走出黑圈。
原理,电路和红外线行走距离检测模块是相同的。
但是放在车头底下左右各一个,这样更能保证小车不会走出黑圈。
8.避障模块
避障就是当小车走到光源处,为了防止小车撞上光源,而设置的电路模块让小车差不多走到的时候自动停止。
方案一:
用光敏二极管,做一个和检测光源的电路一样的电路来检测是否到过光源处。
但是光敏二极管对光的感应太灵敏了,不好调节电位器来确定所要设置的距离。
方案二:
用光敏电阻,用LM358做一个比较器电路,由于光敏电阻对光的感应没有那么灵敏,比较好调节要设置的距离。
电路图如下:
光敏电阻又称光导管,常用的制作材料为硫化镉,另外还有硒、硫化铝、硫化铅和硫化铋等材料。
这些制作材料在一定光强度照射下,其阻值迅速减小的特性。
我们再经过LM358电压比较器电路处理后得到高低电平输出,高低电平再加以软件加以控制,从而达到要求。
三.系统软件设计
1.程序流程图:
(1).主程序流程图:
(2).中断程序流程图:
2.软件程序:
/*-----------------------------------------------
名称:
声光寻迹小车
内容:
通过标准程序静态显示计时时间与行程;通过光电二极管与红外二极管控制电机的PWM输出改变寻迹小车的方向
------------------------------------------------*/
#include
#include
#include
/******************************************************************/
/*定义端口*/
/******************************************************************/
sbitP35=P3^5;//行程计数输入
sbitSTOP=P3^0;//光敏电阻
sbitRS=P2^4;//1602控制字
sbitRW=P2^5;
sbitE=P2^6;
sbitP10=P1^0;//光电1
sbitP11=P1^1;//光电2
sbitPWM1=P1^2;//电机1PWM输出
sbitIN2=P1^3;
sbitPWM2=P1^4;//电机2PWM输出
sbitIN4=P1^5;
sbitENA=P1^6;//电机使能
sbitENB=P1^7;
sbitRED1=P3^3;//红外1
sbitRED2=P3^4;//红外2
#defineDataP0//数据端口
/******************************************************************/
/*全局变量*/
/******************************************************************/
chardataTime[]="";
chardatajourney[]="";
unsignedcharcnt=0,tencnt=0,oldms=0,olds=0,count1=0,count2=0,PWM1_ON=0,PWM2_ON,CYCLE=50,road1=0;
unsignedints=0,min=0,count_new,count_old=1;
/******************************************************************/
/*定时器0中断*/
/******************************************************************/
voidtimer0()interrupt1
{
TH0=(65535-1000)/256;
TL0=(65535-1000)%256;
cnt++;
oldms=cnt;
if(RED1||RED2)//红外信号判断
{
PWM1_ON=0;
PWM2_ON=0;
ENA=0;
ENB=0;
TR0=0;
}
else//光电信号判断
{
if(P10&&P11)
{
PWM1_ON=50;
PWM2_ON=50;
}
if(P10&&!
P11)
{
PWM1_ON=20;
PWM2_ON=40;
}
if(!
P10&&P11)
{
PWM1_ON=40;
PWM2_ON=20;
}
if(!
P10&&!
P11)
{
PWM1_ON=20;
PWM2_ON=40;
}
}
if(count1==PWM1_ON)//电机1的PWM输出
{
PWM1=0;
}
count1++;
if(count1==CYCLE)
{
count1=1;
if(PWM1_ON!
=0)//如果左右时间是0保持原来状态
PWM1=1;
}
if(count2==PWM2_ON)//电机2的PWM输出
{
PWM2=0;
}
count2++;
if(count2==CYCLE)
{
count2=1;
if(PWM2_ON!
=0)//如果左右时间是0保持原来状态
PWM2=1;
}
while(cnt==50)//50毫秒计时
{
tencnt++;
cnt=0;
if(P35!
=count_old)//脉冲计数
{
count_new++;
count_old=P35;
}
while(tencnt==20)//20个50毫秒到,秒加1
{
s++;
tencnt=0;
olds=s;
}
}
while(s==60)//60秒到,分加1
{
min++;
s=0;
}
}
/******************************************************************/
/*毫秒级延时*/
/******************************************************************/
voidDelayMs(unsignedchardenyms)
{unsignedcharj,newms;
for(j=0;j while(newms! =oldms) { newms=oldms; j++; } } /******************************************************************/ /*写入命令函数*/ /******************************************************************/ voidWriteCommand(unsignedcharc) { DelayMs(3);//操作前短暂延时,保证信号稳定 E=0; RS=0; RW=0; _nop_(); E=1; Data=c; E=0; } /******************************************************************/ /*写入数据函数*/ /******************************************************************/ voidWriteData(unsignedcharc) { DelayMs(3);//操作前短暂延时,保证信号稳定 E=0; RS=1; RW=0; _nop_(); E=1; Data=c; E=0; RS=0; } /******************************************************************/ /*写入字节函数*/ /******************************************************************/ voidShowChar(unsignedcharpos,unsignedcharc) { unsignedcharp; if(pos>=0x10) p=pos+0xb0;//是第二行则命令代码高4位为0xc else p=pos+0x80;//是第二行则命令代码高4位为0x8 WriteCommand(p);//写命令 WriteData(c);//写数据 } /******************************************************************/ /*写入字符串函数*/ /******************************************************************/ voidShowString(unsignedcharline,char*ptr) { unsignedcharl,i; l=line<<4; for(i=0;i<16;i++) ShowChar(l++,*(ptr+i));//循环显示16个字符 } /******************************************************************/ /*初始化函数*/ /******************************************************************/ voidInitLcd() { DelayMs(5); WriteCommand(0x38);//displaymode WriteCommand(0x38);//displaymode WriteCommand(0x38);//displaymode WriteCommand(0x06);//显示光标移动位置 WriteCommand(0x0c);//显示开及光标设置 WriteCommand(0x01);//显示清屏 } /******************************************************************/ /*主函数*/ /******************************************************************/ voidmain(void) { unsignedcharnews=1; ENA=1;//电机使能置1 ENB=1; IN4=0;//PWM一端置0 IN2=0; STOP=0;//光敏电阻置0 TMOD=0x01;//定时器初始化 TH0=(65535-1000)/256; TL0=(65535-1000)%256; EA=1; ET0=1; TR0=1; InitLcd();//初始化LCD DelayMs(5);//延时保证信号稳定 while (1) { while(news! =olds) { sprintf(Time,"time: %d: %d",min,s);//打印输出时间信息 ShowString(0,Time); sprintf(journey,"road: %dcm",2*count_new);//打印输出行程信息 ShowString(1,journey); news=olds; if(STOP)//光敏二极管停止单片机运行 { TR0=0; PWM1=0; PWM2=0; } elseTR0=1; } } } 四.元件清单 元件名称 数量 元件名称 数量 L298 1个 小车(整体) 1辆 LM399 1个 LM7805稳压芯片 2个 LM311 3个 光敏二极管 2个 LM358 1个 光敏电阻 1个 TCRT5000 3个 电阻 若干 电位器 若干 电容 若干 二极管 若干 导线,排针 若干 电池(9V) 两个 散热片 3片 注: LM311,LM358,LM399都是集成运放放大器,都可以用作电压比较器。 以上我们都是用作电路比较器。 每个比较器有两个输入端(同相输入端),用“+”表示;;另一个称为反相输入端,用“-”表示。 用作比较两电压时,任意一个输入端加一个固定的电压做参考电压,另一端加一个待比较的信号电压。 当“+”端电压高于“-”端时,输出管截止,相当于输出端开路,输出就电平。 当“-”端电压高于“+”端时,输出管饱和,相当于输出端接低电位。 两个电压差别大于10mV就能确保输出可靠。 这样的比较器,在输出端到正电源一般接一个上拉电阻(1~15K)。 先不同的阻值会影响输出端高电位的值。 五.参考文献: 1.电子技术基础康华光高等教育出版社 2.数字电子技术基础阎石高等教育出版社 3.集成运算放大器(应用精粹)肖景和人民邮电出版社 4.C程序设计谭浩强清华大学出版社 5.C语言程序设计及应用 6.新型实用电子电路赵负图化学工业出版社 7.全国大学生电子设计竞赛——单片机应用技能精解蓝和慧电子工业出版社 8.《51单片机C语言常用模块与综合系统设计实例精讲于永电子工业出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 声光 小车 报告