收藏 分销(赏)

智能循迹小车.doc

上传人:xrp****65 文档编号:5701175 上传时间:2024-11-15 格式:DOC 页数:18 大小:733.77KB 下载积分:10 金币
下载 相关 举报
智能循迹小车.doc_第1页
第1页 / 共18页
智能循迹小车.doc_第2页
第2页 / 共18页


点击查看更多>>
资源描述
智能循迹小车 【摘要】智能循迹小车的设计是以MSP430F149单片机为控制核心,利用TCRT5000反射式光电传感器、比较器实现黑线检测,并将检测的信息送单片机分析和处理,单片机根据计算和分析的结果,控制电机的速度及方向,从而实现自动循迹功能。其中驱动电机由L298N驱动电路实现,速度由单片机输出的PWM实现,并通过单片机内部的AD采样,采样传感器的电压值,根据采集的数据判断小车的行驶状态。 为了实现人机交互功能,设计中增加了LCD和键盘,用LCD12864液晶显示器来显示所检测的黑线状态,按键实现小车的启动和停止。 经测试,智能循迹小车能够自动识别黑线,按照引导线行进,可以左转、右转,也可对测量结果进行实时显示。达到了预期要求。 【关键字】小车 MSP430单片机 L298N TCRT5000传感器 Abstract: The design of intelligent tracking car is based on MSP430F149 microcontroller as the control core ,TCRT5000 reflection type photoelectric sensor is used for comparator implement to detect black line, the information will be sent to microcontroller to analysis and processing,besides, microcontroller according to the result of calculation and analysis control the motor speed and direction, so as to realize automatic tracking function.the drive motor driven by L298N circuit implementation, speed was controlled by PWM output, according to the single chip microcomputer internal AD sampling to collected data so as to judge state of driving cars. In order to reaches interface friendly , the design of LCD and keyboard has been increased in, LCD12864 to display the state of detection by the black line, start and stop buttons to control the car run or not. After testing ,the tracking car can automatically identify the black line, the car can turn left, turn right by it , also may carry on the real-time display of measurement results. The system reaches expected require. Keywords: Intelligent car MSP430F149 L298N TCRT5000 sensor 1. 方案设计 1.1总体方案设计 根据题目要求,本系统设计的目标主要包括控制部分,循迹部分,驱动部分,显示部分等组成。如图1-1所示。 图1-1 智能循迹小车 从以上可以看出,电动小车的系统一般由小车循迹,控制中心、驱动电路及电动机等4个主要部分组成。其工作原理如下:首先将反射式光电传感器检测到黑线的结果送入电压比较器进行比较,比较器输出的高低电平进行分压之后,送入到单片机进行采样,进而在128*64中显示。同时,单片机通过方波控制驱动电路,驱动电机工作。 1.2 算法分析 如右图1-2所示是小车行进轨迹,起点和终点在图中标示。小车的传感器分布如图1-3所示,遇到黑线则判断为1,遇到白线则为0。这个行进轨迹中有两个T字路口和十字路口。小车在这路线上行驶时会出现偏离轨道的问题,我们一般的处理办法是在小车有偏离轨道的地方立即通过软件进行调整。例如在传感器传来001的右偏信息后,单片机马上控制P4.3等几个控制口调整PWM波的占空比使小车左转回来。 图1-3 红外探测的排列 图1-2 小车运行轨迹 由于小车在快速行驶时,有可能会全部偏离轨道,并且会出现十字路口和T字路口的特殊状态 。在全部偏离轨道的时候,我们一开始的处理办法是:当是直走而全部偏离轨道时调整PWM波(一般是调整CCTR3和CCTR6的值来调整占空比)使小车向右大转,它会自己找到黑线,如果是由于在调整左右偏时没来的及及时调整而偏离轨道的状况,它会保持刚才的状态,小车也会找到原来的位置。但是这样处理小车跑下来并不流畅,改进的算法就是在小车跑离轨道时记住上一个状态,将前后两个状态一起分析后再做行驶轨迹的处理,例如当上一次状态是001而此刻状态是0000时就判为右全偏了,然后进行左调整。 在十字和T字路口的时候处理方法如下:当上面的红外传感器为0,其他全为1,时,记住此时的状态,当下一个状态为全0的时候,我们就暂时判为T字路口,此时,让小车直走0.5s,如果,此时依然为全0,则就是T字路口,小车就马上倒退到终点处,开始进行旋转360度,此时会出现碰到T形黑线的地方,我们做的处理是让它先旋转0.5s摆脱那个黑线,然后继续让它旋转,直到有传感器碰到黑线,小车就会自动调整到回去的直道上去;当没有出现刚才T字情况或者出现全1时判为十字路口,并且让它直走。如下表所示: 表1-2 算法分析表及电机运动状态 红外传感器探测头 电机驱动控制引脚 P6.1中 P6.2右 P6.3左 P6.4上 小车状态 P4.3左 P5.1左 P4.6右 P5.3右 电机动作 1 0 0 1 直走 占空比100% 占空比0% 正常行驶 0 0 1 × 右微偏 占空比32% 占空比100% 左微转 1 0 1 × 右偏 占空比80% 占空比0% 左转 1 1 0 × 左偏 占空比0% 占空比80% 右转 0 1 0 × 左微偏 占空比100% 占空比32% 右微转 1 1 1 0 T字路口 占空比100% 占空比50% 旋转360 1.3方案的论证及选择 1.3.1 电机驱动电路的选择 方案一:采用继电器对电动机的开或关进行控制,通过开关的切换对小车的速度进行调整.此方案的优点是电路简单,缺点是继电器的响应时间慢,容易易损坏,寿命较短,可靠性低。 方案二:采用电阻网络或数字电位器调节电动机的分压,达到分压的目的。但电阻网络只能实现有级调速,而数字电阻的元器件价格比较昂贵。而且一般的电动机电阻很小,电流很大,分压不仅回降低效率,而且实现很困难。 方案三:采用由达林顿管组成的 H型桥式电路,用单片机控制达林顿管使之工作在占空比可调的开关状态下,精确调整电动机转速。H型桥式电路保证了简单的实现转速和方向的控制,是一种可以广泛采用的 PWM调速技术的器件。这种调速方式有特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,我选用了L298N。 1.3.2 控制方案选择 方案一:选用一片CPLD作为系统的核心部件,实现控制与处理的功能。CPLD具有速度快、编程容易、开发周期短等优点,可利用VHDL语言进行编写开发。但CPLD在控制上较单片机有较大的劣势。为此,我们不采用该种方案。 方案二:采用通用的51单片机,运用广泛,有良好的知识作为基础,上手很快,单本系统程序量大,需要的I/O口自然就多,51单片机难以胜任。 方案三:系统采用TI公司生产的MSP430单片机作为主控制芯片,有非常丰富的资源,6个8位并行口,其中两个有中断功能,有12位的内部外设ADC,进行AD转换,精密的比较器,强大的定时器A和B,可以产生驱动控制的PWM波,进而减少外接器件,用其控制行进中的小车,以实现其既定的性能指标。 基于以上分析,我们选择方案三。 1.3.3 循迹电路方案选择 方案一:可见光发光二极管与光敏二极管组成的发射-接收电路,这种方案的缺点在于其他环境光源会对光敏二极管的工作产生很大干扰,一旦外界光亮条件的变化,很可能造成误判或漏判。 方案二:采用不调制的反射式红外发射-接收器。红外管可以代替普通的可见光管,能有效降低可见光源的干扰,尺寸小,质量轻,灵敏度高,能够准确的实施检测。 对比三种方案,综合考虑到小车的性能等问题,选择方案三。 2. 硬件电路设计 2.1系统原理框图设计 图2-1 系统原理框图 2.2接口设计 2.2.1电机驱动及光电隔离电路 L298N是ST公司生产的一种高电压、大电流电机驱动芯片。主要特点是:工作电压高,最高工作电压可达46V;输出电流大。内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器线圈等感性负载;采用标准逻辑电平信号控制;使用L298N芯片驱动电机,该芯片可以驱动两台直流电机。 电机驱动电路如下,从中,我们可以看出除了电机驱动电路,还有有TLP521-4所组成的光电隔离电路,隔离的是电机驱动电路和单片机之间电源的干扰,增加安全性,简化电路设计,较小系统误差。 2.2.2循迹及电压比较电路 反射式光电传感器在有黑线的白纸上检测黑线,当检测到黑线时,红外二极管发出的光被黑线吸收,反射不到红外三极管上面,三极管电阻很大,不导通,通过电压比较器进行比较,电压比较器的反相输入端通过电阻分压维持在1.55V,此时正相输入端的电压大于反相输入端,电压比较器输出高电平;当检测到的是白线时,反射到白线上的光不能被红外三极管吸收,电阻值大幅度减小,正相输入端的电压小于参考电压,输出低电平。 2.2.3电源电路设计 在电源模块中,将直流电源输出的电压分别接到电机驱动电路和7805稳压电路,并将稳压管输出的电压给单片机MSP430,电压比较器LM393,反射式光电传感器TCRT5000,及光电隔离TLP521-4供电,保证其正常工作。 3. 软件设计 3.1 程序设计 图3-1 主程序设计流程图 图 3-2 小车状态控制 4. 性能测试与分析 4.1测试仪器 序号 名称 型号 数量 备注 1 直流稳压电源 EM1715A 1 给电路提供电源 2 万用表 DM3068 1 精度6 1/2 3 示波器 DS1102CA 1 显示波形 4.2测试方案 1. 首先测试在自行车型的黑线上,小车能否实现如期的功能:完整的沿着黑线行走。 2. 第二,测试小车能否识别T字路线和十字路线,进而在相应的T字和十字路口做出相应的判断实现不同的走法。 3. 第三,在实现原有的基础上,加大小车的供电电压,看小车是否能平稳的行走,平稳的转弯。 4.3测试结果分析 次数 供电电压 时间 测试结果 1 6.5V NULL 128*64不显示 2 6.9V 75s 较好 3 7.5V 68s 较好 4 8.1V 63s 最好 5 8.7 NULL 转弯处冲出跑道 5.总结 本次设计的智能小车,在整个设计制作过程中,以系统的性能指标和运行的稳定性为目标,本着稳定性和精确性并重的原则,在算法上,我们进行了相当精确地分析,对于偏离轨道,十字和T字的分析完全达到预期要求,完成了设计题目所规定的基本指标和要求。 附录: 1. 电机驱动及光电隔离电路 2. 红外探测及电压比较 3. 电源模块电路 4.MSP430原理图 5.小车实物图 6.小车轨迹图 7.小车控制程序: #include "msp430x14x.h" #include "dingyi.h" #define uchar unsigned char #define uint unsigned int #define ulong unsigned long extern void cls(); extern void fnLCMInit(); extern void point(unsigned char x,unsigned char y,unsigned char s); extern void Linexy(unsigned char x0,unsigned char y0,unsigned char xt,unsigned char yt,unsigned char s); extern void circle(unsigned char Ox,unsigned char Oy,unsigned char Rx,unsigned char s); extern void printf(char col,char row,char dat); uchar a[7]={33,16,26,16,14,16,16};//初始时显示A0:0.00。。。8通道AD采样数值的存储单元 uchar b[7]={33,17,26,16,14,16,16}; uchar c[7]={33,18,26,16,14,16,16}; uchar d[7]={33,19,26,16,14,16,16}; uchar Bit1[3]={0,0,0}; uchar Bit2[3]={0,0,0}; uchar Bit3[3]={0,0,0}; uchar Bit4[3]={0,0,0}; ulong Sum1=0; //20个数据的和 ulong Sum2=0; ulong Sum3=0; ulong Sum4=0; ulong VBuf1=0; //电压扩大10000000的值 ulong VBuf2=0; ulong VBuf3=0; ulong VBuf4=0; uint ADCBuf_1[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的数据 uint ADCBuf_2[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; uint ADCBuf_3[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; uint ADCBuf_4[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; uchar Count=0,x=0,y=0; uchar keyvaluep1=0; uchar flag=0; uchar state,temp_flag; //延时子程序 void DelayMs(uint ms) { while(ms--) { for(uint i=0;i<800;i++); } } //时钟初始化函数 void InitClock(void) { BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启 LFXT1工作在低频模式 ACLK不分频 最高的标称频率 DCOCTL=DCO2+DCO1+DCO0;//DCO为最高频率 do{ IFG1&=~OFIFG;//清除振荡器失效标志 for(uint i=255;i>0;i--); }while(IFG1&OFIFG);//判断XT2是否起振 BCSCTL2=SELM1+SELS;//MCLK SMCLK时钟源为TX2CLK不分频 } //端口初始化函数 void InitPort() { P1SEL=0x00;//P1口所有引脚设置为一般的IO口 P1DIR=0xfc;//P1.0 P1.1 P1.2 P1.3~p1.5设置为输出方向 P1OUT=0x00;//P1口先输出低电平 P1IE=0x03;//P1.0,p1.1中断允许 P1IES=0x03;//P1.0,p1.1下降沿触发中断 P2SEL=0x00;//P2口所有引脚设置为一般的IO口 P4SEL=0x00;//P4口所有引脚设置为一般的IO口 P2DIR=0xFF;//P2口所有引脚设置为输出方向 P4DIR=0xFF;//P4口所有引脚设置为输出方向 P2OUT=0x00;//P2口先输出低电平 P4OUT=0xB7;//P4口先输出高电平 P3SEL=0x00;//P3口所有引脚设置为一般的IO口 P3DIR=0x00;//P3口所有引脚设置为输入方向 P5SEL=0x00; P5DIR=0xff; P5OUT=0X00; } /****************************ADC12控制函数**********************/ //ADC12初始化 void InitADC12(void) { P6SEL=0xff;//P6.0~P6.7为模拟输入 ADC12CTL0&=~ENC;//ENC设置为0从而修改ADC12寄存器 ADC12CTL0=MSC+ADC12ON;//采样信号由SHI仅首次触发,打开ADC12模块 //ADC12MCTL0=INCH_0+SREF_2;//参考电压为VeREF+和AVss 输入通道A0 ADC12MCTL1=INCH_1+SREF_2;//A1 ADC12MCTL2=INCH_2+SREF_2;//A2 ADC12MCTL3=INCH_3+SREF_2;//A3 ADC12MCTL4=INCH_4+SREF_2+EOS; ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_3+ADC12SSEL_0+ADC12DIV_0;//序列转换首地址0x00,源自采样定时器,多通道多次转换,ADC12内部时钟源,不分频 ADC12IE=0x80;//中断使能 ADC12CTL0|=ENC+ADC12SC;//开始新一轮转换 } //计算采样电压电压和功率 void GetV(void) { for(uchar i=0;i<20;i++) { Sum1+=ADCBuf_1[i]; Sum2+=ADCBuf_2[i]; Sum3+=ADCBuf_3[i]; Sum4+=ADCBuf_4[i]; } VBuf1=Sum1/20.0*((2.5*10000000)/4095.0); Sum1=0; Bit1[0]=VBuf1/10000000; Bit1[1]=VBuf1%10000000/1000000; Bit1[2]=VBuf1%1000000/100000; VBuf2=Sum2/20.0*((2.5*10000000)/4095.0); Sum2=0; Bit2[0]=VBuf2/10000000; Bit2[1]=VBuf2%10000000/1000000; Bit2[2]=VBuf2%1000000/100000; VBuf3=Sum3/20.0*((2.5*10000000)/4095.0); Sum3=0; Bit3[0]=VBuf3/10000000; Bit3[1]=VBuf3%10000000/1000000; Bit3[2]=VBuf3%1000000/100000; VBuf4=Sum4/20.0*((2.5*10000000)/4095.0); Sum4=0; Bit4[0]=VBuf4/10000000; Bit4[1]=VBuf4%10000000/1000000; Bit4[2]=VBuf4%1000000/100000; a[3]=Bit1[0]+16; a[5]=Bit1[1]+16; a[6]=Bit1[2]+16; b[3]=Bit2[0]+16; b[5]=Bit2[1]+16; b[6]=Bit2[2]+16; c[3]=Bit3[0]+16; c[5]=Bit3[1]+16; c[6]=Bit3[2]+16; d[3]=Bit4[0]+16; d[5]=Bit4[1]+16; d[6]=Bit4[2]+16; } void display() { for(uint i=3;i<7;i++) //第一路AD printf(1,i,a[i]); for(uint i=3;i<7;i++) printf(2,i,b[i]); for(uint i=3;i<7;i++) printf(3,i,c[i]); for(uint i=3;i<7;i++) printf(4,i,d[i]); } /定时器A***********************************************************************/ //定时器A初始化 void InitTimerA(void) { TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK 增计数 清除TAR CCTL0=CCIE;//CCR0中断允许 比较模式 CCR0=1999;//时间间隔2ms } //定时器A中断 #pragma vector=TIMERA0_VECTOR __interrupt void TimerAINT(void) { ADCBuf_1[Count]=ADC12MEM1; ADCBuf_2[Count]=ADC12MEM2; ADCBuf_3[Count]=ADC12MEM3; ADCBuf_4[Count]=ADC12MEM4; Count++; if(Count==20) { GetV(); Count=0; } } /****************************************************/ #pragma vector=PORT1_VECTOR __interrupt void PORT1(void){ unsigned temp1; DelayMs(5); if((P1IN&0xff)!=0xff) { temp1=P1IFG; switch(temp1) { case 1:keyvaluep1=1; break; case 2:keyvaluep1=0; break; default:keyvaluep1=0;break; } } P1IFG=0x00; } void PWM_inti()//PWM初始化 { TBCTL=TBSSEL1+MC0+ID0+ID1;//选择SMCLK 增计数 ,8分频 TBCCR0=2500; //PWM为50HZ TBCCTL3|=OUTMOD_7;//两个PWM输出口的输出模式。 TBCCR3=0; TBCCTL6|=OUTMOD_7;// TBCCR6=0; P4DIR|=0x08; //P4.3 P4.6输出方波 P4SEL|=0x08; P4DIR|=0x40; P4SEL|=0x40; } /******************** 方向控制 *************************/ void forward() //直走 { TBCCR3=2500;TBCCR6=2500;P5OUT&=~(BIT1+BIT3); } void turnleft_H() //左大转 { TBCCR3=0;TBCCR6=2000;P5OUT&=~(BIT1+BIT3); } void turnleft_L() //左微转 { TBCCR3=800;TBCCR6=2500;P5OUT&=~(BIT1+BIT3); } void turnright_H() //右大转 { TBCCR3=2000;TBCCR6=0;P5OUT&=~(BIT1+BIT3); } void turnright_L() //右微转 { TBCCR3=2500;TBCCR6=800;P5OUT&=~(BIT1+BIT3); } void turncrcle() //旋转360 { TBCCR3=2500;TBCCR6=0;P5OUT&=~BIT1;P5OUT|=BIT3; } void stop() { TBCCR3=0;TBCCR6=0;P5OUT&=~(BIT1+BIT3); } void turnback() { TBCCR3=0;TBCCR6=0;P5OUT|=BIT1;P5OUT|=BIT3; } /*****************************************************************************/ /*** 小车的方向控制 ***/ /*** flag=0 正常 ;flag=1 右偏; flag=2 左偏 ; flag=3 左全偏 ; ***/ /*** flag=4 右全偏 ;flag=4 十字路口; flag=5 终点 ***/ /*****************************************************************************/ void ReadSensor() { if((Bit1[0]==1)&&(Bit2[0]<1)&&(Bit3[0]<1)&&(Bit4[0]==1)) flag=0; if((Bit1[0]<1)&&(Bit2[0]<1)&&(Bit3[0]==1)) flag=1; if((Bit1[0]<1)&&(Bit2[0]==1)&&(Bit3[0]<1)) flag=2; if((Bit1[0]<1)&&(Bit2[0]<1)&&(Bit3[0]<1)) flag=3; if((Bit1[0]==1)&&(Bit2[0]==1)&&(Bit3[0]==1)&&(Bit4[0]==1)) flag=4; if((Bit1[0]==1)&&(Bit2[0]==1)&&(Bit3[0]==1)&&(Bit4[0]<1)) flag=5; state=flag+16; if(flag==0) { temp_flag=0; forward(); } if(flag==1) { turnleft_L(); temp_flag=1; } if(flag==2) { temp_flag=2; turnright_L(); } if(temp_flag==0&&flag==3) { turnright_H(); } if(temp_flag==5&&flag==3) { forward(); DelayMs(1000); if(flag==3&&Bit4[0]<1) { stop(); DelayMs(1000); turnback(); while(Bit2[0]!=1) { turnback(); } turncrcle(); DelayMs(1000); while(Bit4[0]!=1) { turncrcle(); } } else forward(); } if(flag==4) { temp_flag=4; forward(); } if(flag==5) {temp_flag=5; forward(); } } void main() { WDTCTL=WDTPW+WDTHOLD;//关闭看门狗 InitClock();//初始化时钟 InitPort();//初始化端口 fnLCMInit();//LCD12864初始化 InitADC12();//初始化ADC PWM_inti(); cls();//清12864LCD InitTimerA(); _EINT();//开中断 printf(1,0,0x36);//V printf(1,1,0x11);//1 printf(1,2,0x1A);// : printf(1,10,0x36);//V printf(2,0,0x36);//V printf(2,1,0x12);//2 printf(2,2,0x1A);// : printf(2,10,0x36);//V printf(3,0,0x36);//V printf(3,1,0x13);//3 printf(3,2,0x1A);// : printf(3,10,0x36);//V printf(4,0,0x36);//V printf(4,1,0x14);//4 printf(4,2,0x1A);// : printf(4,10,0x36);//V printf(4,10,0x36);//V while(1) { display(); if(keyvaluep1==1) { ReadSensor(); printf(6,10,state); } else {top();//P4OUT&=~BIT3; P4OUT&=~BIT6; P5OUT&=~BIT3;P5OUT&=~BIT1; } } } 18
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 环境建筑 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服