智能寻迹避障小车自动控制设计.docx
《智能寻迹避障小车自动控制设计.docx》由会员分享,可在线阅读,更多相关《智能寻迹避障小车自动控制设计.docx(19页珍藏版)》请在冰豆网上搜索。
![智能寻迹避障小车自动控制设计.docx](https://file1.bdocx.com/fileroot1/2022-11/24/026793ec-ec2b-40e4-92d4-a7a621f2323c/026793ec-ec2b-40e4-92d4-a7a621f2323c1.gif)
智能寻迹避障小车自动控制设计
智能寻迹避障小车自动控制设计
1.设计内容
利用STC12C5A60S2单片机和玩具小车底盘以及相应的传感器实现小车的智能寻迹和避障功能。
2系统规划设计
2.1主控系统
采用单片机作为整个系统的核心,用其控制行进中的小车,以实现其既定的性能指标。
充分分析我们的系统,其关键在于实现小车的自动控制,而在这一点上,单片机就显现出来它的优势——控制简单、方便、快捷。
这样一来,单片机就可以充分发挥其资源丰富、有较为强大的控制功能及可位寻址操作功能、价格低廉等优点。
因此,这种方案是一种较为理想的方案。
针对本设计特点——多开关量输入的复杂程序控制系统,需要擅长处理多开关量的标准单片机,而不能用精简I/O口和程序存储器的小体积单片机,D/A、A/D功能也不必选用。
根据这些分析,我选定了STC12C5A60S2单片机作为本设计的主控装置,51单片机具有功能强大的位操作指令,I/O口均可按位寻址,程序空间多达8K,对于本设计也绰绰有余,更可贵的是51单片机价格非常低廉。
在综合考虑了传感器、两部电机的驱动等诸多因素后,我们决定采用一片单片机,充分利用STC12C5A60S2单片机的资源。
(如图2.1)
图2.1STC12C5A60S2单片机
2.2电机驱动模块
采用L293D小型直流电机驱动器,所用芯片L293D属于H桥集成电路,其输出电流为1000MA,最高电流2A,最高工作电压36V,可以驱动感性负载,特别是其输入端可以与单片机直接相联,从而很方便地受单片机控制。
当驱动小型直流电机时,可以直接控制两路电机,并可以实现电机正转与反转,实现此功能只需改变输入端的逻辑电平。
因为此模块有体积小,控制方便的的特点。
(如图2.2)
图2.2L293D小型直流电机驱动器
2.3循迹模块
采用两只红外对管,分别置于小车车身前轨道的两侧,根据两只光电开关接受到白线与黑线的情况来控制小车转向来调整车向,测试表明,只要合理安装好两只光电开关的位置就可以很好的实现循迹的功能。
(如图2.3)
2.4避障模块
采用二只红外对管分别置于小车的前端两侧,方向与小车前进方向平行,对小车与障碍物相对距离和方位能作出较为准确的判别和及时反应。
(如图2.3)
图2.3红外对管
2.5机械系统
本题目要求小车的机械系统稳定、灵活、简单,而三轮运动系统具备以上特点。
(如图2.4)
图2.4三轮运动系统
2.6电源模块
采用2支3.7V电池双电源分别给单片机与电机供电,让小车完成其功能。
(如图2.5)
图2.53.7V电池
3硬件设计
单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
从上世纪80年代,由当时的4位、8位单片机,发展到现在的300M的高速单片机。
3.1单片机的简介
单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
单片机由运算器、控制器、存储器、输入输出设备构成,相当于一个微型的计算机(最小系统),和计算机相比,单片机缺少了外围设备等。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
它最早是被用在工业控制领域。
由于单片机在工业控制领域的广泛应用,单片机由仅有CPU的专用处理器芯片发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
INTEL的8080是最早按照这种思想设计出的处理器,当时的单片机都是8位或4位的。
其中最成功的是INTEL的8051,此后在8051上发展出了MCS51系列单片机系统。
因为简单可靠而性能不错获得了很大的好评。
尽管2000年以后ARM已经发展出了32位的主频超过300M的高端单片机,直到现在,基于8051的单片机还在广泛的使用。
在很多方面单片机比专用处理器更适合应用于嵌入式系统,因此它得到了广泛的应用。
事实上单片机是世界上数量最多处理器,随着单片机家族的发展壮大,单片机和专用处理器的发展便分道扬镳。
现代人类生活中所用的几乎每件有电子器件的产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电子产品中都含有单片机。
汽车上一般配备40多片单片机,复杂的工业控制系统上甚至可能有数百片单片机在同时工作!
单片机的数量远远超过PC机和其他计算机的总和。
3.2单片机的应用
单片机作为计算机发展的一个重要分支领域,根据发展情况,从不同角度,单片机大致可以分为通用型/专用型、总线型/非总线型及工控型/家电型。
通用型与专用型
这是按单片机适用范围来区分的。
例如,80C51是通用型单片机,它不是为某种专门用途设计的;专用型单片机是针对一类产品甚至某一个产品设计生产的,例如为了满足电子体温计的要求,在片内集成ADC接口等功能的温度测量控制电路。
(1)线型
这是按单片机是否提供并行总线来区分的。
总线型单片机普遍设置有并行地址总线、数据总线、控制总线,这些引脚用以扩展并行外围器件都可通过串行口与单片机连接,另外,许多单片机已把所需要的外围器件及外设接口集成一片内,因此在许多情况下可以不要并行扩展总线,大大减省封装成本和芯片体积,这类单片机称为非总线型单片机。
(2)控制型
这是按照单片机大致应用的领域进行区分的。
一般而言,工控型寻址范围大,运算能力强;用于家电的单片机多为专用型,通常是小封装、低价格,外围器件和外设接口集成度高。
显然,上述分类并不是惟一的和严格的。
例如,80C51类单片机既是通用型又是总线型,还可以作工控用。
3.3前向通道设计
单片机用与测控系统时,总要有与被测对象相联系的前向通道。
因此,前向通道设计与被测对象的状态、特征、所处环境密切相关。
在前向通道设计时要考虑到传感器或敏感元件选择、通道结构、信号调节、电源配置、抗干扰设计等。
在通道电路设计中还涉及到模拟电路诸多问题。
1﹑前向通道的含义
在控制系统中,前向通道似乎就是指信号的输入通道,例如人机接口的键盘、传感器信号输入等;
后向通道指系统的输出信号通道,例如控制信号输出等;
前向通道是输入通道,后向通道是输出通道,因为一般都是模拟信号输入,需要转换成数字信号才能进行处理,所以前向通道一般需要进行模数转换,即A/D转换,把数字信号处理之后再转变成模拟信号输出,也就是后向通道的D/A转换。
自动控制原理中,前向通道是信号流图中从源节点到阱节点之间,与每个节点仅相交一次的通道。
2﹑前向通道的设计
红外测距传感器利用红外信号遇到障碍物距离的不同反射的强度也不同的原理,进行障碍物远近的检测。
红外测距传感器具有一对红外信号发射与接收二极管,发射管发射特定频率的红外信号,接收管接收这种频率的红外信号,当红外的检测方向遇到障碍物时,红外信号反射回来被接收管接收,经过处理之后,通过数字传感器接口返回到小车主机,小车即可利用红外的返回信号来识别周围环境的变化。
利用的是红外线传播时的不扩散原理,因为红外线在穿越其它物质时折射率很小,所以长距离的测距仪都会考虑红外线,而红外线的传播是需要时间的,当红外线从测距仪发出碰到反射物被反射回来被接受到,再根据红外线从发出到被接受到的时间及红外线的传播速度就可以算出距离,红外线的工作原理:
利用高频调制的红外线在待测距离上往返产生的相位移推算出光束度越时间△t,从而根据D=C△t/2得到距离D。
红外传感器的的测距基本原理为发光管发出红外光,光敏接收管接收前方物体反射光,据此判断前方是否有障碍物。
根据发射光的强弱可以判断物体的距离,它的原理是接收管接收的光强随反射物体的距离而变化的,距离近则反射光强,距离远则反射光弱。
目前,使用较多的一种传感器-红外光电开关,它的发射频率一般为38kHz左右,探测距离一般比较短,通常被用作近距离障碍目标的识别。
本系统采用的即为此种传感器。
(如图3.1)
图3.1红外传感器障碍检测
3.4后向通道设计
在控制系统中,后向通道指系统的输出信号通道,例如控制信号输出等;前向通道似乎就是指信号的输入通道,例如人机接口的键盘、传感器信号输入等;在其他系统中,似乎也有对前向、后向概念的使用,例如,手机终端的用户被称为前向用户,不知道为什么?
是不是和前述概念有关。
在单片机系统中,对控制对象输出控制信息的通道称为后向通道。
在后向通道设计中,必须解决单片机与执行机构(如电磁铁、步进电动机、伺服电功机、直流电动机等)功率驱动模块的接口问题,这时也会遇到信号转换(这时由于与执行机构相连接,则必须把数字信号转换成执行机构能接受的模拟信号这就叫DA转换)、隔离及输出通道数的扩展等技术问题。
简单来说前向通道就是各种输入设备与单片机或者控制系统的传输通道或者模式,一般来说都是用AD转换实现。
举例,音频信号的输入、各种传感器信号的输入。
后向通道指单片机或者其他控制器输出到执行单元的通道,在这里需要进行把单片机能识别的数字信号转换成执行单元可识别的电压或电流模拟信号。
1、脉宽调制原理:
脉宽调制器本身是一个由运算放大器和几个输入信号组成的电压比较器。
运算放
图3.2双极式H型可逆PWM变换器电路原理图
大器工作在开换状态,稍微有一点输入信号就可使其输出电压达到饱和值,当输入电压极性改变时,输出电压就在正、负饱和值之间变化,这样就完成了把连续电压变成脉冲电压的转换作用。
加在运算放大器反相输入端上的有三个输入信号。
一个输入信号是锯齿波调制信号,另一个是控制电压,其极性大小可随时改变,与锯齿波调制信号相减,从而在运算放大器的输出端得到周期不变、脉宽可变的调制输出电压。
只要改变控制电压的极性,也就改变了PWM变换器输出平均电压的极性,因而改变了电动机的转向.改变控制电压的大小,则调节了输出脉冲电压的宽度,从而调节电动机的转速.只要锯齿波的线性度足够好,输出脉冲的宽度是和控制电压的大小成正比的.
4软件实现
在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个生产对象的实际需要设计应用程序。
因此,软件设计在微机控制系统设计中占重要地位。
对于本系统,软件更为重要。
在单片机控制系统中,大体上可分为数据处理、过程控制两个基本类型。
数据处理包括:
数据的采集、数字滤波、标度变换等。
过程控制程序主要是使单片机按一定的方法进行计算,然后再输出,以便控制生产。
为了完成上述任务,在进行软件设计时,通常把整个过程分成若干个部分,每一部分叫做一个模块。
所谓“模块”,实质上就是所完成一定功能,相对独立的程序段,这种程序设计方法叫模块程序设计法。
模块程序设计法的主要优点是:
1、单个模块比起一个完整的程序易编写及调试;
2、模块可以共存,一个模块可以被多个任务在不同条件下调用;
3、模块程序允许设计者分割任务和利用已有程序,为设计者提供方便。
本系统软件采用模块化结构,由主程序﹑避障子程序﹑循迹子程序构成。
4.1主程序框图
图4.1主程序框图
4.2循迹程序设计
#include"STC12C5A60S2.h"
#include
/*接线定义*/
sbitIN1=P1^5;
sbitIN2=P1^6;
sbitIN3=P1^1;
sbitIN4=P1^0;
sbitEN1=P1^3;
sbitEN2=P1^4;
/*传感器接线定义*/
sbitLeft_InSen=P2^1;
sbitRight_InSen=P2^0;
sbitBUZZ=P1^7;
voiddelay(unsignedintn)//
{
unsignedchari,j,k;
for(k=0;k<=n;k++)
{
_nop_();
_nop_();
i=5;
j=6;
do
{
while(--j);
}while(--i);
}
}
voidbeep(void)
{
unsignedchari;
for(i=0;i<5;i++)
{
BUZZ=~BUZZ;
delay(30);
}
BUZZ=1;
}
voidgogogo(void)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
voidstop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
voidturnleft(void)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
voidturnright(void)
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
voidmain(void)
{
while
(1)
{
if(Left_InSen==0&&Right_InSen==1)
{
turnright();
delay(5);
stop();
delay(5);
}
if(Left_InSen==1&&Right_InSen==0)
{
turnleft();
delay(5);
stop();
delay(5);
}
if(Left_InSen==1&&Right_InSen==1)
{
gogogo();
delay(5);
stop();
delay(5);
}
if(Left_InSen==0&&Right_InSen==0)
{
stop();
//beep();//发声
}
}
}
4.3壁障程序设计
#include"STC12C5A60S2.h"
#include
/*接线定义*/
sbitIN1=P1^5;
sbitIN2=P1^6;
sbitIN3=P1^1;
sbitIN4=P1^0;
sbitEN1=P1^3;
sbitEN2=P1^4;
/*传感器接线定义*/
sbitLeft_InSen=P3^3;
sbitRight_InSen=P2^0;
sbitbleft=P2^4;
sbitbright=P2^3;
sbitBUZZ=P1^7;
voiddelay(unsignedintn)
{
unsignedchari,j,k;
for(k=0;k<=n;k++)
{
_nop_();
_nop_();
i=20;
j=10;
do
{
while(--j);
}while(--i);
}
}
voidbeep(void)
{
unsignedchari;
for(i=0;i<3;i++)
{
BUZZ=~BUZZ;
delay(10);
}
BUZZ=1;
}
voidgogogo(void)
{
IN1=1;
IN2=0;
IN3=1;
IN4=0;
}
voidbackbackback(void)
{
IN1=0;
IN2=1;
IN3=0;
IN4=1;
}
voidstop(void)
{
IN1=0;
IN2=0;
IN3=0;
IN4=0;
}
voidturnleft(void)
{
IN1=0;
IN2=1;
IN3=1;
IN4=0;
}
voidturnright(void)
{
IN1=1;
IN2=0;
IN3=0;
IN4=1;
}
voidmain(void)
{
while
(1)
{
if(bleft==0&&bright==1)
{
turnright();
delay(3);
stop();
delay(3);
}
if(bleft==1&&bright==0)
{
turnleft();
delay(3);
stop();
delay(3);
}
if(bleft==0&&bright==0)
{
gogogo();
delay(3);
stop();
delay(3);
}
if(bleft==1&&bright==1)
{
turnright();
delay(3);
stop();
delay(3);
}
}
}