机器人小车的避障及速度反馈功能的设计文档格式.docx
《机器人小车的避障及速度反馈功能的设计文档格式.docx》由会员分享,可在线阅读,更多相关《机器人小车的避障及速度反馈功能的设计文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
![机器人小车的避障及速度反馈功能的设计文档格式.docx](https://file1.bingdoc.com/fileroot1/2023-5/5/f1762a9b-46ac-473e-8837-dbcc36264871/f1762a9b-46ac-473e-8837-dbcc362648711.gif)
避障;
红外线感应;
1、选题的意义及目的
嵌入式计算机系统起源于微型机时代,但很快就进入到独立发展的单片机时代。
在单片机时代,嵌入式系统以器件形态迅速进入到传统电子技术领域中,以电子技术应用工程师为主体,实现传统电子系统的智能化,而计算机专业队伍并没有真正进入单片机应用领域。
因此,电子技术应用工程师以自己习惯性的电子技术应用模式,从事单片机的应用开发。
这种应用模式最重要的特点是:
软、硬件的底层性和随意性;
对象系统专业技术的密切相关性;
缺少计算机工程设计方法。
虽然在单片机时代,计算机专业淡出了嵌入式系统领域,但随着后PC时代的到来,网络、通信技术得以发展;
同时,嵌入式系统软、硬件技术有了很大的提升。
由于嵌入式系统最大、最广、最底层的应用是传统电子技术领域的智能化改造,因此,以通晓对象专业的电子技术队伍为主,用最少的嵌入式系统软、硬件开销,以8位机为主,带有浓重的电子系统设计色彩的电子系统应用模式会长期存在下去。
其应用领域会集中在网络、通信、多媒体、商务电子等方面,不可能替代原来电子工程师在控制、仪器仪表、机械电子等方面的嵌入式应用。
本文主要对基于ARM开发的自主式移动机器人小车进行了研究,实现了小车的基本功能。
该系统目前完成的主要功能就是:
2、系统完成的主要功能
首先,是设计出了避障传感器系统,该系统采用红外线技术,主要完成对障碍物的感应;
其次,是设计出了移动机器人小车的电机控制转速部分,该系统采用步进电机作为电机首选,同时采用集成芯片L297加L298配合使用来作为电机的驱动控制部分;
还有就是速度反馈的部分,由于ARM板内部没有记数的功能,就设计了传感器数据读取的一个系统。
最后,对机器人的核心部分(基于ARM嵌入式系统)进行了研究和设计。
以S3C44B0X实验板为平台,以及避障系统和运动控制系统两部分结合起来构成整个移动机器人最主要的硬件部分。
其中,实验板为移动机器人的中枢神经部分,它承担着对于外部硬件的全权管理(包括接收外部硬件的传递过来的信息,对信息进行相应的处理,以及把处理后的信息再传递给外部硬件);
避障系统为整个机器人系统的感应部分,一切外界环境的识别都有避障系统来完成;
运动控制系统为整个机器人系统的移动部分,它承担着让机器人能自由的在物理环境中移动的功能。
以S3C44B0X开发板构建整个机器人的中枢神经,主要是采用嵌入式操作系统来管理。
避障系统设计:
采用红外线来实现避障(电路设计,调试)。
运动控制系统设计:
采用直流电机来实现机器人的移动功能。
软件设计部分:
主要是应用程序配合外部硬件驱动程序。
3、硬件设计
(1)直流电机的控制方案
一个电动小车整体的运行性能,首先取决于它的电池系统和电机驱动系统。
电动小车的驱动系统一般由控制器、功率变换器及电动机三个主要部分组成。
电动小车的驱动不但要求电机驱动系统具有高转矩重量比、宽调速范围、高可靠性,而且电机的转矩-转速特性受电源功率的影响,这就要求驱动具有尽可能宽的高效率区。
使用的电机一般为直流电机,主要用到永磁直流电机、伺服电机及步进电机三种。
直流电机的控制很简单,性能出众,直流电源也容易实现。
(2)避障系统的设计
常用避障电路的实现方法
机器人小车避障电路设计常用的方法有两类:
一种是超声波发射,接收传感器;
另一种是红外线发射传感器。
超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,但超声波技术受干扰影响比较大。
采用红外线技术设计避障电路,主要优点是廉价,而且,红外线常用于遥控电路,技术比较成熟,电路设计也比较简单,但是,它的避碰距离不是很远,一般最远也不会超过1m。
考虑到实验室的条件以及技术实用性,本项目主要采用的是红外线技术设计避障电路。
红外线避障系统的实现
基本原理
红外线是一种波长在750mm至lm之间的电磁波,对障碍物的衍射能力差,抗干扰性能强,此外红外通讯有着成本低廉、连接方便、简单易用和结构紧凑的特点,所以得到广泛的应用。
采用红外线技术设计避障电路方法一般有两种,一种是基于红外线发射二级管和红外线接收二级管来设计;
另外一种是基于红外线发射二极管以及红外线接收头来设计,两种方法的最大区别就在于接收电路,前者主要是要自行设计出红外接收二极管的接收电路,而后者用到的红外接收头内部就是一个接收电路,所以后者就比较简洁,而且效果比前者要好的多。
发射软件中断设计
红外线设置检测到障碍后会向ARM的中断寄存器发送一个高低电平的脉冲信号,软件通过读取这个电平脉冲来调用电机的转弯程序,以实现小车的避障功能。
软件设计过程中,把寄存器PCONG设置为控制寄存器,将PDATG设置成数字寄存器,通过改变PCONG的高低电平来获得PDATG的数值,如果是高电平,保持原来的转速,即没遇到障碍,如果是低电平就调用电机转弯的程序。
这个方案是通过应用程序直接读取寄存器数据来实现中断过程,实际上还可以通过系统的中断控制来设置寄存器的值,然后再调用中断程序实现想要的结果,本次项目还是运用了应用程序的实现。
其避障系统的流程图如图2所示。
(3)速度测量实时反馈
方案总述
S3C44B0X本身不具有外部脉冲计数功能,可利用可编程定时计数器82C54在S3C44B0X系统中实现测量电机转速。
在机器人控制中,需要知道它的状态,这就需要测量。
对于机器人行走常需要分时或连续测量和显示其转速及瞬时转速。
为了能精确地测量转速外,还要保证测量的实时性,要求能测得瞬时转速。
转速测量方法分为模拟式和数字式两种,模拟式采用测速发电机为检测元件,得到的信号是电压量,而数字式通常采用光电编码器、圆光栅、霍尔元件等为检测元件,得到的信号是脉冲信号。
随着微型计算机的广泛应用,特别是高性能价格比的单片机的涌现,转速测量普遍采用了以单片机为核心的数字法,智能化微电脑式代替了一般机械式或模拟量结构。
方案选择和实施
选择方案
在这个项目中选用霍尔集成元件作为传感器,主要因为它本身不怕灰尘,适合露天场地,且体积小,价格便宜,可单电源供电,使用极其方便,因此本测量系统转速信号检测点采用霍尔集成传感器作为转速检测探头。
任务实施
把探头(霍尔元件)固定在距齿轮外圆lmm的支架上,在霍尔元件的正对面贴一小块磁钢(B>
18000T,B为磁钢强度要求),当测速齿轮的每个齿经过探头正前方时,改变了磁通密度,探头就输出一个标准的脉冲信号。
检测元件选用型号为CS3020开关集成霍尔传感器.此元件是OC门,因此在输出端与电源之间要接一个电阻。
计数模块设计
鉴于S3C44B0X本身不具有外部脉冲计数功能,需要在已有的硬件资源基础上扩展外围电路。
利用可编程定时计数器82C54是个很好的选择。
Intel82C54是专用的可编程定时计数芯片,82C54通过对加在其CLK输入引脚的脉冲进行计数,脉冲最高频率可以达到10MHz,使用灵活,功能强大。
采用82C54对系统外围进行硬件设计。
S3C44B0X的数据线D0~D7通过74LVCA245接82C54的数据线,74LVCA245的作用是实现了CPU的电压和82C54的电压的稳定转换。
片选可使用S3C44B0X的任意空余片选nGCSx,如果整个系统还有其他外围电路需要较多片选,也可利用S3C44B0X的地址线接74HC138译码器扩展出多路片选信号供系统其它资源使用。
4、软件设计
(1)总程序设计流程
图1主程序流程图
(2)避障系统流程图
图2避障系统流程图
(3)速度反馈中断程序流程图
应用程序通过对82C54工作方式,通道和中断信号等的设置,来读取D0~D7的八位数据。
这个部分的实现其实也可以通过应用程序调用相应的驱动程序来实现,但只是为了实现功能的话,这个应用程序已经可以实现了,而驱动程序的编写又涉及到内核的调用,所以为了保险,还是选择了应用程序。
其中断程序流程图下图所示。
图3速度反馈中断程序流程图
5、课程设计体会
本次课程设计主要对基于ARM开发的自主式移动机器人小车进行了研究,实现了小车的最基本功能。
其次,是设计出了移动机器人小车的电机控制转速部分,最后,对机器人的核心部分(基于ARM嵌入式系统)进行了研究和设计,主要让操作系统完成控制功能(主要是通过接收避障系统感应外界环境所返回的信号,进而控制运动控制系统,从而完成一个自主运动的智能功能)。
在该项目的研究中,责任的是软件设计部分,不仅使软件设计能力有了极大的提高,还大大丰富了理论知识,在项目过程中,软件部分和硬件部分要相互配合,在这次项目中,学到了很多知识,不仅增强了理论知识的自主学习能力,同时增强了实际动手操作的能力,也提高了综合运用知识的能力。
为以后的工作积累了很多经验。
在设计过程中也遇到了很多困难,但都坚持下来了,这也是这次课程设计中的一大收获。
6、参考文献
[1]求是科技,单片机典型模块设计实例导航[J],人民邮电出版社,2002年8月。
[2]张俊谟,单片机中级教程[M],北京航空航天大学出版社,2001年6月。
[3]王昊等,通用电子元器件的选用与检测[J],电子工业出版社,1998年6月。
[4]朱金刚,系列单片机C语言编程入门,电子制手2003年第一期。
[5]KarimYaghmourBUILDINGEMBEDDEDLINUXSYSTEMS[F],中国电力出版社,1998年6月。
[6]迈克、普瑞德科,机器人控制器与程序设计[M],科学出版社,2001年3月。
[7]陈永甫,红外控测与控制电路[L],人民邮电出版社,1998年7月。
[8]李岩、荣盘祥基于S3C44B0X嵌入式uClinux系统原理及应用[K],清华大学出版社,1997年7月。
7、程序清单
红外发射软件中断部分代码如下:
#include<
stdio.h>
stdlib.h>
#include<
unistd.h>
fcntl.h>
linux/rtc.h>
linux/ioctl.h>
linux/errno.h>
linux/fs.h>
#definePCONG(*(volatileunsigned*)0x01d20040)//定义地址
#definePDATG(*(volatileunsigned*)0x01d20044)//定义地址
intvalue[2];
typedefunsignedlongU32;
voiddelay(U32time)
{
while(time--);
}
intstart_motor(intr,intl)
intfd,i;
U32times1,times2;
value[0]=r;
value[1]=l;
fd=open("
/dev/motor_drv"
O_RDWR);
//打开电机驱动程序
if(fd==-1)
{
perror("
open"
);
exit(-1);
}
write(fd,value,2*sizeof(int));
delay(10000);
close(fd);
return0;
intmain()
inti;
PCONG&
=0xfffffff3;
/*PG1->
input*/
while
(1){
if(PDATG&
0X00000002){/*HIGHLEVEL*/
printf("
红外线没检测到障碍\n"
);
}
else{
printf("
红外线检测障碍\n"
/*callthemotordriver*/
start_motor(50,0);
/*调用电机左转程序*/
sleep
(1);
start_motor(50,50);
速度测量实时反馈的部分代码如下:
linux/init.h>
asm/segment.h>
linux/mm.h>
linux/module.h>
linux/kernel.h>
linux/types.h>
linux/slab.h>
asm/uaccess.h>
asm/system.h>
linux/config.h>
#definerPCONA(*(volatileunsigned*)0x1d20000)
#definerPDATA(*(volatileunsigned*)0x1d20004)
#definerPCONC(*(volatileunsigned*)0x1d20010)
#definerPDATC(*(volatileunsigned*)0x1d20014)
#definerPUPC(*(volatileunsigned*)0x1d20018)/*interrupt*/
#definerINTCON(*(volatileunsigned*)0x01e00000)
#definerINTPND(*(volatileunsigned*)0x01e00004)
#definerINTMOD(*(volatileunsigned*)0x01e00008)
#definerINTMSK(*(volatileunsigned*)0x01e0000c)
#definerI_ISPC(*(volatileunsigned*)0x01e00024)
#definerI_PSLV(*(volatileunsigned*)0x01e00010)
#definerI_PMST(*(volatileunsigned*)0x01e00014)
#definerPCONG(*(volatileunsigned*)0x01d20040)
#definerPUPG(*(volatileunsigned*)0x01d20048)
#definerEXTINT(*(volatileunsigned*)0x01d20050)
#definerPDATG(*(volatileunsigned*)0x01d20044)
#defineBaseAddr(*(volatileunsigned*)0xa000000)
/*8253controlword*/
#define8253_COM(*(volatileunsigned*)0xa00000e)
/*Writecounter0*/
#define8253PA_W(*(volatileunsigned*)0xa000008)
/*Writecounter1*/
#define8253PB_W(*(volatileunsigned*)0xa00000a)
/*Writecounter2*/
#define8253PC_W(*(volatileunsigned*)0xa00000c)
/*Readcounter0*/
#define8253PA_R(*(volatileunsigned*)0xa000000)
/*Readcounter1*/
#define8253PB_R(*(volatileunsigned*)0xa000002)
/*Readcounter2*/
#define8253PC_R(*(volatileunsigned*)0xa000004)
intmain(intargc,char**argv)
rPCONA=0x3ff;
/*setport_Afunction2(addressbus)*/
rPCONC=0xaaaaaaaa;
/*setport_Cfunction2(databus)*/
8253_COM=0x30;
/*selectCounter0,Mode0,Binarycounter*/
8253PA_W=0xfe;
/*writelow-eightbit*/
8253PA_W=0xff;
/*writehigh-eightbit*/
8253_COM=0x70;
/*selectCounter1,Mode0,Binarycounter*/
8253PB_W=0xfe;
8253PB_W=0xff;
rINTCON=0x0;
rINTMOD=0x0;
rINTMSK=0x0;
inti=1000000;
unsignedshortj;
unsignedchardata;
while(i--);
8253_COM=0x00;
data=8253PA_R;
j=8253PA_R;
j=(j<
<
8|data);
printf("
j=%d\n"
j);