摘要:本寻迹小车是以感光板为车架,89s52单片机为控制核心,加以直流电机、光电传感器和电源电路以及其他电路构成。系统由89s52通过IO口控制小车的前进后退以及转向避障。寻迹由RPR220型光电对管完成。 关键词:AT89S52 直流电机 光电传感器 自动寻迹电动车 一、系统设计 1、设计要求(1)自动寻迹小车从安全区域启动。 (2)小车按指定路线运行,自动区分直线轨道和弯路轨道,在指定弯路处拐弯,实现灵活前进、转弯、避障等功能,在轨道上划出设定的地图。 寻迹路线如图1所示: file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpg2、小车循迹的原理这里的循迹是指小车在黑色地板上循白线行走,通常采取的方法是红外探测法。 红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。红外探测器探测距离有限,一般最大不应超过3cm。 3、模块方案比较与论证根据设计要求,本系统主要由控制器模块、电源模块、寻迹传感器模块、直流电机及其驱动模块、电压比较模块等模块构成。 为较好的实现各模块的功能,我们分别设计了几种方案并分别进行了论证。 3.1车体设计方案1:购买玩具电动车。购买的玩具电动车具有组装完整的车架车轮、电机及其驱动电路。但是一般的说来,玩具电动车具有如下缺点:首先,这种玩具电动车由于装配紧凑,使得各种所需传感器的安装十分不方便。其次,这种电动车一般都是前轮转向后轮驱动,不能适应该题目的方格地图,不能方便迅速的实现原地保持坐标转90度甚至180度的弯角。再次,玩具电动车的电机多为玩具直流电机,力矩小,空载转速快,负载性能差,不易调速。而且这种电动车一般都价格不菲。因此我们放弃了此方案。 方案2:自己制作电动车。经过反复考虑论证,我们制定了左右两轮分别驱动,后万向轮转向的方案。即左右轮分别用两个转速和力矩基本完全相同的直流电机进行驱动,车体尾部装一个万向轮。这样,当两个直流电机转向相反同时转速相同时就可以实现电动车的原地旋转,由此可以轻松的实现小车坐标不变的90度和180度的转弯。 在安装时我们保证两个驱动电机同轴。当小车前进时,左右两驱动轮与后万向轮形成了三点结构。这种结构使得小车在前进时比较平稳,可以避免出现后轮过低而使左右两驱动轮驱动力不够的情况。为了防止小车重心的偏移,后万向轮起支撑作用。 对于车架材料的选择,我们经过比较选择了有机玻璃。用有机玻璃做的车架比塑料车架更加牢固,比铁制小车更轻便,美观。 综上考虑,我们选择了方案2。小车底盘如图2所示: file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpg 图2 车体底盘图 3.2控制器模块方案1:采用可编程逻辑期间CPLD 作为控制器。CPLD可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。采用并行的输入输出方式,提高了系统的处理速度,适合作为大规模控制系统的控制核心。但本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。且从使用及经济的角度考虑我们放弃了此方案。 方案2:采用凌阳公司的16位单片机,它是16位控制器,具有体积小、驱动能力高、集成度高、易扩展、可靠性高、功耗低、结构简单、中断处理能力强等特点。处理速度高,尤其适用于语音处理和识别等领域。但是当凌阳单片机应用语音处理和辨识时,由于其占用的CPU资源较多而使得凌阳单片机同时处理其它任务的速度和能力降低。 本系统主要是进行寻迹运行的检测以及电机的控制。如果单纯的使用凌阳单片机,在语音播报的同时小车的控制容易出现不稳定的情况。从系统的稳定性和编程的简洁性考虑,我们放弃了单纯使用凌阳单片机而考虑其它的方案。 方案3:采用Atmel公司的89s52单片机作为主控制器。89s52是一个低功耗,高性能的8位单片机,片内含8k空间的可反复擦些100,000次的Flash只读存储器,具有2Kbytes的随机存取数据存储器(RAM),32个IO口,2个8位可编程定时计数器,1个16位可编程定时计数器,四通道PWM,内置8路8 位ADC。且AT89s52系列的单片机可以在线编程、调试,方便地实现程序的下载与整机的调试。 从方便使用的角度考虑,我们选择了方案3。 3.3电源模块由于本系统需要电池供电,我们考虑了如下集中方案为系统供电。 方案1: 采用10节1.5V干电池供电,电压达到15V,经7812稳压后给支流电机供电,然后将12V电压再次降压、稳压后给单片机系统和其他芯片供电。但干电池电量有限,使用大量的干电池给系统调试带来很大的不便,因此,我们放弃了这种方案。 方案2:采用3节4.2V可充电式锂电池串联共12.6V给直流电机供电,经过7812的电压变换后给支流电机供电,然后将12V电压再次降压、稳压后给单片机系统和其他芯片供电。锂电池的电量比较足,并且可以充电,重复利用,因此,这种方案比较可行。但锂电池的价格过于昂贵,使用锂电池会大大超出我们的预算,因此,我们放弃了这种方案。 方案3:采用12V蓄电池为直流电机供电,将12V电压降压、稳压后给单片机系统和其他芯片供电。蓄电池具有较强的电流驱动能力以及稳定的电压输出性能。虽然蓄电池的体积过于庞大,在小型电动车上使用极为不方便,但由于我们的车体设计时留出了足够的空间,并且蓄电池的价格比较低。因此我们选择了此方案。 综上考虑,我们选择了方案3。 3.4稳压模块方案1: 采用两片7812将电压稳压至12V后给直流电机供电,然后采用一片7809将电压稳定至9V,最后经7805将电压稳至5V,给单片机系统和其他芯片供电,但7809和7805压降过大,使7809和7805消耗的功率过大,导致7809和7805发热量过大,因此,我们放弃了这种方案。 方案2:采用两片7805将电压稳压至5V后给单片机最小系统和传感器供电,在7805前的12V为L298供电。 综上考虑,我们选择了方案2。 3.5寻迹传感器模块方案1:用光敏电阻组成光敏探测器。光敏电阻的阻值可以跟随周围环境光线的变化而变化。当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化。将阻值的变化值经过比较器就可以输出高低电平。 但是这种方案受光照影响很大,不能够稳定的工作。因此我们考虑其他更加稳定的方案。 方案2:用红外发射管和接收管自己制作光电对管寻迹传感器。红外发射管发出红外线,当发出的红外线照射到白色的平面后反射,若红外接收管能接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。这样自己制作组装的寻迹传感器基本能够满足要求,不过易受外界光的干扰,但是我们用热缩管套在红外发射和接收管外面,这样就能基本避免外界光干扰问题。 因此我们选择了方案2。 3.6电机模块本系统为智能电动车,对于电动车来说,其驱动轮的驱动电机的选择就显得十分重要。由于本实验要实现对路径的准确定位和精确测量,我们综合考虑了一下两种方案。 方案1:采用步进电机作为该系统的驱动电机。由于其转过的角度可以精确的定位,可以实现小车前进路程和位置的精确定位。虽然采用步进电机有诸多优点,步进电机的输出力矩较低,随转速的升高而下降,且在较高转速时会急剧下降,其转速较低,不适用于小车等有一定速度要求的系统。经综合比较考虑,我们放弃了此方案。 方案2:采用直流减速电机。直流减速电机转动力矩大,体积小,重量轻,装配简单,使用方便。由于其内部由高速电动机提供原始动力,带动变速(减速)齿轮组,可以产生较大扭力。 我们所选用的直流电机减速比为1:74,减速后电机的转速为100r/min。我们的车轮直径为6cm,因此我们的小车的最大速度可以达到 V=2πr·v=2*3.14*0.03*100/60=0.314m/s 能够较好的满足系统的要求,因此我们选择了此方案。 3.7电机驱动模块方案1:采用专用芯片L298N作为电机驱动芯片。L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可带有控制使能端。用该芯片作为电机驱动,操作方便,稳定性好,性能优良。以分别控制两个直流电机,而且还 方案2:对于直流电机用分立元件构成驱动电路。由分立元件构成电机驱动电路,结构简单,价格低廉,在实际应用中应用广泛。但是这种电路工作性能不够稳定。 因此我们选用了方案1。 4、电机驱动电路的设计.2 电机驱动电路: file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image006.png 图3 BLOCK DIAGRAM file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image008.png 图4 Biderectional DC Motor Control file:///C:/Users/admin/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png 图5 L298N驱动电路 图7 L298电机驱动电路 L298N的5、7、10、12四个引脚接到单片机上,通过对单片机的编程就可以实现两个直流电机的PWM调速以及正反转等功能。 4、最终方案经过反复论证,我们最终确定了如下方案: (1)车体用废弃的PCB电路板手工制作。 (2)采用89S52单片机作为主控制器。 (3)用蓄电池经7805稳压后为直流电机供电, (4)用自制的红外对管传感器,用电压比较器制作的光电对管进行寻迹。 (5)L298N作为直流电机的驱动芯片 三、软件实现 #include<reg52.h> #define uchar unsigned char //#define V_TH0 -25000/256//0XFF //#define V_TL0 -25000%256//0XF6 sbit in1=P2^7; sbit in2=P2^6; sbit pwm1=P2^5; //左轮 sbit in3=P2^4; sbit in4=P2^3; sbit pwm2=P2^2; //右轮 sbit zuo2=P1^5; //最左边 0有效 sbit zuo1=P1^4; sbit zhong=P1^3; //中间 0有效 sbit you1=P1^6; sbit you2=P1^7; //最右边 0有效 sbit kai=P1^2; // 开始键 0有效 sbit ting=P1^1; //停止键 0有效 sbit duo=P3^3; //避障 uchar x,y,z; void delay(void) {uchar i,j; for(i=0;i<100;i++) for(j=0;j<100;j++); } void delay1(uchar x) //延时子程序 { unsigned char a,b; for(a=x;a>0;a--) for(b=200;b>0;b--); } /*void time0(void) interrupt 1 using 0 { if(leve==1) { pwm=0; TH0=-25000/256; TL0=-25000%256; leve=0; } else { counter++; if(counter==ZKB1) { counter=0; TH0=-25000/256; TL0=-25000%256; if(count==1) { out1=1; out2=0;} if(count==2) { out1=0; out2=1; } } pwm=1; leve=1; } } */ //**********前进子程序************* void zou(z) { switch(z) { case 1: pwm1=pwm2=1;delay1(1000);pwm1=pwm2=0;delay1(1000);break;//直走 case 2: pwm1=1;pwm2=0;delay1(400);pwm1=pwm2=0;delay1(400);break;//右拐 case 3: pwm1=1;pwm2=0;delay1(900);pwm1=pwm2=0;delay1(900);break;//右急转弯 case 4: pwm1=0;pwm2=1;delay1(400);pwm1=pwm2=0;delay1(400);break;//左拐 case 5: pwm1=0;pwm2=1;delay1(900);pwm1=pwm2=0;delay1(900);break;//左急转弯 case 6: P0=0xff;pwm1=pwm2=1;delay(500);if(zhong==0);break;// 盲区 case 7: pwm1=1;pwm2=0;delay1(1000);pwm1=pwm2=0;delay1(1000);break;//大右拐 case 8: pwm1=1;pwm2=0;delay1(900);pwm1=pwm2=0;delay1(900);break;//右拐 case 9: pwm1=0;pwm2=1;delay1(900);pwm1=pwm2=0;delay1(900);break;//左拐 } } //*********************主函数***************** void main() { //EA=1; //ET0=1; //TMOD=0x11; //设置T0工作方式与初值 //TH0=0XFF; //-25000/256; //TL0=V_TL0; //-25000%256; //count=0; x=0; y=0; P2=0xff; P1=0x00; P3=0xff; while(1) { if(ting==0) { delay(); //TR0=0; in1=0; in2=0; in3=0; in4=0; pwm1=0; pwm2=0; //count=0; y=0; } if(kai==0) { //TR0=1; in1=1; in2=0; in3=1; in4=0; pwm1=1; pwm2=1; //count=1; y=1; } if(y==1) {if(zhong==0) {delay();zou(1); } //直走 if(zuo1==0) {delay();zou(2); } //右拐 if(zuo2==0) {delay();zou(3); } //大右拐 if(you1==0) {delay();zou(4); } //左拐 if(you2==0) {delay();zou(5); } //大左拐 if(P2==0x00&P3!=0x00) {delay();zou(6); } //盲区 if(P3==0x00) {delay();zou(7); } //大右拐 if(duo==0&P3!=0x00) {delay();zou(8); } //右拐 if(duo!=0&P2==0xff) {delay();zou(9); } //左拐 } } } 我们的寻迹小车在完成设计要求的前提下,充分考虑到了外观、成本等问题,在性能和价格之间作了比较好的平衡。由于设计要求并不复杂,我们没有在电路中增加冗余的功能,在电路中做了单片机最小系统这样烧写程序会方便些。并做了电机驱动模块,传感器模块。各模块相对独立,这样易于调试也易于改进电路。方便以后的扩展和进一步的开发。 另外,我们的车体底盘经过充分的论证和专业的设计,兼顾了美观、廉价、稳固、可靠等各方面的因素,具有较高的稳定性和推广意义。 鸣谢:天津工程师范学院 工程训练中心 七、参考文献 1.单片机典型模块设计实例导航 人民邮电出版社 求实科技编著 2.8051单片机典型模块设计与应用 人民邮电出版社 钟富昭 编著 张晨改编 3.产品 C语言设计实例详解 北京航空航天大学出版社 周兴华 编著 4.51单片机C语言程序设计快速入门 人民邮电出版社 田立 田清 代方震 编著 5.单片机应用系统设计技术——基于C语言编程 电子工业出版社 张奇 杜群贵 编著
|