遥控智能小车课程设计.docx

上传人:b****6 文档编号:6763656 上传时间:2023-01-10 格式:DOCX 页数:20 大小:85.36KB
下载 相关 举报
遥控智能小车课程设计.docx_第1页
第1页 / 共20页
遥控智能小车课程设计.docx_第2页
第2页 / 共20页
遥控智能小车课程设计.docx_第3页
第3页 / 共20页
遥控智能小车课程设计.docx_第4页
第4页 / 共20页
遥控智能小车课程设计.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

遥控智能小车课程设计.docx

《遥控智能小车课程设计.docx》由会员分享,可在线阅读,更多相关《遥控智能小车课程设计.docx(20页珍藏版)》请在冰豆网上搜索。

遥控智能小车课程设计.docx

遥控智能小车课程设计

 

《嵌入式系统原理》

课程设计说明书

 

题目:

遥控智能小车

院(系):

计算机与电子系

专业班级:

电子科学与技术0902班

学生姓名:

黄占威

学号:

20091185045

指导教师:

黄向宇

 

2011年12月30日至2012年1月13日

 

华中科技大学武昌分校制

嵌入式系统原理课程设计任务书

一、设计题目

遥控智能小车

二、设计主要内容

(1)广泛查找文献资料,认真研究,反复论证,精心设计技术方案。

(2)严格遵守各项纪律,勤奋学习,认真思考,敢于挑战困难并勇于创新。

(3)较为深入的掌握ARM处理器的体系结构、指令系统、编程方法,初步了解ARM应用系统的软硬件开发方法及手段,较熟练地掌握ARM处理器几种重要的片内外设(定时器、PLL、I2C、RTC等)的基本原理及编程方法,初步掌握ARM处理器外围电路的扩展方法。

(4)在现有车模的基础上,以嵌入式ARM微处理器构成小车控制核心,同时加装声光电、红外线、超声波传感器、LED显示等外围设备,实现对小车的速度、位置、运行状况的实时测量,并将测量数据传送至处理器进行处理,然后由处理器根据所检测的各种数据实现对电动车的智能控制;

(5)设计的智能小车应该能够实时显示时间、速度、里程,具有自动寻迹、寻光、避障功能,可程控行驶速度、准确定位停车。

并有相应的声光电设备发出相关的提示或警示信息。

(6)遥控方式可自选,系统通过遥控器可以控制小车的行驶方向、速度、起停等运行状态,要求要达到一定的控制精度、距离及范围,小车行驶速度应达到3m/s以上。

(7)分析结果,独立撰写设计总结报告陈述自己的观点,格式应严格遵守学校规范。

内容尽量翔实,其中必须要有自己独立的见解和认识。

三、原始资料

硬件资源:

四驱小车车模、STM32系统板、用于ARM处理器的JTAG仿真器、PC机Pentium100以上。

设计指导书:

STM32系统板配套光盘

四、要求的设计成果

(1)在现有车模的基础上,以嵌入式ARM微处理器构成小车控制核心,同时加装声光电、红外线、超声波传感器、LED显示等外围设备,实现对小车的速度、位置、运行状况的实时测量,并将测量数据传送至处理器进行处理,然后由处理器根据所检测的各种数据实现对电动车的智能控制。

(2)撰写课程设计说明书,要求简洁、通顺,格式规范,设计方案正确,实现技术路线明确,论述内容完整、清楚、规范,数据、资料真实可靠,软件程序运行良好。

(3)要求有完整的电路设计原理图及软件源代码。

五、进程安排

(1)第1天:

任务布置及相关知识讲解

(2)第2-3天:

资料查阅与方案制定

(3)第4-8天:

硬件设计、程序编制与调试阶段

(4)第9天:

撰写设计报告

(5)第10天:

答辩与考核阶段

六、主要参考资料

[1]田泽.嵌入式系统开发与应用实验教程.北京航空航天工业大学出版社,2005.

[2]郭荣佐,王霖.《嵌入式系统原理》.北京航空航天大学出版社,.2008.

[3]周根林.嵌入式系统原理与应用.南京大学出版社,2006.

[4]谭浩强.C语言程序设计(第2版).清华大学出版社,2008

[5]丁峰.ARM系统开发——从实践到提高.中国电力出版社,2007.

[6]游雨云.单片机PWM信号控制智能小车的实现方法.技术与市场,2009,(12)

[7]袁新娜,余红英,超声波传感器在智能小车避障系统中的应用.大众商务教育版(民办教育研究),2009,(8)

指导教师(签名):

 

20年月日

目录

 

1.总体思想1

2.电机驱动2

2.1简介2

2.2具体实现2

2.3功能函数设计2

3.遥控系统7

3.1遥控器简介7

3.2接收探头与解码7

3.3红外控制8

4.超声波12

4.1简介12

4.2超声波测距具体实现12

4.3超声波程序设计12

5.红外寻迹14

5.1反射式红外传感器14

5.2具体实现方法14

5.3寻迹程序设计15

6.总结17

1.总体思想

图1.1设计全局图

本次课程设计,我们小组采用stm32作为主控芯片,L298N模块作为电机驱动芯片。

在小车车头放置三个反射式红外传感器,由于红外光易于被黑线吸收,利用这个原理,来检测黑线,当检测到黑线时,发射出去的红外光被吸收,红外传感器接受不到反射信号,通过输出信号反馈给STM32,产生中断,作出相应的调整,详细介绍见下文第12页。

车头部分采用一个US-100超声波模块,用于检测前方障碍物,我们小组设置的安全距离为25cm,当小车与前方障碍之间的距离小于25cm时,小车蜂鸣器报警,stm32控制电机,作出相应的调整。

关于超声波工作详情,请见下文第11页。

小车尾部安装一枚HS0038红外接收探头,配合一块遥控器,实现遥控小车的功能。

我们小组选用的遥控器编码为NEC协议。

红外遥控功能详情,请见下文第7页。

我们在小车的车身上放置一块3.2寸TFT液晶显示器。

用于显示时间,车速。

车速通过霍尔元件测得。

 

2.电机驱动

2.1简介

电机运转需要大电流,而stm32驱动能力达不到电机正常运转的要求,故我们小组采用L298N模块驱动电机,L298N拥有4个输入端口,由stm32直接输入,4个输出端,可以驱动两个直流电机。

stm32输出端口的电平变换,可以控制电机的方向。

PWM脉宽调制信号,可以控制电机的转速。

实现加速减速的功能。

2.2具体实现

通过stm32的PA0,PA1,根据TIM2产生的不同占空比的PWM波,控制电机的速度,以及正反转。

PA3,PA4控制小车前轮,前轮采用舵机控制,在转向方面,不能大幅度转弯,所以,在小车转弯上,我们采用转一段时间,然后倒退一段距离,然后再转,如此反复几次。

通过这种方式实现小车的900C转弯。

2.3功能函数设计

1.voidFront()

{

GPIOD->BRR=0X03;

GPIOA_Conf();//配置A端口

GPIOA->BRR=0x0f;

GPIOA->BSRR=0X01;

}

调用这个函数,实现小车全速向前形式。

PD端口的D0,D1位,是控制小车后面两个尾灯。

当小车前进时,尾灯关闭。

2.voidBack()

{

GPIOD->BSRR=0x03;

GPIOA_Conf();

GPIOA->BRR=0x0f;

GPIOA->BSRR=0X02;

}

调用这个函数,实现小车全速后退。

同时开启车身后面的尾灯。

3.voidLeftSlideFront()

{

GPIOD->BSRR=0X01;

GPIOD->BRR=0X02;

GPIOA->BRR=0X04;

GPIOA->BSRR=0X08;

Time_Configuration(350,0,500,7199);

}

调用此函数,实现小车前进,左转弯。

同时开启尾部左边的尾灯,关闭右边的尾灯。

Time_Configuration(350,0,500,7199)为占空比调制函数。

通过输入不同的值,改变电机的转速。

4.voidTime_Configuration(uint16_tCCR1_Val,uint16_tCCR2_Val,uint16_tperiodValue,uint16_tPrescalerValue)

{

/*开启TM2定时器时钟*/

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);

/*TIM2定时器复用管脚PA0,PA1,PA2,PA3*/

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;

GPIO_Init(GPIOA,&GPIO_InitStructure);

/*配置定时器时基*/

TIM_TimeBaseStructure.TIM_Period=periodValue;

TIM_TimeBaseStructure.TIM_Prescaler=PrescalerValue;

TIM_TimeBaseStructure.TIM_ClockDivision=0;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);

/*配置定时器各通道情况*/

TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse=CCR1_Val;

TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;

TIM_OC1Init(TIM2,&TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);

TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_Pulse=CCR2_Val;

TIM_OC2Init(TIM2,&TIM_OCInitStructure);

TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);

TIM_ARRPreloadConfig(TIM2,ENABLE);

TIM_Cmd(TIM2,ENABLE);

}

PWM脉宽调制波形输出,是stm32定时器功能的一大亮点,以往8位单片机输出PWM波形,均为模拟,或者借助外围芯片,而stm32内部定时器,实现了精确的PWM波形直接输出。

上面功能函数,为TIM2定时器的配置情况。

我在使用时,开启了TIM2定时器的通道1和通道2。

分别为PA0,PA1,这两个端口控制小车的后轮电机。

由于前轮为舵机。

所以,没有采用PWM波形。

而是直接给高低电平调整小车的方向。

stm32定时器采用预分频处理,即将系统时钟分频后给定时器,这个预分频值,由传入的参数PrescalerValue决定。

系统时钟为72MHz,设分频后的频率为F,则:

F=72MHz/(PrescalerValue+1)

定时器的计数周期为传入参数periodValue的值决定。

PWM占空比值由传入参数CCR1_Val和CCR2_Val决定,分别控制PA0,PA1的占空比值。

占空比=CCR1_Val/periodValue。

4.voidLeftSlideBehind()

{

GPIOD->BSRR=0X01;

GPIOD->BRR=0X02;

GPIOA->BRR=0X04;

GPIOA->BSRR=0X08;

Time_Configuration(0,350,500,7199);

}

调用此函数,控制小车后退并左转弯。

同时开启左边尾灯,关闭右边尾灯。

5.voidRightSlideFront()

{

GPIOD->BSRR=0X02;

GPIOD->BRR=0X01;

GPIOA->BRR=0X08;

GPIOA->BSRR=0x04;

Time_Configuration(350,0,500,7199);

}

调用此函数,控制小车前进并右转弯。

同时关闭左边尾灯,开启右边尾灯。

6.voidRightSlideBehind()//后退,右转弯

{

GPIOD->BSRR=0X02;

GPIOD->BRR=0X01;

GPIOA->BRR=0X08;

GPIOA->BSRR=0X04;

Time_Configuration(0,350,500,7199);

}

调用此函数,控制小车后退并右转弯。

同时关闭左边尾灯,开启右边尾灯。

7.voidUpshift()

{

uint16_ti;

GPIOD->BRR=0x03;

for(i=100;i<=180;i=i+10)

{

Delay(200);

Time_Configuration(i,0,500,7199);

}

while(i<=500)

{

i=i+50;

Time_Configuration(i,0,500,7199);

Delay(100);

}

}

调用此函数,实现小车的加速,我们小组将加速过程分为2级,第一级为慢加速,让速度慢慢起来,第二级加速为快加速,当速度达到一定值后,占空比增大的幅度加强。

8.voidSlowDown()

{

uint16_ti=400;

GPIOD->BSRR=0X03;

while(i>200)

{

Time_Configuration(i,0,500,7199);

i=i-50;

Delay(70);

}

for(;i>170;i=i-5)

{

Time_Configuration(i,0,500,7199);

Delay(80);

}

}

调用此函数,实现小车的减速,减速过程,我们也分为两级。

第一级为快速减速,第二级为慢速减速。

使小车平稳减速。

9.voidBrake()

{

GPIOD->BSRR=0x03;

GPIOA_Conf();

GPIOA->BSRR=0x0f;

}

调用该函数,小车将停止。

同时后面尾灯开启。

 

3.遥控系统

3.1遥控器简介

我们小组使用的遥控器发射编码为NEC协议,NEC编码协议中,遥控器每发送一个8位数据,可以分为5个部分:

图3.1NEC协议编码规则

当按下遥控器上的任意一个键时,遥控器将发送一个38KHz的载波信号,根据NEC编码协议,如果发送数据位为1,则向外发送38KHz的载波信号,持续发送0.56ms.然后停止发送1.685ms后继续发送下一位。

如果发送数据位为0,则红外遥控向外发送38KHz的载波信号,持续发送0.56ms,然后停止发送0.565ms后继续发送下一位。

3.2接收探头与解码

接受红外信号部分,我们采用HS0038接收探头,HS0038共三个引脚,分别为,OUT、VCC、GND。

通电后,当没有收到红外信号时,OUT端口默认为高电平。

接受端口信号与红外遥控发送信号电平相反。

在解码方面,接收探头接受到38KHz的载波后,输出端OUT电平拉低。

由于NEC发射编码中,采用的是38KHz载波表示高,无发射表示低。

所以在接受探头部分的电平高低,与发射部分刚好相反。

解码部分,数据1,0的电平宽度为别是:

图3.2NEC协议1、0电平宽度

由于每个数据位开始低电平均为0.56ms,所以,我们使用TIM3定时器,准确捕获到每位数据高电平持续时间。

通过捕获到的值,来确认1和0.

通过软件解码时,首先接受到引导码,9ms的低电平和4.5ms的高电平,然后是地址码和地址反码,最后是数据码和数据反码。

在程序设计上,我们定义个unsignedchar型数组,分别记录下地址码、地址反码、数据码、数据反码。

取出数组下标为2和3的值,将下标为3的数组数据取反,判断是否相等,如果不相等,表示解码数据有误;如果相等,表示解码正确。

3.3红外控制

将stm32的外部中断3端口与红外探头的输出端相连,捕捉红外遥控发射来的信号。

外部中断端口程序配置如下:

1.voidEXTI3_Configration()

{

/***************配置PC3端口,作为外部中断触发端口***********/

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;

GPIO_Init(GPIOC,&GPIO_InitStructure);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource3);

/****************外部中断线配置,设置为上升沿触发****************/

EXTI_InitStructure.EXTI_Line=EXTI_Line3;

EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd=ENABLE;

EXTI_Init(&EXTI_InitStructure);

/********************中断向量表配置*****************/

NVIC_InitStructure.NVIC_IRQChannel=EXTI3_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01;

NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01;

NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;

NVIC_Init(&NVIC_InitStructure);

}

配置好外部中断后,当stm32上电后,便会实时监控PC3端口,当接受到红外信号后,便产生一个中断信号,调用中断处理函数,处理该事件,下面为中断处理函数,主要是解码红外信号:

2.voidEXTI3_IRQHandler(void)

{

inti,j,Counter=0;

charIR[4]={0};

charch1=0,ch2=0;

if(EXTI_GetITStatus(EXTI_Line3)!

=RESET)

{

TIM3->CNT=0;

TIM_Cmd(TIM3,ENABLE);

while(TIM_GetCounter(TIM3)<7000);

TIM_Cmd(TIM3,DISABLE);

TIM3->CNT=0;

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==0)

{

while(!

GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));

TIM3->CNT=0;

TIM_Cmd(TIM3,ENABLE);

while(TIM_GetCounter(TIM3)<3500);

TIM_Cmd(TIM3,DISABLE);

if(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3)==1)

{

while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));

for(i=0;i<4;i++)

{

for(j=0;j<8;j++)

{

while(!

GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));

TIM3->CNT=0;

TIM_Cmd(TIM3,ENABLE);

while(GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_3));

Counter=TIM_GetCounter(TIM3);

TIM_Cmd(TIM3,DISABLE);

ch1=ch1>>1;

if(Counter>840)

{

ch1=ch1|0x80;

}

else

{

ch1=ch1|0;

}

Counter=0;

}

IR[i]=ch1;

}

ch1=IR[2];

ch2=IR[3];

ch2=~ch2;

if(ch1==ch2)

{

switch(ch1)

{

case0x07:

LeftSlideFront();break;

case0x09:

RightSlideFront();break;

case0x40:

Front();break;

case0x19:

Back();break;

case0x16:

LeftSlideBehind();break;

case0x0d:

RightSlideBehind();break;

case0x0c:

Upshift();break;

case0x5e:

SlowDown();break;

case0x15:

Brake();break;

default:

Brake();break;

}

}

}

}

Delay(500);

EXTI_ClearITPendingBit(EXTI_Line3);

}

}

这个函数为中断处理函数,在中断处理函数中,我们又用到了一个TIM3定时器,该定时器主要是解码红外信号,根据上文所述的0,1编码规则,用TIM3定时器,所捕获到的值,来判断信号0,1,实现软件解码红外信号。

下面为TIM3定时器的配置:

3.voidTIM3_Configuration()

{

TIM_DeInit(TIM3);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);

TIM_TimeBaseStructure.TIM_Period=50000;

TIM_TimeBaseStructure.TIM_Prescaler

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

当前位置:首页 > 总结汇报

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

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