之前的一个小项目,基于stm32f103这款单片机,实现红外遥控,超声波避障,黑白寻迹,pwm调速,齿轮测速等功能,这里上传下之前的工程文件,附部分项目笔记,希望对需要的人有帮助,有不对的地方还请指出来,谢谢!
下面是设计报告的内容节选(清晰图片版请下载附件)
项目设计:智能小车1、项目简介本次项目中我们利用SMART103平台中的硬件资源控制电机驱动、红外遥控模块从而实现对小车的前进,后退,左右转弯以及速度调整,并能够持续加减速。速度状态通过LED指示状态来识别。通过此次项目,可以掌握电机驱动模块跟红外遥控模块的使用、I/O口作为输出模式时,CPU对I/O口的基本操作和控制,系统滴答定时器的工作原理、高级定时器TIM1的PWM调制原理、以及红外遥控器的工作原理、对系统工作有个整体认识。 2、电机驱动模块 接口说明: 输出口:OUT1、OUT2、OUT3、OUT4 四路输出口分别对应小车左右两侧的电机;其中1、2为一组,对应左侧电机的正负极;3、4位一组,对应右侧电机的正负极,在安装电机之前对电机正负极进行检测。 输入口:ENA、IN1、IN2、IN3、IN4、ENB ENA、ENB为电机控制使能端口,改口接入PWM波可以根据波形占空比调节电机转速IN1、IN2、IN3、IN4 分别对应单片机IO口,用来控制电机正反转。 电源输入:12V输入、GND 12V接入电源正极,GND接入电源负极,供电机驱动模块正常驱动电机,该模块自带5V板载输出。 原理图: 图中假定IN1、IN2分别对应输入1、0;电流流经方向为黄色荧光笔轨迹,驱动电路一侧电机电机正传,反之输入0、1电机反转;同样电路另一侧原理相同。 MOTO_GPIO初始化:General Purpose Input Output (通用输入/输出)简称为GPIO,或总线扩展器,利用工业标准I2C、SMBus或SPI接口简化了I/O口的扩展。当微控制器或芯片组没有足够的I/O端口,或当系统需要采用远端串行通信或控制时,GPIO产品能够提供额外的控制和监视功能。 在STM32中,每个GPI/O端口有两个32位配置寄存器(GPIOx_CRL,GPIOx_CRH),两个32位数据寄存器(GPIOx_IDR和GPIOx_ODR),一个32位置位/复位寄存器(GPIOx_BSRR),一个16位复位寄存器(GPIOx_BRR)和一个32位锁定寄存器(GPIOx_LCKR)。 根据数据手册中列出的每个I/O端口的特定硬件特征,GPIO端口的每个位可以由软件分别配置成如下8中工作模式:
- 输入浮空 GPIO_Mode_IN_FLOATING = 0x04,
- 输入上拉 GPIO_Mode_IPU = 0x48,
- 输入下拉 GPIO_Mode_IPD = 0x28,
- 模拟输入 GPIO_Mode_AIN = 0x0,
- 开漏输出 GPIO_Mode_Out_OD = 0x14,
- 推挽输出 GPIO_Mode_Out_PP = 0x10,
- 推挽式复用功能 GPIO_Mode_AF_PP = 0x18
- 开漏式复用功能 GPIO_Mode_AF_OD = 0x1C,
STM32的GPIO端口位配置表如下图所示: STM32的输出模式配置如下表所示: 下面编写电机驱动模块IO初始化函数: Init_PWM_GPIO初始化脉冲宽度调制(PWM),是英文“ Pulse Width Modulation” 的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制, PWM 原理如图: 图中,我们假定定时器工作在向上计数 PWM模式,且当 CNT<CCRx 时,输出 0,当 CNT>=CCRx 时输出 1。那么就可以得到如上的 PWM示意图:当 CNT 值小于CCRx 的时候, IO 输出低电平(0),当 CNT 值大于等于 CCRx 的时候,IO 输出高电平(1),当 CNT 达到 ARR 值的时候,重新归零,然后重新向上计数,依次循环。改变 CCRx 的值,就可以改变 PWM 输出的占空比,改变 ARR 的值,就可以改变 PWM 输出的
频率,这就是 PWM 输出的原理。 STM3内部PWM波产生原理: PWM产生的流程: - 使能定时器TIM1(高级定时器1)和相关IO口时钟。使能定时器1时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
使能GPIOF时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); - 初始化IO口为复用功能输出。函数:GPIO_Init();
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用功GPIOA8,GPIO9复用映射到定时器TIM1 - 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
- 初始化输出比较参数:TIM_OC1Init();TIM_OC2Init();
- 使能预装载寄存器:TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
使能预装载寄存器:TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable); - 使能自动重装载的预装载寄存器允许位TIM_ARRPreloadConfig(TIM1,ENABLE);
- 使能定时器,TIM_Cmd(TIM1,ENABLE);
- 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();
3、红外遥控模块
一个通用的红外遥控系统由发射和接收两大部分组成,如图 编码格式: 目前广泛使用较普遍的两种:一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准;另一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。 NEC 标准(代表芯片WD6122):遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。NTC编码,引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。编码采用脉冲位置调制方式(PPM) 红外NEC协议编码利用脉冲之间的时间间隔来区分“0”和“1”:数据0 可用“高电平0.56ms +低电平0.56ms”表示,数据1 可用“高电平0.56ms +低电平1.68ms”表示。当一个键按下超过36ms,振荡器使芯片激活,将发射一组108ms的编码脉冲,这110ms发射代码由一个引导码(9ms),一个结果码(4.5ms),8位地址码,8位地址反码,8位数据码和这8位数据的反码组成。如果键按下超过110ms仍未松开,接下来发射的代码(连发码)将仅由起始码(9ms)和结束码(2.25ms)组成。 编码构成:
Init_TELECONTRAL_IO初始化红外遥控初始化流程:
- 初始化 GPIO_Pin_5并打开IO时钟使能,打开复用时钟,模式上 拉输入,速度50MHZ。
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE); - 将GPIO_Pin_5的外部中断挂载到外部中断线上。
GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5); - 初始化外部中断EXTI_Init(&EXTI_InitStruct);
- 设置优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
- 设置抢占优先级,响应优先级, NVIC_Init(&NVIC_InitStruct);
- 在中断服务函数中判断红外按键的状态;
- 通过命令解析函数获取当前按键的指令状态int Remote_Process(void);
中断优先级分组
Control_Init红外遥控按键值获取:
通过获取到的按键值,编写小车控制的程序,并设置模式标志位,切换模式完成小车的前进、后退、左转、右转、停止、加减速等功能。同时将当前获取到的速度值跟小车的模式状态显示到LCD1602上面。 设置按键模式 :判断当前按键5是否被按下,在模式一与模式二之间进行切换。
编写两种模式下的控制函数:
单片机源程序如下(主程序):
- #include <stdio.h>
- #include "moto.h"
- #include "delay.h"
- #include "trail.h"
- #include "range.h"
- #include "timer3.h"
- #include "lcd1602.h"
- #include "telecontral.h"
- #include "speed.h"
- #include "pid.h"
- extern u16 Cnt_10ms;
- extern unsigned int object; //超声波避障
- extern unsigned int trail; //寻迹模式
- int main(void)
- {
- Init_Moto_IO(); //电机驱动IO初始化
- Init_PWM_GPIO(); //定时器1两路PWM波
- Init_Trail_IO(); //寻迹模块
- LCD_Init(); //LCD1602初始化
- Range_Init();
- Init_TELECONTRAL_IO(); //红外遥控初始化
- TIM3_Configuration(); //定时器3初始化
- Init_TIM1_BaseInit(100,100);
- delay_init();
-
- Init_Speed_IO(); //初始化测速模块的IO
- TIM4_Configuration(); //测速模块用到了定时器4
- Init_PID(); //PID速度
-
- while(1)
- {
- if(Cnt_10ms >= 10)
- {
- Cnt_10ms = 0;
- UltrasonicWave1_StartMeasure();
- Stop_run();
- if(object == 1) //避障模式用到超声波
- {
- Test(); //避障0 //按键0触发避障模式
- }
- }
- if(trail == 1)
- {
- Trail(); //寻迹8 //按键8触发寻迹模式
- }
- Show_Current_Speed();
- Control_Init();
- // Pid_Test();
-
- }
- }
复制代码
所有资料51hei提供下载(内含完整源码与word格式清晰版的设计论文):
Smartcar.rar
(2.06 MB, 下载次数: 319)
|