电子设计竞赛控制组设计报告.docx
《电子设计竞赛控制组设计报告.docx》由会员分享,可在线阅读,更多相关《电子设计竞赛控制组设计报告.docx(22页珍藏版)》请在冰豆网上搜索。
电子设计竞赛控制组设计报告
编号:
C甲00102
2011年全国大学生电子设计竞赛
智能小车(C题)
参赛队员:
张纪宽()
高军()
朱真真()
专业:
电气工程与自动化
电子信息科学与技术
智能小车
摘要:
本系统主要设计和制作了甲乙两辆智能小车,使用软件编程控制小车完成交替超车。
两车均采用两片ATmega16单片机作为主控芯片,使用L298N驱动两个减速电机为小车提供动力,行进中使用激光发射与接收模块检测路面标志线,运用NRF2401无线传输模块实现甲乙两车的即时通讯,在两车行驶过程中通过无线通信确定哪辆车在前面,当到达超车区时后面的车赶超前面的车从而实现交替超车。
本系统还增加了光电传感器用于防止小车撞车,并通过12864液晶屏实时显示小车行进的时间和行驶的圈数。
经过多次测试,小车运行良好,能够很好的完成基本部分和发挥部分的要求。
关键词:
无线通信;激光检测;交替超车;Atmeg16单片机;光电开关
Abstract:
Thissystemmainlydesignandthemanufactureoftheabtwovehiclesintelligence,usethesoftwarecontrolcarfinishalternateovertake.TwocarallUSEStwopiecesofATmega16monolithicprocessorasthemaincontrolchip,usingL298Ndrivetworeductionmotorforthecartoprovidepower,usingalaserontheemittingandreceivingmoduleinspectionmarkline,usetheNRF24L01wirelesstransmissionmodulesrealizeabtwocarofinstantmessaging,intwodrivingprocessthroughthewirelesscommunicationdeterminewhichcarinfront,andwhenyougettotheovertakingareathecarbehind,catchupthecarinfrontandthusrealizestheovertakingalternately.Thesystemalsoincreasesthephotoelectricsensorusedtopreventthecarcrash,andthroughthe12864LCDdisplaysrealtimetraveltimeanddrivingthecarnumberofturns.AfterDuoCitestthecarisrunningwell,bebetterabletocompletebasicpartandplayapartoftherequest.
Keywords:
wirelesscommunication;laserdetectionalternate;Atmeg16;overtakingphotoelectricswitch;single-chipmicrocomputer
1.系统的结构和功能介绍
1.1设计任务与要求
1.1.1设计任务
设计并制作甲乙两辆小车通过软件编程,完成甲乙交替超车领跑的功能。
1.1.2设计要求
1.甲乙分别从起跑线开始,在跑道上各正常行驶一圈。
2.将甲乙分别放置在规定位置并同时启动,乙车通过超车标志线后在超车
区内实现超车功能,并先于甲车到达终点标志线,即第一圈实现乙车超过甲车。
两车继续行驶,甲车检测到超车标志线后在超车区实现超车。
3.甲、乙两车继续行驶第三圈和第四圈,并交替领跑。
4.重新设定甲车起始位置(在离起点标志线前进方向40cm范围内任意设定),实现甲、乙两车四圈交替领跑功能。
1.2理论分析与计算
1.2.1信号检测与控制
采用激光传感器用于检测路面标志线,在车头的左中右三侧分别装上激光传感器。
当检测到黑线时,指示灯亮,小车做相应运动;当检测到白线时,指示灯灭,小车沿直线行驶。
1.2.2两车之间的通信方法
系统采用NRF2401无线传输模块用于两车的通信。
当到达超车区时,最先检测到超车标志的小车向后面的小车发出信号,并立即减速。
后面的小车检查测到前面小车发出的信号后,加速行驶完成超车运动。
超车完成后前面的小车再发出信号通知后面的小车超车已完成,最后两车都以正常的速度行驶。
1.2.3系统节能减排方面的优化设计
为实现节能减排、绿色环保的目的我们采用功耗比较小的直流减速电机和ATMEGA16单片机,并且使用体积最小,功耗最低的NRF2401无线传输模块。
在小车的设计中尽量的采用体积小、重量轻的元器件等,用于减轻小车的重量,降低小车运行时的功耗。
1.3系统基本方案
本系统使用两片ATmega16单片机作为核心控制芯片,采用L298芯片驱动直流减速电机,并使用NRF2401无线传输模块实现两车即时通讯,控制两车的速度完成超车,使用12864液晶显示屏实时显示,超车前后会发出语音提示人机界面人性化、直观化。
,系统的整体框图如图1所示。
图1系统框图
1.4各模块方案的选择与论证
1.4.1控制器的选择与论证
方案一:
采用ATMEL公司的AT89S52单片机
52单片机软件编程灵活,自由度大,可用软件编程实现各种算法和逻辑控制,成本低,被各个领域广泛应用。
但52单片机功耗较大,内存只有8Kb,驱动能力差,速度较慢,考虑到本系统软件编程较为复杂,对单片机内存要求较高,需要精确的计时等功能,因此,我们放弃了这个方案。
方案二:
选择ATMEL公司的ATmega16单片机
AVR单片机具有体积小、集成度高、功耗低(3.3V电压)、可直接输出两路PWM、中断处理能力强等特点,内嵌16kFLASH,处理速度高,自身带有PWM功能和AD转换功能,运算速度快,驱动能力强,性价比高,符合低功耗标准。
为简化电路和降低功耗我们采用方案二。
1.4.2电机的选择与论证
方案一:
使用步进电机作为驱动部分
步进电机的优点在于转速以及转动距离易于调节,便于软件控制。
缺点是:
体积大,功耗大,价格高,转速相对较慢,低速运行时易出现低频振动现象。
方案二:
使用直流电机作为驱动部分
其优点在于调速精度比较高,调速性能优良,调速方便、调速方式多,力矩大,工作效率高、应用范围广、体积比较小且关停时耗能也小;控制的精确度虽然没有步进电机那样高,但完全可以满足题目的要求,在价格方面相对于步进电机相对便宜。
因为小车运行需要较高的速度,所以我们选择用动力和力矩较大的直流电机来驱动小车,综上所述为实现系统的功耗和性能的最优化,我们采用方案二。
1.4.3电机驱动电路的选择与论证
方案一:
采用MOS管构成的H桥
通过H桥搭建的H桥电路,可以提高效率,降低功耗,但MOS管构成的H桥实现起来比较复杂,同时管子的参数不同,很难避免MOS管发热烧坏等问题。
方案二:
采用L298驱动模块
L298内含四个驱动通道,输出电流可达4A,并且此芯片专门为电机驱动设计使用,工作性能稳定。
通过L298控制电机的正反转,可以很好的控制小车的速度与转向,而且成本低,使用起来简单方便。
考虑到产品的成本和系统的性能我们决定使用L298电机驱动芯片,采用方案二。
1.4.4无线通讯模块的选择与论证
方案一:
采用红外光方式。
红外通信只适用于室内静止或慢速移动中的点对点通信,方向性要求高,对于运动的小汽车在传输过程中易产生误码,性能不稳定。
无法满足系统的要求。
方案二:
采用Nordic公司生产的nRF24L01芯片。
该芯片超低功耗(发送10.5mA@-5dBm;接收18mA),nRF2401A支持多点间通信,最高传输速率超过1Mbit/s,它采用Soc方法设计,需要极少的外围电路,且没有复杂的通信协议,工作电压范围宽(1.9V到3.6V),基于nRF2401A的工作原理,自行设计了无线收发电路,完全可以达到设计的要求。
更为重要的是nRF2401A价格经济,是业界体积最小、功耗最少、外围元件最少的低成本射频系统级芯片。
从电路工作的稳定性,低功耗及性价比的角度考虑,我们选择方案二。
1.4.5标志线检测传感器的选择与论证
方案一:
使用TK-20黑白线检测传感器
TK-20黑白线检测传感器是TK-10的升级版,有效探测距离达5cm。
虽然具有受可见光干扰小,使用方便的优点,但是检测的精度比较低,需要传感器的个数较多,且道路参数的检测种类少,检测的前瞻距离比较小,不能满足精确控制的要求。
方案二:
利用激光发射接收装置进行检测。
激光发射接收装置由激光发射器、激光接收器组成。
它的优点是能实现无接触远距离测量,速度快,精度高,量程大,抗光、电干扰能力强等可以很好的完成对路面的检测,精确控制小车的行驶的路径。
为简化设计和实现对小车的精确控制,我们决定采用方案二。
2.系统硬件设计
2.1ATMega16的最小系统
ATMega16的最小系统包括复位电路、ISP接口、JTAG接口、PA~PD四个端口全部引出,支持JTAG仿真。
ATmega16最小系统电路图如图2所示:
图2ATMEGA16最小系统
2.2nRF24L01无线收发模块
无线收发子系统以nRF24l01芯片为核心,辅助以稳压部分、晶振部分、无线部分电路。
电压VDD经电容C1、C2、C3处理后为芯片提供工作电压,晶振部分包括Y1、C9、C10,当晶振设为16MHz时,通信速率为1Mbps,天线部分包括L1、L2,用来将nRF2401A芯片的ANT1、ANT2管脚产生的2.4G电平信号转换为电磁波信号,或者将电磁波信号转换为电平信号输入芯片的ANT1、ANT2管脚。
子系统框图如图3所示,电路具体原理图如图4所示。
图3子系统原理框图
图4无线收发子系统原理图
2.3电机驱动的电路设计
由于要驱动两个电机,显然只需利用MMC_1的两个通道,将MMC_1的CH1DCPWM端、CH1DCDIR端、CH2DCPWM端、CH2DCDIR端分别与L298的4个输入端相连,利用SPI模式软件编程控制,电路原理图如图5所示。
图5直流电机驱动电路
2.4激光传感器收发电路
发射部分,经过调制管,便输出180khz的频率,经过三极管8050放大之后驱动发射管,使发射管以180KHZ的频率,20%-30%的占空比发射出650nm的光线,经过反射后,接收管接收到反射回来的黑白信号,输出高低电平,由单片机识别,从而达到识别路径的功能。
发射和接收原理电路图如图6所示。
图7接收部分
图6发射和接收原理电路图
3.软件设计
3.1系统主程序流程框图
系统主要通过检测起点标志线的个数来计算小车跑的圈数,当甲乙中任何一个先检测到超车标志就会通过无线传输模块向另一辆小车发出超车信号完成替超车。
图7主程序流程图
4.系统测试
4.1测试方案及测试条件
在室内环境下使用按规定制作的跑道,依次测试两辆小车分别跑一周运行的时间,超车运行一周的时间,改变初始位置运行一周的时间等,通过多次测试后求出平均值。
4.2测试表格
表一:
甲乙两车分别运行一周的时间
第一次
(百分秒)
第二次
(百分秒)
第三次
(百分秒)
第四次
百分秒)
平均值
(百分秒)
甲
18'50''
18'25''
19'30''
19'15''
18'15''
乙
19'32''
20'10''
20'53''
19'62''
19'92''
表二:
第一轮超车运行一周的时间
第一次
(百分秒)
第二次
(百分秒)
第三次
百分秒)
第四次
(百分秒)
平均值
(百分秒)
甲
22'50''
22'25''
23'30''
23'15''
23'20''
乙
22'32''
23'10''
21'53''
22'62''
22'14''
表三:
第二轮超车运行一周的时间
第一次
(百分秒)
第二次
(百分秒)
第三次
(百分秒)
第四次
(百分秒)
平均值
(百分秒)
甲
22'55''
22'77''
23'03''
22'45''
22'30''
乙
22'32''
23'10''
23'53''
23'62''
23'18''
4.3测试结果分析
由于小车暴露在外界环境中测试时难免会受到外界环境的干扰,因此测试结果会存在一些误差。
而且在经过多次测试后电池的电量有所损耗,不能保证每次提供的电量都相等。
所以小车的运行时间会有较小的差距,经过多次测试和分析后可以得出结论:
小车运行的时间在22秒左右,其所产生的误差都在误差允许范围内,能够较好的满足设计的要求。
5.结束语
本系统使用两片ATMEGA16作为主控芯片,该系统主要由NRF2401无线收发模块、L298N驱动模块、激光检测模块、显示模块等组成。
小车行驶过程中使用激光检测器检测标志线,NRF2401无线收发模块实现两车的通讯,我们还增设了光电开关防止小车相撞,并使用12864实时显示小车运行的时间和运行的圈数等功能,使系统更加直观。
在这次设计中我们完成了基本部分和发挥部分的要求,经过测试很好的满足了题目的要求。
当然在比赛中我们也遇到了很多困难,比如在激光的检测黑白线的过程中调试了很多次效果都不是很理想,小车的实际转速与理论值不相符等等,但是功夫不负有心人经过小组成员的相互讨论和统一协作我们终于将问题解决了。
通过这次比赛我们不但增强了实践能力和协作精神,而且懂得了理论联系实际的重要性,这对我们以后的工作和学习都将是一笔宝贵的财富。
由于经验不足,我们的设计和制作中难免还存在着一些缺陷,需要进一步改正,再此希望各位评委老师能够给予批评指正。
最后感谢大赛组委会和学校能够给我们提供这次锻炼的机会。
6.参考文献
【1】陈杰,黄鸿编著.传感器与检测技[M].高等教育出版社,2002
【2】卓晴,黄开胜,邵贝贝著,学做智能车[M].北京航空航天大学出版社,2007
【3】华成英,童诗白.模拟电子线路基础[M].北京:
高等教育出版社,2006
【4】康华光.数字电子技术基础[M].北京:
高等教育出版社,2005
【5】严国萍,周龙占著.通信电子线路基础[M].北京:
科学出版社,2006
附录
1元器件清单
名称
型号
数量
简易小车
2辆
Avr单片机
ATMEGA16
2片
无线收发模块
NRF2401
2个
激光传感器模块
6个
光电开关
C38-D50NK
2个
LCD屏
12864液晶显示器
2个
锂电池
3.7V
8节
电池盒
2个
2主要程序
//甲车
#include"L298.h"
//#include"wuxian.h"
#include"delay.h"
#include"12864.h"
#pragmainterrupt_handlerint0:
2
#pragmainterrupt_handlerint1:
3
//声明中断1
//#pragmainterrupt_handlerint1:
3
ucharcom;//2401接受
ucharhengxian=0;//检测横线
ucharchaoche=0;//检测超车标志
voidPWM_INIT(void)
{
DDRD|=BIT(4)|BIT(5);//设置为输出PWM
TCCR1A=0XA2;//10100011CO1M1A1,CO1M1A0,CO1M1B1,CO1M1B0=1010
TCCR1B=0X1A;//00011010WGM13WGM12WGM11WGM10=1110模式14ICR1;CS12CS11CS10=010为8分频
ICR1=999;//f=1K8M晶振TOP=FOSC/Focn/N-1
//OCR1A=468.75;//2.5ms8M晶振
//OCR1B=92.75;//0.5ms8M晶振
}
voidPWM_CTR(uinta,uintb)
{
OCR1A=a;//2.5ms12M晶振左边
OCR1B=b;//0.5ms12M晶振右边
}
uchara=0,biaozhi=0;
voidinit_INT0(void)
{
SREG|=BIT(7);
MCUCR=0X02;//下降沿中断
GICR=0XC0;
}
/*voidinit_INT1(void)
{
SREG|=BIT(7);
MCUCR&=~0X00;//低电平中断
GICR=0X40;
}*/
voidint0(void)
{
a++;
biaozhi=1;
}
voidint1(void)//蜂鸣器
{
PWM_CTR(500,500);
}
voidmain(void)
{
delay_ms(1000);
init_L298();
//SPI_Init();
//RF2401_Init();
//DDRA|=BIT(7);
PWM_INIT();
init_INT0();
//lcd_init();
while
(1)
{
if(biaozhi==1)
{
biaozhi=0;
if(a==1)//起跑线
{
forward();//一起前进
PWM_CTR(830,800);
delay_ms(10);//延时1s
}
if(a==2)//第1个转弯
{
forward();//一起前进
PWM_CTR(825,950);
delay_ms(600);//延时1s
}
if(a==3)//第2个转弯
{
forward();//一起前进
PWM_CTR(825,950);
delay_ms(600);//延时1s
}
if(a==4)//超车标志
{
chaoche++;
forward();//一起前进
PWM_CTR(825,950);
delay_ms(600);//延时1s
}
if(a==9)//第四个转弯
{
forward();//一起前进
PWM_CTR(825,950);
delay_ms(600);//延时1s
}
if(a==10)//起跑线
{
a=1;
forward();//一起前进
PWM_CTR(825,800);
delay_ms(100);//延时1s
}
}
/*if(!
(PINB&0X02))//仅中间白线高,黑线低
{
hengxian++;//检测黑线数目
forward();//一起前进
PWM_CTR(820,800);//全速
delay_ms(200);
if(!
(PINB&0X02))//又检测到表示超车标志区
{
chaoche=1;
forward();//一起前进
PWM_CTR(700,950);
delay_ms(500);//延时1s
}
else
if(PINB&0X02)//未检测到表示转弯标志线
{
chaoche=0;
forward();//一起前进
PWM_CTR(700,950);
delay_ms(500);//延时1s
}
}
else*/
//仅左侧白线低,黑线高
if(PINB&0X01)//仅检测到左面PB0
{
delay_ms(20);
//左右同时检测到白线低,黑线高
if((PINB&0X01)&&(PINB&0X04))//仅检测到右面PB2
{
forward();//直线
PWM_CTR(822,800);
}
else
if((PINB&0X01)&&(!
(PINB&0X04)))
{
A_runB_back();//大右拐
PWM_CTR(500,750);
}
}
else
//仅右侧白线低,黑线高
if(PINB&0X04)//仅检测到右面PB2
{
delay_ms(20);
//左右同时检测到白线低,黑线高
if((PINB&0X01)&&(PINB&0X04))//仅检测到右面PB2
{
forward();//直线
PWM_CTR(822,800);
}
else
if((!
(PINB&0X01))&&(PINB&0X04))
{
A_backB_run();//大左拐
PWM_CTR(750,500);
}
}
else
if((!
(PINB&0X01))&&(!
(PINB&0X02))&&(!
(PINB&0X04)))
{
forward();//一起前进
PWM_CTR(822,800);
}
//显示横线数
/*lcd_weizhi(0,0);//从第1行,第0列开始
write_date(dis1[hengxian/100]);
lcd_weizhi(0,1);
write_date(dis1[hengxian%100/10]);
lcd_weizhi(0,2);
write_date(dis1[hengxian%10]);
//显示超车区
lcd_weizhi(1,0);
write_date(dis1[chaoche]);*/
}
/*while
(1)
{
if(PINC&0X01==0X01)//发送
a=1;
else
if(PINC&0X02==0X02)//接收
a=2;
if(a==1)//发送
{
Buffer[0]=1;
TX_Mode();
delay_ms(10);
if(!
(PINB&(1<{
unsignedcharirq_sta;