资源描述
材料清单一、 研究报告1. 项目成果简介2. 项目研究背景和意义3. 研究计划4. 研究内容5. 成果创新点6项目研究展望二、附件材料附件一:实物电路图附件二:实物照片附件三:源程序清单三、实物作品衡阳市第三届大学生创新大赛相关项目的研究报告项目名称:智能寻迹小车的研究与开发项目类型:实用型成果形式:1、研究报告;2、实用作品参赛学生:陈绪雄、周锋、蒋晶指导教师:李祖林、雷军、李旭华一、项目成果简介本项目使用光电传感器检测小车的运动轨迹,金属传感器和超声波传感器检测小车周围的障碍,对小车的相关信息进行采集,采用AVR单片机Atmega128L作为电动小车的寻迹控制,AVR单片机Atmega128L完成算法分析、信息处理和小车的控制。构建了以微处理器为核心、多传感器的小车信息检测与融合、声光报警与LCD数码显示、双向PWM控制驱动电机的智能小车寻迹系统。电动小车能沿着任意设定的轨迹行走,遇到障碍自动停止5秒并发出声光报警,之后能自动倒回按设定的轨迹行走,小车能自动纠偏。经过测试,小车能够按任意设定的轨迹行走流畅。二、项目研究背景和意义随着计算机技术、控制技术、信息技术的快速发展,工业的生产和管理进入了自动化、信息化和智能化时代,智能化已经成为时代发展的需要。在柔性自动化生产线、智能仓储管理及物流配送等领域,当生产现场环境恶劣时,人工不能完成的任务如物料运输和装卸等,可采用智能寻迹小车完成相应的任务。基于生产现场和日常生活的实际需要,研究和开发智能小车寻迹系统具有十分重要的意义。该项目的研究可以应用于机车头灯自动寻迹、工厂自动化、仓库管理、智能玩具和民用服务等领域,可提高劳动生产效率,改善劳动环境。三、研究计划2007年6月1日-2007年6月20日,收集资料,确定研究内容、技术方案、研究路线。(由组内3人共同研究)。2007年6月21日-2007年7月30日,完成小车硬件的电路制作(陈绪雄负责小车整体方案确定、制作电路板,周锋负责购买元器件和电路焊接,蒋晶负责电路图绘制)。2007年8月1日-2007年9月8日,完成小车软件的编写和小车整机调试。(三人共同协作完成)。2007年9月10日-2008年3月6日,完成成果总结。四、研究内容1 方案与论证1.1控制芯片的选择方案一:选用AVR单片机Atmega128L,Atmega128L是高性能、低功耗的 AVR 8 位微处理器,64引脚。采用先进的 RISC 结构,具有133 条指令,大多数可以在一个时钟周期内完成。它具有两个独立的预分频器和比较器功能的8 位定时器/计数器和两个具有预分频器、比较功能和捕捉功能的16 位定时器/计数器及具有独立预分频器的实时时钟计数器。片内带有模拟比较器。具有上电复位以及可编程的掉电检测功能。其片内资源丰富,具有: 8个外部中断, 4个定时计数器,53个I/O口,可解除I/O口资源不足的困难。其引脚大多数都有具有第二功能,功能强大。.方案二:采用AT89S52单片机,AT89S52 单片机是一种低功耗、高性能CMOS 8位微控制器,具有8K 在系统可编程存储器。使用Atmel 公司高密度非易失性存储器技术制造,与工业80C51 产品指令和引脚完全兼容。片上Flash允许程序存储器在系统可编程,亦适于常规编程器。AT89S52有5个中断源,和3个定时计数器。方案三:采用FPGA(现场可编辑门列阵)作为系统控制器。FPGA可以实现各种复杂的逻辑功能,规模大,集成度高,体积小,稳定性好,并且可利用EDA软件进行仿真和调试。FPGA采用并行工作方式,提高了系统的处理速度,常用于大规模实时性要求较高的系统。方案比较:由三种方案可以看出,以Atmega 128L核心可以方便地实现对各个部分的控制和外接,而AT89S52而需要外扩大量的I/O口才能满足需要,而FPGA的高速处理能力得不到充分发挥且价格较贵,所以我们选择方案一。(2)轨道行程控制方案的选择为了使电动车能够识别黑线不跑离轨道,我们在系统中加装了光电传感器和金属传感器。1.2 路面检测 我们采用检测黑线的方法来控制智能小车的行走轨迹,使用了两个红外对管来检测黑线,同时用超声波传感器检测小车周围的障碍物。方案一:采用热探测器。热探测器是利用所接收到的红外辐射后,会引起温度的变化,温度的变化引起电信号输出,且输出的电信号与温度的变化成比例,温度变化是因为吸收热辐射能量引起的,与吸收红外辐射的波长没有关系,即对红外辐射吸收没有波长的选择。但热探测器对其吸收的红外辐射波长没有选择性,受外界环境的影响比较大。 方案二;采用光电探测器。光电探测器接收红外辐射后,由于红外光子直接把材料的束缚态电子激发成传导电子,由此引起电信号输出,信号大小与所吸收的光子数成比例。且这些红外光子的能量的大小(即红外光还必须满足一定的波长范围),必须满足一定的要求,才能激发束缚电子,起激发作用。光电探测器吸收的光子必须满足一定的波长,否则不能被吸收,所以受外界影响比较小,抗干扰比较强。基于上面分析,我们采用方案二1.3 小车运行终点检测方案一:采用计算路程的方法来控制。只要将计算出来的路程不断的与预置的初值进行比较,只要相等说明已经到了终点,倒回起点也如此。这种方法不仅计算路程麻烦而且占用了CPU的开销。方案二:采用检测金属片的方法。只要在运行轨迹的终点放置一块铁片,再用金属传感器检测金属片就可以了,电路简单、程序采用中断的方式不会占用很多CPU资源。综合上述我们采用方案二1.4 显示装置的选择方案一:采用美信公司的MAX7219是一款串行共阴极数码管动态扫描显示的驱动芯片,其峰值段电流可达到40mA最高串行扫描频率10MHz,典型扫描频率为1.3MHz,仅用3线串行接口传送数据,可直接与单片机接口,用户可以方便地修改其内部参数以实现多位LED显示。它内含硬件动态扫描显示控制电路,每片芯片可同时驱动8位共阴LED。点是控制比较简单,而且串行显示只占用很少的I/O口。方案二:采用点阵型LCD显示,点阵型LCD虽然占用的I/O口资源多,控制比较复杂,但其功能强大的,显示信息量大,可以保证良好的用户模式。它具有显示质量高、体积小、重量轻、功耗低、轻薄短小、无辐射危险、平面直角显示以及影像稳定不闪烁等优势,可视面积大,图面积效果好,分辨率高,抗干扰能力强等特点等优点。考虑到Atmega128 I/O口资源丰富和LCD的众多优点,我们选择使用LCD显示。2 主要电路设计与分析2.1系统结构框图单片机将传感器送来的数据进行处理、算法分析,其输出信号控制电机并送LCD显示。光电传感器负责黑线的检测,引导智能小车的行使轨迹。金属传感器负责前起点和终点的检测,当金属传感器检测到金属条时,说明电动小车已经到起点或终点,采用超声波传感器检测智能小车的周围障碍物及其距离,若检测的距离达到超过给定值,发出声光报警,声音报警信号为“请注意倒车”。系统框图如图2.1。图2.1 系统框图2.2系统模块理论分析与设计(1)探测路面黑线的基本原理当光线照射到路面会反射,由于黑线和地面对光的反射系数不同,可根据接收到的反射光强弱,用光电传感器判断黑线。光电管基本原理图如图2.2。图2.2光电管基本原理图当光电管检测不到黑线时,红外光管接收到反射回来的红外光,使其输出由高电平立即跳至低电平。我们在小车上并排加上两个红外光电管,黑线置于两红外光电管之间,并且将两个光电管产生的电信号脉冲分别送单片机的PE2和PE3。这样通过PWM来调节两个电机的速度来校正行使路线,电动车行驶状态和红外对管产生的电信号关系如表2-1。表2-1 电动车行驶状态和红外对管产生的电信号关系(2)金属探测模块金属探测模块主要用于行驶轨迹中金属片的探测。考虑到金属一般都是导体,根据电磁场理论可知,在受到变化的电磁场作用的任何导体,都会产生电涡流。因此,在本系统中采用电感式接近开关实现对金属片的检测。电感式接近开关由LC高频振荡器和放大处理电路组成,金属物体接近传感器的振荡感应头时,物体内部产生电涡流,当电涡流作用于接近开关时,接近开关振荡能力衰减,内部电路的参数发生变化,由此识别出有无金属物体接近,进而控制开关的通和断,并以电信号脉冲的形式送入单片机的PD7。电感式接开关内部工作原理图如图2.3。图2.3电感式接开关内部工作原理图 (3)电机驱动模块L298是一个4通道逻辑驱动电路,既将逻辑控制电平进行功率放大,可以用于功率驱动的电压。电机驱动模块电路如图2.4所示。图2.4 电机驱动模块电路PWM(脉冲宽度调制)控制,配用L298驱动电路实现直流电机的调速,非常简单且调速范围大,它利用的是直流斩波原理,假设高电平导通,在一个周期T内导通时间为t,那么一个周期T内的平均电压,其中=称为占空比。各周期内不同的占空比示例如图2.5。图2.5 各周期内不同的占空比示例电机的转速与电机两端的电压成正比,而电机两端的电压与控制波形的占空比成正比,因此电机的速度与占空比成正比,占空比越大,电机转得越快,当占空比时,电机转速达到最大。3 程序设计主程序流程图主要包括传感器输出中断的查询、电平的检测和电机的响应等。主程序流程图如图3.1所示。图3.1主程序流程图4 功能测试通过测试,智能小车能按任意设定路线行驶,能实现以下功能:(1) 沿着直线轨迹行使。(2) 沿着S型设定轨迹行使。(3) 沿着任何设置的轨迹行使。(4) 小车行使到达轨迹终点时,自动停留5秒并发出声光报警之后自动寻迹倒回行使到起点。(5) 沿轨迹行使过程中,检测到障碍物时,自动停止5s,并发出声光报警“请注意倒车”。4 小结项目设计中采用具有丰富资源的Atmega128单片机和光电传感器、金属传感器、超声波传感器等,实现相应信号的检测与小车的控制,系统结构简单、稳定、具有较高的控制精度、抗干扰能力强,实现了智能小车能按任意轨迹行驶。五、成果创新点智能小车能检测障碍物及其距离,并发出声光报警 “请注意倒车” 信号,智能小车能沿任意设定轨迹行驶,具有实际应用价值和推广价值。六、项目研究展望对智能寻迹小车的研究,加装GPS(全球卫星定位系统)或加装基于Internet的接口电路,智能寻迹小车将具有更广泛的应用前景和使用价值,这也是我们以后的研究方向。附录一:实物电路图附件二:实物照片附录三:程序清单/*This program was produced by theCodeWizardAVR V1.24.1d StandardAutomatic Program GeneratorCopyright 1998-2004 Pavel Haiduc, HP InfoTech s.r.l.http:/www.hpinfotech.roe-mail:officehpinfotech.roProject : LTPC-3500Version : 1.0Date : 2007-6-1Author : HNHYLEI Company : HNGXY Comments: Chip type : ATmega128LProgram type : ApplicationClock frequency : 8.000000 MHzMemory model : SmallExternal SRAM size : 0Data Stack size : 128*/#include #include #include #include #include /-#define buzzer_led PORTB.0#define LED1 PORTD.0 #define LED2 PORTD.1 #define LED3 PORTD.2 #define LED4 PORTD.3 #define lpwm_ff PORTB.4 #define lpwm_re PORTA.4 #define rpwm_ff PORTB.7 #define rpwm_re PORTA.5 #define black_l PINE.2#define black_r PINE.3#define metal_detect PINF.0#define model PINF.2/- 液晶#define uchar unsigned char #define rs PORTA.7#define rw PORTB.5#define en PORTB.6#define ret PORTA.6/LCD数据数据口初始化 #define data PORTCuchar command,data1,data2,com0;uchar lcd_bufl,lcd_bufg;/定义显示缓冲区/-/ Declare your global variables here/ This flag is set on USART0 Receiver buffer overflowbit left_run=0; /左走bit right_run=0; /右走bit left_ff=1; /左前进bit right_ff=1; /右前进 bit left_pwm; /用于左PWMbit right_pwm; /用于右PWM/-/-bit filter_start=0; /数字滤波bit filter_over=0; /数字滤波 bit black_l1=0; /左黑线1bit black_l2=0; /左黑线2bit black_r1=0; /右黑线1bit black_r2=0; /右黑线2 bit left_turn=0; /左转 bit right_turn=0; /右转bit metal1=0; /金属1bit metal2=0; /金属2bit mode=0; /测试模式bit stop_point; /停车点bit buzzer=0; /蜂鸣bit lcd_dsp=0; /LCD刷新 bit read_over; /bit gradient_set=0; /bit stop_status=0; /unsigned char speed_l; /left速度控制量unsigned char speed_r; /right速度控制量unsigned char filter_count; /数字滤波 unsigned char excute_step1; /unsigned char excute_step2; /unsigned int bcd_temp0=0; /BCD 入口 /-unsigned char count1=0; /秒计时 unsigned char count2=0; /转弯计时unsigned int count3=0; /停止时间计时 unsigned int count4=0; /unsigned int count5=0; / unsigned int stop_time=0; /停止时间 unsigned int gradient=0; / unsigned int gradient2=0; / unsigned int gradient_old; /unsigned int gradient2_temp18; / unsigned int filter_temp150; /数字滤波 unsigned long int filter_sum; unsigned int filter_temp3;/-unsigned char j1,k1; /公共循环变量unsigned char bcd_temp5=0; /BCD分解值/-unsigned int ahead_time=0; /前进时间 unsigned int back_time=0; /倒退时间 /EEPROM- /-void bcd_con(unsigned char numb);void clear_lcd();void lcd_int();void lcd_set();void display();void dis_code1(); void dis_code2(); void write_command(uchar command);void write_data(uchar data0); /- /-/ External Interrupt 0 service routine interrupt EXT_INT0 void ext_int0_isr(void)/ Place your code here / External Interrupt 4 service routine interrupt EXT_INT4 void ext_int4_isr(void) TCNT3H=0x00; TCNT3L=0x00;/ External Interrupt 5 service routine interrupt EXT_INT5 void ext_int5_isr(void) if(filter_start=0) filter_temp1filter_count=(unsigned int)TCNT3H*0xff+(unsigned int)TCNT3L; filter_count+;if(filter_count=50) /60 filter_count=0; filter_start=1; if(filter_over=1)filter_over=0;gradient=filter_temp3; read_over=1; /-/ Timer 0 overflow interrupt service routineinterrupt TIM0_OVF void timer0_ovf_isr(void)/TCNT0=0x06;left_pwm=left_pwm;if(left_pwm=1) if(left_turn=1) TCNT0=255-(speed_l/2); else TCNT0=255-speed_l; else if(left_turn=1) TCNT0=speed_l/2; else TCNT0=speed_l; if(left_run=1) if(left_pwm=1) if(left_ff=1) lpwm_ff=1; lpwm_re=0; else lpwm_ff=0; lpwm_re=1; else lpwm_ff=0; lpwm_re=0; else lpwm_ff=0; lpwm_re=0; /-/ Timer 1 overflow interrupt service routine interrupt TIM1_OVF void timer1_ovf_isr(void)/ Place your code hereTCNT1H=0xff; TCNT1L=0x06; /-前进时间 if(+count1=128) count1=0; if(excute_step1=0&excute_step2!=2) ahead_time+; if(excute_step1=2) back_time+; lcd_dsp=1; /- if(mode=1&ahead_time=128) count3=0; stop_time+; lcd_dsp=1; if( buzzer=1) buzzer_led=buzzer_led; LED1=LED1; LED2=LED2; LED3=LED3; LED4=LED4; else buzzer_led=1; LED1=1; LED2=1; LED3=1; LED4=1; if(stop_time=5) stop_point=0; buzzer_led=1; /- 检线停止if(mode=1)if(stop_status=0) if(+count4=35) count4=0; stop_status=1; if(stop_status=1) if(+count4=200) count4=0; stop_status=0; /- if(black_l=0) /左循迹 if(black_l1=1) black_l2=1; black_l1=1; else black_l1=0; black_l2=0; right_turn=0; count2=0; if( black_l2=1&right_turn=0) right_turn=1; if(right_turn=1) if(+count2=150) count2=0; right_turn=0; /- if(black_r=0) /右循迹 if(black_r1=1) black_r2=1; black_r1=1; else black_r1=0; black_r2=0; count2=0; left_turn=0; if( black_r2=1&left_turn=0) left_turn=1; if(left_turn=1) if(+count2=150) count2=0; left_turn=0; /- /金属传感器 if(metal_detect=0) if(metal1=1) metal2=1; metal1=1; else metal1=0; metal2=0; /-/ Timer 2 overflow interrupt service routine interrupt TIM2_OVF void timer2_ovf_isr(void)/ TCNT2=0xaf;right_pwm=right_pwm;if(right_pwm=1) if(right_turn=1) TCNT2=255-speed_r/2; else TCNT2=255-speed_r; else if(right_turn=1) TCNT2=speed_r/2; else TCNT2=speed_r; if(right_run=1) if(right_pwm=1) if(right_ff=1) rpwm_ff=1; rpwm_re=0; else rpwm_ff=0; rpwm_re=1; else rpwm_ff=0; rpwm_re=0; else rpwm_ff=0; rpwm_re=0; /- / Timer 3 overflow interrupt service routine interrupt TIM3_OVF void timer3_ovf_isr(void)/ Place your code here/TCNT3H=0xff; / 液晶 /LCD初始化void lcd_int(void) ret=0; /PORTG=PORTG&0b11110111; delay_ms(2); ret=1; /PORTG=PORTG|0b00001000; delay_us(1); /psb=1;/将PSB置1,通信方式为8BIT数据并口 delay_us(1);/LCD功能设置void lcd_set(void) command=0x34;/功能设置-8BIT控制界面,扩充指令集-这个可去掉 write_command(command); command=0x30;/功能设置-8BIT控制界面,基本指令集 write_command(command); command=0x01;/清屏幕显示,将DDRAM的地址计数器归零 write_command(command); command=0x06;/DDRAM的地址计数器(AC)加1 write_command(command); command=0x0c;/显示打开,光标关,反白显示关 write_command(command); /清屏程序void clear_lcd(void) command=0x01; write_command(command); command=0x34; write_command(command); command=0x30; write_command(command); /写指令程序void write_command(uchar command) delay_ms(5); rs=0; rw=0; data=command; en=1; delay_us(2); en=0;/写数据程序void write_data(uchar data0) delay_ms(5); rs=1; rw=0; data=data0; en=1; delay_us(2); en=0; /LCD显示程序void display(void) command=com0; write_command(command); data2=lcd_bufl; data1=lcd_bufg; write_data(data1); data1=data2; write_data(data1); /-void bcd_con(unsigned char numb) if(numb=5)goto numb5; if(numb=4)goto numb4; if(numb=3)goto numb3; if(numb=2)goto numb2;numb5: bcd_temp4=bcd_temp0/10000; bcd_temp0=bcd_temp0%10000;numb4: bcd_temp3=bcd_temp0/1000; bcd_temp0=bcd_temp0%1000;numb3: bcd_temp2=bcd_temp0/100; bcd_temp0=bcd_temp0%100;numb2: bcd_temp1=bcd_temp0/10; bcd_temp0=bcd_temp0%10; /-void digit_filter(void)/unsigned char filter_temp4;unsigned int filter_temp2; for(j1=0;j129;j1+) /58 for(k1=j1+1;k1filter_temp1k1) filter_temp2=filter_temp1j1; filter_temp1j1=filter_temp1k1; filter_temp1k1=filter_temp2; filter_sum=0; for(j1=10;j120;j1+) /49 filter_sum=filter_sum+filter_temp1j1; filter_temp3=filter_sum/10; filter_over=1; filter_start=0;/-/全角显示/显示代码区void dis_code1(void) com0=0x81; /衡 lcd_bufl=0xe2; lcd_bufg=0xba; display(); com0=0x82; /阳 lcd_bufl=0xf4; lcd_bufg=0xd1; display(); com0=0x83; /市 lcd_bufl=0xd0; lcd_bufg=0xca; display(); com0=0x84; /第 lcd_bufl=0xda; lcd_bufg=0xb5; display(); com0=0x85; /三 lcd_bufl=0xfd; lcd_bufg=0xc8; display(); com0=0x86; /届 lcd_bufl=0xec; lcd_bufg=0xbd; display(); com0=0x93; /大 lcd_bufl=0xf3; lcd_bufg=0xb4; display(); com0=0x94; /学 lcd_bufl=0xa7; lcd_bufg=0xd1; display(); com0=0x95; /生 lcd_bufl=0xfa; lcd_bufg=0xc9; display(); com0=0x89; /科 lcd_bufl=0xc6; lcd_bufg=0xbf; display(); com0=0x8A; /技 lcd_bufl=0xbc; lcd_bufg=0xbc; display(); com0=0x8B; /创 lcd_bufl=0xb4; lcd_bufg=0xb4; display(); com0=0x8C; /新 lcd_bufl=0xc2; lcd_bufg=0xd0; display(); com0=0x8D; /竞 lcd_bufl=0xf3; lcd_bufg=0xb4; display(); com0=0x8E; /赛 lcd_bufl=0xfc; lcd_bufg=0xc8; display(); / void dis_code2(void) com0=0x80; /前 lcd_bufl=0xb0; lcd_bufg=0xc7; display(); com0=0x81; /进 lcd_bufl=0xf8; lcd_bufg=0xbd; display(); com0=0x82; /时 lcd_bufl=0xb1; lcd_bufg=0xca; display(); com0=0x83; /间 lcd_bufl=0xe4; lcd_bufg=0xbc; display(); com0=0x84; /全角 : lcd_bufl=0xba; lcd_bufg=0xa3; display(); com0=0x90; /停 lcd_bufl=0xa3; lcd_bufg=0xcd; display(); com0=0x91; /止 lcd_bufl=0xb9; lcd_bufg=0xd6; display(); com0=0x92; /时 lcd_bufl=0xb1; lcd_bufg=0xca; display(); com0=0x93; /间 lcd_bufl=0xe4; lcd_bufg=0xbc; display(); com0=0x94; /全角 : lcd_bufl=0xba; lcd_bufg=0xa3; display(); com0=0x88; /倒 lcd_bufl=0xb9; lcd_bufg=0xb5; display(); com0=0x89; /退 lcd_bufl=0xcb; lcd_bufg=0xcd; display(); com0=0x8a; /时 lcd_bufl=0xb1; lcd_bufg=0xca; display(); com0=0x8b; /间 lcd_bufl=0xe4; lcd_bufg=0xbc; display(); com0=0x8c; /全角 : lcd_bufl=0xba; lcd_bufg=0xa3; display(); com0=0x98; /倾 lcd_bufl=0xe3; lcd_bufg=0xc7; display(); com0=0x99; /斜 lcd_bufl=0xb1; lcd_bufg=0xd0; display(); com0=0x9a; /脉 lcd_bufl=0xf6; lcd_bufg=0xc2; display(); com0=0x9b; /宽 lcd_bufl=0xed; lcd_bufg=0xbf; display(); com0=0x9c; /全角 : lcd_bufl=0xba; lcd_bufg=0xa3; display(); /- /- void dis_code3(void) bcd_temp0=ahead_time; bcd_con(4); if(mode=0) com0=0x85; else com0=0x95; lcd_bufl=bcd_temp2+0x30;
展开阅读全文