当前位置:文档之家› 自动寻轨小车

自动寻轨小车

摘要:本设计采用AT89S52作为系统控制核心,采用光电传感器来检测信号,用两个步进电机分别驱动后轮,电机驱动采用功率放大管,通过单片机给定的控制信号进行换相,灵活方便地对步进电机的速度和转向进行控制,进而达到控制电动车在黑色轨迹上的运动。

关键词:电动车;双步进电机;单片机;光电传感器1 系统设计1.1 设计任务和要求1.1.1设计任务设计并制作一个自动寻迹小车,小车从安全区域启动,按指定路线运行,自动区分直线轨道和弯路轨道,在指定弯路处拐弯,实现灵活前进、转弯、倒退等功能。

1.1.2 基本要求在不加配重的情况下,电动车完成以下运动:(1) 公交车从起始站点A出发,沿着黑色引导线,公交车从起始站点A出发,沿着黑色引导线,到达终点B;(2) 小车按指定路线运行,自动区分直线轨道和弯路轨道,在指定弯路处拐弯,实现灵活前进、转弯、倒退等功能,在轨道上划出设定的地图;(3) 到达指定的目的地后发出声光报警。

0.5米C 墙壁B24厘米0.375米30厘米50厘米30厘米1.5米0.375米30厘米24厘米0.375 米 A1.5米1.1.3发挥部分将配重固定在可调整范围内任一指定位置,电动车完成以下运动:(1) 在小车的车头和车尾装上转向灯(黄灯)和停止提示(红灯);(2) 可在小车车身装上LED显示小车的运行状况和语音提示等功能(3) 其他。

1.2 总体设计方案1.2.1系统总体设计思路本系统实现电动车地板上沿黑色轨迹行驶并实时显示车运行状况。

总体设计思路如图1所示。

系统包括控制器模块、电源模块、信号检测模块、电机及其驱动模块、键盘模块等四部分。

系统工作时,单片机接收传感器的输出信号后输出控制信号,采用黑白线引导、反射式光电传感器检测,使小车在轨道上自动行驶。

1.2.2 方案论证与比较(1)控制器模块的设计方案论证与选择方案一:采用FPGA作为系统主控器。

FPGA可实现各种复杂逻辑功能,规模大,集成度高,体积小,稳定性好,IO资源丰富、易于进行功能扩展,处理速度快,但适用于大规模实时性要求较高的系统,价格高,编程实现难度大。

本系统只需完成信号检测和电机驱动的控制,逻辑功能简单,对控制器的数据处理能力要求不高,故不选择此方案。

方案二:采用嵌入式系统作为主控器。

嵌入式系统工作频率较高,速度较快,控制功能很强,也有较强的数据处理能力。

但同样价格高,编程实现难度大。

方案三:采用Atmel公司的AT89S52单片机作为主控制器。

AT89S52是一个低功耗、高性能8位单片机,片内含8 KB Flash片内程序存储器,256 Bytes RAM,32个外部双向输入/输出(I/O)口,5个中断优先级,2层中断嵌套中断等。

价格便宜,使用方便,编程实现难度低,适合用来实现本系统的控制功能。

综上分析,本设计选择方案三。

(2)电机控制模块的设计方案论证与选择为实现电动车对行走路径的准确定位和精确测量,可考虑以下两种方案:方案一:采用直流电机。

直流电机转动力矩大,体积小,重量轻,装配简单,使用方便。

主要适合于高速电机系统,本系统要求控制精度较高,不易达到。

方案二:采用步进电机。

步进电机是数字控制电机,控制也简单,具有瞬间启动和急速停止的优越性,比较适合本系统要求控制精度高的特点。

综上分析,本系统选择方案二。

(3)电机驱动模块的设计方案论证和选择方案一:采用集成芯片L298N驱动步进电机。

L298N是一个具有高电压大电流的全桥驱动芯片,响应频率较高,稳定性较好。

但本系统两个电机时序不同,会出现需要不同延时程序的情况,系统处理负荷大,影响电机工作,同时价格相对较高。

方案二:用功率管(如TIP132,8A 70W)构成驱动电路来驱动电机。

结构简单,价格低廉,经测试完全可以驱动电机,完成控制功能。

综上分析,选择方案二。

(4)信号检测模块的设计方案论证和选择方案一:用光敏电阻组成光敏探测器。

光敏电阻原理简单,使用方便,价格低廉,但受光照强度影响很大,可靠性差。

方案二:采用角度传感器。

使用角度传感器来测量车体水平方向和竖直方向的角度,感测到的倾角信号经编码后传送给单片机,由单片机控制电动车的运行。

角度传感器灵敏度合适,响应速度好,但是使用复杂,价格昂贵,且不易购买。

方案三:用光电传感器。

光电传感器原理简单,实现方便,价格低廉,可集发射器和接收器于一体。

使用这类光电传感器电路简单,工作性能稳定,能完成需要的信号检测功能。

综上分析,选择方案三。

2 硬件电路设计2.1整机电路设计系统整机电路如附录1所示。

单片机系统作为控制核心,实时接收光电传感器的输出信号,经数据处理后送给各单元电路,控制各部分电路工作。

2.2各主要单元电路设计2.2.1 主控器模块的设计本系统主控制器如图2所示。

单片机接收传感器检测到的输入信号,将此信号进行运算处理,然后以控制电流或控制电压的方式输出给被控制的单元电路,实现各项功能。

图2 主控制器模块2.2.2 电机驱动模块的设计电动车左右两轮用电机分别控制,便于控制车转向。

电机采用功率放大管TIP132驱动,电机驱动电路如图3、图4所示。

电机的A、B、C、D端接功率放大管的集电极,功率管基极经限流电阻分别接单片机的I/O端口,控制电机的转向和速度。

图3 左轮电机驱动电路图4 右轮电机驱动电路2.2.3 信号检测模块的设计本设计用光电传感器采集信号,四个分别固定在轮子下的反射式传感器用来引导电动车寻迹,使电动车沿着白色轨迹运行,在运动过程中,当车偏离运动轨迹(超出黑线)时,即红外光线照射到黑色线上,反射光较少,接收管集电极和发射极间的电阻增大,输出高电平,复合管导通,输出高电平给单片机,引起系统中断,控制两个电机正转或反转,使车重新回到轨迹上。

车头和车尾的传感器用来检测小车前进时是否到达B点和倒退时是否到A点。

另外两个固定在跷跷板支架上的U型槽传感器用来检测平衡位置,当传感器中心轴被指针遮挡住时,红外三极管接收不到红外光,输出就从低电平跳到高电平,送给单片机,单片机使车停下来,说明平衡位置找到了。

两种传感器的工作原理实质相同,如图5所示。

图5 光电传感器检测信号原理图8 系统主程序流程图3 系统软件设计本系统的软件设计采用C语言,利用Keil C完成单片机系统的开发,实现各项设计功能和技术指标要求。

3.1 理论计算和分析本系统要达到设计指标,电动车在跷跷板上的运行速度是关键,电动车的速度有电机控制,本设计使用的步进电机齿数为50,步距角= ,Z为电机转子齿数,N为转子运行拍数。

齿数一定,步距角与转子运行拍数成反比。

所以取单双八拍式,则电机步距角小,更利于精确定位。

电机转一圈为800拍,转一圈的周长为188mm,所以每拍转过的长度为,每转过8拍后长度为0.47*8=3.76mm .设计要求电动车从A端到平衡位置C时间小于30s,假设电动车到达C运行时间为25s,电机转过的拍数N=800mm/0.47mm=1702.127拍,近似取1702.2拍,则电机每拍要用时间t=25s/1702.2=14.686ms.取电机每拍所用的时间为14ms,则假设电动车从B端返回到A端所用时间为= ,满足设计要求。

所以电机运转时序取单双八拍式正、反转。

程序中严格控制电机运转频率达到控制电动车速度。

3.2 系统主程序流程图系统主程序流程如图8所示,由于此系统实时性要求很高,大量数据信号要在尽量短的时间内完成,单片机将集中根据检测到的信号精确控制电机速度和转向,软件中定义电机控制时序缓存区,利用查寻法编程,单片机不断检测外部传感器信号,利用标志位查询电机时序,控制车的运动,输出显示。

4 系统测试分析设计完成后,对系统关键部分进行了测试分析,如语音播放电路,光电检测电路、电机控制电路,并进行了模拟场地试运行测试。

第一阶段:车的未接入检测信号时的运动Ø通过电动车上固定好两个步进电机作为两个后轮。

Ø后轮的驱动电路连接好Ø将电源接上,观察小车是否会沿着直线运行,不断的调试,适当的修改程序,使小车正常运行。

第二阶段:检测装置测试Ø将小车的检测电路连接好,用万用表测试小车遇到黑色物质时是否会出现高电平。

第三阶段:整机测试Ø连接好各部分电路,观测小车是否会按设计要求一样运行。

5 特色与创新点讨论硬件方面:采用双步进控制电动车,利于车转向,利用光电传感器与单片机之间的信号传输与转换,加上语音播放模块,实现电动车的智能化。

软件方面:传感器在检测到某物时,输出信号会发生变化,让单片机只对此规律的信号作出反应,减少了数据处理量,缩短了系统反应时间,并简化了程序,提高了系统的控制精度。

整个运行过程中通过实时信息采集,利用端口查询,实现对信号的实时检测和处理。

6 结束语本系统以单片机为核心部件,利用光电检测技术和一定的软件算法实现了电动车在黑色轨迹上自行运动,在设计过程中,力求线路简单,充分发挥软件的灵活性来满足系统设计的要求。

但因时间有限,系统还存在一些误差和有待改进的地方。

参考文献[1] 全国大学生电子设计竞赛组委会.第六届全国大学生电子设计竞赛获奖作品选编.北京:北京理工大学出版社,2005[2] 黄智伟,王彦,陈文光等.全国大学生电子设计竞赛训练教程.北京:电子工业出版社,2005[3] 胡汉才.单片机原理及接口技术.北京:清华大学出版社,2006[4] 王为青,程国钢.单片机Keil Cx51应用开发技术.北京:人民邮电出版社,2007附录1:整机电路原理图附录2:实现程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//****************电机控制时序*******************************//低四位为右轮,高四位为左轮uchar code zz[8]={0x91,0x83,0xc2,0x46,0x64,0x2c,0x38,0x19}; //前进时序uchar code left[8]= {0x11,0x33,0x22,0x66,0x44,0xcc,0x88,0x99}; //前进左拐(后退右拐)时序uchar code right[8]={0x99,0x88,0xcc,0x44,0x66,0x22,0x33,0x11}; //前进右拐(后退左拐)时序/********** 方向灯定义**********/sbit red =P1^0; //红灯sbit yel_r =P1^1; //右黄灯sbit yel_l =P1^2; //左黄灯/*******************************************************************//* *//* 延时函数*//* *//*******************************************************************/void delay(int ms){while(ms--){uchar i;for(i=0;i<120;i++){;}}}//*******************前进函数****************************void qj(){uchar i;for(i=0;i<8;i++)//八拍一个周期,转过3.76mm{P0=zz[i];delay(5);//延时5ms}}//********************前进左拐(后退右拐)函数****************************** void left1_turn(){uchar i;yel_l=1;//左黄灯亮for(i=0;i<8;i++)//八拍一个周期{P0=left[i];delay(5);}yel_l=0;//左黄灯灭}//********************前进右拐(后退左拐)函数****************************** void right1_turn(){uchar i;yel_r=1;//右黄灯亮for(i=0;i<8;i++)//八拍一个周期{P0=right[i];delay(5);}yel_r=0;//右黄灯灭}//**********************主函数*******************************void main(){uchar Q;P0=0xff;P2=0xff;Q=P2&0x0f;//EA=1;//EX0=1; //开外部中断0//IT0=1; //下降沿触发delay(10); //上电,等待稳定while(1){ P2=0xff; Q=P2&0x0f;switch(Q){// if(Q==0x01|Q==0x02) //前进左出轨case(0x01) :;case(0x02) : ;case(0x03): delay(10);right1_turn(); break; //右拐// if(Q==0x04|Q==0x08) //前进右出轨case(0x04):;case(0x08):;case(0x0c): delay(10);left1_turn();break; //左拐case(0x0a): P0=0x00;break;default :qj(); //未出轨,继续前进// else goto qj1;// goto qj1;}/* if(P2^0|P2^1)right1_turn();if(P2^2|P2^3)left1_turn();qj();*/}}。

相关主题