AT89S51单片机 智能小车.docx
《AT89S51单片机 智能小车.docx》由会员分享,可在线阅读,更多相关《AT89S51单片机 智能小车.docx(17页珍藏版)》请在冰豆网上搜索。
AT89S51单片机智能小车
智能小车(C题)
摘要:
本次设计是设计一个智能小车,采用AT89S51单片机作为控制中心,通过红外反射型对管检测边界线,关电开关检测路面标志线,并配合自制的L298来实现直流减速电机的驱动。
使用NRF24L01模块实现两车之间的通信,采用单位数码管显示车牌号,明显区分两辆小车。
采用自制码盘调速实现车速闭环控制。
另外,本次设计我们采用手工焊制,虽然外观上不十分美观,但是性价比较高,经济适用,并且很好的锻炼了我们焊接、调试、团队协作等方面的能力。
我们对小车的性能进行了实际检测,验证了各项指标,良好的实现了设计目标。
关键词:
AT89S52光电传感器红外对管无线通信
1.系统方案
1.1系统设计与结构框图
根据题目要求,本系统主要由电源模块,红外探测模块,电机驱动模块,光电检测模块,无线通信模块,码盘测速模块,微调模块,显示模块,计时模块等构成。
系统的结构框图如下图1所示:
图1系统结构框图
1.2方案论证
小车选择:
本设计中小车要在规定车道上灵活行驶,购买玩具车不能很好的适应要求。
又考虑到四轮车转弯受到限制,不易超车,所以我们自己设计车体结构类似为三角形,灵活性大,且尽量使小车重心降低以便于制动。
控制器选择:
方案一:
采用Atmel公司的AT89S52单片机。
方案二:
采用mc9s12xs128单片机。
方案三:
采用凌阳公司的SPCE061板。
mc9s12xs128和SPCE061使用起来比较困难,电路复杂,焊接也相对困难,而本题使用AT89S52完全能可以满足要求,AT89S52低功耗,高性能,使用mc9s12xs128和SPCE061有些大材小用了。
电源模块:
方案一:
铅酸电池供电。
方案二:
电池组供电。
方案三:
锂电池供电。
铅酸电池供电,电流大,但是重量太沉。
电池组耗费量太大。
小车为活动性机器,故最好采用电池供电。
电机工作需要8V电压,且要求较大的电流,其它模块需5V和3.3V供电,电流要求不高。
这样,体积小,容量大,重量轻,使用寿命长的锂电池结合8V—5V和5V—3.3V的DC-DC芯片便成为我们的最佳选择。
电机选择:
方案一:
采用步进电机
方案二:
采用直流减速电机
步进电机可以准确定位,但输出力矩低,速度慢,且体积大,重量大,不适用于小车的快速行驶,也可能达不到时间上的要求。
而直流减速电机转动力矩大,速度大,体积小,重量轻,因而成为我们的最终选择。
电机驱动模块
方案一:
采用晶体管构建H桥驱动
方案二:
采用专用芯片L298
H桥由4个三极管组成,可方便实现直流电机的四象限运行,分别对应正转、正转制动、反转、反转制动。
专用驱动芯片L298,响应频率高,一片可控制两个直流电机,操作方便,稳定性好,性能优良。
最终,我们选用L298作为电机驱动。
探测模块
方案一:
光敏电阻+发光二极管
方案二:
采用光电传感器
方案三:
红外对管
反射式光电传感器采用一体化结构,利用黑、白线反射光的强弱寻迹,灵敏度高,体积小,且结构紧凑,安装方便,通过红外对管来实现,它测量距离近,信号强度低。
但相比光电传感器而言,其体积较小,价格低,安装较容易.实验室旧拆卸件无需额外成本。
考虑到性价比和检测要求,我们选择方案二和方案三相结合,即关电开关检测车行道上的标志线,红外反射对管检测车道边界线。
微调模块:
在小车走到边界处,传感器检测到边界线,软件控制电机对其进行微调。
码盘测速模块:
用自制打印码盘检测小车的车轮转速,差动比较两轮速度进行调整。
计时模块:
51单片机具有强大的中断功能。
我们可以通过中断进行计数,然后计算出时间。
这样,无需外部硬件,程序也较简单。
.
显示模块:
数码管显示速度快,亮度高,我们用其来显示车牌号以便明显区分两车。
无线通信模块:
通过无线来实现小车与上位机的通讯,我们采用常见的无线单片收发芯片nRF2401,它体积小、功耗少、外围元件少,有助于减轻小车重量。
1.3系统设计
铝合金自制车体采用L298驱动直流减速电机实现行进,光电传感器结合红外对管完成小车自动行驶的功能。
利用码盘测速实现电动车的闭环反馈控制,根据PID控制算法找出车速平衡点。
同时LED显示模块和无线通信模块实现了两车之间的通信。
我们确定的最终方案为:
1.小车模块:
采用自制类三角形车体结构
2.控制模块:
采用Atmel公司的AT89S52单片机。
3.电源模块:
采用锂电池结合DC-DC芯片供电。
4.电机模块:
采用直流减速电机,由L298来驱动。
5.码盘测速模块:
采用自制打印码盘。
6.微调模块:
软件编程实现。
7.红外探测模块:
采用反射式光电传感器。
。
8.计时模块:
软件编程实现。
9.显示模块:
采用LED显示车牌号。
10.无线通信模块:
采用无线单片收发芯片nRF2401。
2.理论分析与计算
2.1信号检测与控制:
信号的检测通过使用反射型光电对管与红外对管实现。
广电对管相对于红外对管看更加灵敏,更加高效,然后根据读入的对管状态值,来调节小车的行驶状态。
但考虑到成本与性价比问题,我们在每辆车上只使用1个光电对管,将其放置在车头位置检测转弯线以应对高速灵敏的要求。
(图见附录A图8)在其他位置我们则使用一些先有的较为廉价的红外对管与三极管组成检测电路,也同样可以达到相当高的使用标准与灵敏度。
同时出于测量车速构造回馈模块的考虑,我们用自制并用打印机打印车轮码盘贴于车轮内侧,同时在电机车轴附近设置红外对管检测模块,用以实现回馈车速,达到始终可以自身调节的目标。
2.2两车之间的通信:
通信模块我们选择了NRF24L01+模块,此模块使用高效GFSK调制,抗干扰能力强,内置硬件CRC用于检错,体积小巧15mmX29m,而且具备低功耗1.9-3.6V工作的能力,待机模式下状态为22uA;掉电模式下为900nA,符合节能的基本思想。
本系统中要考虑三种模式下的通讯:
默认直行模式:
当车启动时,在进行一系列初始化的过程中开启通信模块,发送检测信号,同时进入接受模式。
若检测到有另外的模块发来检测信号,则该车根据之前设定进入超车或等车模式,同样另外一辆小车也进入了相应模式。
若接收模式下始终无法检测到有其他的检测信号输入,则进入默认的沿跑道行驶模式。
超车模式:
小车自动进入超车模式,当走出超车区完成超车时将通过无线模块发送超车完成信号给等待车,并在下一圈时根据程序设定自动进入等车模式。
等车模式:
小车自动进入等车模式,当检测到超车区来临时,将走到预定地点停车等待,并进入接受模式检测无线信号,直到接收到超车完成信号时重新启动电机继续行驶,并在下一圈时根据程序设定进入超车模式。
2.3时间测量与计算:
本系统中对于时间的计量是通过中断形式实现的,不需要任何硬件设施。
其具体实现方法就是每进入一次中断,则计数值加一。
通过该计数值,我们就可方便的计算出时间。
控制:
综合分析各种常用控制算法和现有测试仪器,同时出于测量车速构造回馈模块的考虑,我们用自制并用打印机打印车轮码盘贴于车轮内侧,同时在电机车轴附近设置红外对管检测模块,用以实现回馈车速,达到始终可以自身调节的目标来实现两车之间的超车。
2.4环保节能性价比体现:
1,红外传感器直接采用拆卸件,节省资源、循环利用,因此型号不一混搭使用。
2,车体部分采用普通合金脚料,用盛放元件的塑料管组成前瞻支架部分,轻便且易于取材而且环保。
充分利用废弃物品自制小车,拒绝套件。
培养动手能力的同时突出小车的性价比。
3,可多次循环利用的锂电池,轻便小巧,虽然单品价格相对会高一些,但其寿命长,从长远角度看既环保又节能。
4,采用8050三极管分立元件电路代替比较器,大大的减少的开销,运用电路知识,合理利用资源寻找更节能,更便捷更低功耗的的代替方案。
3.电路与程序设计
3.1检测与驱动电路设计
电源模块:
采用L7805和ASM1117稳压芯片产生5V和3.3V。
如附录A图1所示。
电机驱动模块:
一片L298N可控制两个直流电机,我们用PWM输出来调制车速,且为了防止电机模块对前级的干扰,我们加光电耦合级,电路连接如附录A图2所示。
探测模块:
我们采用反射式光电对管和红外反射对管如附录A图3,红外探测侧对管输出接8050三极管组成的比较器,由地面反射状况的不同而输出1,0信号予以反馈。
其电路连接如附录A图4所示。
显示模块:
数码管显示车牌号,采用静态显示方式,其电路连接如附录A图5所示。
无线模块:
nRF2401业界体积最小、功耗最少、外围元件最少的无线单片收发芯片,编程很方便,实际传输距离在50-80米左右。
其电路如附录A图6所示。
单片机最小系统:
AT89S52单片机最小系统如附图A图7所示。
3.2软件设计与工作流程图
因为本系统中小车要进行前进、车速调节、延时、检测边界线和转弯线等一系列活动,所以对于程序的安排结构要求严格。
在此,我们采用模块化设计方法,将整个程序分为以下几个模块:
.主程序;电机驱动子程序;寻找转弯线子程序;无线通信子程序等。
主程序代码见附录B。
主程序流程图如图2示。
图2工作流程图
4.功能测试与结果分析
4.1基本功能测试:
1.1号车正常行驶一圈
测试次数
所需时间
1
12s
2
15s
3
14s
4
16s
5
15s
平均时间:
14.4s/圈
2号车正常行驶一圈
测试次数
所需时间
1
15s
2
16s
3
14s
4
15s
5
13s
平均时间:
14.6s/圈
2.2号车追1号车,实现超车功能
测试次数
所需时间
1
31s
2
34s
3
35s
4
34s
5
32s
平均时间:
32s/圈
4.2发挥功能测试:
1.交替领跑第二圈
测试次数
所需时间
1
60s
2
64s
3
63s
4
65s
5
67s
平均时间:
63.9s/圈
4.3创新发挥
在完成基本要求和发挥部分的基础上,我们又扩展了以下功能:
通过无线收发芯片nRF2401在两车之间实现通讯,当领跑车冲出跑道,通过通信是另一车立即停止。
4.4结果分析:
我们在软件上精心调试多次,硬件上注意每一个小细节,最终使得我们的小车在多次测试中都较好地完成了题目地基本要求和发挥部分。
同时我们所扩展的路程测量与显示功能,效果良好。
5.结束语
通过良好的寻迹,二分法与微调结合等算法,我们的小车可顺利完成各段行程,并较为快速的找到转弯线;通过nRF2401,顺利实现小车之间的无线通讯,从而判断领跑车和两车之间的状态控制。
6.参考文献
[1]全国大学生电子设计竞赛组委会.全国大学生电子设计竞赛获奖作品选编(2005).北京:
北京理工大学出版社.2007
[2]王延伟.罗亚非.大学生创新竞赛实战.北京:
北京航天航空大学出版社.2009
[3]曹立军.单片机原理与应用.电子科技大学出版社.2005
[4]杜清府.刘海.检测原理与传感技术.山东大学出版社.2008.9
[5]谭浩强.C语言程序设计(第二版).北京:
清华大学出版社
[6]王鸿明.电工技术与电子技术.北京:
清华大学出版社
附录A
图1电源电路
图2电机驱动电路图
图3光电对管连接图
图4红外对管连接图
图5数码管显示
图6nRF2401连接图
图7单片机最小系统
图8传感器安装实物图
附录B
//***********************跑圈方案A(单车行驶)控制参数************************//
ucharcounter_corner;
//***********************电机控制端口*************************//
sbitin1=P1^0;//******************//
sbitin2=P1^1;//******左电机******//
sbitena=P1^4;//******************//
sbitin3=P1^2;//******************//
sbitin4=P1^3;//******右电机******//
sbitenb=P1^5;//******************//
ucharNum_1,Num_2;
ucharleft,right;//left控制左电机,right控制右电机
//***********************方向传感器*************************//
sbitL_1=P0^0;//*****传感器1*****//
sbitL_2=P0^1;//*****传感器2*****//
sbitL_3=P0^2;//*****传感器3*****//
//***********************正反转设置******************************//
voidpositive()
{
in1=1;
in2=0;
in3=1;
in4=0;
}
voidnegative()
{
in1=0;
in2=1;
in3=0;
in4=1;
}
//***********************跑道方向修正函数*********************************//
voiddirection_modify(uchardirection)
{
negative();
delay_ms(20);
positive();
if(direction==1)
{
right=2;
delay_ms(20);
}
if(direction==2)
{
left=2;
delay_ms(20);
}
//***********************边界检测函数***********************************//
voidboundary_scan()
{
if(L_2==0)
{
delay_ms(3);
if(L_2==0)
{
direction_modify
(1);
}
}
if(L_3==0)
{
delay_ms(3);
if(L_3==0)
{
direction_modify
(2);
}
}
right=15;
left=15;
}
//***********************前方传感器测试与拐弯设置***********************//
voidturnleft_scan()
{if(L_1==0)
{
delay_ms(5);
if(L_1==0)
{
counter_corner++;
if(counter_corner==5)
{counter_corner=0;
}
if(counter_corner!
=1)
{delay_ms(500);
left=2;
right=12;
//while
(1);
delay_ms(480);
left=12;
right=12;
while(!
L_1);
delay_ms(3);
while(!
L_1);
}
}
}
}
//***********************定时器T0中断服务函数***********************//
voidt0(void)interrupt1//定时器T0用来产生左电机转动所需的PWM波
{TH0=(-500)/256;//定时器重装初值
TL0=(-500)%256;
Num_1++;
Num_2++;
if(Num_1==left)//PWM波的占空比为left/21*100%
{ena=0;}
elseif(Num_1==21)//PWM波的周期为21*500us
{ena=1;
Num_1=0;
}
if(Num_2==right)//PWM波的占空比为right/21*100%
{enb=0;}
elseif(Num_2==21)//PWM波的周期为21*500us
{enb=1;
Num_2=0;
}
}