电子信息专业实验报告
课 程 电子信息系统综合设计实验MCU部分
实验题目 智能机器小车设计 实验总分
学生姓名 学 号
学生姓名 学 号
学生姓名 学 号
实验时间 地 点分组
电子信息学院专业实验中心
目录
一、摘要
二、题目要求
三、软硬件设计方案
四、各部分电路的作用及电路工作原理分析
五、系统调试与实验结果
六、实验结果
七、拓展功能
八、参考资料
九、附录
一、摘要
摘要:智能循迹小车主要由单片机模块、传感器模块、电机驱动模块以及电源模块组成,小车具有自主寻迹的功能。本次设计我们采用STC89C52单片机作为控制芯片,传感器模块采用红外光电对管和比较器实现,能够识别黑白两色路面,电机模块由L293D芯片和两个减速直流电机构成,组成了智能车的动力系统,电源采用7.2V的直流电池,经过系统组装,从而实现了小车的自动循迹的功能。
关键词 智能小车 STC89C52单片机 L293D芯片 红外光对管
二、题目要求
“智能寻迹机器小车设计”,要求采用MCS-51单片机为控制芯片,设计出一个能够识别并沿着以白底为道路色,宽度5mm左右的黑色胶带制作的不规则的封闭曲线为引导轨迹行进的智能寻迹机器小车。
三、软硬件设计方案
1、硬件部分
可分为四个模块:单片机模块、传感器模块、电机驱动模块以及电源模块。
1.1、单片机模块
单片机模块为小车运行的核心部件,起控制小车的所有运行状态的作用。本次小车的设计我们小组采用的是ATMEL公司的STC89C52RC单片机。STC89C52RC是一种低损耗、高性能、CMOS八位微处理器,片内有4k字节的在线可重复编程、快速擦除快速写入程序的存储器,能重复写入/擦除1000次,数据保存时间为十年。其程序和数据存储是分开的。
STC89C52RC单片机介绍:
上图为STC89C52RC引脚图。
STC89C52RC引脚功能说明 :
VCC(40引脚):电源电压
VSS(20引脚):接地
P0端口(P0.0~P0.7,39~32引脚):P0口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线。此时,P0口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节;而在校验程序时,则输出指令字节。验证时,要求外接上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):P1口是一个带内部上拉电阻的8位双向I/O口。P1的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流。
P2端口(P2.0~P2.7,21~28引脚):P2口是一个带内部上拉电阻的8位双向I/O端口。P2的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流。
P3端口(P3.0~P3.7,10~17引脚):P3是一个带内部上拉电阻的8位双向I/O端口。P3的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这时可用作输入口。P3做输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输入一个电流。
RST(9引脚):复位输入。当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平有效。
30引脚:地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,此引脚也用作编程输入脉冲。
29引脚:外部程序存储器选通信号,当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。
31引脚:访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,
必须接GND。
XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。
XTAL2(18引脚):振荡器反相放大器的输入端。
1.2 传感器模块
我们小组使用光电传感器来采集路面信息。使用红外光电对管,其结构简明,实现方便,成本低廉,没有复杂的图像处理工作,因此反应灵敏,响应时间少。但也存在不足,它能获取的信息是不完全的,容易受很多扰动(如背景光源,高度等)的影响,抗干扰能力较差。但本次实验要求精度并不是太高,出于成本和设计复杂度方面考虑,我们决定采用红外对管来完成传感器模块。
图中仅以一对光电管示例
1.3 电机控制模块
我们本次实验采用的是直流减速电机电机,其转过的角度可以精确定位,可实现小车行进过程的精确定位,驱动部分我们则采用的是采用专用芯片L293D作为电机驱动芯片其操作方便,稳定性好,性能优良。一片L293D就可以分别控制两个步进电机工作。
1.4 电源模块
电源模块的作用是给整个系统稳定供电以保持其正常工作,包括7.2V的电源以及转5V部分,其中7.2V的是给步进电机和其驱动供电,5V的用来驱动单片机及其他芯片。
硬件各个部分的连接图如下:
2、软件部分
2.1程序流程图
本系统采用的是STC89C52单片机,再根据硬件连接,通过相应的软件来完成对信号的采集和数据的分析,再控制小车的运行状态,以下为主程序流程图:
2.2程序设计思路
2.2.1寻迹模块程序
通过传感器获得路面信息然后反馈给单片机,再通过单片机来实现相应的功能。
2.2.2电机驱动模块程序
控制两个直流电机,实现前进、后退、前左转、前右转、停车等功能。
四、各部分电路的作用及电路工作原理分析
1、电机驱动模块
1.1、电机工作原理
本次我们的小车动力部分采用的是直流减速电机,又叫齿轮减速电机,是在普通直流电机的基础上,加上配套齿轮减速箱。齿轮减速箱的作用是,提供较低的转速,较大的力矩。同时,齿轮箱不同的减速比可以提供不同的转速和力矩。这大大提高了,直流电机在自动化行业中的使用率。减速电机是指减速机和电机(马达)的集成体。这种集成体通常也可称为齿轮马达或齿轮电机。通常由专业的减速机生产厂进行集成组装好后成套供货。减速电机广泛应用于钢铁行业、机械行业等。使用减速电机的优点是简化设计、节省空间。
减速机部分: 主要有齿轮,轴承,蜗轮,蜗杆等。
电机部分:定子:主磁极+换向极+机座+电刷装置
转子:电枢铁心+电枢绕组+换向器+转轴
直流电机工作原理:
直流电机是智能车行进的动力部件,它的转动是通过给它加载直流电压来实现的,下面介绍它的工作原理。
直流电机由定子、转子和电刷组成。当给电刷加一直流电压,转子上的绕组线圈中就有电流流过,由毕-萨电磁力定律可知:
一个通电流的导体,在磁场中要受到力的作用,这个力叫电磁力。
电磁力的大小由下式决定
电磁力f=Bli
电磁力方向由左手定则判定如图4.1.1所示。根据毕-萨电磁力定律可知,当磁密度和绕组线圈长度一定时,电磁力的大小只和流过绕组线圈的电流的大小有关图4.1.2是直流电机分析物理模型图,它表示了一台最简单的两极直流电机模型,它的固定部分(定子)由一对NS相对的永磁磁铁和一对电刷组成,旋转部分(转子)则由电枢线圈绕组和一对相互隔离的圆弧形铜片做成的换向片组成,两换向片分别接到电枢线圈绕组的A、B端,换向片与转轴之间是互相绝缘的。定子与转子之间要有一定的气隙空间,流过转子上电枢线圈绕组的电流由定子部分的电刷与换向片接触导通来实现。当电刷A与换向片A相接触时如果我们通以正向电流,如图4.2.2所示,电流从线圈绕组的A端流入,根据电磁力方 图4.1.2
向左手定则可知会产生一个向左的切线方向的电磁力,使得转子逆时针旋转。当旋转到90°时,电刷A与换向片A脱离接触而与换向片B接触,同时电刷B也与换向片B脱离而与换向片A接触,虽然电枢旋转后电枢线圈绕组的位置发生了改变,但是由于换向片的作用,电流虽然是从电枢线圈绕组的B电流入,但是电流的方向没有改变,根据电磁力方向左手定则,电磁力的方向依然是向左的切线方向,因此转子在一直向左的电磁力的作用下就会不断的逆时针旋转。同理当改变加载在换向片两边的电压极性时,因为改变了流入电机绕组的电流方向,根据电磁力方向左手定则可知转子会沿顺时针方向旋转。
如果加载在电机两端的电压,根据欧姆定律流过电枢线圈绕组的电流就会增大,由毕-萨电磁力定律:
电磁力f=Bli
可知,当磁场强度和导线长度一定时,电磁力只和流过电枢线圈的电流有关,电流越大电磁力越大,那么电机就转得越快。现在除了有刷电机外还有无刷直流电机,无刷直流电机的原理和有刷的差不多,简单地说就是把把定子和转子换了一个位置,转子是永磁体,定子是绕组,电刷由永磁体担任,换向片由霍尔元件和换成了电子换向器组成。
1.2、驱动部分原理及电路图
L293D提供双向驱动电流高达600毫安,电压是从4.5 V至36 V的。两个设备是专为驱动等感性负载继电器,电磁阀,直流双极步进和马达,也可以给其他高电流/高电压提供电源负载。兼容所有的TTL输入,每个输出都是推拉式驱动电路,与达林顿三极管和伪达林源。启用1,2 EN驱动器和3,4 EN驱动器。当使能输入为高电平时,相关联的驱动器被启用和他们的 输出处于活动状态,并在其输入端的同相。当使能输入为低,这些驱动器被禁用 其输出关闭,在高阻抗状态。工作温度是从0℃到70℃。
L293D引脚和驱动电路图:
L293D的输入输出部分原理图如下:
驱动和电机相连接的电路图如下(左边引脚分别于单片机相应引脚相连)。
2、信号采集模块
智能小车在运行之后是不需要人来操控的,因此信号采集模块是非常重要的,本系统采用的是红外对管来采集路面信息,红外发射管会定时的发射红外光,当前面路面是黑色时,大部分的光被吸收,红外接收管接收到微弱的发射信号,反馈给控制系统信号“1”,当前面的路面是白色时,大部分的光被反射,红外接收管接收到较强的信号,反馈给控制系统信号”0”,这样就通过传感器系统收集到了路面信息,接下来由信号处理系统来分析处理,从而判断小车的运动情况。传感器部分电路原理图如下所示:
红外发射接收管的电路连接装配图:
LM393双电压比较器集成电路内部原理图:
3、信号处理模块
检测到白色路面的红外接收头处理后送出的是低电平(“0”),而检测到黑色路线的检测头送出的是高电平(“1”),由此可根据这2个红外接收头的高低电平判断路线情况而调整小车前进方向。具体情况有如下几种:
a 检测到 0 0 小车直走
b 检测到 1 0 小车左转
c 检测到 0 1 小车右转
d 检测到 1 1 小车停止
主芯片的电路:
USB转串口电路:
MAX232芯片是美信(MAXIM)公司专为RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。
MAX232内部原理图:
Usb转串口电路连接图
可以直接实现单片机与电脑相连接,进行程序烧录。
五、系统调试
1、硬件部分
焊接完成后,首先进行的调试是用数字万用表测量各个电路是否焊接正常,是否有虚焊漏焊等现象的出现,以及各个电容是否是正常的未被击穿状态、电阻的阻值是否与设计的原理图上的一致。接通电源,用数字万用表测量当有+5V的各引脚是否有+5V的电压,测量电路中是否出现了不该有的短路现象。接入光电传感器模块,使各个光电检测器的光电对管靠近白纸,观察对应的发光二极管是否发光,不发光表示正常。 然后再使各个光电对管靠近黑线,观察对应的发光二级管是否发光,发光表示正常。
硬件部分的原理图见附录一。
2、软件部分
首先我们先测试了小车的前进,停止,左转和右转。组装信号采集模块后,实现小车的自动循迹功能。
软件部分的程序代码见附录三。
六、实验结果
1、主要功能测试:小车可以在黑色轨迹上完成循迹任务。并且在转弯时,前面的定位发光二极管可以模拟汽车的转向。
2、其他功能测试:二极管的动态显示,红外遥控,防撞等功能将相应程序烧入其中基本上都可以实现。
七、拓展功能
防止掉落地面功能:当小车行驶到悬空的地方时,前面的红外对管检测不到信号就会停止,防止小车掉落。
八、参考资料
《电子信息专业实验教程》 四川大学出版社
《C语言程序设计与应用》 清华大学出版社
《电路理论基础》 科学出版社
《模拟电子技术》 清华大学出版社
《数字电路设计》 四川大学出版社
九、附录
附录一:总体电路原理图:
附录二:主板和传感器电路焊接装配图:
附录三:软件部分程序代码
#include <REGX52.H> //包含51单片机相关的头文件
sbit LeftLed=P2^0; //定义前方左侧指示灯端口
sbit RightLed=P0^7; //定义前方右侧指示灯端口
sbit FontLled=P1^7;
sbit LeftIR=P3^5; //定义前方左侧红外探头端口
sbit RightIR=P3^6; //定义前方右侧红外探头端口
sbit FontIR=P3^7; //定义前方正前方红外探头端口
sbit M1A=P0^0; //定义左侧电机驱动A端
sbit M1B=P0^1; //定义左侧电机驱动B端
sbit M2A=P0^2; //定义右侧电机驱动A端
sbit M2B=P0^3; //定义右侧电机驱动B端
sbit B1=P0^4; //定义语音识识别传感器端口
sbit SB1=P0^6; //定义蜂鸣器端口
void tingzhi()
{
M1A=0; //将M1电机A端初始化为0
M1B=0; //将M1电机B端初始化为0
M2A=0; //将M2电机A端初始化为0
M2B=0; //将M2电机B端初始化为0
}
void qianjin()
{
M1A=1;
M1B=0;
M2A=1;
M2B=0;
}
void houtui()
{
M1A=0;
M1B=1;
M2A=0;
M2B=1;
}
void zuozhuan()
{
M1A=0;
M1B=1;
M2A=1;
M2B=0;
}
void youzhuan()
{
M1A=1;
M1B=0;
M2A=0;
M2B=1;
}
void delay_nus(unsigned int i) //延时:i>=12 ,i的最小延时单12 us
{
i=i/10;
while(--i);
}
void delay_nms(unsigned int n) //延时n ms
{
n=n+1;
while(--n)
delay_nus(900); //延时 1ms,同时进行补偿
}
void ControlCar(unsigned char ConType) //定义电机控制子程序
{
tingzhi();
switch(ConType) //判断用户设定电机形式
{
case 1: //前进 //判断用户是否选择形式1
{
qianjin();
break;
}
case 2: //后退 //判断用户是否选择形式2
{ houtui(); //M2电机反转
break;
}
case 3: //左转 //判断用户是否选择形式3
{
zuozhuan(); //M2电机正转
break;
}
case 4: //右转 //判断用户是否选择形式4
{
youzhuan(); //M1电机正转
//M2电机反转
break;
}
case 8: //停止 //判断用户是否选择形式8
{
tingzhi();
break; //退出当前选择
}
}
}
void main() //主程序入口
{
bit RunFlag=0; //定义小车运行标志位
//RunShow=0; //初始化显示状态
ControlCar(8); //初始化小车运行状态
while(1) //程序主循环
{
Start:
LeftLed=LeftIR; //前方左侧指示灯指示出前方左侧红外探头状态
RightLed=RightIR; //前方右侧指示灯指示出前方右侧红外探头状态
FontLled= FontIR;
SB1=LeftIR;
if(LeftIR == 0 && RightIR == 0) //三个红外检测到黑线,就前进
{
ControlCar(1);
delay_nms (10);
goto NextRun;
}
if(LeftIR == 0 && RightIR == 1)
{
ControlCar(3); //右侧没有信号时,开始向左转一定的角度
delay_nms (10);
goto NextRun;
}
if(LeftIR == 1 && RightIR == 0)
{
ControlCar(4); //左侧没有信号时,开始向右转一定的角度
delay_nms (10);
goto NextRun;
}
goto Start;
NextRun:
ControlCar(8);
}
}