智能循迹小车报告
摘要:本设计由寻迹信息采集电路,电机驱动电路以及MCU 控制模块四大部分构成。MCU 控制模块是本设计的核心部分,该部分以一片TI 公司的MSP430F149 为控制中心,实现对各个模块的控制。寻迹信息采集部分以反射式光电传感器和比较器组成,将采集到的数据处理后送至单片机。电机由以L298N 为核心部件的电路驱动。该小车具有自动寻迹起始点检测功能。基于稳定的硬件电路设计以及精确可靠的软件算法,小车能够实现预期功能。
关键词:MSP430,L298N,寻迹。
一、 循迹信息采集模块
小车在前进时,要实现寻迹功能,可以采用高灵敏度的反射式光电传感器
对地面进行扫描,再将采集到的数据经过比较器后输出高低电平,最后送入单片机处理。
经过对一只ST188 的测试,发现ST188 接收管输出端的低电平输出大致为0.78V,高电平的输出大致为2.85V,经过比较器后输出低电平为0.03V,高电平为3.26V,能够被单片机所识别。
小车在白色地面行驶时,红外发射管发出的红外信号被反射,接收管收到信号后,输出端为低电平。而当红外信号遇到黑色导轨时,红外信号被吸收,接收管不能接收到信号,输出端为高电平。单片机通过采集每个红外接收管的输出端电压,便可以检测出轨道的位置,从而控制小车的转向,使小车一直沿轨道前进。
ST188采用高发射功率红外光电二极管和高灵敏度光电晶体管组成。检测距离为4-13mm。本小车一共采用了5只ST188光电对管,一只位于黑线上方,两只位于黑线左右用于直走微调,最左最右端两只用于转弯。我们在光电对管的发射端串联的一个电位器来调节发射管的电压,以便在不同的环境下进行调节。
循迹模块原理如图所示:
注意:在实际制作中,光电对管应尽量靠近地面,以减少干扰。
二、 电压比较模块
电压比较模块我们采用了3块LM393芯片,一块LM393芯片上有两个电压比较模块,我们只用到了其中的5个电压比较。我们在LM393的同向输入给定一个参考电压,与在端光电对管的接收端的电压进行比较,若接收端电压比参考电压大,则输出一个 ,反之输出一个 。
三、电机驱动模块
本次小车采用了由两个减速电机和一个万向轮制作的三轮移动平台,在电机驱动方面采用了L298来控制两个减速电机 。 MSP430F149 为芯片提供驱动信号,传至PWM 控制各个电机的转速,从而调整小车的前进速度和转向。L298模块的原理图如图所示。
注意:制作L298模块时应注意在芯片后面留散热片的空间。
四、电源模块
采用了一块稳压芯片7805搭建的12V转5V的电路,如图:
五、控制模块
本次设计采用了一片MSP430F149为控制核心,主要用于循迹和电机PWM控制。
六、程序部分
程序开始运行便进入扫描状态,在直走时不断进行左右微调保证小车行走在线中间。走迷宫的程序必须要有优先级,可左转优先或直走优先,在T字口,十字口一律左转或右转。以左转优先为例,程序优先级顺序为:左转>直走>右转>左微调>右微调>原地转圈。
附录:
程序:
1初始化程序(具体PWM自己调):
#include "main.h"
/*******************************************
函数名称:CLK_Init()
功 能:时钟设置
参 数:无
返回值 :无
********************************************/
void Clk_Init(void)
{
uchar i;
BCSCTL1=0x00; //XT2振荡器、不分频
BCSCTL2=SELM_2+SELS; //选择MCLK\SCLK的时钟源为高速时钟,不分频
do
{
IFG1&=~OFIFG; //清除振荡失效标志
for(i=0xff;i>0;i--); //等待
}
while ((IFG1&OFIFG)!=0); //等待振荡器工作正常
}
/*******************************************
函数名称:PWM_Init
功 能:初始化PWM
参 数:无
返回值 :无
********************************************/
void delay_us(uint time)
{
uchar i=0;
while(time--)
{
while((i++)!=8);
i=0;
}
}
//延时MS
void delay_ms(uchar time_1)
{
while(time_1--)
delay_us(1000);
}
void PWM_Init()
{
P4DIR=0xff; // P4 PWM输出
P4SEL=BIT1+BIT2+BIT3+BIT5;
P4DIR=BIT1+BIT2+BIT3+BIT5;
TBCCTL1|=OUTMOD_7; //捕获/比较控制寄存器,输出为模式7
TBCCTL2|=OUTMOD_7; //PWM RESET/SET模式
TBCCTL3|=OUTMOD_7; //TBCCRn--复位
TBCCTL5|=OUTMOD_7; //TBCL0--置位
TBCCR1 =0; //P4.1 L298N IN1
TBCCR2 =0; //P4.2 IN2
TBCCR3 =0; //P4.3 IN3
TBCCR5 =0; //P4.5 IN4
TBCCR0 =1000;
TBCTL |= TBSSEL_1+MC_1; //TIMER_B工作于增计数方式
}
void all_init(void)
{
PWM_Init();
Clk_Init();
P2DIR=0x00; // P2.0---P2.4电压比较结果输入
P1DIR|=BIT0+BIT1; //将P3口切换为输出状态
P1OUT|=BIT0+BIT1; //ENA,ENB
}
void STRAIGHT(void) //------------全速前进
{
TBCCR2=400;
TBCCR1=0;
TBCCR5=350;
TBCCR3=0;
}
void LEFT(void) //--------------左转
{
TBCCR2=0;
TBCCR1=250;
TBCCR5=250;
TBCCR3=0;
}
void RIGHT(void) //---------------右转
{
TBCCR2=250;
TBCCR1=0;
TBCCR5=0;
TBCCR3=250;
}
void LEFTS(void) //---------------左转微调
{
TBCCR2=100;
TBCCR1=0;
TBCCR5=250;
TBCCR3=0;
}
void RIGHTS(void) //-------------------右转微调
{
TBCCR2=250;
TBCCR1=0;
TBCCR5=100;
TBCCR3=0;
}
void STOP(void) //---------------------停止
{
TBCCR1=0;
TBCCR2=0;
TBCCR3=0;
TBCCR5=0;
}
void circle(void)
{
TBCCR2=250;
TBCCR1=0;
TBCCR5=0;
TBCCR3=200;
}
//////////////////////////////////////////////////////////////////
2逻辑判断程序:
#include "main.h"
void judge(void)
{
while(1)
{
if((data&0x01)==0x01) //左优先
{
delay_us(100);
if((data&0x01)==0x01)
{
//LEFT();
//delay_ms(10);
STRAIGHT(); //冲出一段距离
delay_ms(10);
LEFT(); //左转到中间灯离开黑线
delay_ms(35); //时间自己微调
while(1)
{
LEFT();
if((data&0x04)==0x04)
{
delay_us(100);
if((data&0x04)==0x04) //转到中间的灯在线上
break;
}
}
//STRAIGHT();
break;
}
break;
}
if((data&0x04)==0x04) //优先级2 2黑 直走
{
delay_us(100);
if((data&0x04)==0x04)
{
STRAIGHT();
break;
}
break;
}
if((data&0x10)==0x10) //优先级3 右转 5黑
{
delay_us(100);
if((data&0x10)==0x10)
{
STRAIGHT();
delay_ms(5);
while(1)
{
RIGHT();
if((data&0x04)==0x04)
{
delay_us(10);
if((data&0x04)==0x04)
break;
}
}
//STRAIGHT();
break;
}
break;
}
if((data&0x02)==0x02) //左转微调 2黑
{
delay_us(100);
if((data&0x02)==0x02)
LEFTS();
break;
}
if((data&0x08)==0x08) //右转微调 4黑
{
delay_us(100);
if((data&0x08)==0x08)
RIGHTS();
break
}
if((data&0x1f)==0x00) //优先级4 原地转圈° 12345白
{
delay_ms(10);
if((data&0x1f)==0x00)
{
while(1)
{
circle();
if((data&0x1f)!=0x00)
{
delay_us(100) //转到不为全白;
if((data&0x1f)!=0x00)
break;}
}
break;
}
break;
}
else
{
STOP();
break;
}
}
}
第二篇:循迹小车报告
循迹小车设计报告
学校:定西师范高等专科学校 产品名称:循迹小车
日期:二〇一一年八月十八日
摘要:
本设计是一种基于单片机控制的简易自动寻迹小车系统,包括小车系统构成软硬件设计方法。小车以AT89C51 为控制核心, 用单片机产生PWM波,控制小车速度。利用红外光电传感器对路面白色轨迹进行检测,并将路面检测信号反馈给单片机。单片机对采集到的信号予以分析判断,及时控制驱动电机以调整小车转向,从而使小车能够沿着白色轨迹自动行驶,实现小车自动寻迹的目的。
循迹小车的电路系统包括电源模块、单片机模块、传感
器模块、电机驱动模块。
一、工作原理:
1.利用红外采集模块中的红外发射接收对管检测路面上的轨迹
将轨迹信息送到单片机
2.单片机通过输入的信息分别控制小车左右两个电机的转速,用来控制小车的方向
3.最终完成智能小车可以按照路面上的白色轨迹运行
二、设计方案
该车采用红外传感器对白色路面进行道路检测,把采集到的信号传给AT89C51单片机,AT89C51单片机根据收到的信号判断小车当前状态,通过电机驱动芯片L298N发出控制命令,控制电机的工作状态以实现对小车姿态的控制。
三、硬件模块设计:
3.1 电源模块:
电源采用自制直流稳压电源,通过对220V的交流电压的变压,整流、滤波、稳压,分别输出12V和5V的直流电压。用来给小车各模块供给所需电压。 - 1 -
电源电路如图:
3.2电机驱动模块:
电机驱动芯片L298N是SGS公司的产品,内部包含4通道逻辑驱动
电路。是一种二相和四相电机的专用驱动器,即内含二个H桥的高电压大电流双全桥式驱动器,接收标准TTL逻辑电平信号,可驱动46V、2A以下的电机。其引脚排列如图1中U4所示,1脚和15脚可单独引出连接电流采样电阻器,形成电流传感信号。L298可驱动2个电机,OUT1、OUT2和OUT3、OUT4之间分别接2个电动机。5、7、10、12脚接输入控制电平,控制电机的正反转,ENA,ENB接控制使能端,控制电机的停转。也利用单片机产生PWM信号接到ENA,ENB端子,对电机的转速进行调节。
L298N的逻辑功能:
- 2 -
外形及封装:
L298N电路原理图:
3.3 传感器模块:
主要器件简介:
1.红外线发射管也称红外线发射二极管,属于二极管类。它是可以将电能直接转换成近红外光(不可见光)并能辐射出去的发光器件,主要应用于各种光电开关及遥控发射电路中。
- 3 -
2.红外线接收管是将红外线光信号变成电信号的半导体器件,它的核心部件是一个特殊材料的PN结,和普通二极管相比,在结构上采取了大的改变,红外线接收管为了更多更大面积的接受入射光线,PN结面积尽量做的比较大,电极面积尽量减小,而且PN结的结深很浅,一般小于1微米。红外线接收二极管是在反向电压作用之下工作的。没有光照时,反向电流很小,称为暗电流。当有红外线光照时,携带能量的红外线光子进入PN结后,把能量传给共价键上的束缚电子,使部分电子挣脱共价键,从而产生电子-空穴对。它们在反向电压作用下参加漂移运动,使反向电流明显变大,光的强度越大,反向电流也越大。红外线接收二极管在一般照度的光线照射下,所产生的电流叫光电流。如果在外电路上接上负载,负载上就获得了电信号,而且这个电信号随着光的变化而相应变化。
3.CD4069是一个六非门电路,就是在一个集成电路中有六个非门,非门的功能是(反相):输入1则输出为0,输入0则输出1。本寻迹为7组非门,共用了三个CD4069。其中:第一路为13输入12输出和9输入8输出;第二路1输入2输出和5输入6输出;第三路为13输入12输出和9输入8输出;第四路为1输入2输出和5输入6输出;第五路为9输入8输出和5输入和6输出;第六路为13输入12输出和11输入10输出;第七路为1输入2输出和3输入4输出;7脚是VSS,14脚是VCC。
原理:光有反射的特性,当前方的红外发射出来的光线遇到物体时,就会形成反射的光线,而这个经反射的红外光线刚好被红外接收探头接收到。当红外接收探头接收到信号后,再将信号送到单片机由单片机内部的程序来控制电动车的运行情况。红外发射管发出红外线,当发出的红外线照射到白色的平面,光线将被反射,若红外接收管接收到反射回的光线则检测出白线继而输出低电平,若接收不到发射管发出的光线则检测出黑线继而输出高电平。
电路设计:如下图所示的寻迹电路,经过施密特触发器CD4069整形放大,当检测不到白线时,发射管发出的光将不能被接收管接收,接收管截至,后级CD4069将输出高电平,当检测到白线时,发射管发出的光经过板面反射后被接收管接收,接收管导通,后级CD4069输出低电平。单片机通过读取由CPLD检测 - 4 -
的高低电平来判断电机的运动方向。
传感器电路图:
四、软件设计:
;*************************************************
;P1为电机控制信号输出端
;P2为循迹信号输入端,P2.7不连接导线,循迹灯1连接P2.0,2连P2.1…… ;*************************************************
org 0000h ajmp main
main:
mov 60h,#1 mov 61h,#50 - 5 -
mov 62h,#100
mov 63h,#150 mov 64h,#200 mov 70h,#200 mov 71h,#150 mov 72h,#100 mov 73h,#50 mov 74h,#1
setb P1.0 setb P1.1 setb P1.2 setb P1.3 acall zhizou jiance:
mov P3,P2 mov a,P2
jb P2.0,jiance3 jb P2.6,jiance3 ajmp zhidong jiance3:
jnb P2.2,jiance0 jnb P2.3,jiance0 jnb P2.4,jiance0 ajmp zhidong
jb P2.2,jiance0 jb P2.3,jiance0 jb P2.4,jiance0 ajmp zhizou jiance0: 电机左使能信号输出端 电机左速度控制信号输出端电机右使能信号输出端 电机右速度控制信号输出端边上两个全白则制动 中间三个全黑则制动 中间三个全白则直走
- 6 - ;; ;; ; ; ;
jnb P2.1,jiance1 jb P2.2,jiance2 jiance1:
jb P2.4,zuozhuan jiance2:
jnb P2.5,youzhuan ajmp zhizou ajmp jiance
zhizou:
setb P1.0
setb P1.1
setb P1.2
setb P1.3
ajmp jiance
zhidong:
setb P1.0
clr P1.1
setb P1.2
clr P1.3
ajmp jiance
zuozhuan:
setb P1.0
clr P1.1
setb P1.2
setb P1.3
mov r0,#64h
- 7 -
mov r1,#74h acall delay1 clr P1.3
acall delay2 setb P1.3 ajmp jiance
youzhuan:
setb P1.0 setb P1.1 setb P1.2 clr P1.3 mov r0,#64h
mov r1,#74h acall delay1 clr P1.1
acall delay2 setb P1.1 ajmp jiance
delay1:
mov a,@r0 mov r4,a d1:
mov r5,#2 d2:
djnz r5,d2 djnz r4,d1 ret
- 8 -
delay2:
mov a,@r1 mov r6,a
d3:
mov r7,#2
d4:
五、总结与体会:
根据本次设计要求,我们小组系统地阅读了大量的资料,并认真分析了设计课题的需求,还系统学习了51系列单片机的工作原理及其使用方法,并独自设计循迹小车的整个项目。
虽然条件艰苦,但经过不懈钻研和努力,进行了多次试验,最终做出了整个小车的硬件系统,然后结合课题任务和小车硬件进行了程序的编制,本系统能够满足设计要求,能够使小车沿引白色线路行驶,但由于经验能力有限,该系统还存在着许多不尽人意的地方有待于进一步的完善与改进。
通过本次设计,不仅是对我们课本所学知识的考查,更是对我的自学能力和收集资料能力以及动手能力的考验。使我们意识到了实验的重要性,在硬件制作和软件调试的过程中,出现了很多问题,最终都是通过实验的方法来解决的。还有以前对程序只是一个很模糊的概念,通过这次的课题设计使我对程序完全有了一个新的认识,并能使用汇编语言熟练的进行编程了。通过本次课题设计,极大的锻炼了我们的思考和分析问题的能力,并对单片机有了一个更深的认识。
总之,在课题设计的过程中,无论是对于学习方法还是理论知识,我们都有djnz r7,d4 djnz r6,d3 ret end - 9 -
了新的认识,受益匪浅,这将激励我们在今后再接再厉,不断完善自己的理论知识,提高实践运作能力。感谢指导老师在我们准备阶段的关怀和帮助以及对我们辛勤的指导。
- 10 -