遥控智能小车(课程设计)

  • 格式:doc
  • 大小:174.50 KB
  • 文档页数:24

下载文档原格式

  / 24
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《嵌入式系统原理》

课程设计说明书

题目:遥控智能小车

院(系):计算机与电子系

专业班级:电子科学与技术0902班

学生姓名:黄占威

学号:20091185045

指导教师:黄向宇

20 11 年 12 月 30 日至20 12 年 1 月 13 日

华中科技大学武昌分校制

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

目录

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个输出端,可以驱动两个直流电机。s tm32输出端口的电平变换,可以控制电机的方向。PWM脉宽调制信号,可以控制电机的转速。实现加速减速的功能。

2.2 具体实现

通过stm32的PA0,PA1,根据TIM2产生的不同占空比的PWM波,控制电机的速度,以及正反转。PA3,PA4控制小车前轮,前轮采用舵机控制,在转向方面,不能大幅度转弯,所以,在小车转弯上,我们采用转一段时间,然后倒退一段距离,然后再转,如此反复几次。通过这种方式实现小车的900C转弯。

2.3 功能函数设计

1.void Front()

{

GPIOD->BRR = 0X03;

GPIOA_Conf(); //配置A端口

GPIOA->BRR = 0x0f;

GPIOA->BSRR = 0X01;

}

调用这个函数,实现小车全速向前形式。PD端口的D0,D1位,是控制小车后面两个尾灯。当小车前进时,尾灯关闭。

2.void Back()

{

GPIOD->BSRR = 0x03;

GPIOA_Conf();

GPIOA->BRR = 0x0f;

GPIOA->BSRR = 0X02;

}

调用这个函数,实现小车全速后退。同时开启车身后面的尾灯。

3 . void LeftSlideFront()

{

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.void Time_Configuration(uint16_t CCR1_Val,uint16_t CCR2_Val,uint16_t periodValue,uint16_t PrescalerValue)

{

/*开启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);