当前位置:文档之家› 遥控智能小车(课程设计)教学文案

遥控智能小车(课程设计)教学文案

遥控智能小车(课程设计)《嵌入式系统原理》课程设计说明书题目:遥控智能小车院(系):计算机与电子系专业班级:电子科学与技术0902班学生姓名:***学号: ***********指导教师:***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个输出端,可以驱动两个直流电机。

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

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);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.void LeftSlideBehind(){GPIOD->BSRR = 0X01;GPIOD->BRR = 0X02;GPIOA->BRR = 0X04;GPIOA->BSRR = 0X08;Time_Configuration(0,350,500,7199);}调用此函数,控制小车后退并左转弯。

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

5.void RightSlideFront(){GPIOD->BSRR = 0X02;GPIOD->BRR = 0X01;GPIOA->BRR = 0X08;GPIOA->BSRR = 0x04;Time_Configuration(350,0,500,7199);}调用此函数,控制小车前进并右转弯。

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

6.void RightSlideBehind() //后退,右转弯{GPIOD->BSRR = 0X02;GPIOD->BRR = 0X01;GPIOA->BRR = 0X08;GPIOA->BSRR = 0X04;Time_Configuration(0,350,500,7199);}调用此函数,控制小车后退并右转弯。

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

7.void Upshift(){uint16_t i;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.void SlowDown(){uint16_t i = 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.void Brake(){GPIOD->BSRR = 0x03;GPIOA_Conf();GPIOA->BSRR = 0x0f;}调用该函数,小车将停止。

相关主题