循迹车培训资料循迹车C程序循迹车电路图.docx
《循迹车培训资料循迹车C程序循迹车电路图.docx》由会员分享,可在线阅读,更多相关《循迹车培训资料循迹车C程序循迹车电路图.docx(22页珍藏版)》请在冰豆网上搜索。
循迹车培训资料循迹车C程序循迹车电路图
《循迹车比赛培训资料》
1.前言1
2.软件以及C语言基础1
3.单片机系统
4.循迹原理
5.软件控制
6.红外探头的安装
7.电机驱动电路
8.舵机控制
9.程序调试
前言
西安工业大学电子信息工程学院科学技术协会是一个以实践为主要方法,以科学技术为指导的旨在于锻炼在校对于电子制作、电子设计以及各类电子大赛活动等有热情的同学。
电信科协会为广大同学们提供了一个开放、友谊、互助的平台,通过在每一学期的活动来达到锻炼自我的作用。
同时电信科协在此向西安工业大学的每一位同学发出邀请,只要你热爱电子、热爱集体、同时还拥有坚强的毅力,我们欢迎你的加入。
我们的联系地点:
西安工业大学未央校区教E206
一、软件以及C语言基础
一、首先当然是运行KEIL软件,接着按下面的步骤建立您的第一个项目:
(1)点击Project菜单,选择弹出的下拉式菜单中的NewProject,如图1-2。
接着弹出一个标准Windows文件对话窗口,如图1-3。
在“文件名”中输入您的第一个C程序项目名称,这里我们用“test”。
“保存”后的文件扩展名为uv2,这是KEILuVision2项目文件扩展名,以后能直接点击此文件以打开先前做的项目。
图1-2NewProject菜单
图1-3文件窗口
(2)选择所要的单片机,这里选择常用的Ateml公司的AT89c51。
而且本单片机c语言教程里的大部分程序都是基于此芯片的,此时屏幕如图1-4所示。
AT89c51有什么功能、特点呢?
看图中右边有简单的介绍。
完成上面步骤后,就可以进行程序的编写了。
图1-4选取芯片
(3)首先在项目中创建新的程序文件或加入旧程序文件。
如果您没有现成的程序,那么就要新建一个程序文件。
在KEIL中有一些程序的Demo,在这里我们还是以一个C程序为例介绍如何新建一个C程序和如何加到您的第一个项目中吧。
点击图1-5中1的新建文件的快捷按钮,在2中出现一个新的文字编辑窗口,这个操作也能通过菜单File-New来实现。
好了,现在能编写程序了。
实例:
#include
voidmain(void)
{
P0_0=1;
P0_1=0;
P1=0xff;
P2=0x00;
}
图1-5新建程序文件
这段程序的功能是不断从串行口输出“HelloWorld!
”字符,先不管程序的语法和意思吧,先看看如何把它加入到项目中和如何编译试运行。
(4)点击图1-5中的3保存新建的程序,也能用菜单File-Save或快捷键Ctrl+S
进行保存。
因是新文件所以保存时会弹出类似图1-3的文件操作窗口,把第一个程序命名
为test1.c,保存在项目所在的目录中,这个时候您会发现程序单词有了不一样的颜色,说明KEIL的C语言语法检查生效了。
如图1-6鼠标在屏幕左边的SourceGroup1文件夹图标上右击弹出菜单,在这里能做在项目中增加减少文件等操作。
选“AddFiletoGroup‘SourceGroup1’”弹出文件窗口,选择刚刚保存的文件,按ADD按钮,关闭文件窗,程序文件已加到项目中了。
这个时候在SourceGroup1文件夹图标左边出现了一个小+号说明,文件组中有了文件,点击它能展开查看。
图1-6把文件加入到项目文件组中
(5)C程序文件已被加到了项目中了,下面就剩下编译运行了。
使用软件默认的编译设置,它不会生成用于芯片烧写的HEX文件。
鼠标右键点击图中‘Target1’选中‘OptionsforTarget‘Target1’’出现如下图中对话框。
选中‘CreateHEXFi’然后保存并退出。
然后点击编译(图像中红色A处)便会产生用于给单片机下载的HEX文件。
编译成功后产生的.hex文件
图1-7编译程序
二、接下来就是将编译生成的.hex文件下载到单片机里面。
我们用到的软件名为:
ISPlay
烧写下载软件。
打开文件菜单,选中编译成功后的.hex文件,例中选择“循迹车.hex”
然后点击“AUTORUN!
”,软件会提示下载成功。
此时单片机已经被烧写进了你所写的C语言程序。
二、单片机最小系统
单片机最小系统即为单片机能够工作的一个最基本的电路。
只有在这个电路之上单片机才能发挥它的计算功能。
所以只要做好一个单片机的最小系统,再向外扩展其他的比如驱动电路、控制电路等就可以完成用户所需要的期望。
三、循迹原理
这里的循迹是指小车在白色地板上循黑线行走,通常采取的方法是红外探测法。
红外探测法,即利用红外线在不同颜色的物体表面具有不同的反射性质的特点,在小车行驶过程中不断地向地面发射红外光,当红外光遇到白色纸质地板时发生漫反射,反射光被装在小车上的接收管接收;如果遇到黑线则红外光被吸收,小车上的接收管接收不到红外光。
单片机就是否收到反射回来的红外光为依据来确定黑线的位置和小车的行走路线。
红外探测器探测距离有限,一般最大不应超过15cm。
对于发射和接收红外线的红外探头,可以自己制作或直接采用集成式红外探头。
(1)自制红外探头电路如图1所示,红外光的发送接收选用型号为ST168的对管。
当小车在白色地面行驶时,装在车下的红外发射管发射红外线信号,经白色反射后,被接收管接收,一旦接收管接收到信号,那么图中光敏三极管将导通,比较器输出为低电平;当小车行驶到黑色引导线时,红外线信号被黑色吸收后,光敏三极管截止,比较器输出高电平,从而实现了通过红外线检测信号的功能。
将检测到的信号送到单片机I/O口,当I/O口检测到的信号为高电平时,表明红外光被地上的黑色引导线吸收了,表明小车处在黑色的引导线上;同理,当I/O口检测到的信号为低电平时,表明小车行驶在白色地面上。
此种方法简单,价格便宜,灵敏度可调,但是容易受到周围环境的影响,特别是在图1较强的日光灯下,对检测到的信号有一定的影响。
(2)集成式红外探头可以采用型号为E3F-DS10C4集成断续式光电开关探测器,它具有简单、可靠的工作性能,只要调节探头上的一个旋钮就可以控制探头的灵敏度。
该探头输出端只有三根线(电源线、地线、信号线),只要将信号线接在单片机的I/O口,然后不停地对该I/O口进行扫描检测,当其为高电平时则检测到白纸,当为低电平时则检测到黑线。
此种探头还能有效地防止普通光源(如日光灯等)的干扰。
其缺点则是体积比较大,占用了小车有限的空间。
四、软件控制
其程序控制框图如图3。
小车进入循迹模式后,即开始不停地扫描与探测器连接的单片机I/O口,一旦检测到某个I/O口有信号,即进入判断处理程序(switch),先确定4个探测器中的哪一个探测到了黑线,如果InfraredML(左面第一级传感器)或者InfraredSL(左面第二级传感器)探测到黑线,即小车左半部分压到黑线,车身向右偏出,此时应使小车向左转;如果是InfraredMR(右面第一级传感器)或InfraredSR(右面第二级传感器)探测到了黑线,即车身右半部压住黑线,小车向左偏出了轨迹,则应使小车向右转。
在经过了方向调整后,小车再继续向前行走,并继续探测黑线重复上述动作。
由于第二级方向控制为第一级的后备,则两个等级间的转向力度必须相互配合。
第二级通常是在超出第一级的控制范围的情况下发生作用,它也是最后一层保护,所以它必须要保证小车回到正确轨迹上来,则通常使第二级转向力度大于第一级,即level2>level1(level1、level2为小车转向力度,其大小通过改变单片机输出的占空比的大小来改变),具体数值在实地实验中得到。
专家点评:
根据本文所讲述的方法,我们可以较容易地做出按照一定轨迹行走的智能电动小车。
但是按照该方法行走的小车如果是走直线,有可能会是蛇形前进。
为了使小车能够按轨迹行走的更流畅,可以在软件编程时运用一些简单的算法。
例如,在对小车进行纠偏时,适当提前停止纠偏,而不要等到小车完全不偏时再停止,以防止小车的过冲。
五、红外探头的安装
在小车具体的循迹行走过程中,为了能精确测定黑线位置并确定小车行走的方向,需要同时在底盘装设4个红外探测头,进行两级方向纠正控制,提高其循迹的可靠性。
这4个红外探头的具体位置如图2所示。
图中循迹传感器共安装4个,全部在一条直线上。
其中InfraredMR与InfraredML为第一级方向控制传感器,InfraredSR与InfraredSL为第二级方向控制传感器。
小车行走时,始终保持黑线(如图2中所示的行走轨迹黑线)在InfraredMR和InfraredML这两个第一级传感器之间,当小车偏离黑线时,第一级探测器一旦探测到有黑线,单片机就会按照预先编定的程序发送指令给小车的控制系统,控制系统再对小车路径予以纠正。
若小车回到了轨道上,即4个探测器都只检测到白纸,则小车会继续行走;若小车由于惯性过大依旧偏离轨道,越出了第一级两个探测器的探测范围,这时第二级动作,再次对小车的运动进行纠正,使之回到正确轨道上去。
可以看出,第二级方向探测器实际是第一级的后备保护,从而提高了小车循迹的可靠性。
六、电机驱动电路
由于芯片所提供的电流很小,不足以驱动电机,所以需要专业的驱动芯片为电机提供大电流,用去驱动电机的前进后退和停止。
同时还可以通过此芯片来控制电机的转速,原理即为通过单片机输出脉冲信号输入到L298的ENA、ENB端口。
七、舵机控制
舵机简介及其单片机控制方法
一、概述
舵机最早出现在航模运动中。
在航空模型中,飞行机的飞行姿态是通过调节发动机和各个控制舵面来实现的。
举个简单的四通飞机来说,飞机上有以下几个地方需要控制:
1.发动机进气量,来控制发动机的拉力(或推力);
2.副翼舵面(安装在飞机机翼后缘),用来控制飞机的横滚运动;
3.水平尾舵面,用来控制飞机的俯仰角;
4.垂直尾舵面,用来控制飞机的偏航角;
二、结构和控制
一般来讲,舵机主要由以下几个部分组成,舵盘、减速齿轮组、位置反馈电位计5k、直流电机、控制电路板等。
舵机的输入线共有三条,红色中间,是电源线,一边黑色的是地线,这辆根线给舵机提供最基本的能源保证,主要是电机的转动消耗。
电源有两种规格,一是4.8V,一是6.0V,分别对应不同的转矩标准,即输出力矩不同,6.0V对应的要大一些,具体看应用条件;另外一根线是控制信号线,一般为白色,或为桔黄色。
舵机的控制信号为周期是20ms的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化。
也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。
舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。
由此可见,舵机是一种位置伺服的驱动器,转动范围不能超过180度,适用于那些需要角度不断变化并可以保持的驱动当中。
比方说机器人的关节、飞机的舵面等。
三、参考c程序
//******中断程序1*******用于控制舵机偏转角度******周期20ms*******//
voidtimer1()interrupt1using0
//中断1T0溢出中断
{
n1=!
n1;
if(n1==0)
{
p10=0;
TH0=dg;
TL0=dd;
}
else
{
p10=1;
TH0=gg;
TL0=gd;
}
}
八、程序调试
程序调试为此项制作的最重要的环节,因为循迹车的工作大脑为单片机,而单片机的工作完全在程序的控制下进行。
所以程序的好坏会直接的影响到循迹车的工作。
附录
一、参考程序:
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
//*********延时函数1ms************//
voiddelay(unsignedintms)
{
unsignedchari;
while(ms--)
{
for(i=0;i<125;i++);
}
}
uchart1=63,ts1=63;
bitn1=1;n2=1;
sbitp10=P2^3;
sbitp11=P2^2;
uintgg,gd,dg,dd,zgg,zgd,zdg,zdd;
//***中断程序1***用于控制舵机偏转角度*****周期20ms*****//
voidtimer1()interrupt1using0//中断1T0溢出中断
{
n1=!
n1;
if(n1==0)
{
p10=0;
TH0=dg;
TL0=dd;
}
else
{
p10=1;
TH0=gg;
TL0=gd;
}
}
//*******中断程序2********用于控制电机转速***********//
voidtimer2()interrupt3using3//中断3T1溢出中断,使用工作组3
{
n2=!
n2;
if(n2==0)
{
p11=0;
TH1=zdg;
TL1=zdd;
}
else
{
p11=1;
TH1=zgg;
TL1=zgd;
}
}
//&&&&&&&&&&&&&
(一)此段子函数对舵机方向进行操作&&&&&//
//********左转90度***********高低占空比为2.5ms:
17.5ms*******//
voidzz90()
{
gg=0xf6;
gd=0x3c;
dg=0xbb;
dd=0xa4;
TR0=1;
}
//******左转45度***********高低占空比为2ms:
18ms******//
voidzz45()
{
gg=0xF8;
gd=0x30;
dg=0xB9;
dd=0xB0;
TR0=1;
}
//******左转20度***********高低占空比为1.8ms:
18.2ms***********//
voidzz20()
{
gg=0xf8;
gd=0xf8;
dg=0xB8;
dd=0xe8;
TR0=1;
}
//**********右转90度*******高低占空比为0.5ms:
19.5ms*******//
voidyz90()
{
gg=0xfd;
gd=0x44;
dg=0xb4;
dd=0x9c;
TR0=1;
delay
(2);
}
//******右转45度*******高低占空比为1ms:
19ms***********//
voidyz45()
{
gg=0xfa;
gd=0xEC;
dg=0xb6;
dd=0xF4;
TR0=1;
}
//******右转20度******高低占空比为1.3ms:
18.7ms*********//
voidyz20()
{
gg=0xfa;
gd=0xec;
dg=0xb6;
dd=0xf4;
TR0=1;
}
//**********方向复位********高低占空比为1.7ms:
18.3ms********//
voidfw()
{
gg=0xf9;
gd=0x5C;
dg=0xB8;
dd=0x84;
TR0=1;
}
//&&&&&&&&&
(二)此段子函数对主电机进行操作&&&&&&&&&&&//
voidqj()//前进
{P2_0=1;P2_1=0;
zgg=0x01;
zgd=0x01;
zdg=0x0e;
zdd=0x0e;
TR1=1;
}
voidkqj()//快速前进
{P2_0=1;P2_1=0;
zgg=0xe0;
zgd=0xc0;
zdg=0xf8;
zdd=0x30;
TR1=1;
}
voidht()//后退
{P2_0=0;P2_1=1;
zgg=0xe0;
zgd=0xc0;
zdg=0xf8;
zdd=0x30;
TR1=1;
}
voidtj()
{
P2_0=0;P2_1=0;delay(10);
}
//&&&&&&&&&&&&(三)函数主体&&&&&&&&&&&&&&&&&&//
voidmain(void)
{
intm,a[8];
P0=0XFF;P1=0X00;P2=0X00;P3=0X00;//
TMOD=0x11;//
ET0=1;//
ET1=1;//端口初始化
EA=1;//
TR0=0;//
TR1=0;//
p10=1;
//**************************循迹部分**************************//
while
(1)
{
//扫描端口状态........
//P0_0==0黑道..........P0_6==0黑道
//直走
if(P0_3==0)
{
fw();kqj();TR0=1;TR1=0;
}
//跑飞
elseif(P0_0==0&&P0_1==0&&P0_2==0&&P0_3==0&&P0_4==0&&P0_5==0&&P0_6==0&&P0_7==0)
{
qj();TR0=1;TR1=0;
}
//右转
elseif(P0_4==0)
{
qj();yz20();TR0=1;TR1=0;
}
elseif(P0_5==0)
{
qj();yz45();TR0=1;TR1=0;
}
elseif(P0_6==0)
{
qj();yz90();TR0=1;TR1=0;
}
//左转
elseif(P0_2==0)
{
qj();zz20();TR0=1;TR1=0;
}
elseif(P0_1==0)
{
qj();zz45();TR0=1;TR1=0;
}
elseif(P0_0==0)
{
qj();zz90();TR0=1;TR1=0;
}
elsedelay
(2);
}
}
二、参考电路图
单片机、L298驱动电机、LM393(电位比较器)、红外传感器部分
可能需要用到的芯片图:
LM393
L298
稳压电源