智能寻轨小车.docx
《智能寻轨小车.docx》由会员分享,可在线阅读,更多相关《智能寻轨小车.docx(19页珍藏版)》请在冰豆网上搜索。
智能寻轨小车
文档编制序号:
[KKIDT-LLE0828-LLETD298-POI08]
智能寻轨小车
仲恺农业工程学院
基于STC89C52单片机的红外寻迹小车设计
学院:
自动化学院
班级:
自动化111班
姓名:
杨武洁
学号:
14
指导老师:
唐宇
成绩:
摘要:
本设计是一种基于STC89C52单片机控制的简易自动寻迹小车系统,包括小车系统构成软硬件设计方法。
小车以STC89C52单片机为控制核心,用单片机模拟产生PWM波控制小车速度,利用红外光电传感器对路面黑色轨迹进行检测,并将路面检测信号反馈给单片机。
单片机对采集到的信号予以分析判断,及时控制驱动电机以调整小车转向,从而使小车能够沿着黑色轨迹自动行驶,实现小车自动寻迹的目的。
关键词:
单片机STC89C52红外光电传感器直流电机PWM调速
一、系统简述
1、功能简述
总体功能本设计是基于STC89C52单片机的智能寻迹小车设计,设计一个基于直流电机的自动寻迹小车,使小车能够自动检测地面黑色轨迹,并沿着黑色车轨迹行驶;此外系统还利用编码盘对行驶的小车的速度进行测量,并显示在数码管上,系统方案方框图如图1所示。
系统方案方框图
2、小车寻迹原理
这里的寻迹是指小车在白色地板上循黑线行走,由于黑线和白色地板对光线的反射系数不同,可以根据接收到的反射光的强弱来判断“道路”,采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。
单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。
3、控制系统总体设计
自动寻迹小车控制系统由主控制电路模块、稳压电源模块、红外检测模块、电机及驱动模块等部分组成,控制系统的结构框图如图2所示。
主控制电路模块:
用STC89C52最小单片机系统、复位电路,时钟电路,32路I/O口
红外检测模块:
光电传感器红外双管,比较器LM339
电机及驱动模块:
电机驱动芯片LN298N、两个直流电机
测速模块:
用74HC14反向器做信号处理
二、硬件设计
1、寻迹传感器模块
寻迹模块采用红外线发射和接收管等分立元器件组成探头,并使用LM339电压比较器(加入迟滞电路),防止临界输出抖动做为核心器件构成中控电路。
此系统具有的多种探测功能能极大的满足
在黑线检测的测试中,若检测到黑色区域,发射管发射的红外线没有反射到接收管,测量接收管的电压为4.8V,若检测到白色区域,接收管接受到发射管发射的红外线,光电管导通,电阻发生变化,所分得的电压也就随之发生变化,测的接收管的电压为0.5V,测试基本满足要求。
判断有无黑线我们用的一块比较器LM339芯片,LM339电压比较器芯片内部装有四个独立的电压比较器,各引脚如下图,比较基准电压由10K的变阻器调节,各个接收管的参数都不一致,每个传感器的比较基准电压也不尽相同,我们为每个传感器配备了一个变阻器。
整个探测模块具体电路如下:
通过红外双管检测黑线,输出信号给LM339芯片,接收电压与比较电压比较后,输出信号变为高低电平,再输入到单片机中,用以判定是否检测到黑线。
在小车具体的寻迹行走过程中,为了能精确测定黑线位置并确定小车行走的方向,需要同时在底盘装设4个红外探测头,在车前方横排的设置四个探头相对位置,黑线大小为两个人探头的大小。
2、控制器模块
采用STC公司的STC89C52单片机作为主控制器,是一个低功耗,高性能的8位单片机,它具有8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。
另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
最高运作频率35MHz,6T/12T可选,且可在线编程、调试,方便地实现程序的下载与整机的调试。
时钟电路和复位电路与单片机构成最小系统,如图3
1)采用外部时钟,晶振频率为12MHZ
2)采用按键复位
STC89C52最小单片机系统
3、电机及驱动模块
A、直流电机:
电机采用直流减速电机,直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。
由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生较大扭力。
B、电机驱动:
驱动模块采用专用芯片L298N作为电机驱动芯片,L298N是一个具有高电压大电流的全桥驱动芯片,其响应频率高,可以直接驱动两路3-30V直流电机,并提供5V输出端口,直接供给5V单片机电路系统供电本设计采用两驱驱动芯片,一片L298N可以分别控制两个直流电机。
以下为L298N的引脚图和输入输出关系表。
该模块提供4输入或6输入单片机信号,用跳线帽灵活选择PWM调速,板载上拉电阻,完美解决51单片机IO口驱动能力不足的问题。
L298N外部引脚L298N输入输出关系
IN1-IN4为单片机控制信号输入,ENA、ENB可以作为PWM调速输入信号端,通过单片机编程可实现PWM调速设计,可以用跳线帽直接接高电平为全速驱动;OUT1-OUT4为输出到电机,其中OUT12控制电机1,OUT34控制电机2,VCC、GND为电池盒电源供应。
驱动电路的设计如图3-10所示:
L298N电机驱动电路
4、测速模块设计
测速是利用编码盘的原理,使用一休化对射红外发射接收管WYCH206,并使用74HC14(带施密特触发器反向器),防止临界输出抖动做为核心器件构成中控电路。
该装置留有安装孔易于安装,使用非常简便,灵敏度高,反应非常迅速。
由红外发射管发出的红外管,在编码盘栅格遮挡下,对边的接收管没有接受到红外光,则表现为高电平输出,没有遮挡时有接受到红外光,则为低电平输出。
经过对射红外发射接收管在编码盘的影响下,把传输信号经过74HC14芯片处理输出到单片机的口,利用T1计数器对下降沿信号的计数,通过在1S内的计数脉冲来求得小车速度。
小车车轮直径为CM。
通过脉冲计数,在1S内脉冲数C,则速度V=
(2**)/20*C,单位为CM/S
当光电传感器开始接受信号,通过比较器将信号传入单片机中。
小车进入寻迹模式,即开始不停地扫描与探测器连接的单片I/O口,一旦检测到某个I/O口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态。
与此同时,速度检测红外对管也对编码盘进行测测速,并时时刻刻显示在数码管上。
单片机采用T0定时1ms,通过产生PWM波,控制电机转速,并计时100ms测速周期,T1计数器,对下降沿进行计数,计算小车速度。
三、软件设计
1、PWM控制
本系统采用PWM来调节直流电机的速度。
PWM是通过控制固定电压的直流电源开关频率,从而改变负载两端的电压,进而达到控制要求的一种电压调整方法。
PWM可以应用在许多方面,如电机调速、温度控制、压力控制等。
在PWM驱动控制的调整系统中,按一个固定的频率来接通和断开电源,并根据需要改变一个周期内“接通”和“断开”时间的长短。
通过改变直流电机电枢上电压的“占空比”来改变平均电压的大小,从而控制电动机的转速。
因此,PWM又被称为“开关驱动装置”。
在脉冲作用下,当电机通电时,速度增加;电机断电时,速度逐渐减少。
只要按一定规律,改变通、断电的时间,即可让电机转速得到控制。
本系统中通过控制52单片机的定时器T0的初值,从而可以实现ENA和ENB输出口输出不同占空比的脉冲波形。
定时器周期中断一次,就使ENA和ENB产生一个高电平或低电平。
将直流电机的速度分为100个等级,因此一个周期就有个100脉冲,周期为100个脉冲的时间。
速度等级对应一个周期的高电平脉冲的个数。
占空比为高电平脉冲个数占一个周期总脉冲个数的百分数。
一个周期加在电机两端的电压为脉冲高电压乘以占空比。
占空比越大,加在电机两端的电压越大,电机转动越快。
电机的平均速度等于在一定的占空比下电机的最大速度乘以占空比。
当我们改变占空比时,就可以得到不同的电机平均速度,从而达到调速的目的。
精确地讲,平均速度与占空比并不是严格的线性关系,在一般的应用中,可以将其近似地看成线性关系。
2、总体软件流程图
小车进入寻迹模式后,即开始不停地扫描与探测器连接的单片I/O口,一旦检测到某个I/O口有信号变化,就执行相应的判断程序,把相应的信号发送给电动机从而纠正小车的状态或把速度测量信号发送到单片机,但单片机计算速度并显示在数码管上。
软件的主程序流程图如图所示:
3、小车寻迹流程图
红外传感器为1、2、3、4,虚线为黑线,小车进入寻迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号,即进入判断处理程序,先确定4个探测器中的哪一个探测到了黑线,如果中间2个传感器探测到黑线,即小车中部压到黑线,小车向前前进;如果1、2或1级传感器探测到黑线,小车车身右偏出,此时应使小车左转;如果是3、4或4传感器探测到了黑线,,小车向左偏出了轨迹,则应使小车向右转;如果小车4个传感器都没有检测到黑线,可能是应为惯性,小车冲过头了,此时使是小车向后退,回到刚刚有黑线的地方重新检测,在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作。
寻迹流程图如图所示
4、中断程序流程图
这里利用的是52单片机的T0定时器,从而让单片机P0口的和引脚输出占空比不同的方波,然后经驱动芯片放大后控制直流电机。
定时器定时1ms中断一次,就使或产生一个高电平或低电平。
中断程序流程图如图所示
四、设计总结
本设计主要设计了智能循迹和速度实时测量和显示在数码管的功能。
设计介绍了该设计的总体思想和一些用到的基本的原理及系统的硬件、软件设计。
现将本文主要工作总结如下:
(1)本设计使用模块化的设计方法。
各个功能在硬件和软件的设计上都实现了模块化。
(2)系统经过测试,虽然存在着一定的问题,但能够实现小车的循迹功能、寻光功能,基本上能实现小车的路径规划功能。
(3)小车在弯道方面还存在稳定性问题,基于STC89C52单片机处理速度缓慢和硬件资源比较少,所以该设计最终还是集成了两块单片机,使编程方面能够很好融合硬件资源。
该小车系统还存在一些不完善和需要改进的地方,可以有以下几处需要改进和完善:
(1)需找较高端的单片机,像STC12系列的单片机,其内部硬件资源丰富,能够弥补软件设计过于繁冗而导致不能实现的问题,使得寻迹和测速数码管显示由一块单片机就可以完全实现;
(2)小车在一些比较小角度的弯道行驶时还是有点不稳定,可以通过不断测试相应的电机速度来不断选择最佳的适应某弯道的速度,使小车行驶的时候更顺畅,更体现智能性;
(3)可以在该智能循迹小车中添加更多的有趣的功能。
在小车系统中加上光电传感器让小车可以实现避障功能,还可以在小车上安装喇叭让小车播放音乐等,这样小车更具有智能的特点,而且有更多的娱乐和学习的特性。
(4)该智能循迹小车系统具有循线、追光和路径判断的功能。
但这些功能都是用单独的程序实现的,每运行一个功能就需要重新下载程序。
对于这个问题,可以用多路开关与单片机的I/O口相连,通过检测开关信号进行智能循迹小车功能的选择。
五、设计心得体会
这次循迹小车课程设计不得不说是个大工程,让我们从中学会了许多东西,特别是分工与合作。
从最开始的买元器件,到焊接、调试循迹板,再到控C语言程序的编写,都不简单。
我们的循迹板在第一次焊接完毕,经过调试后,能正常工作。
但是,当我们把它装在小车上让它去跑时,问题就来了,有个灯就不亮了。
后来经过检测后,终于又弄好了。
然后在写C语言时,主要就是调节小车的速度和转弯时的角度。
而最难的是小车在过弯道时的稳定性能,真的很复杂,花了我们很多时间才把它写好。
而速度测量程序的编写,由于89系列单片机硬件资源有限,所以我们一直都不能实现速度实时测量显示,最后只有有2片89系列的单片机把他们独立出来,才显示成功,这是我们最大的遗憾,后期基于兴趣我们可以用12系列的单片机来弥补这一缺陷,实现1片单片机就实现所有功能。
由于这次课程设计的工作量很大,所以我们组这次的分工非常明确。
有的人负责硬件搭建,有的人负责写C语言程序,有的人负责循迹板的焊接与调试,还有负责资料的收集和报告的书写。
最后,经过我们组的分工协作,终于把循迹小车的制作完成了。
这次课程设计,收获最大的,还是告诉了我们要主动去学习新的知识。
附录(单片机程序)
1、寻迹程序
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbitIN1=P0^0;
sbitIN2=P0^1;
sbitIN3=P0^2;
sbitIN4=P0^3;
sbitLed1=P0^4;
sbitLed2=P0^5;
sbitLed3=P0^6;
sbitLed4=P0^7;
sbitPWM_ENA=P2^4;
sbitPWM_ENB=P2^5;
uinta=0,b=0;
ucharN1=0;
voidPWM();
voidrun();
voidback();
voidleft();
voidright();
voidmain()
{
TMOD=0x01;
TH0=0xff;
TL0=0xf6;
EA=1;
ET0=1;
TR0=1;
while
(1)
{
if(Led2==1&&Led3==1)
run();
else
{
if((Led3==1&&Led4==1)||Led4==1||Led3==1){
left();
}
if((Led1==1&&Led2==1)||Led1==1||Led2==1)
{
right();
}
if(Led1==0&&Led2==0&&Led3==0&&Led4==0)
{
back();
}
}
}
}
voidrun()
{
a=40;
b=40;
IN1=1,IN2=0,IN3=1,IN4=0;
PWM();
}
voidback()
{
a=40;
b=40;
IN1=0,IN2=1,IN3=0,IN4=1;
PWM();
}
voidleft()
{
a=40;
b=30;
IN1=1,IN2=0,IN3=0,IN4=0;
PWM();
}
voidright()
{
a=30;
b=40;
IN1=0,IN2=0,IN3=1,IN4=0;
PWM();
}
voidT0_time()interrupt1
{
TH0=0xff;
TL0=0xf6;
N1++;
if(N1==100)N1=0;
}
voidPWM()
{
if(N1PWM_ENA=1;
else
PWM_ENA=0;
if(N1
PWM_ENB=1;
else
PWM_ENB=0;
}
2、速度测量
#include<>
#defineuintunsignedint
#defineucharunsignedchar
sbitdula=P2^6;
sbitwela=P2^7;
ucharcodetable[]={
0x03,0xf3,0x25,0x0d,0x99,0x49,0x41,0x1f,
0x01};
unsignedcodedis[]={0x40,0x20,0x10,0x0f};
unsignedchardisbuff[5]={0};
unsignedchartime=0;
unsignedchari=0;
unsignedintcount1=0;
unsignedintV=0;
voiddelayms(uintkms)
{
uintx,y;
for(x=kms;x>0;x--)
for(y=110;y>0;y--);
}
voidDisplay_SMG(void)
{
if(++i>=4)i=0;
wela=1;
P1=table[disbuff[i]];
wela=0;
P1=0xff;
dula=1;
P1=dis[i];
dula=0;
delayms(5);
}
voidtime_0()interrupt1using2
{
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
time++;
Display_SMG();
if(time>=250)
{
time=0;
V=count1*2;
count1=0;
disbuff[0]=V/1000;
disbuff[1]=V%1000/100;
disbuff[2]=V%1000%100/10;
disbuff[3]=V%1000%100%10;
}
}
voidintersvr1(void)interrupt0using1
{
count1++;
}
voidmain(void)
{
TMOD=0X01;
TH0=(65536-2000)/256;
TL0=(65536-2000)%256;
TR0=1;
ET0=1;
EX0=1;
IT0=1;
IE0=0;
EA=1;
while
(1);
}
参考资料
[1]宋健,姜军生,赵文亮.基于单片机的直流电动机PWM调速系统[J].农机化研究,2006,
(1):
102-103.
[2]边春元李文涛江杰杜平等;C51单片机典型模块设计与应用;机械工业出版社;
[3]李华.MCS-51系列单片机实用接口技术[M].北京:
航空航天大学出版社,2003
[4]楼然苗.51单片机设计实例[M].北京:
航空航天大学出版社,
[5]王晶,翁显耀,梁业宗自动寻迹小车的传感器模块设计.武汉理工大学自动化学院 湖北武汉
[6]刘迎春.传感器原理设计与应用[M].长沙:
国防科技大学出版社,1992.
[7]王晓明.电动机的单片机控制[J].学术期刊,2002,13(15):
1322-1755.
[8]游雨云,丁志勇,智能小车单片机控制直流电机方案与设计论文.技术研发,.
[9]马忠梅,李月香.单片机内部资源的C语言编程[J].微计算应用,1997,(03).
[10]段颖康,基于光电传感器自动寻迹智能小车位置信息采集模块设计论文.新特器件应用,.
[11]康华光.电子技术基础(数字部分+模拟部分).北京:
高等教育出版社,2006.
[12]张义和,王敏男,许宏昌等.例说51单片机(C语言版).北京:
人民邮电出版社,2010.