找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 26070|回复: 4
收起左侧

基于单片机的多功能智能小车设计论文

[复制链接]
ID:298227 发表于 2018-3-28 11:53 | 显示全部楼层 |阅读模式
做的课程设计,主要包括以下内容:
1.总体方案设计与论证
2.各模块硬件电路设计
3.系统软件设计
3.总结与展望


摘要

随着计算机、微电子、材料、机械、通信等技术的快速发展,智能化的小车和机器人的发展速度也越来越快,作为21世纪自动化领域内非常伟大的成就它已经和人们的生产生活紧密的联系在了一起。根据题目的要求,本设计的智能遥控小车主要由两大部分构成:一个红外遥控部分,一个智能小车部分。其中红外遥控部分采用专用编码芯片HT6221作为发射端,一体化红外接收头作为接收端;智能小车部分采用微控制器AT89C52单片机作为其控制核心,用红外反射式光电传感器进行障碍物和路线的检测,用步进电机控制小车的启停、速度快慢以及转向,用直射式光电检测器、施密特触发器等元件组成的电路来检测小车车轮转速,用LCD1602液晶显示屏来实时显示小车运行的速度、时间和路程。

经过硬件和软件的综合设计,本设计的智能遥控小车基本上实现了遥控控制、自动躲避障碍、自动沿着特定的路线行驶、实时显示速度、路程等功能。


目录

第一章 绪论              1

1.1 课题背景和意义              1

1.2 课题研究现状和发展趋势              1

1.2.1 研究现状              1

1.2.2 发展趋势              2

1.3 课题内容和要求              2

第二章 总体方案设计与论证              4

2.1 遥控控制模块设计与论证              4

2.2 电机驱动模块设计与论证              5

2.3 避障循迹模块设计与论证              6

2.4 数据显示模块设计与论证              6

2.5 转速测量模块设计与论证              7

2.6 电源模块设计与论证              7

第三章 各模块硬件电路设计              9

3.1 红外遥控发射器模块              9

3.1.1 红外遥控模块的工作原理              9

3.1.2 HT6221编码芯片简介              10

3.1.3 红外遥控发射器

3.2 单片机控制模块

3.2.1 单片机模块电路

3.2.2 复位电路

3.2.3 振荡电路

3.3 红外接收器及解码

3.4 电机驱动模块              16

3.4.1 步进电机的工作原理              16

3.4.2 ULN2003芯片简介              17

3.4.3 步进电机驱动电路设计              18

3.5 避障循迹模块

3.6 转速检测模块

3.7 数据显示模块

3.8 电源模块

第四章 系统软件设计

4.1 系统总体程序流程图              24

4.2 避障循迹模块程序设计              25

4.2.1 避障程序流程图              25

4.2.2 循迹程序流程图              26

4.3 数据显示模块程序设计              27

第五章 总结与展望              28

5.1 总结              28

5.2 改进与展望              28

参考文献              29

致谢

附录A 各模块电路图

附录B 程序              39



第一章 绪论

1.1 课题背景和意义

随着计算机、微电子、信息技术的快速发展,智能化技术的发展速度越来越快,智能化与人们生活的联系也越来越紧密,智能化是未来社会发展的必然趋势。智能小车实际上就是一个可以自由移动的智能机器人,比较适合在人们无法工作的地方工作,也可取代人们完成一些复杂、危险性质的工作。作为现代自动控制领域内十分伟大的一项发明智能小车、机器人已经和人们的生产生活紧密的联系在了一起。

智能小车,是一个包含周围环境探测、识别反应、自动控制等功能于一体的综合系统,它综合地运用了微控制器、传感、遥控、机械结构、电子基础、自动控制等多学科的知识。智能小车是一个复杂而又庞大的系统,其内部有许多块控制芯片作为其控制核心,多种传感器来采集外部环境信息并将接收到的信息传给主控制器,然后由控制器来控制其各个模块执行相应的动作。智能小车由于成本较低,甚至还能够胜任一些人们都无法胜任的工作,它已逐步深入到工业、农业以及社会生活的各个方面。本课题设计的智能小车中用到的遥控技术、显示技术、单片机控制系统、传感技术、自动避障技术已广泛应用于工农业生产、国防军事、医疗卫生、宇宙探测等诸多领域,特别是其在军事侦察、反恐、防暴、防核化及污染等危险和恶劣环境中有着广阔的应用前景,由此可见其有着及其重要的研究意义。

1.2 课题研究现状和发展趋势

  1.2.1 研究现状

智能小车、机器人的发展研究从上世纪60年代至今已有几十年的历史,自从上世纪60年代末期,第一台能够自主移动机器人问世以后,经过几十年的发展智能机器人已经从最初的示教模仿机器人发展到现在的具有感知功能的智能机器人,在技术上取得了很大的进步许多国家都对智能机器人进行了大量的研究。由于各国的科研实力不同,其水平也有高低,其中美国和日本在该项技术的研究处于领先地位。

法国提出了让智能机器人具有自动认知功能的一项科技计划,使其能够在复杂的环境中通过自主感知判断来自动执行各种动作。美国发明的智能机器人,可以帮助人们送信件、食品等生活用品,还可以牵引吸尘器来打扫卫生。日本目前已经研制成功的人形机器人,其可以模仿人们的各种面部表情而且非常逼真。近年来发明的的手术机器人已经广泛的应用在实际医疗手术中而且稳定性好,安全性高。我国的智能小车、机器人的研究已经有三十多年的历史,特别是在军事领域的应用方面已经取得了较大的成果,已经相继研制出了复杂的智能机器人,危险作业机器人、仿人机器人、复合结构移动机器人等。国内的许多高校也都在不停的进行着这方面的研究而且也有了层出不穷的成果,例如中科院研制的能够和人对话的机器人、上海交大研制的具有较强越障能力的仿人关节结构的机器人等。与此同时,我国也开展了智能移动机器人基础理论研究,在某些方面取得了世界领先的成果,正在逐渐缩小与发达国家的差距。

  1.2.2 发展趋势

随着各方面技术的不断进步与完善,各个国家对于智能小车、机器人的科研能力都再逐步的加强,未来的智能机器人可能会朝着以下几个方面发展:使用高强度的轻质材料让机器人的结构越来越灵巧动作执行也更加灵活;应用网络化技术来远距离操作控制机器人群体为人们工作;通过复杂生物机电系统和人机耦合系统来研究出具有仿生感知、生物神经的仿人机器人。相信未来会有具有更高智能化的、更加生动有趣的智能机器人出现在我们的周围,而且会极大的改变和方便人们的生产生活。

1.3 课题内容和要求

本设计的智能小车用微处理器(即单片机)作为整个系统的控制核心部分,主要包括单片机控制模块、遥控模块、避障模块、循迹模块、数据显示模块等模块。要求能够实现以下几种功能:

(1)遥控功能,即通过遥控器来控制小车的启动、停止、左转、右转、后退等动作。

(2)自动避障功能,即小车在前方遇到障碍时可以立即做出反应,自动左转或右转躲避障碍。

(3)自动循迹功能,即小车可以自动沿着规定的路线行驶。

(4)能够实时显示小车行驶的速度、路程等数据。

要求通过此次的实际动手设计掌握以下基本技能:

(1)学会电子产品的设计开发过程;

(2)掌握单片机原理、遥控原理、显示原理等;

(3)能够熟练进行系统的硬件电路设计以及软件设计;

(4)熟练使用相关的电子设计和仿真软件;

(5)查阅国内外相关文献,掌握智能小车的最新研究动态和未来发展趋势。

第二章 总体方案设计与论证

本设计方案采用微处理器(AT89C52单片机)作为整个系统控制的中心,主要由两个部分构成,红外遥控发射部分和智能小车部分。其中智能小车部分主要由以下子模块构成:单片机控制模块、电源模块、电机驱动模块、循迹避障模块、转速检测模块、红外接收器和数据显示模块组成;红外遥控发射部分主要由遥控按键、编码芯片、红外发射三个部分构成。其总体设计框图包括两个部分,如图2.1所示:

   a 遥控部分框图                         b 小车部分框图

                 图2.1 系统总体设计框图

2.1 遥控控制模块设计与论证

目前比较常用的遥控控制方式有两种,红外遥控控制系统和无线遥控控制系统。

方案一:选择红外遥控装置作为小车的遥控控制器。红外遥控是通过遥控发射器内的编码芯片将按键信息调制成一串0和1的二进制代码,然后通过红外线发出,最后被红外接收装置接收进行解码,再运用单片机对解码后的码信息进行识别,然后再根据不同的码信息进行不同的控制操作[9]。

方案二:选择无线电遥控装置作为小车的遥控控制器。无线电遥控是利用不同频率的无线电波对远方的各种机构进行控制的遥控设备。这些信号被远方的接收设备接收后,可以驱动其他各种相应的机械或者电子设备去完成各种操作[6]。

红外遥控和无线遥控是对不同的载波来说的,红外遥控器是用红外线来传送控制信号的,它的特点是有方向性中间不能被阻挡,在室内使用时大概在7m的范围内有效;无线遥控器是用无线电波来传送控制的信号的,它的特点是无方向性,可以不面对面控制,距离远,有效距离可达数十米甚至数公里。

以上两种方案均可作为本设计的遥控控制器,虽然无线遥控控制的距离更远也更加灵敏,但对于本设计来说使用红外遥控已经足够了,而且红外遥控的原理更加简单易懂,所以本设计采用方案一即红外遥控作为小车的遥控控制系统。

2.2 电机驱动模块设计与论证

目前比较常用的小车驱动电机主要有两种选择:

方案一:选择直流电机作为小车的动力驱动。直流电机是将直流电能转换为机械能的一种装置,因其转动力矩大、体积较小、重量很轻、使用方便,所以其在一些小型的电动装置中的应用较多。直流电机的运行方式是这样的:在它里面有圆形的磁体会产生磁场,当给它转子上的绕组通电时,通电线圈在磁场中便会产生洛伦兹力带着线圈即转子转动,当转子转动时通电线圈内的磁场方向将会改变,所以绕组上的电流也要变换流向,在方向一直不变的洛伦兹力控制下电机将向顺时针或逆时针持续转动。由H型桥式电路直接驱动直流电机控制电机的正反转,通过软件编程使单片机输出不同占空比的PWM(脉宽调制信号)来控制直流电机的转速进而控制小车的行驶速度[6]。

方案二:选择步进电机作为小车的动力驱动。步进电机是将输入端输入的电脉冲信号转变为转子的角位移的可以实现精确定位的电机。电机转动的快慢取决于脉冲信号的频率、转动的圈数取决于脉冲的个数,在不超载的情况下其转动速度不受负载的影响,即给步进电机输入一个脉冲信号,电机的转子则转过一个角度,给其加上连接不断的脉冲波形则步进电机就能持续转动下去[5]。

相比直流电机,步进电机转过的角度是由脉冲信号控制的其可以实现小车的精确定位停车,步进电机调速也更加容易,只要输入不同频率的脉冲信号就能控制小车的行驶速度,而且它还有很好的止动能力。所以在本设计中我们选用了步进电机作为小车的驱动电机。

2.3 避障循迹模块设计与论证

目前主要有两种方案来实现小车的自动避障功能:

方案一:采用红外反射式光电传感器、电压比较器及一些电阻构成的障碍物检测电路来检测小车前方的障碍。障碍物检测电路安装在小车前部的中间及左右两边,来检测小车前方的障碍物。其障碍检测过程如下:红外发光二极管发出红外光,如果遇到小车前面的障碍物,红外线就会被物体反射回来,被光敏三极管吸收此时光敏三极管导通,并在输出端输出低电平信号至单片机,然后单片机调用寻迹避障子程序控制小车做出相应的避障反应,当左边遇到障碍物时单片机会自动调用右转子程序控制其右转,当右边遇到障碍物时单片机会自动调用左转子程序控制其左转。当无障碍物时,发出的红外线不被反射,光敏三极管截止,输出高电平信号,小车继续向前行驶[8]。

方案二:采用超声波原理来检测小车前方的障碍。其检测障碍的原理如下:先由超声波发射器向小车前方发射超声波,超声波在向前传播过程中,若遇到障碍物则会被反射回去,反射波被超声波回收装置接收后会产生一个电信号然后被转化为高低电平信号反馈给单片机,若为高电平则说明前方遇到障碍,然后由单片机调用避障子程来控制小车做出相应的躲避障碍的动作[7]。

在本设计我们采用了第一种方案实现小车的自动避障功能。

2.4 数据显示模块设计与论证

根据题目的要求小车可以实时显示其运动的速度、距离等数据。主要有两种方案来实现:

方案一:用共阳极数码管和可编程的键盘接口芯片组成数据显示电路,接口芯片直接与单片机的I/O口相连,由单片机精确控制实现LED动态显示。

方案二:用LCD液晶显示屏直接与单片机相连组成数据显示电路。LCD液晶显示屏是一种专门用来显示字符和数字的点阵型液晶模块,它是由若干个5X7或5X11点阵字符位组成的,一个字符占据一个点阵字符位,每位之间有一个点距的间隔将字符隔开,行与行之间也有间隔[8]。

由于本设计需要显示的数据较多,若用LED数码管来显示需多个数码管才能满足要求,这样电路设计过于复杂,相反只用一个LCD液晶显示屏即可显示要求数据,所以本设计我们采用方案二即LCD显示屏来显示实时数据。

2.5 转速测量模块设计与论证

方案一:选择霍尔开关型传感器测量小车车轮转速。具体做法是:在非磁性材料制作的转子上,固定好一片钢性磁体,将霍尔开关型传感器的感知接收面和磁体的磁极相对, 并在安装架上安装好(注意磁场方向不要弄错),轮子转动时磁体会跟着转动,在磁体转到和传感器的接收面相对时, 霍尔传感器便输出一个脉冲信号, 由两个脉冲间的时间间隔,便可算出转速,然后再根据车轮半径编程便可算出小汽车运行的速度[10]。

方案二:选择直射式光电检测器测量小车车轮转速。具体做法是: 在小车的驱动轮的主轴上安装一个开有十个透光槽的圆形叶片,保持叶片和驱动轮能够同步转动,然后在驱动轮旁安装好直射式光电检测器,叶片随着车轮的转动不断切割红外发射管与红外接受管之间的红外线通路,当叶片转动至透光槽与红外线通路重合时,检测器导通,红外接受管通过电流,当叶片转动至使透光槽遮住时,光通路断开。随着车轮不断的转动,便会输出连续的脉冲序列,测出脉冲的个数便可知叶片转过的孔数,从而可计算出车轮转动的转角和转速,然后再根据车轮半径由软件编程便可算出小车运行的速度[11]。

以上两种方案都能够测出小车车轮的转速。但是在本设计中,对于方案一来说,要想在很小的小车车轮上密集安装磁片比较困难,而且彼此之间也容易产生干扰。因此本设计拟采用方案二测量小车的转速。

2.6 电源模块设计与论证

电源是整个小车系统运行的基本条件,它的性能的好坏直接决定整个系统运行的稳定性和性能。小车的供电电源包含两部分,单片机控制模块电源和电机驱动模块电源,我们将单片机及其外围电路和步进电机分开供电,两者互相不影响,实现稳定供电。由于步进电机需较高的供电电压而单片机和其逻辑单元最大供电电压不能超过5V,因此需设计稳压电路。

方案一:采用8节1.5V干电池串联共12V直接给步进电机供电,然后经过由LM7805稳压芯片构成的稳压电路将电压降至5V后给电片机及其外围逻辑电路供电。但是本方案由于电池电量有限,而且数量较多的干电池重量较大会给驱动电机带来太大负担,也占用了太大的空间在体积较小的小车上使用太不方便,所以放弃了该方案。

方案二:采用12V蓄电池直接给步进电机供电,将电压降至5V后给单片机及其外围电路供电。蓄电池具有较长的续航能力以及电压输出的值基本不怎么变化,但是因为蓄电池的体积和质量过大,并不适合本设计的使用,所以我们并没有使用蓄电池来供电。

方案三:采用3节4.2V锂电池串联的方式共直接给步进电机供电,然后经过由稳压芯片构成的稳压电路将电压降至5V后给单片机及其外围逻辑电路供电。本方案锂电池的电量较足并且可以充电重复利用,3节锂电池重量和占用的空间都较小,因此该方案比较可行,最终我们选择了该方案作为小车的驱动电源[14]。


第三章 各模块硬件电路设计

本设计的遥控智能小车的硬件部分共分为两大模块:红外遥控发射器硬件模块和智能小车部分硬件模块。其中红外遥控发射硬件模块包含遥控按键、编码芯片、红外发射三个子模块;智能小车部分硬件模块包含单片机控制模块、电机驱动模块、避障循迹模块、显示模块、红外接收器模块、电源模块6个子模块。

首先介绍红外遥控发射器部分即遥控按键、编码芯片、红外发射三个子模块的硬件设计。

3.1 红外遥控发射器模块

  3.1.1 红外遥控模块的工作原理

红外线遥控是比较常见的一种遥控设备,它是利用波长为0.76~1.5μm之间的红外线来传送控制信号的遥控设备。其占据空间小、价格便宜、使用方便,在我们常用的家用电器比如电视、DVD,录音机、空凋等和一些小型电动玩具装置上均已应用了红外线遥控设备。但是红外遥控也有缺点比如容易受到空间和距离的限制,一般在7m的范围内有效且发射和接收之间不能被物体隔挡,但对于本设计的智能小车来说已经能够满足要求。

红外遥控系统一般由两大部分组成:一个红外发射部分,一个红外接收部分。其中发射部分主要由按键键盘、编码调制、LED红外发送器构成,它最重要的部分就是应用编码芯片对按键信息进行编码和发送;接收部分由光电转换放大器、解调、解码电路构成,其最重要的部分是对接收到的编码进行解调。其原理如图3.1所示:

                      图3.1 红外遥控系统原理框图

按下遥控器的一个按键,遥控器的编码芯片会对按键信息进行编码,然后通过LED红外发射器发出脉冲编码,被红外接收头接收后将编码解出并输入到单片机的外部中断,对接收到的脉冲编码进行位“0”和位“1”的识别,再根据不同的码信息调用相应的子程序来对小车进行不同的控制操作。

  3.1.2 HT6221编码芯片简介

HT6221是合泰公司生产的多功能遥控编码芯片,工作电压在1. 8V-3.5V,其采用PPM(Pulse Position Modulation)进行编码,周期能编码16位地址码和8位数据码,最多能同时支持32个活动键。其引脚结构如图3.2所示:

               

                  图3.2 HT6221引脚图

其各引脚说明如下表3-1所示:

3-1HT6221芯片引脚说明

引脚号

引脚名称

          描述

0

AIN

低8位地址码输入

1-8

C1-C8

键盘列控制

9

  LED

按键指示灯

10-13

  R1-R4

键盘行控制, 高电平有效

14

  DOUT

串行数据输出引脚, 38KHz发射频率

15

  VDD

1.8V- 3.5V

16

  DT

最重要数据位(DT)代码设置

17、18

  X2、X1

455KHz振荡器输出,455KHz振荡器输入

19

  VSS

接地

    遥控编码有两种:位0和位1,其低电平脉宽相同但高电平脉宽不一样。采用脉宽调制的串行码,以脉宽为0.565ms、间隔0.56ms、周期为1.125ms的脉冲表示二进制的“0”;以脉宽为0.565ms、间隔1.685ms、周期为2.25ms的脉冲表示二进制的“1”。其波形如图3.3所示:

   

       图3.3 遥控码的“0”和“1”(注:接收端的波形与发射断相反)

  3.1.3 红外遥控发射器

遥控发射器专用芯片很多,在本设计中我们运用了HT6221芯片来实现红外编码的发射。其电路如图3.4所示:   

图3.4 遥控发射器电路原理图

图3.4中当有任意一个按键按下后,按键指示灯(D1)发光,HT6221编码芯片能够产生脉冲编码,该脉冲编码会被调制成38KHz的脉冲信号然后通过图中的红外发射二极管(D2)发射出去[8]。

所按的按键不同其发出的编码脉冲也不同,按键所代表的功能也就不同,其各按键的功能分配如下表3-2所示:


3-2 按键功能分配表

             按键

              功能

              K1

        控制小车的启动

              K2

        控制小车的停止

              K3

        控制小车的加速

              K4

        控制小车的左转

              K5

        控制小车的右转

              K6

        控制小车的倒退

下面是智能小车部分即单片机控制模块、红外接收器模块、电机驱动模块、避障循迹模块、显示模块、电源模块6个子模块的硬件设计介绍。

3.2 单片机控制模块

  3.2.1 单片机模块电路

本设计我们采用AT89C52单片机作为智能小车部分的控制核心,AT89C52单片机是AT89系列的标准型8位单片机,其与标准MCS-51指令系统和8052产品引脚兼容,功耗低、性能强大、价格便宜适用于许多较为复杂控制的场合。AT89C52单片机的内部结构如下:一个以ALU为中心的8位中央处理器,256字节内部数据存储器(RAM),8K字节用来存储程序的Flash内部程序存储器即片内ROM(可反复擦写1000次),4个8位可编程I/O口(P0、P1、P2、P3),3个16位定时/计数器,8个中断源,两个中断优先级的中断控制系统,一个全双工串行通信口,一个片内振荡器和时钟电路[1]。AT89C52单片机最小应用系统主要由单片机、复位电路、振荡电路等部分组成。本设计的单片机控制模块原理图如图3.5所示:

                             图3.5 单片机控制模块

本设计中我们使用了AT89C52单片机的大部分引脚,其具体的引脚功能分配如下表3-3所示:

3-3 单片机引功能分配表

       引脚

                  功能分配

   P0.0-P0.7

接LCD1602的D0-D7引脚,作为数据信息的输出引脚

   P1.0-P1.2

接LCD1602的RS、RW、E引脚,作为数据信息的控制端

P1.3-P1.5、P1.7

连接避障循迹电路的输出端

     P1.6

连接转速测量电路的脉冲输出端

    P2.4-P2.7

连接电机驱动芯片的脉冲信号输入端

      P3.2

外部中断,连接红外接收器的输出端

   VCC

接+5V电源

   GND

接地

  3.2.2 复位电路

单片机的复位,是为了初始化单片机的工作状态,有时当程序运行出错或因操作错误而使系统处于锁死状态,为了摆脱困境,也可按复位键重新初始化单片机。RST引脚是复位信号的输入端,要实现复位操作必须使RST引脚上至少保持两个机器周期的高电平,再从高电平变为低电平完成复位。复位电路由按键复位和上电复位两种方式,本设计采用按键复位实现复位操作。单片机按键复位电路如图3.6所示:

      

                       图3.6 复位电路

按键复位是通过按键使复位引脚经电阻R0与VCC电源接通来实现的,按下复位键时,RST引脚为高电平;松开复位按键后,RST引脚逐渐将为低电平,复位结束。

  3.2.3 振荡电路

AT89C52单片机内有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为芯片引脚XTAL2。只要在片外通过XTAL1和XTAL2引脚跨接振荡元件(如晶体振荡器),则可构成一个稳定的自激振荡器,单片机通电后即可工作。其外部振荡电路如图3.7所示:

      

                         图3.7 振荡电路

AT89C52单片机内部RAM容量很小,当单片机需要存放大量数据时就必须扩展外部数据存储器。此外AT89C52单片机的I/O口数量和功能很有限,也常常要扩展外部接口芯片。由于本设计不需要太多的I/O口,内部程序存储器也够用,所以不用扩展外部数据存储器和外部接口芯片。

3.3 红外接收器及解码

红外接收器也叫做一体化红外接收头,其内部是由红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等构成的。红外监测二极管接收到红外信号后,会把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平。交流信号进入带通滤波器,带通滤波器只允许30khz到60khz的负载波通过,然后脉冲信号再通过解调电路和积分电路进入比较器,由比较器输出高低电平信号,还原出发射端的信号波形。但为了提高接收的灵敏度输出的高低电平和发射端是反相的。红外接收头有很多的种类,一般都有电源引脚、信号输出引脚和接地引脚。根据发射端调制载波的不同应选用相应解调频率的接收头,本设计我们采用一体化红外接收头1838来解调HT6221编码芯片的编码。其实物图如图3.8所示:

                          

                          图3.8 1838红外接收头

由于红外接收头内部放大器也很大的增益,这样很会容易引起干扰,因此在接收头的电源引脚上须加上大小在22uf以上的滤波电容。本设计的红外接收电路如图3.9所示:

         

                              图3.9 红外接收电路图

其中U6为1838红外接收头,电容C4为滤波电容,DOUT 是解调信号的输出端,直接与单片机的P3.2引脚即INT0中断相连[8]。

解码的重点是怎样识别位0和位1,由于位0和位1的低电平脉宽相同但高电平脉宽不一样。所以需要根据高电平的宽度区别位0和位1,如果从0.56ms低电平信号过后延时了0.56ms以后如果能读到低电平信号说明该位为0反之则为1,为了可靠起见延时必须介于0.56ms和1.12ms之间,否则如果该位为0读到的已是下一位的高电平,因此我们取其中间值即(1.12ms+0.56ms)/2=0.84ms。

当按下遥控器的按键后,便有红外脉冲编码信号发出,经红外接收头接收解码后在其输出端输出检波整形后的方波信号,然后直接输入至单片机外部中断进行码信息的识别,单片机再调用相应子程序执行对应的操作。具体解码操作流程图如图3.10所示:

               

                     图3.10 红外接收解码流程图

3.4 电机驱动模块

  3.4.1 步进电机的工作原理

步进电机是一种将电脉冲信号转变为角位移或线位移的电机。电机转动的快慢取决于脉冲信号的频率、转动的圈数取决于脉冲的个数,在不超载的情况下其转动速度不受负载的影响,即给步进电机输入一个脉冲信号,电机的转子就转过一个固定角度(步距角),给其输入连续的脉冲信号步进电机就能连续转动[5]。

在本设计中我们采用步距角为1.8度的四相步进电机作为小车的驱动电机,其内部结构及元件图如图3.11所示:

                  图3.11 步进电机结构和元件图

四相步进电机有着比较小的体积和转矩,该电机共有5根引出线,分别是内部四组绕组线圈A、B、C、D的四根引出线,一根电源引出线,其采用单极性直流电源供电,使A、B、C、D四相绕组轮流供电,转子就会沿着A、B、C、D方向转动。其旋转角度与脉冲数成正比,旋转频率与脉冲频率成正比。

本设计的步进电机采用四相八拍的工作方式,即A-AB-B-BC-C-CD-D-DA-A

的通电顺序工作。当通电顺序为A-AB-B-BC-C-CD-D-DA时电机正转,当通电顺序为DA-D-CD-C-BC-B-AB-A时电机反转。步进电机工作时的时序波形图如图3.12所示:

                   图3.12 步进电机工作时序波形图

  3.4.2 ULN2003芯片简介

ULN2003驱动芯片可以直接用来驱动电流小于0.5A的步进电机。ULN2003芯片是美国TI公司和Sprague公司开发的高压大电流达林顿晶体管阵列电路具有较高的电流增益和工作电压、较宽的温度范围、较强的驱动负载能力等特点,适和应用于各种高速大功率的驱动系统中。其内部结构及引脚如图3.13所示:

               

                        图3.13 ULN2003芯片引脚图

其引脚说明如表3-4所示:

3-4ULN2003芯片引脚说明

             引脚

           功能说明

           IN1-IN7

     脉冲信号输入端(接单片机)

              GND

            接地

          OUT1-OUT7

     驱动信号输出端(接步进电机)

             COM

          接+5V电源

ULN2003驱动芯片的输出结构是集电极开路的,所以要在输出端接一个上拉电阻,通常单片机驱动ULN2003时,上拉2K的电阻较为合适。

  3.4.3 步进电机驱动电路设计

由于单片机的输出电流太小,而步进电机需要较大的驱动电流,所以需要驱动电路来连接单片机和步进电机。本设计中我们采用四相步进电机作为小车的驱动电机,用单极性直流电源供电。采用ULN2003芯片直接驱动步进电机,步进电机驱动电路如图3.14所示:

图3.14 步进电机驱动电路

ULN2003的输入端直接与单片机的P2.4-P2.7引脚相连,单片机输出不同的脉冲信号,这些脉冲信号经ULN2003驱动芯片放大后分别控制步进电机的启动、停止、正转、反转、加速和减速。本设计中只要对步进电机的各相绕组按合适的时序通电,就能使步进电机转动。正、反转可由输入不同顺序的脉冲信号来控制以实现小车的前进和后退;我们使用两个步进电机分别控制小车的左轮和右轮,通过单片机输出不同频率的脉冲使左右两个车轮具备不同的转速,由转速差实现小车的转向,当左侧车轮转速大于右侧车轮时小车右转,当右侧车轮转速大于左侧时小车左转。

3.5 避障循迹模块

本设计我们采用了红外反射式光电传感器、电压比较器及一些电阻来构成障碍物检测电路,并直接与单片机的P1.4引脚相连,其可将检测到的模拟信号转化为高低电平信号然后输入到单片机,单片机根据输入的高低电平信号来判断是否有障碍物,若有则调用自动避障子程序控制小车做出相应的避障动作。障碍物检测电路如图3.15所示:

图3.15 障碍物检测电路

图中U3红外反射式光电传感器是由红外发光二级管和光敏三极管组成的,红外发光二级管用来发射红外线,光敏三极管用来接收被反射回来的红外线。红外接收/检测器有一个内置的只允许红外光线通过的光滤波器和一个只允许38.5 kHz左右电信号通过的电子滤波器,这样就防止了外来光源对红外接收器的干涉。

U4是电压比较器,它能够将输入的模拟电压信号转化为高低电平信号,当3脚电平大于4脚时,输出端1脚输出为高电平,反之输出为低电平。障碍物检测电路安装在小车前部的中间及左右两边,来检测小车前方的障碍物。其障碍检测过程如下:红外二极管发出红外光,如果遇到小车前面的障碍物,红外线就会被物体反射回来并被光敏三极管吸收,此时光敏三极管导通并在输出端输出低电平信号至单片机,然后单片机调用寻迹避障子程序控制步进电机做出相应的避障反应,当左边遇到障碍物时小车右转,当右边遇到障碍物时小车左转。当无障碍物时,发出的红外线不被反射,光敏三极管截止,输出高电平信号,小车继续向前行驶[9]。

循迹的原理和避障的原理是相同的,循迹电路安装在小车底部,循迹是通过辨别黑白色来行走。工作过程如下:红外发光二极管发出红外光,当遇到黑色,不反射红外光,比较器输出为高电平;当遇到白线,红外光被反射回来,比较器输出为低电平。单片机根据输入电平的变化判断小车的行驶路线是否偏离,然后调用自动避障子程序实现小车的自动循迹,当左边检测到白色时小车右转,当右边检测到白色时小车左转;当两边检测到的都是黑色时小车前进,当两边检测到的都是白色时小车停止。

3.6 转速检测模块

施密特触发器是具有特殊功能的非门,当它的输入端的电压上升到某个值时,输出端会立即从高电平跳变为低电平,而当输入端的电压下降到某一个值时,输出端会立即从低电平跳变为高电平。本设计采用直射式光电检测器、施密特触发器、三极管和若干电阻构成的电路与单片机的P1.6引脚相连来测量小车车轮的转速,其实物图和电路图如图3.16所示:

                          

                      图3.16 透射式光电测速实物和电路图

具体的转速检测方法是:在小车的驱动轮的主轴上安装一个开有十个透光槽的圆形叶片,保持叶片和驱动轮能够同步转动,然后在驱动轮旁安装好直射式光电检测器,叶片随着车轮的转动不断切割红外发射管与红外接受管之间的光通路,当叶片转动至透光槽与光通路重合时,光通路导通,光敏三极管通过电流,输出端会输出一个低电平信号,当叶片转动至使透光槽遮住时,光通路断开,输出端会输出一个高电平信号。随着车轮不断的转动,光通路不断的导通和断开,输出端便会输出连续的脉冲序列,测出脉冲的个数便可知叶片转过的孔数,由叶片转过的孔数可以知道车轮转过的圈数,从而可计算出车轮转动的转速,然后再根据车轮半径便可算出小车运行的速度和路程[11]。

3.7 数据显示模块

本设计中小车的数据显示电路采用液晶显示屏LCD1602,LCD1602具有8位并行2线或者3线串行两种接口方式。LCD1602液晶显示模块具有体积小、功耗低、显示内容丰富、超薄轻巧等优点。具体的液晶显示电路如图3.17所示:

   

                       图3.17 LCD液晶显示电路

电路中LCD1602与AT89C52单片机使用并行数据通信。引脚1接电源电压正极,引脚0、14、15分别接电源电压负极,为LCD1602提供电源与背光电源;2脚接一个10K电位器用于调节背光灯光度;3、4、5脚分别接P1.0、P1.1、P1.2脚作为单片机控制信号输入与输出端;6—13脚接单片机的P0.0—P0.7脚作为单片机数据信息输入端。数据显示的原理为:首先通过数据显示子程序将小车的速度、路程等数据信息计算出来,然后再将这些数据信息通过单片机的P0.0-P0.7引脚直接输出至LCD1602的DO-D7引脚[8]。

3.8 电源模块

电源是整个小车系统运行的基本条件,它的性能的好坏直接决定整个系统运行的稳定性和性能。小车的供电电源包含两部分,单片机控制模块电源和电机驱动模块电源,我们将单片机及其外围电路和步进电机分开供电,两者互相不影响,实现稳定供电。

本设计中我们采用3节4.2V锂电池串联共12.6V直接给步进电机供电,用于驱动小车电机,也可降至5V后给单片机及其他逻辑单元供电。这三节电池的体积和重量都比较小,便于安装在小车底座,不会造成电机负载过大,而且价格低、电流驱动能力强。为了给单片机及其他逻辑单元供电,必须将锂电池组的电压降至5V,这里我们采用LM7805稳压芯片进行降压,稳压电路如图3.18所示:

图3.18 5V稳压电路

第四章 系统软件设计

在进行微机控制系统设计时,除了系统硬件设计外,大量的工作就是如何根据每个对象的实际需要设计应用程序,小车能否实现要求功能取决于软件的编程是否合理。本设计采用模块化程序设计法进行系统软件的设计,主要包含主程序、避障循迹子程序、数据显示子程序等程序模块。由于本人水平和能力有限只完成了部分模块的程序设计。

4.1 系统总体程序流程图

系统的总体程序流程图如图4.1所示:

      

                      图4.1 系统程序流程图

在图4.1系统程序流程图中,开始时先是系统的初始化,包括定时器初始化,外部中断的初始化,液晶显示器的初始化。其中避障循迹子程序用于控制小车自动躲避障碍和自动沿着特定的黑线行驶;数据显示子程序主要是将测得的车轮转速换算成小车的行驶的速度、路程等数据进而在LCD1602液晶显示屏显示。

4.2 避障循迹模块程序设计

  4.2.1 避障程序流程图

      

                           图4.2 避障程序流程图

图4.2所示为小车避障程序流程图,小车在行驶过程中由位于小车前部的四个障碍物检测电路不断检测小车周围环境,若遇到障碍物则将低电平信号输入至单片机,然后由单片机调用避障子程序控制小车作出相应的避障动作。如果左边遇到障碍则调用右转子程序,右边遇到障碍则调用左转子程序,前方遇到障碍则调用左转或右转子程序,没有遇到障碍则调用直行子程序。具体的程序请见附录B避障子程序。

4.2.2 循迹程序流程图

      

                          图4.3 循迹程序流程图

图4.3所示为循迹程序流程图,小车在循迹行驶过程中安装在小车底部的四个红外反射式光电开关不断检测小车的行驶路线,若小车偏离黑线则将检测到的低电平信号输入至单片机,单片机再调用循迹子程序控制小车使其沿着黑线行驶,如果小车偏向黑线左边则调用右转子程序,偏向黑线右边则调用左转子程序,在黑线上则调用直走子程序,完全偏离黑线则调用后退子程序。具体的程序请见附录B循迹子程序。

4.3数据显示模块程序设计

                  

                      图4.4 数据显示程序流程图

在图4.4数据显示程序流程图中,首先初始化LCD1602,然后在液晶的第一行显示“路程: cm”,液晶第二行显示“速度: cm/s”然后由主程序不断调用数据显示程序不断刷新cm或者cm/s前面的数字实现实时显示的目的。具体的程序请见附录B数据显示子程序。

第五章 总结与展望

5.1 总结

本设计的智能小车基本上实现了题目要求的各项功能,可以用遥控来控制小车的启停、左转、右转、前进、倒退,小车能自动沿着黑线行驶,遇到障碍时能够自动躲避障碍,而且可以实时显示运行的速度、路程等数据。通过本次设计让我学会了电子产品的设计开发过程,掌握了红外遥控原理、步进电机的驱动原理、采用红外反射式光电开关检测障碍的原理、显示原理等自己以前并不了解的新知识,对单片机的结构和其控制系统也有了更深的理解和认识,对于Altium Designer、Proteus等电路设计和仿真软件的操作也更加熟练,特别是在、自己最不擅长的软件编程方面也有了一定的提高。

但是由于本人水平和能力有限,本设计中还存在一些不足之处。例如由于安装在小车上面的红外传感器检测范围有限,存在一些检测盲区,光电检测也容易收到外界环境和太阳光的干扰,有时可能会导致小车的循迹避障功能失效;小车是利用转速差来转弯的但是这种方法转弯不够顺畅也不能持续转弯并且对电机的损耗也较大,这些都有待进一步的改进和完善。

5.2 改进与展望

在本设计中我们可以采用超声波避障来代替红外避障以减少外界干扰;多安装几个寻迹电路,在小车的车头底部左右两边各一个,中间底部左右两边各一个,车尾底部左右两边各一个,这样可提高小车寻迹功能的可靠性和灵敏性;通过多组速度(不同脉冲所对应的速度)的实际测试,寻找更合适的转向速度,以提高转向的精确度。

我们还可以为小车添加语音控制模块,用语音来控制小车的一些状态,这样将大大增加其人机交互控制的趣味性。


致谢

    不知不觉三个月的时间过去了,从开始的搜集查找相关文献资料确定一个大体的设计思路到后来一步步的进行各个模块的具体设计再到现在最终设计的完成,特别感谢我的指导老师杨安平老师在设计过程中给予我的极大帮助,虽然老师平时很忙,但每周仍会抽出两次时间来对我不懂的地方进行耐心的指导,并对我的设计方案提出一些改进的意见,教会了我解决相关问题的具体思路和方法,并且在我不擅长的硬件设计和软件设计方面给予了我细心的讲解。本设计能够顺利完成设计任务,除了杨老师外还有很多同学也对我的设计进行了一些指导和帮助,在此对你们表示最诚挚的感谢!

    最后还要感谢各位评阅老师在百忙之中抽出时间对本论文进行评阅,谢谢!



单片机源程序如下:
  1. #include<uart.h>
  2. #define LeftIR P1_2      //左边红外接收连接到P1_2
  3. #define RightIR P3_5    //右边红外接收连接到P3_5
  4. #define LeftLaunch P1_3 //左边红外发射连接到P1_3
  5. #define RightLaunch P3_6 //右边红外发射连接到P3_6
  6. void delay_nus(unsigned int i)
  7. {
  8.   i=i*10/12;
  9.   while(--i);
  10. }
  11. void Hardware_delay_1ms(void)
  12. {
  13.    TMOD &=0xF0;
  14.    TMOD |=0x01;  //T0——16位定时器器模
  15.   TH0 = 0xFC;
  16.    TL0 =0x18;    //64536
  17.    TF0=0;        //清除定时器溢出标志
  18.    TR0=1;         //启动定时器   
  19.   while(TF0==0);  //等待计数完成
  20.   TR0=0;         //停止定时器
  21. }
  22. void delay_nms(int n) //延时ms
  23. {
  24.     int j;
  25.     for(j=n;j>0;j--)
  26.      Hardware_delay_1ms();   
  27. }
  28. void IRLaunch(unsigned char IR)
  29. {
  30. int counter;
  31. if(IR==‘L’)              //左边发射
  32. for(counter=0;counter<38;counter++)
  33. {
  34. LeftLaunch=1;
  35. delay_nus(13);
  36. LeftLaunch=0;
  37. delay_nus(13);
  38. }
  39. if(IR=='R')              //右边发射
  40. for(counter=0;counter<38;counter++)
  41. {
  42. RightLaunch=1;
  43. delay_nus(13);
  44. RightLaunch=0;
  45. delay_nus(13);
  46. }
  47. }
  48. void Forward(void)          //直行子程序
  49. {
  50. P1_1=1;
  51. delay_nus(1700);
  52. P1_1=0;
  53. P1_0=1;
  54. delay_nus(1300);
  55. P1_0=0;
  56. delay_nms(20);
  57. }
  58. void Left_Turn(void)      //左转子程序
  59. {
  60. int i;
  61. for( i=1;i<=23;i++)
  62. {
  63. P1_1=1;
  64. delay_nus(1300);
  65. P1_1=0;
  66. P1_0=1;
  67. delay_nus(1300);
  68. P1_0=0;
  69. delay_nms(20);
  70. }
  71. }
  72. void Right_Turn(void)      //右转子程序
  73. {
  74. int i;
  75. for( i=1;i<=23;i++)
  76. {
  77. P1_1=1;
  78. delay_nus(1700);
  79. P1_1=0;
  80. P1_0=1;
  81. delay_nus(1700);
  82. P1_0=0;
  83. delay_nms(20);
  84. }
  85. }
  86. void Backward(void)        //后退子程序
  87. {
  88. int i;
  89. for( i=1;i<=65;i++)
  90. {
  91. P1_1=1;
  92. delay_nus(1300);
  93. P1_1=0;
  94. P1_0=1;
  95. delay_nus(1700);
  96. P1_0=0;
  97. delay_nms(20);
  98. }
  99. }
  100. int main(void)
  101. {
  102. int irDetectLeft,irDetectRight;
  103. uart_Init();
  104. printf("Program Running!\n");
  105. while(1)
  106. {
  107. IRLaunch('R');                  //右边发射
  108. irDetectRight = RightIR;        //右边接收
  109. IRLaunch('L');                  //左边发射
  110. irDetectLeft = LeftIR;          //左边接收
  111. if((irDetectLeft==0)&&(irDetectRight==0))//同时接到红外线
  112. {
  113. Backward();
  114. Left_Turn();
  115. Left_Turn();
  116. }
  117. else if(irDetectLeft==0)        //只有左边接收到红外线
  118. {
  119. Backward();
  120. Right_Turn();
  121. }
  122. else if(irDetectRight==0)       //只有右边接收到红外线
  123. {
  124. Backward();
  125. Left_Turn();
  126. }
  127. else
  128. Forward();
  129. }
  130. }


  131. 循迹子程序
  132. #include <uart.h>
  133. #define LD1    P1_2;   //左左检测灯
  134. #define LD2    P1_3;   //中左检测灯
  135. #define RD1    P3_5;   //中右检测灯
  136. #define RD2    P3_6;   //右右检测灯
  137. void delay_nus(unsigned int i)
  138. {
  139.   i=i*10/12;
  140.   while(--i);
  141. }  
  142. void Hardware_delay_1ms(void)
  143. {
  144.    TMOD &=0xF0;
  145.    TMOD |=0x01; //T0——16位定时器器模
  146.   TH0 = 0xFC;
  147.    TL0 =0x18;    //64536
  148.   TF0=0;        //清除定时器溢出标志
  149.    TR0=1;         //启动定时器   
  150.   while(TF0==0);//等待计数完成
  151.    TR0=0;         //停止定时器
  152. }
  153. void delay_nms(int n)
  154. {
  155.     int j;
  156.     for(j=n;j>0;j--)
  157.      Hardware_delay_1ms();   
  158. }
  159. void Forward(void)           //直行子程序
  160. {
  161. P1_1=1;
  162.                             delay_nus(1440);
  163.                             P1_1=0;
  164.                             P1_0=1;
  165.                 delay_nus(1400);
  166.                             P1_0=0;
  167.                             delay_nms(20);
  168.               }
  169. void Left_Turn(void)      //左转子程序
  170.                             {
  171.                             int i;
  172.                             for( i=1;i<=15;i++)
  173.                                           {
  174.                                           P1_1=1;
  175.                                           delay_nus(1420);
  176.                                           P1_1=0;
  177.                                           P1_0=1;
  178.                                           delay_nus(1400);
  179.                                           P1_0=0;
  180.                                           delay_nms(20);
  181.                                           }
  182.                             }
  183. void Right_Turn(void)       //右转子程序
  184.                             {
  185.                             int i;
  186.                             for( i=1;i<=15;i++)
  187.                                           {
  188.                                           P1_1=1;
  189.                                 delay_nus(1440);
  190.                                           P1_1=0;
  191.                                           P1_0=1;
  192.                                 delay_nus(1420);
  193.                                           P1_0=0;
  194.                                           delay_nms(20);
  195.                                           }
  196.                             }
  197. void Backward(void)        //后退子程序
  198.                             {
  199.                             int i;
  200.                             for( i=1;i<=65;i++)
  201.                                           {
  202.                                           P1_1=1;
  203.                                 delay_nus(1400);
  204.                                           P1_1=0;
  205.                                           P1_0=1;
  206.                                 delay_nus(1440);
  207.                                           P1_0=0;
  208.                                           delay_nms(20);
  209.                                           }
  210.                             }
  211. int main ()
  212. {
  213. int L1,L2,R1,R2;
  214. uart_Init();
  215. printf("Program Running!\n");
  216.               while(1)
  217.               {
  218. L1=LD1;
  219.                   L2=LD2;
  220.                   R1=RD1;
  221.                   R2=RD2;
  222. if((L1==1)&&(R2==0))         //左灯检测到黑色右灯检测到白色 左转
  223.                             {
  224.                             Left_Turn();
  225.                             }
  226. else if((L1==0)&&(R2==1))      //左灯检测到白色右灯检测到黑色 右转
  227.                             {
  228.                   Right_Turn();
  229.                             }
  230. else if((L1==0)&&(L2==0)&&(R1==0)&&(R2==0)) //四个灯都检测到白色 后退
  231.                             {
  232.                             Backward();
  233.                             }
  234. else if((L1==1)&&(L2==1)&&(R1==1)&&(R2==1))//四个灯都检测到黑色 后退
  235.                             {
  236.                             Backward();
  237.                             }
  238. else      //前进
  239.                             {
  240.                             Forward();
  241.                             }
  242.               }
  243.    }
  244. 数据显示子程序
  245. bit lcd_busy()                //判忙函数
  246. {
  247.               bit result;
  248.               RS=0;
  249.               RW=1;
  250.               E=1;
  251.               _nop_();
  252.               _nop_();
  253.               _nop_();
  254.               _nop_();
  255.               result = (bit)(P0&0x80);
  256.               E=0;
  257.               return result;
  258. }
  259. void lcd_write_cmd(uchar cmd)   //液晶写指令
  260. {
  261.               while(lcd_busy());
  262.               RS=0;
  263.               RW=0;
  264.               E=0;
  265.               _nop_();
  266.               _nop_();
  267.               P0=cmd;
  268.               _nop_();
  269.               _nop_();
  270.               _nop_();
  271.               _nop_();
  272.               E=1;
  273.               _nop_();
  274.               _nop_();
  275.               _nop_();
  276.               _nop_();
  277.               E=0;                           
  278. }
  279. void lcd_write_dat(uchar dat)                            //液晶写数据指令
  280. {
  281. ……………………

  282. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
基于单片机的智能小车设计.doc (1.04 MB, 下载次数: 161)
回复

使用道具 举报

ID:517182 发表于 2019-4-20 16:28 | 显示全部楼层
怎么没有完整的电路设计图?发出来学习学习
回复

使用道具 举报

ID:717081 发表于 2020-3-30 21:11 | 显示全部楼层
搜获很大,很详细
回复

使用道具 举报

ID:720168 发表于 2021-1-18 15:30 | 显示全部楼层
你好,发射电路的NPN是哪种类型
回复

使用道具 举报

ID:960382 发表于 2021-8-13 16:34 | 显示全部楼层
看看步进电机,也玩玩这个
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表