智能电动往返小车完整版论文+电路+程序Word文件下载.docx
《智能电动往返小车完整版论文+电路+程序Word文件下载.docx》由会员分享,可在线阅读,更多相关《智能电动往返小车完整版论文+电路+程序Word文件下载.docx(65页珍藏版)》请在冰点文库上搜索。
3.2.4、电源模块……………………………………………………………8
3.2.5、按键模块……………………………………………………………8
3.2.6、LCD液晶显示模块…………………………………………………9
4、系统软件框图…………………………………………………9
5、设计数据测量…………………………………………………11
参考文献…………………………………………………………12
1、设计任务
设计并制作一个能自动往返于起跑线与终点线间的小汽车。
允许用玩具汽车改装,但不能用人工遥控(包括有线和无线遥控)。
跑道宽度0.5m,表面贴有白纸,两侧有挡板,挡板与地面垂直,其高度不低于20cm。
在跑道的B、C、D、E、F、G各点处画有2cm宽的黑线,各段的长度如图1所示。
1.1基本要求
1)车辆从起跑线出发(出发前,车体不得超出起跑线),到达终点线后停留10秒,然后自动返回起跑线(允许倒车返回)。
往返一次的时间应力求最短(从合上汽车电源开关开始计时)。
2)到达终点线和返回起跑线时,停车位置离起跑线和终点线偏差应最小(以车辆中心点与终点线或起跑线中心线之间距离作为偏差的测量值)。
3)D~E间为限速区,车辆往返均要求以低速通过,通过时间不得少于4秒,但不允许在限速区内停车。
1.2发挥部分
1)自动记录、显示一次往返时间(记录显示装置要求安装在车上)。
2)自动记录、显示行驶距离(记录显示装置要求安装在车上)。
3)其它特色与创新。
2、方案论证与选择
2.1、系统总体框图
选定自动往返小车的题目后,我们决定购买一台符合尺寸要求的玩具遥控小车,通过去掉其遥控部分,并直接利用上面的直流电机的方法实现要求,由此节省自行安装和调试小车动力部分的时间。
根据设计任务要求,经过论证选择,最终确定的系统设计框图如下:
系统分为单片机控制模块、外部传感器模块、电机驱动模块、电源模块、按键模块和LCD液晶显示模块。
2.2、各模块硬件选择
2.2.1、控制模块
控制模块负责接收传感器和按键的输入,控制液晶显示模块和PWM控制输出。
主流方案是采用FPGA芯片或者单片机。
方案1:
采用可编程逻辑器件FPGA作为控制器。
FPGA可以实现各种复杂的逻辑功能、规模大、密度高、体积小、稳定性高、IO资源丰富、易于进行功能扩展。
方案2:
采用Atmel公司的AT89S52单片机作为主控制器AT89S52是一个低功耗,高性能的51内核的CMOS8位单片机,片内含8k空间的可反复擦些1000次的Flash只读存储器,具有256bytes的随机存取数据存储器(RAM),32个IO口,2个16位可编程定时计数器。
考虑到本系统不需要复杂的逻辑功能,对数据的处理速度的要求也不是非常高。
且从使用及经济的角度考虑我们选择较为成熟的方案2。
2.2.2、外部传感器模块
外部传感器模块主要作用是检测赛道上的黑线以及测量车轮转过圈数。
主要方案有以下两种。
该方案用光敏电阻组成光敏探测器检测黑线,用霍耳传感器进行测速。
首先,光敏电阻的阻值可以跟随周围环境光线的变化而变化。
当光线照射到白线上面时,光线发射强烈,光线照射到黑线上面时,光线发射较弱。
因此光敏电阻在白线和黑线上方时,阻值会发生明显的变化,只要将阻值的变化值经过比较器就可以输出高低电平。
其次,使用利用霍耳效应的传感器。
当载流导体或半导体出于与电流相垂直的磁场中时,在其两端将产生电位差的这一现象称为霍尔效应。
如果在车轮的内侧装上一条细磁铁,把霍耳传感器同样装在车轮的内侧,测量霍尔传感器的输出就可以知道车轮转过的圈数。
该方案使用RPR220型光电对管进行检测黑线和测速。
RPR220是一种一体化反射型光电探测器,其发射器是一个砷化镓红外发光二极管,而接收器是一个高灵敏度,硅平面光电三极管。
当经过黑线时接收器输出高电平。
测速时,在车轮的内侧贴上一个光电码盘,用光电对管对码盘进行检测。
光电对管照射到黑色和白色的边界时输出信号会有跳变,将跳变的输出信号送给单片机进行检测就可以得到轮子的转速。
经过论证比较,由于RPR220型光电对管内置可见光过滤器能减小离散光的影响,同时光电对管调理电路简单,工作性能稳定。
因此,外部传感器模块选用
2.2.3、电机及其驱动模块
采用专用芯片L298N作为电机驱动芯片。
L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。
用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
对于直流电机用分立元件构成驱动电路。
由分立元件构成电机驱动电路,结构简单,价格低廉,在实际应用中应用广泛。
但是这种电路工作性能不够稳定。
因此我们选用了方案1。
2.2.4、电源模块
电源模块作用时把外部电压降为5V,供给单片机和传感器使用。
本设计使用常用的7805作为降压芯片。
2.2.5、按键模块
按键模块包括2个按键,分别负责起跑后读取行驶时间和小车行驶距离。
鉴于传感器模块的输出信号为高电平有效,因此按键没按下时,按键输出为低电平。
2.2.6、显示模块
用LCD1602液晶屏。
该液晶屏可以两行显示数字、汉字,显示清晰。
用8位数码管进行显示,数码管显示亮度较高。
考虑到我们需要指示当前数值是小车行驶时间还是距离,因此决定采用能显示更多内容的LCD作为显示模块的主要硬件。
3、系统硬件设计与实现
3.1、系统总体电路图
3.2、系统各模块设计介绍
3.2.1、单片机控制模块
模块电路图如下:
单片机P1口的1脚接LCD显示的数据端,P0口的5、6、7脚接LCD的控制端,P0口的1脚接蜂鸣器,P0口的3、4脚接电机控制端,P3口的4脚(计数器T0)接PWM控制端,P3口的2、3脚(中断口)接或非门,对应光电对管和按键输入。
单片机在系统中起控制中心的作用,其内部代码见软件设计部分。
3.2.2、外部传感器模块
模块电路图如上图。
电源电压为5伏,信号输出后接入或非门再连接单片机的中段输入口。
当小车经过黑线时,RPR220型光电对管接收端输出约为4—5伏,经过白线时输出为0—1伏,经过LM324比较器将光电对管输出转换为逻辑信号的高低电平(比较器的基准电压为4伏)。
3.2.3、电机驱动模块
电机驱动模块利用电池组供电。
单片机的两个端口输出“10”和“01”分别驱动小车向前和向后动,另外一个端口输出PWM波形,通过波形的占空比来控制直流电机的转速。
L298N是SGS公司的产品,内部同样包含4通道逻辑驱动电路。
可以方便的驱动两个直流电机,或一个两相步进电机。
L298N可接受标准TTL逻辑电平信号VSS,VSS可接4.5~7V电压。
4脚VS接电源电压,VS电压范围VIH为+2.5~46V。
输出电流可达2.5A,可驱动电感性负载。
1脚和15脚下管的发射极分别单独引出以便接入电流采样电阻,形成电流传感信号。
L298可驱动2个电动机,OUT1,OUT2和OUT3,OUT4之间可分别接电动机,本实验装置我们选用驱动一台电动机。
5,7,10,12脚接输入控制电平,控制电机的正反转。
EnA,EnB接控制使能端,控制电机的停转。
L298N的管脚图如下:
3.2.4、电源模块
该电源模块的功能是把9伏锌锰干电池通过7805转换为5伏电压,向单片机、逻辑芯片和LCD1602供电。
考虑到如果用电池组同时向电机和芯片供电时,由于驱动电机所需电流较大,容易影响对芯片的供电,因此我们决定电池组单独对驱动电机,另外利用6F22型叠层式锌-锰干电池向电路其他部分提供电源。
3.2.5、按键模块
模块电路图如下:
由于单片机的中断口是低电平(或者下降沿)触发,而RPR200型光电对管在检测黑线时输出高电平,处于减少芯片书的考虑,我们决定采用或非门,同时把没有按下的按键输出设为低电平,即如上图所示。
3.2.6、LCD液晶显示模块
LCD1602为工业字符型液晶,能够同时显示16*02即32个字符。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:
阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,只要在数据端输入相应的ASCII码,即可在LCD上显示相应字符。
4、系统软件框图
软件设计流程图如下
延时3s
黑线数量加1
限速
结束限速
停车
计时10s
再启动
5、设计数据测量
5.1、传感器测量
步骤:
用电压表测量PRP220光电对管在黑色和白色环境下的输出电压值
结果:
见下表
背景环境
电压值
白色
0.78
0.81
黑色
4.65
4.86
结论:
LM324的基准电压设置为4伏。
5.2、总体测试
在地上贴黑线模拟赛道,把小车放在赛道上测试。
见下表(限速区时间为秒表所测)
测试次数
总时间
限速区时间
总路程(m)
实际往返距离(m)
1
25.5
3.9
8.3
8
2
26.5
4.2
8.8
3
8.7
小车性能基本满足设计任务要求
参考文献
[1]李建忠编,《单片机原理及应用技术(第二版)》,西安电子科技大学出版社
[2]谭浩强编,《C程序设计(第三版)》,清华大学出版社
#include<
intrins.h>
AT89X52.h>
/********************************************************************************\
**宏定义区**
\********************************************************************************/
/*-------------------------------LCD模块------------------------------------*/
#defineLCD_RWP0_6//读写控制端
#defineLCD_RSP0_5//数据命令选择端
#defineLCD_EP0_7//执行使能端
#defineLCD_DataP1//P1口
#defineWrite0x00//低电平写入
#defineRead0x01//高电平读出
#defineData0x01//高电平选择数据
#defineCmd0x00//低电平选择命令
#defineEnable0x00//跃变到低电平时执行命令
#defineDisable0x01
#defineTrue0x01
#defineFalse0x00
#defineLCD_Init0x38//初始化模式
#defineLCD_DispCtr0x0C//开显示及光标设置
#defineLCD_CloseCtr0x08//关显示
#defineLCD_CLS0x01//清屏幕
#defineLCD_EnterSet0x06//显示光标
#defineBusyP1_7//忙信号
/*--------------------------测速/测距/测时模块-------------------------------*/
#defineCircleLength0.144//小车转一轮的长度为.132m
/*--------------------------------控速模块-----------------------------------*/
#defineP04P0_3//后电机
#defineP03P0_4//后电机
//#defineP01P0_1//前电机
//#defineP02P0_2//前电机
#definebellP3_7
#defineP31P2_5//控制液晶背光
#defineP33P3_3
/*------------------------------菜单选择模块---------------------------------*/
#defineLine0x00//0代表直线模式
//#defineCurve0x01//1代表S型模式
#defineNormal0x00//0代表正常速度
#defineLow0x01//1代表低速
#defineHigh0x02//2代表高速
/*********************************************************************************\
**全局函数声明区**
\*********************************************************************************/
/*-------------------------------LCD模块-------------------------------------*/
voidLCDInit(void);
//LCD初始化
voidSetWriteCmd(void);
//设置写命令模式
voidSetReadCmd(void);
//设置读命令模式
voidSetWriteData(void);
//设置写数据模式
voidWriteCmd(charcmd);
//写命令
voidWriteData(charddata);
//写数据
voidExecuteCmd(void);
//执行命令
voidSetXY(charx,chary);
//定位显示地址
voidDisplaySingleChar(charx,chary,charcchar);
//显示单个字符
voidDisplayString(charx,chary,char*str);
//显示一段字符串
voidDelay(unsignedinttime);
//延时主程序
voidDelayUs(unsignedinttime);
//延时子程序
//voiddelay500ms(void);
bitIsBusy(void);
//判断忙标志函数
voidDisplayTime(void);
//显示时间
voidDisplayAVGSpeed(void);
//显示平均速度
voidDisplayDistance(void);
//显示路程
/*--------------------------测速/测距/测时模块-------------------------------*/
voidINTInit(void);
//所有中断初始化
voidSpeedINT(void);
//测速中断
voidComputeTime(void);
voidComputeSpeedANDDistance(void);
//计算速度和距离
voidCtrSpeedINT(void);
//控速中断
voidTime0INT(void);
voidTime1INT(void);
//控速单位时间中断
voidClock0_Init(void);
//时钟中断初始化
voidClock1_Init(void);
//时钟中断初始化
voidCtrSpeed(void);
**全局变量区**
shorti=0;
floatSpeedCount=0;
//测速计数脉冲
floatSpeed=0.0;
floatDistance=0.0;
charTime1INTCount=0;
//T1中断时间计时
floatPassTime=0.00;
//小车行走的时间
shortIsT0INT=1;
bitIsT1INT;
//判断T1是否已经响应中断
shortIsT0INT2=1;
charThx[5]={0xf4,0xf4,0xb4,0xd4,0xff};
//3ms,3ms,15ms,3ms
charTlx[5]={0x11,0x11,0x51,0x11,0xff};
charThx0=0x99;
charTlx0=0x99;
charThx1=0x99;
//20ms
charTlx1=0x99;
//shortRound=0;
//shortBack=0;
//shortBack0=0;
//bitBackid;
//bitStop=0;
charArea0=0;
charArea1=0;
//区域变量
charLowSpeedArea1StartTime;
charLowSpeedArea1EndTime;
charHighSpeedAreaEndTime;
charLowSpeedArea2EndTime;
charLowSpeedArea1PassTime=0;
//第一个低速区通过时间
charHighSpeedAreaPassTime=0;
//高速区通过时间
charLowSpeedArea2PassTime=0;
//第二个低速区通过时间
charReadyToGo=10;
charReadyToGo1=4;
//倒计时
charflag;
charp=0;
//bitRoundid=0;
//cha