遥控智能小车课程设计.docx
- 文档编号:6763656
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:20
- 大小:85.36KB
遥控智能小车课程设计.docx
《遥控智能小车课程设计.docx》由会员分享,可在线阅读,更多相关《遥控智能小车课程设计.docx(20页珍藏版)》请在冰豆网上搜索。
遥控智能小车课程设计
《嵌入式系统原理》
课程设计说明书
题目:
遥控智能小车
院(系):
计算机与电子系
专业班级:
电子科学与技术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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 遥控 智能 小车 课程设计