嵌入式实验报告 多功能智能小车.docx

上传人:b****1 文档编号:14235183 上传时间:2023-06-21 格式:DOCX 页数:31 大小:2.01MB
下载 相关 举报
嵌入式实验报告 多功能智能小车.docx_第1页
第1页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第2页
第2页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第3页
第3页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第4页
第4页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第5页
第5页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第6页
第6页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第7页
第7页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第8页
第8页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第9页
第9页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第10页
第10页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第11页
第11页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第12页
第12页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第13页
第13页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第14页
第14页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第15页
第15页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第16页
第16页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第17页
第17页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第18页
第18页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第19页
第19页 / 共31页
嵌入式实验报告 多功能智能小车.docx_第20页
第20页 / 共31页
亲,该文档总共31页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式实验报告 多功能智能小车.docx

《嵌入式实验报告 多功能智能小车.docx》由会员分享,可在线阅读,更多相关《嵌入式实验报告 多功能智能小车.docx(31页珍藏版)》请在冰点文库上搜索。

嵌入式实验报告 多功能智能小车.docx

嵌入式实验报告多功能智能小车

组别

07

 

嵌入式系统实验报告

项目名称:

多功能智能小车

 

学号

姓名

主要工作

蓝牙通信、个性化功能(40%)

避障、实验报告(30%)

巡线、视频(30%)

2016年6月6日

1选题思路

1.1创意来源

1.1.1课程学习

在嵌入式系统这门专业课以及单片机原理这门选修课上,我们学习到了很多有关嵌入式系统和单片机的工作原理和使用方法,了解了单片机大体能通过通用串行口实现的功能,包括串口通信、传感器检测、输出PWM波控制电机运转等功能。

1.1.2助教指导

在课上我们学习到理论方面的知识,而要让我们深入理解和掌握相关操作,还需要实验课上的动手实践,这就离不开助教的帮助。

从一开始的安装软件、介绍单片机,到查阅参考手册逐步编写函数,再到最后的实现小车的各种功能,每一步助教都十分详细地讲解了从手册查阅到的相关寄存器的配置、打开时钟、相应功能函数的编写。

小车最后能够流畅运行,很大程度上都归功于助教。

并且,从助教教的课程中,我们也得到了我们的灵感:

通用接口、中断、传感器、时钟等等,以及助教发给我们的代码、演示文档和多个小作业、大作业参考都给了我们很大的帮助。

1.1.3课后讨论

实验课程结束以后,为了实现大作业要求的巡线、避障以外的一些其他功能,我们也从多方面搜索查阅了相关的资料并对可实现的功能进行了小组讨论,提出的方案有:

利用蓝牙实现与移动设备的通讯、增加声音模块让小车“说话”、像控制游戏里的角色一样自由控制小车行驶、上下坡自动调速、温度检测、定距离行驶以及简易跟随。

1.2结合实际情况

巡线、避障功能可以很容易地做出场地进行调试;蓝牙和声音模块都属于自己增加的模块类的,蓝牙通讯易于控制,而声音模块虽然函数可能略为简单,但最多只能发出几种不同的声音,不可能做到像人一样说话,并且小车已自带有蜂鸣器;简易跟随、定距离行驶和自由控制都不需要增加其他东西,只要编写函数即可;温度检测只能检测环境温度,可以增加温度过高过低时的报警系统,但意义并不大,并且条件实现稍困难;上下坡自动调速经测试,发现小车在不同坡度(±30°左右之间)速度适中,爬坡能力也较好,故自动调速也略显多余,但可以增加手动调速功能即设定小车的行驶速度,以及速度反馈功能保证速度稳定。

1.3确定最终方案

经过理论、实验课的学习以及课后的小组讨论结合实际情况,我们组最终确定的智能小车所实现的功能如下:

①智能小车巡线前进

②智能小车避障转弯

③蓝牙通讯控制

④简易跟随运动物体

⑤给定距离行驶

⑥自由控制小车运动

⑦手动设定速度

⑧速度反馈调节

选定的这些功能,有的复杂有的简单,有的还需要和其他功能联动,这样既能巩固我们在课上学习的编写程序的能力,加深理解单片机,又具有一定的难度,对组员来说也是一种挑战和提升。

2实现方案

2.1机械改造

为了更好地实现巡线、避障等功能,在编写相应的函数之前,我们首先对小车的机械结构做了一些调整。

如图1所示,左侧为小车的原始结构,右侧为调整后的结构,可以看出,我们将四个红外传感器的间距加大,虽然最边上的传感器超出的小车的底板边缘,但我们也利用纸板和胶带以及更长的导线将传感器固定在了相应的位置。

这样做的好处是,中间两个传感器是探测向下的距离的,加宽间距有利于巡线时更好地检测到两侧的空白;旁边两个传感器是用于避障的,往边缘移动使得宽度增加,更接近于小车的宽度,改善了因传感器检测宽度不足导致的车轮前进受阻。

图1小车前后机械结构对比图

2.2红外传感器ADC

红外传感器和模数转换器ADC是实现小车巡线、避障等重要功能不可缺少的部分,其作用是红外传感器感应光线、距离的变化,经过模数转换器将采集到的信息转化为数字量,用于实现各项功能。

其初始化函数如下:

voidADC_Configuration(void)

{

/*ADC1configuration------------------------------------------------------*/

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//每个ADC独立工作

//ADC扫描所有规则转换通道ADC_SQRx和注入转换通道ADC_JSQR

ADC_InitStructure.ADC_ScanConvMode=ENABLE;

ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;//连续转换模式开启

/*关闭ADC外部触发,即禁止由外部触发模数转换*/

ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;

ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//转换数据右对齐

ADC_InitStructure.ADC_NbrOfChannel=4;//开启4个通道

ADC_Init(ADC1,&ADC_InitStructure);//调用固件库函数完成初始化

/*ADC1regularchannelconfiguration*///采样周期为239.5个周期

ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1,ADC_SampleTime_239Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_5,2,ADC_SampleTime_239Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_6,3,ADC_SampleTime_239Cycles5);

ADC_RegularChannelConfig(ADC1,ADC_Channel_7,4,ADC_SampleTime_239Cycles5);

//转换周期不能太短,否则CPU基本一直处于ADC中断状态

/*EnableADC1DMA*/

ADC_DMACmd(ADC1,ENABLE);/*使能ADC1DMA*/

/*EnableADC1ECO*///ADC转换完成中断使能

//ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);

/*EnableADC1*/

ADC_Cmd(ADC1,ENABLE);

/*EnableADC1resetcalibarationregister*/

ADC_ResetCalibration(ADC1);//ADC1复位校准

/*ChecktheendofADC1resetcalibrationregister*/

while(ADC_GetResetCalibrationStatus(ADC1));//等待校准寄存器初始化

/*StartADC1calibaration*/

ADC_StartCalibration(ADC1);//开始校准

/*ChecktheendofADC1calibration*/

while(ADC_GetCalibrationStatus(ADC1));//等到校准完成

ADC_Calibration_DR=ADC1->DR;//保存校准码

/*StartADC1SoftwareConversion*/

ADC_SoftwareStartConvCmd(ADC1,ENABLE);//软件启动ADC1进行连续转换

}

2.3TIM计数PWM输出电机

小车的单片机系统自带有计数器,将计数器设置好预分频值、计数数值、计数方式以后就可以得到一定频率的脉冲,并产生相应频率的中断;抑或是给定参考数值和工作模式,在计数过程中得到预设占空比的方波,即脉冲宽度调制PWM波,可以用于电机控制,以实现速度的调整,联合电机正反转控制来达到左右转弯、前进后退等目的。

计数器及PWM波的配置如下:

voidTIM_Configuration(void)

{

/*TIM1PeripheralConfiguration*/

TIM1_DeInit();

/*TimeBaseconfiguration*///100Hz

TIM1_TimeBaseStructure.TIM1_Prescaler=7200;

TIM1_TimeBaseStructure.TIM1_CounterMode=TIM1_CounterMode_Up;

TIM1_TimeBaseStructure.TIM1_Period=100;

TIM1_TimeBaseStructure.TIM1_ClockDivision=0;

TIM1_TimeBaseStructure.TIM1_RepetitionCounter=0;

TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);

TIM1_ClearFlag(TIM1_FLAG_Update);

TIM1_ITConfig(TIM1_IT_Update,ENABLE);//使能定时器TIM1中断

/*TIM1counterenable*/

TIM1_Cmd(ENABLE);//TIM1用于10ms的定时器

/*-----------------------------------------------------------------------

TIM3Configuration:

generate2PWMsignalswith4differentdutycycles:

TIM3CLK=36MHz,Prescaler=10,TIM3counterclock=3600KHz

TIM3ARRRegister=499=>TIM3Frequency=TIM3counterclock/(ARR+1)

TIM3Frequency=7.2KHz.

TIM3Channel3dutycycle=(TIM3_CCR3/TIM3_ARR)*100=25%

TIM3Channel4dutycycle=(TIM3_CCR4/TIM3_ARR)*100=12.5%

-----------------------------------------------------------------------*/

/*Timebaseconfiguration*/

TIM_TimeBaseStructure.TIM_Period=499;

TIM_TimeBaseStructure.TIM_Prescaler=10;

TIM_TimeBaseStructure.TIM_ClockDivision=0;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

/*PWM1Modeconfiguration:

Channel3*/

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_Channel=TIM_Channel_3;

TIM_OCInitStructure.TIM_Pulse=0;//CCR3_Val;//初始占空比值,可以设置为0

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;

TIM_OCInit(TIM3,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);

/*PWM1Modeconfiguration:

Channel4*/

TIM_OCInitStructure.TIM_Channel=TIM_Channel_4;

TIM_OCInitStructure.TIM_Pulse=0;//CCR4_Val;

TIM_OCInit(TIM3,&TIM_OCInitStructure);

TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM3,ENABLE);

/*TIM3enablecounter*/

TIM_Cmd(TIM3,ENABLE);//TIM3输出两路PWM波,用于控制电机转速

/*Timebaseconfiguration*/

TIM_TimeBaseStructure.TIM_Period=0xFFFF;

TIM_TimeBaseStructure.TIM_Prescaler=0;

TIM_TimeBaseStructure.TIM_ClockDivision=0;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

/*SelectstheTI2asclockforTIM2:

theexternalclockis

connectedtoTI1inputpin,therisingedgeistheactiveedgeand

nofiltersamplingisdone(ICFilter=0)*/

//[将TIM2的通道2设为TIM2的外部时钟信号,

//TIM->CNT的值即为通道2端输入脉冲数]

TIM_TIxExternalClockConfig(TIM2,TIM_TIxExternalCLK1Source_TI2,TIM_ICPolarity_Rising,0);

/*TIM2enablecounter*/

TIM_Cmd(TIM2,ENABLE);//采集脉冲数

/*Timebaseconfiguration*/

TIM_TimeBaseStructure.TIM_Period=0xFFFF;

TIM_TimeBaseStructure.TIM_Prescaler=0;

TIM_TimeBaseStructure.TIM_ClockDivision=0;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStructure);

/*SelectstheTI3asclockforTIM2:

theexternalclockis

connectedtoTI3inputpin,therisingedgeistheactiveedgeand

nofiltersamplingisdone(ICFilter=0)*/

TIM_TIxExternalClockConfig(TIM4,TIM_TIxExternalCLK1Source_TI1,TIM_ICPolarity_Rising,0);

/*TIM2enablecounter*/

TIM_Cmd(TIM4,ENABLE);//采集脉冲数

}

2.4USART串口蓝牙通讯

串口主要用于数据的发送和接收,可以实现指令的发送和反馈信息的显示。

利用接收到数据产生中断从而在中断处理中实现数据的读取;而在各项功能的实现过程中,反馈信息的显示能够更好地帮助我们了解小车相应的状态,进而做出调整。

蓝牙通讯可以实现移动设备和小车的交互,但美中不足的是,蓝牙只能让做到数据的接收而无法让移动设备显示出反馈的信息,因此我们对指令也做了简化使得控制起来更为简洁。

串口的配置函数如下:

voidUSART_Configuration(void)

{

/*USART1configuredasfollow:

-BaudRate=115200baud

-WordLength=8Bits

-OneStopBit

-Noparity

-Hardwareflowcontroldisabled(RTSandCTSsignals)

-Receiveandtransmitenabled

-USARTClockdisabled

-USARTCPOL:

Clockisactivelow

-USARTCPHA:

Dataiscapturedonthesecondedge

-USARTLastBit:

Theclockpulseofthelastdatabitisnotoutputto

theSCLKpin

*/

USART_InitStructure.USART_BaudRate=9600;

USART_InitStructure.USART_WordLength=USART_WordLength_8b;

USART_InitStructure.USART_StopBits=USART_StopBits_1;

USART_InitStructure.USART_Parity=USART_Parity_No;

USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;

USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;

USART_InitStructure.USART_Clock=USART_Clock_Disable;

USART_InitStructure.USART_CPOL=USART_CPOL_Low;

USART_InitStructure.USART_CPHA=USART_CPHA_1Edge;

USART_InitStructure.USART_LastBit=USART_LastBit_Disable;

/*ConfiguretheUSART1*/

USART_Init(USART1,&USART_InitStructure);

/*EnableUSART1*/

USART_Cmd(USART1,ENABLE);

USART_ITConfig(USART1,USART_IT_RXNE,ENABLE);

}

蓝牙模块如图2所示,在原先进行烧写程序的串行口接上蓝牙的数据口,再多引一根蓝牙模块所需要的电源线即可。

图2蓝牙模块

2.5NVICEXTI中断处理

在嵌入式课程的理论课上我们已经学习了有关中断的知识,实际应用时,可以发现小车的中断已经配置好,只要在相应的中断函数中编写中断服务子程序即可。

小车可实现的中断多种多样,有按键中断、定时器中断、串口中断等。

在实际应用中我们只用到了串口的中断来接收数据,其余中断并未采用。

串口中断服务子程序在4.4节中做详细展开,嵌套向量中断控制器NVIC的配置如下:

voidNVIC_Configuration(void)

{

NVIC_InitTypeDefNVIC_InitStructure;

#ifdefVECT_TAB_RAM

/*SettheVectorTablebaselocationat0x20000000*/

NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);

#else/*VECT_TAB_FLASH*/

/*SettheVectorTablebaselocationat0x08000000*/

NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);

#endif

/*EnabletheTIM1Interrupt*/

NVIC_InitStructure.NVIC_IRQChannel=TIM1_UP_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);

NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQChannel;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

3程序流程图

图3系统流程图

·`

4关键代码注解

4.1指令对照表

表1指令对照表

指令代码(3位数字)

指令含义

001

巡线

002

避障

003

简易跟随

004

设定行驶距离

单独使用无效,在给定行驶距离后自动执行004指令

005

前进

006

后退

007

左转

008

右转

009

停止

0XY

(X不为0,即010~099)

设定行驶速度为XY(10~99)

非现实速度,仅为数字参照

XYZ

(X不为0,即100~999)

设定行驶距离为XYZ(100~999)

为实际距离,单位为mm

000

无效指令

4.2Main函数

Main函数是系统开始运行时执行的函数,在一开始需编写各项功能的配置,包括时钟RCC、中断NVIC、串口GPIO、USART、定时器TIM、DMA、ADC等等,这些是所有的主函数都需要有的,在此不作赘述。

而主要的不同在于主循

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

当前位置:首页 > 成人教育 > 专升本

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2