自动避障小车技术报告2讲解.docx

上传人:b****5 文档编号:8533003 上传时间:2023-01-31 格式:DOCX 页数:25 大小:1.73MB
下载 相关 举报
自动避障小车技术报告2讲解.docx_第1页
第1页 / 共25页
自动避障小车技术报告2讲解.docx_第2页
第2页 / 共25页
自动避障小车技术报告2讲解.docx_第3页
第3页 / 共25页
自动避障小车技术报告2讲解.docx_第4页
第4页 / 共25页
自动避障小车技术报告2讲解.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

自动避障小车技术报告2讲解.docx

《自动避障小车技术报告2讲解.docx》由会员分享,可在线阅读,更多相关《自动避障小车技术报告2讲解.docx(25页珍藏版)》请在冰豆网上搜索。

自动避障小车技术报告2讲解.docx

自动避障小车技术报告2讲解

 

自动避障小车

技术报告

学校:

乐山师范学院

成员:

郑素仙

朱平

吴志

指导老师:

张九华

 

前言

设计背景:

在科学探索和紧急抢险中经常会遇到对与一些危险或人类不能直接到达的地域的探测,这些就需要用机器人来完成。

而在机器人在复杂地形中行进时自动避障是一项必不可少也是最基本的功能。

因此,自动避障系统的研发就应运而生。

我们的自动避障小车就是基于这一系统开发而成的。

随着科技的发展,对于未知空间和人类所不能直接到达的地域的探索逐步成为热门,这就使机器人的自动避障有了重大的意义。

我们的自动避障小车就是自动避障机器人中的一类。

自动避障小车可以作为地域探索机器人和紧急抢险机器人的运动系统,让机器人在行进中自动避过障碍物。

 

 

一、设计目标:

1.小车从无障碍地区启动前进,感应前进路线上的障碍物后,能自动避开障碍物。

2.根据障碍物的位置选择下一步行进方向,选择左拐还是右拐,若障碍物在左边则自动右拐,若障碍物在右边则左拐,若障碍物在正前方可任意选择左拐或者是右拐,以达到避开障碍物的目的。

3.通过利用单片机内时钟源的控制设定左拐和右拐的时间,从而能持续前进。

4.为达到速度的可控性,需设置两个独立按键对小车进行控速。

二、方案设计:

根据设计要求,确定如下方案:

在现有玩具电动车的基础上,加装超声波传感器,实现对电动车的运行状况的实时测量,并将测量数据传送至单片机进行处理,然后由单片机根据所检测的各种数据实现对电动车的智能控制。

这种方案能实现对电动车的运动状态进行实时控制,控制灵活、可靠,精度高,可满足对系统的各项要求。

2.1直流调速系统

采用脉宽调速系统

脉宽调速系统的主电路采用脉宽调制式变换器,简称PWM变换器。

脉宽调速也可通过单片机控制继电器的闭合来实现,但是驱动能力有限。

为顺利实现电动小汽车的前行与倒车,本设计采用了可逆PWM变换器。

可逆PWM变换器主电路的结构式有H型、T型等类型。

我们在设计中采用了常用的双极式H型变换器,它是由4个三极电力晶体管和4个续流二极管组成的桥式电路。

如附录一:

2.2检测系统

检测系统主要实现红外传感器,超声波传感,光电传感器对车的运行进行实时测量,即利用这种传感器对电动车的避障、位置、行车状态进行测量。

行车开始、结束及超声波检测:

在车的开始和结束阶段,都是用红外式的光电传感器,当按下此光电开头,小车就开始行驶,在完成任务后,再按下此开关,小车就停止前进。

在前进的过程中不断的发送超声波,并对接到的进行处理计算。

如果处理得到的结果是发现前面的障碍时,再行进一次距离的处理,当距离小是40CM时,让小车倒退一段时间,再进行避障处理,如果距离大于40CM,就直接进避障处理。

 

三硬件设计

3.1、SPCE061A单片机最小系统

我们用的是凌阳的SPCE061A单片机最小系统其概述如下:

SPCE061A是继μ’nSP™系列产品SPCE500A等之后凌阳科技推出的又一款16位结构的微控制器。

与SPCE500A不同的是,在存储器资源方面考虑到用户的较少资源的需求以及便于程序调试等功能,SPCE061A里只内嵌32K字的闪存(FLASH)。

较高的处理速度使μ’nSP™能够非常容易地、快速地处理复杂的数字信号。

因此,与SPCE500A相比,以μ’nSP™为核心的SPCE061A微控制器是适用于数字语音识别应用领域产品的一种最经济的选择。

性能

􀂋16位μ’nSP™微处理器;

􀂋工作电压(CPU)VDD为2.4~3.6V(I/O)VDDH为2.4~5.5V;

􀂋CPU时钟:

0.32MHz~49.152MHz;

内置2K字SRAM;

􀂋内置32KFLASH;

􀂋可编程音频处理;

􀂋晶体振荡器;

􀂋系统处于备用状态下(时钟处于停止状态),耗电仅为2μA@3.6V;

􀂋2个16位可编程定时器/计数器(可自动预置初始计数值);

􀂋2个10位DAC(数-模转换)输出通道;

􀂋32位通用可编程输入/输出端口;

􀂋14个中断源可来自定时器A/B,时基,2个外部时钟源输入,键唤醒;

􀂋具备触键唤醒的功能;

􀂋使用凌阳音频编码SACM_S240方式(2.4K位/秒),能容纳210秒的语音数据;

􀂋锁相环PLL振荡器提供系统时钟信号;

􀂋32768Hz实时时钟;

􀂋7通道10位电压模-数转换器(ADC)和单通道声音模-数转换器;

􀂋声音模-数转换器输入通道内置麦克风放大器和自动增益控制(AGC)功能;

􀂋具备串行设备接口;

􀂋具有低电压复位(LVR)功能和低电压监测(LVD)功能;

内置在线仿真电路ICE(In-CircuitEmulator)接口;

􀂋具有保密能力;

具有WatchDog功能;

16位μ’nSP™微处理器硬件结构图

3.1.1.SPCE061A时钟电路

SPCE061A时钟电路采用晶体振荡器。

下图为SPCE061A时钟电路的接线图。

外接晶振采用32768Hz。

3.1.2.PLL锁相环

PLL电路的作用是将系统提供的实时时钟的基频(32768Hz)进行倍频,输出系统时钟Fosc

3.1.3.看门狗Watchdog

SPCE061A的清狗周期为0.75S;清看门狗操作寄存器:

P_Watchdog_Clear(0x7012H)

清狗操作:

在每个0.75S的清狗周期里P_Watchdog_Clear写入0x0001。

3.1.4.低电压复位(LVR)

通过某种方式,使单片机内存各寄存器的值变为初始的操作称为复位。

SPCE061A的复位方式为低电压复位。

3.1.5.I/O端口

OA口:

IOA0~IOA6:

7路普通AD输入端口,IOA0~IOA7:

触键唤醒功能

IOB口:

外部中断输入,串行接口、PWM输出等复用端口

3.1.6.时基与定时器

时基信号可提供常用的、现成的频率信号,完成部分定时器的功能

3.1.7.SPCE061A的定时器/计数器

递增计数方式,自动重载定时器/计数器初始值,输出4位可调脉宽比PWM信号,溢出频率/2的方波输出,多种时钟源输入。

3.1.8.ADC、DAC

SPCE061A的特色是其强大灵活的语音功能;而单片机对语音处理的支持,除了其处理能力外,还有片内集成的ADC、DAC;特别是集成有AGC电路的MIC通道。

ADC转换过程:

3.2、超声波传感器

1.基本特性与参数指标

超声波传感器谐振频率:

40KHz;

模组传感器工作电压:

4.5V~9V

模组接口电压:

4.5V~5.5V

2.主要功能

三种测距模式选择跳线J1(短距、中距、可调距):

短距:

20cm~100cm左右(根据被测物表面材料决定),精度1cm;

中距:

70cm~400cm左右(根据被测物表面材料决定);

可调:

范围由可调节参数确定,当调节在合适的值时,最远测距700cm左右;

3.结构示意图

一般应用时,只需要用两条10PIN排线把J5与SPCE061A的IOB口低八位连接,J4与IOB口高八位连接,同时设置好J1、J2跳线就完成硬件的连接了。

不同测距模式的选择只需改变测距模式跳线J1的连接方法即可。

模组工作的性能与被测物表面材料有很大关系,如毛料、布料对超声波的反射率很小,会严重影响测量结果

实物图:

J1为选择工作模式,J2选择电源接口

4.电路原理图介绍:

超声波谐振频率调理电路

由单片机产生40KHz的方波,并通过模组接口(J4)送到模组的CD4049,而后面的CD4049则对40KHz频率信号进行调理,以使超声波传感器产生谐振。

 

超声波回波接收处理电路

超声波接收处理部分电路前级采用NE5532构成10000倍放大器,对接收信号进行放大;后级采用LM311比较器对接收信号进行调整,比较电压为LM311的3管脚的输入,可由J1跳线选择不同的比较电压以选择不同的测距模式。

 

测距程序流程图

超声波测距的功能函数流程图如图。

用户只需进行六次测距操作,这六次的测量结果需要经过处理后才可得到最终的测距返回值,然后将返回值化成距离。

 

四软件设计

4.1软件设计各模块

voidRunTime2Hz(void);

设置2HZ基频中断向量函数。

voidOffTime2Hz(void);

清2HZ基频中断向量函数。

voidClear_WatchDog(void);

清看门狗函数

unsignedintSP_GetCh(void);

取键值函数

voiddelay2s(inttimer)

可调的延迟函数

4.2速度控制

速度控制用TIMERA的PWM输出控制,当它前进时设PWM为12/16,当它转弯时设为8/16。

其代码为:

*P_TimerA_Ctrl=0x0333;

*P_TimerA_Data=0xff9f;

4.3障碍物检测

用TIMERB的TONT输出给超声波提供出射频率,并给它延迟一段时间,发射完时,清TIMERB,让它工作在计时方式,当计到10000时!

没有收到回波,则说明前在无障碍。

如果有收到回波则说明有障碍。

4.4看门狗

看门狗只要一定时间给其喂狗,就可以保证程序不会跑飞,跑飞就会自动复位。

其代码就只有一句:

*P_Watchdog_Clear=0x0001;

4.5基频中断

采用2HZ的基频中断,实现实时控制;一次中断,中断时间为0。

5S,其代码如下:

[P_INT_Ctrl]=r1;

INTIRQ;//开中断

4.6程序设计流程图

五:

测试数据、测试结果分析及结论

测试方法与仪器:

1.测试仪器

测试仪器包括数字万用表、信号发生器、示波器、直流稳压电源等。

2.测试方法

数字万用表主要用来测试各个IO口的状态;

信号发生器与示波器用于测试超声波传感器信号的接收与传输;

试验测试能不能完成固定避障。

结论:

经过了我们的努力,我们基本上能完上避障的功能!

当然我们之后还有很长的路要走,

在之后我们会自己做一个最小系统,此次我们更侧重于软件方面的设计。

同时我们还要设计更多的外围电路,实现更多的功能。

其中包括:

红外光电检测用来检测旁边的物体;还有红外遥控器,用来控制小车的运行与停止;再加一个显示器,用来显示路程和时间等等。

 

附录一:

 

程序附录:

程序设计中包括:

主程序,测距程序,中断程序组成;

1.主程序:

#include"SPCE061A.h"

#include"ceju.h"

unsignedcharINTflag;//定时标识

unsignedintsum;//2hz计数器1次为0。

5秒

voidRunTime2Hz(void);

voidOffTime2Hz(void);

voidClear_WatchDog(void);

voiddelay2s(inttimer)//设置基频为2HZ的中断,就是一次定时0。

5S

{

sum=timer;

RunTime2Hz();//运行中断

while(!

INTflag)

{

Clear_WatchDog();//清看门狗

}

INTflag=0;

OffTime2Hz();//结束中断

}

voiddelay2s(inttimer);

intmain(void)

{

unsignedintBack_data;//装距离

*P_IOB_Dir=0x1f00;//初始化IOB,IOB8~12同向输出

*P_IOB_Attrib=0x1f00;

*P_IOB_Data=0x0000;

INTflag=0;

Clear_WatchDog();//清看门狗

while

(1)

{

*P_TimerA_Ctrl=0x0373;

*P_TimerA_Data=0xff9f;//设前进PWM这14/16

Back_data=measure_Times(0);//测距

if(Back_data==0)//判断是否为0,为0则为前进

{

*P_TimerA_Ctrl=0x0373;

*P_TimerA_Data=0xff9f;

}

elseif(Back_data<=40)//判断是否小于40CM,小于则进行倒车

{

*P_TimerA_Ctrl=0x006;

*P_IOB_Data=0x1000;//倒车

delay2s(0);

*P_IOB_Data=0x0100;//前进

delay2s(3);

}

elseif(Back_data<=100)//判断是否小于1M,小于则进行避障

{

*P_TimerA_Ctrl=0x0333;

*P_IOB_Data=0x0400;//左转

delay2s

(1);

*P_IOB_Data=0x0800;//右转

delay2s

(1);

*P_IOB_Data=0x0400;//左转

delay2s

(1);

*P_TimerA_Ctrl=0x006;//停止PWM运行

*P_IOB_Data=0x0000;//停车

while

(1)

{;}

}

else

Clear_WatchDog();

}

}

2.中断程序:

#include"SPCE061A.h"

#include"ceju.h"

voidIRQ3(void)__attribute__((ISR));//IRQ中断服务程序

voidIRQ3(void)

{

*P_INT_Clear=0x0100;//

EXT1_IRQ_ult();//调用超声波测距的外部中断服务程序

}

 

.TEXT

.includeSPCE061A.inc;

.external_sum;

.external_INTflag;

.public_IRQ5;

_IRQ5:

//定时3秒的中断程序

pushr1,r4to[sp];

r1=0x0008;

testr1,[P_INT_Ctrl];

jnzL_4Hz;//TimerAFIQentrence

r1=0x0004;

[P_INT_Clear]=r1;//清中断

r1=[_sum]//取时基信号量

r1+=1;

cmpr1,4;

jeloop0;

[_sum]=r1//保存时基信号量

popr1,r4from[sp];

reti;

loop0:

r1=0x0001;

[_INTflag]=r1;//设置中断标识

r1=0

[_sum]=r1

popr1,r4from[sp];

reti;

L_4Hz:

r1=0x0008;

[P_INT_Clear]=r1;//清中断

popr1,r4from[sp];

reti;

 

.external_sum;

.includeSPCE061A.inc;

.CODE

.public_Clear_WatchDog;

_Clear_WatchDog:

.PROC

R1=0x0001;

[P_Watchdog_Clear]=R1;//清看门狗

retf;

.ENDP

.public_RunTime2Hz;//初始化中断为2HZ定时中断源

_RunTime2Hz:

.proc

r1=0x0004;

[P_INT_Ctrl]=r1;

INTIRQ;//开中断

retf

.endp;

 

.public_OffTime2Hz;

_OffTime2Hz:

.proc

r1=[P_INT_Ctrl]

r1&=0xfffb;

[P_INT_Ctrl]=r1;

r1=0x0000

[_sum]=r1;

retf;

.endp;

 

3、测距程序

#include"SPCE061A.h"

#defineLONG_SEND_TIMER1000//中距测距时的40KHz信号发射时长

#defineLONG_SEND_TIMER23000//中距测距的补充测距时的40KHz信号发射时长

#defineLONG_WAIT_DELAY600//中距测距的防余波干扰延时时长

#defineLONG_WAIT_DELAY21500//中距测距的补充测距时的防余波干扰延时时长

#defineLONG_RES_ADD0x00B0//中距测距的结果补偿值

#defineLONG_RES_ADD20x0220//中距测距的补充测距时的结果补偿值

#defineLOW_SEND_TIMER250//短距测距时的40KHz信号发射时长

#defineLOW_SEND_TIMER21000//短距测距的补充测距时的40KHz信号发射时长

#defineLOW_WAIT_DELAY180//短距测距的防余波干扰延时时长

#defineLOW_WAIT_DELAY2400//短距测距的补充测距时的防余波干扰延时时长

#defineLOW_RES_ADD0x0034//短距测距的结果补偿值

#defineLOW_RES_ADD20x00B0//短距测距的补充测距时的结果补偿值

unsignedintCounter_buf;//超声波测距当中,用于保存TimerB计数的变量,相当于时长

unsignedintEXT1_IRQ_flag=0;//外部中断标志变量,用于EXT1的IRQ中断程序和测距程序同步

voidDelay_ult(unsignedinttimers)

{

unsignedinti;

for(i=0;i

{

__asm("nop");

}

}

unsignedintResoult_ult(unsignedintCounter)//计算距离

{

unsignedintuiTemp;

unsignedlongulTemp;

ulTemp=(unsignedlong)Counter*33500;//*以声音的速度,以厘米为单位

ulTemp=ulTemp/196608;

ulTemp=ulTemp>>1;//除二

uiTemp=(unsignedint)ulTemp;

returnuiTemp;

}

unsignedintmeasure2_ult(unsignedinttype);

unsignedintmeasure_ult(unsignedinttype)//超声波测距模组的测距程序,完成一次测距

{

unsignedintExit_flag=1;

unsignedintuiTemp;

unsignedintuiResoult;

unsignedintuiSend_Timer,uiWait_Timer,uiRes_Add;

unsignedintuiSystem_Clock;

uiSystem_Clock=*P_SystemClock;//将当前的系统时钟设置暂时保存起来

*P_SystemClock=0x0088;//将系统时钟设置为49MHz,分频比为1,强振模式

if(type)//根据type即测距类型,选择不同的测距参数

{

uiSend_Timer=LONG_SEND_TIMER;

uiWait_Timer=LONG_WAIT_DELAY;

uiRes_Add=LONG_RES_ADD;

}

else

{

uiSend_Timer=LOW_SEND_TIMER;

uiWait_Timer=LOW_WAIT_DELAY;

uiRes_Add=LOW_RES_ADD;

}

*P_TimerB_Data=0xfed2;

*P_TimerB_Ctrl=0x03c0;//发40KHz的信号触发超声波传感器

Delay_ult(uiSend_Timer);//等待发送

*P_TimerB_Ctrl=0x0006;//关定时器B

*P_TimerB_Data=0x0000;

*P_TimerB_Ctrl=0x0001;//TrB工作在192KHz频率

while(*P_TimerB_Data

{//以避开余波的干扰

*P_Watchdog_Clear=0x0001;

}

*P_INT_Clear=0x0100;//开中断前先清中断

*P_INT_Ctrl=*P_INT_Ctrl_New|0x0100;

*P_INT_Clear=0xffff;//清除中断发生标志

__asm("IRQON");//打开总中断使能

EXT1_IRQ_flag=0;//TimerA的溢出中断的标志变量置0

while(Exit_flag)

{

if(EXT1_IRQ_flag==1)//当该变量在timerA的FIQ中断中被置1时表示接收到了回波

{

Exit_flag=0;//退出标示

Counter_buf=Counter_buf+uiRes_Add;//计数值加上一定的调整数据

uiResoult=Resoult_ult(Counter_buf);//对计数值进行处理,得出距离值

}

if(*P_TimerB_Data>10000)//如计数值大于10000,表示超时

{

Exit_flag=0;

uiResoult=measure2_ult(type);//再进行一次补充的测距,将会加长40KHz信号发射的量

*P_TimerB_Ctrl=0x0006;//停止定时器B

}

uiTemp=*P_TimerB_Data;

*P_Watchdog_Clear=0x0001;

}

*P_INT_Ctrl=*P_INT_Ctrl_New&(~0x

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1