资源描述
湖北理工学院电赛预选赛论文题目;智能壁障循迹小车参赛人员:许金利 陈雄班级:10电气本一智能壁障循迹小车摘要:本系统是以msp430单片机为控制核心,利用TRCT5000红外对管检测黑线,控制小车实现自动循迹功能,利用E18D80NKN红外壁障传感器实现壁障功能。小车驱动采用L293D驱动电路,速度由单片机控制,通过L293D芯片驱动直流电机,结合光电开关,可有效控制小车在特定位置转弯角度;另利用红外解码原理,通过遥控器实现小车的功能转换。由以上各种功能的结合,使小车更加智能化,自动化,该系统在结构和技术上都显得更加科学化。关键字:msp430单片机;TRCT5000红外对管;E18D80NKN红外壁障传感器;L293D芯片。2 方案设计2.1 主控系统 采用msp430F149单片机加8MHZ的晶振为整个系统的核心,TI公司的msp430系列16位单片机具有超低功耗性能,用其控制智能小车,实现既定的功能。2.2 电机驱动模块(L293D) 采用功率三极管作为功率放大器的输出控制直流电机,线性型驱动的电路结构和原理简单,这种调速方式有调速特性优良、调整平滑、调速范围广、过载能力大,能承受频繁的负载冲击,还可以实现频繁的无级快速启动、制动和反转等优点。因此决定采用使用功率三极管作为功率放大器的输出控制直流电机。2.3 循迹模块 采用4只红外对管并排至于小车后,中央黑线的两侧分别有两只,红外对管的红外发射管不断发射红外线,光敏三极管会不断接受反射的红外线,通过对黑线的检测,光电对管会向单片机发送脉冲信号,单片机则会控制电机的转速来实现转弯,继而实现循迹功能。红外对管的电路实物图如下: 图2 TRCT5000传感器模块布局图 2.4 壁障模块E18-D80NK-N 这是一种集发射与接收于一体的光电传感器,发射光经过调制后发出,接收头对反射光进行解调输出。有效的避免了可见光的干扰。透镜的使用,也使得这款传感器最远可以检测80厘米距离的问题。如遇障碍物,光电开关向单片机发去信号继而控制小车转弯以实现壁障功能。 E18-D80NK-N光电传感器的实物图与原理图2.5 机械系统 本题目要求小车的机械系统稳定、灵活、简单,而运动系统具备以上特点。 驱动部分:由于玩具汽车的直流电机功率较小,而小车上装有电池、电机、电子器件等,使得电机负担较重。电池的安装:将电池放置在车体的电机前后位置,降低车体重心,提高稳定性,同时可增加驱动轮的抓地力,减小轮子空转所引起的误差。2.6 电源模块 电源采用12V电源转5V,通过7805的稳压片及滤波电容。 电源电路3 硬件设计3.1 总体设计 智能小车采用前轮驱动,前轮左右两边各用一个电机驱动,调制前面两个轮子的转速起停从而达到控制转向的目的,将循迹光电对管并排安装在车体后。当车身下左边的传感器检测到黑线时,主控芯片控制左轮电机停止,车向左修正,当车身下右边传感器检测到黑线时,主控芯片控制右轮电机停止,车向右修正。红外光电开关装在车上中间部分,当检测到障碍物时,主控芯片控制小车转弯。 Msp430 单片机 主板设计框图红外对管模块电机驱动模块光电开关模块液晶显示模块红外遥控模块3.2 驱动电路电机驱动一般采用H桥式驱动电路,L293D内部集成了H桥式驱动电路,从而可以采用L293D电路来驱动电机。通过单片机给予L293D电路PWM信号来控制小车的速度,起停。 电机驱动电路3.3 信号检测模块小车循迹原理是小车在画有黑线的白纸 “路面”上行驶,由于黑线和白纸对光线的反射系数不同,可根据接收到的反射光的强弱来判断“道路”黑线。笔者在该模块中利用了简单、应用也比较普遍的检测方法红外探测法。红外探测法,即利用红外线在不同颜色的物理表面具有不同的反射性质的特点。在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色地面时发生漫发射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,则小车上的接收管接收不到信号,再通过LM324作比较器来采集高低电平,从而实现信号的检测。市面上有很多红外传感器,在这里我选用TCRT5000型光电对管。 光电对管传感器原理图3.4 主控电路 本模块主要是对采集信号进行分析,同时给出PWM波控制电机速度,起停,以及驱动液晶显示等作用。 主控电路4 软件设计启动 4.1 主程序框图壁障NN循迹Y是否检测到障碍是否检测停止Y停止 主程序图框 4.2 C程序#include#include /延时函数头文件#define uint unsigned int#define uchar unsigned char#define mcu_xtal 8 /对8M的晶振#define delay_us(x) _delay_cycles (x * mcu_xtal) /延时1us#define delay_ms(x) _delay_cycles (unsigned long)x * mcu_xtal*1000)/延ms#define delay_s(x) _delay_cycles (unsigned long)x * mcu_xtal*1000000)/延stypedef unsigned char UCHAR;typedef unsigned int UINT;#define CPU_F (double)8000000) /8000000为当前的晶振频率#define DelayUs(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0) #define DelayMs(x) _delay_cycles(long)(CPU_F*(double)x/1000.0) UCHAR table = Xu Jin Li ;UCHAR FLAG = Chen Xiong;#define ComDir P3DIR /控制端输入输出定义#define RS_L P3OUT &=BIT0 /液晶的RS端低电平#define RS_H P3OUT |= BIT0 /液晶的RS端高电平#define RW_L P3OUT &=BIT1 /液晶的RW端低电平#define RW_H P3OUT |= BIT1 /液晶的RW端高电平#define EN_L P3OUT &=BIT2 /液晶的EN端低电平#define EN_H P3OUT |= BIT2 /液晶的RW端高电平#define DatDir P4DIR /数据端输入输出定义#define DatBus P4OUT /数据端输出#define WriDat P4IN /数据端输入void CheBusy(); /读忙函数/*/void WriteCom(UCHAR com) CheBusy(); /读忙 DatDir = 0XFF; /数据口为输入 RW_L; /RW端拉低 RS_L; /RS端拉低 DatBus = com; /将指令写入 EN_H; /EN端拉高 DelayMs(1); /延时发送数据 EN_L; /EN端拉低/*/void WriteData(UCHAR dat) CheBusy(); /读忙 DatDir = 0XFF; /数据端输入 RW_L; /RW端拉低 RS_H; /RS端拉高 DatBus = dat; /将数据写入 EN_H; /EN端拉高 DelayMs(1); /延时发送数据 EN_L; /EN端拉低 /*/void Init1602() EN_L; WriteCom(0x38); /设置16*2显示,5*7点阵,8为数据口 WriteCom(0x0c); /开显示,不显示光标 WriteCom(0x06); /读写一个字符后,指针自动加1,整不移动 WriteCom(0x01); /清屏/*/void CheBusy() RS_L; RW_H; EN_H; DatDir = 0X00; while(WriDat & 0x80) /判断数据第八位 EN_L; DelayUs(1); EN_H; DelayUs(1); /*/void DispChar(UCHAR x,UCHAR y,UCHAR data) if(y = 2) WriteCom(0x80 + 0x40 + x); else WriteCom(0x80 + x); WriteData(data); /*/void DispString(UCHAR x,UCHAR y,UCHAR n,UCHAR *pstr) UCHAR i; for (i=0;i0;i-); while(IFG1 & OFIFG) != 0); BCSCTL2 |=SELM_2 + SELS + DIVS_3; /MCLK和SMCLK选的是XT2(8M晶振) /+SMCLK时钟8分频/*/void deal_inf(void) uchar i,j,k,value; uint Temp = 0; k = 1; for(i=0;i4;i+) for(j=0;j 2000) value = value | 0x80; else value = value; if(j 1; k +; Table_infi = value; value = 0; Flag_3 = 1;/*/void main() WDTCTL = WDTPW + WDTHOLD; /关狗 P1IE |= BIT6; /P1.6开中断 P1IES |= BIT6; /P1.6下降沿产生中断 P1IFG |= BIT6; Init(); TACTL |= TASSEL_2 + MC_2 + TACLR;/时钟SMCLK+连续计数+TAR清零 _EINT(); P3DIR = 0XFF; P4DIR = 0XFF; Init1602(); DispString(1,1,14,table); DispString(1,2,12,FLAG); while(1) if(Flag_2 = 1) /说明将波形的客户码,客户反码,数据码数据反码装入了Table_dat33 Flag_2 = 0; deal_inf(); /进行波形处理 if(Flag_3 = 1) /说明波形处理完毕 Flag_3 = 0; if(Table_inf2=0x00) /1 bizhang=1; if(Table_inf2=0x21) /2 bizhang=0; if(Table_inf2=0x04) /3 xunji=1; if(Table_inf2=0x06) /4 xunji=0; P2DIR=0XFF; P2OUT=0XF0; while(bizhang) xu_Init(); /初始化端口 BIZHANG(); /初始化蔽障 if(BIZHANG_turn_flag = 1) /左转处理 P2DIR = 0XFF; P2OUT = 0XF3; delay_ms(1); P2OUT =0XFa; delay_ms(280); if(BIZHANG_turn_flag = 0) /直走处理 P2DIR = 0XFF; P2OUT = 0XFC; delay_ms(100); P2OUT = 0XF0; delay_ms(10); while(xunji) I0_Init(); /初始化端口 xunji_hanshu(); /初始化循迹 if(xunji_turn_flag = 1) /左转处理 P2DIR = 0XFF; P2OUT = 0Xfa; delay_ms(10); P2OUT =0Xf0; delay_ms(1); if(xunji_turn_flag = 2) /右转处理 P2DIR = 0XFF; P2OUT = 0Xf5; delay_ms(10); P2OUT = 0Xf0; delay_ms(1); if(xunji_turn_flag = 0) /直走处理 P2DIR = 0XFF; P2OUT = 0Xfc; delay_ms(10); P2OUT = 0Xf0; delay_ms(1); #pragma vector = PORT1_VECTOR_interrupt void Port1(void) P1IFG &= BIT6; if(Flag_1 = 1) if(TAR 9000)&(TAR 17000) /去掉引导码9ms Num = 0; Table_datNum = TAR; TACTL |= TACLR; Num +; if(Num = 33) Num = 0; Flag_2 = 1; else Flag_1 = 1;/第一次进中断Flag_1置1,接下来去处理接收到的波 TACTL |= TACLR; /第一次进中断将TAR清零
展开阅读全文