找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 13890|回复: 20
收起左侧

基于Stm32f103红外蓝牙寻迹智能小车设计

  [复制链接]
ID:263159 发表于 2017-12-18 15:54 | 显示全部楼层 |阅读模式
之前的一个小项目,基于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是否被按下,在模式一与模式二之间进行切换。

编写两种模式下的控制函数:

单片机源程序如下(主程序):
  1. #include <stdio.h>
  2. #include "moto.h"
  3. #include "delay.h"
  4. #include "trail.h"
  5. #include "range.h"
  6. #include "timer3.h"
  7. #include "lcd1602.h"
  8. #include "telecontral.h"
  9. #include "speed.h"
  10. #include "pid.h"


  11. extern u16 Cnt_10ms;
  12. extern unsigned int object;                                                                //超声波避障
  13. extern unsigned int trail;                                                                //寻迹模式

  14. int main(void)
  15. {
  16.         Init_Moto_IO();                                                                //电机驱动IO初始化
  17.         Init_PWM_GPIO();                                                        //定时器1两路PWM波
  18.         Init_Trail_IO();                                                        //寻迹模块
  19.         LCD_Init();                                                                                //LCD1602初始化
  20.         Range_Init();
  21.         Init_TELECONTRAL_IO();                                //红外遥控初始化        
  22.         TIM3_Configuration();                                        //定时器3初始化
  23.         Init_TIM1_BaseInit(100,100);
  24.         delay_init();
  25.         
  26.         Init_Speed_IO();                                                        //初始化测速模块的IO
  27.         TIM4_Configuration();                                        //测速模块用到了定时器4        
  28.         Init_PID();                                                                                //PID速度
  29.         
  30.         while(1)
  31.         {        
  32.                         if(Cnt_10ms >= 10)
  33.                         {
  34.                                 Cnt_10ms = 0;
  35.                                 UltrasonicWave1_StartMeasure();        
  36.                                 Stop_run();
  37.                                 if(object == 1)                                        //避障模式用到超声波
  38.                                 {
  39.                                         Test();                //避障0                        //按键0触发避障模式        
  40.                                 }
  41.                         }
  42.                         if(trail == 1)
  43.                         {
  44.                                         Trail();        //寻迹8                        //按键8触发寻迹模式
  45.                         }
  46.                         Show_Current_Speed();
  47.                         Control_Init();
  48. //                        Pid_Test();
  49.                

  50.         }
  51. }

复制代码
0.jpg

所有资料51hei提供下载(内含完整源码与word格式清晰版的设计论文):
Smartcar.rar (2.06 MB, 下载次数: 319)
回复

使用道具 举报

ID:262559 发表于 2017-12-23 16:17 来自手机 | 显示全部楼层
能具体说一下STM32 f103  具体型号呢  
回复

使用道具 举报

ID:262559 发表于 2018-1-10 21:24 来自手机 | 显示全部楼层
厉害了!!
回复

使用道具 举报

ID:118238 发表于 2018-1-25 21:06 | 显示全部楼层
谢谢 您的分享
回复

使用道具 举报

ID:218529 发表于 2018-3-20 15:25 | 显示全部楼层
谢谢分享 顶一个
回复

使用道具 举报

ID:295278 发表于 2018-3-21 22:31 | 显示全部楼层
学习 谢谢
回复

使用道具 举报

ID:253037 发表于 2018-4-15 12:11 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:319872 发表于 2018-5-1 15:14 | 显示全部楼层
谢谢分享,初学者多指教
回复

使用道具 举报

ID:319872 发表于 2018-5-1 15:15 | 显示全部楼层
麻烦回复通过下,谢谢
回复

使用道具 举报

ID:317867 发表于 2018-5-2 20:05 | 显示全部楼层
挺不错的,就是代码的注释部分好像是有乱码,希望能在注意一下。
回复

使用道具 举报

ID:348697 发表于 2018-6-10 14:30 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:381278 发表于 2018-7-31 14:49 | 显示全部楼层
f103与f407有些什么需要注意的
回复

使用道具 举报

ID:415678 发表于 2018-10-26 10:37 | 显示全部楼层
楼上乱码那个,可能是你软件里设置的字体格式不对。相帮同学做个寻迹避障的蓝牙小车,先参考下。
回复

使用道具 举报

ID:420387 发表于 2018-11-4 10:48 | 显示全部楼层
厉害·
回复

使用道具 举报

ID:382179 发表于 2018-11-7 23:48 | 显示全部楼层
谢谢楼主,学习中ing
回复

使用道具 举报

ID:264467 发表于 2018-11-11 15:34 | 显示全部楼层
感谢您的分享,,谢谢
回复

使用道具 举报

ID:438716 发表于 2018-12-3 22:50 | 显示全部楼层
谢谢楼主分享,小白一个,学习一下
回复

使用道具 举报

ID:507145 发表于 2019-4-12 10:53 | 显示全部楼层
谢谢您的分享对我很有帮助
回复

使用道具 举报

ID:517912 发表于 2019-5-13 09:04 | 显示全部楼层
看一下感觉挺有用的
回复

使用道具 举报

ID:229044 发表于 2019-5-23 21:12 | 显示全部楼层
感激不尽!!
回复

使用道具 举报

ID:615786 发表于 2019-11-16 17:39 | 显示全部楼层
谢谢分享
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表