你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

共享一些 STM32 智能小车设计的资料

[复制链接]
feixiang20 发布时间:2017-12-25 15:03
STM32电机培训online,大佬带你玩电机) ~4 P& v& G( G0 q
  x& ~- c* X) ~  A: X$ l
, Q1 N, i$ g( H7 _- Y! G& G

' w: E3 i: H" }! k1 }9 J  {  _第一篇。基于Stm32f103红外蓝牙寻迹智能小车设计
$ Q. y0 Y8 A- o, J3 N
之前的一个小项目,基于stm32f103这款单片机,实现红外遥控,超声波避障,黑白寻迹,pwm调速,齿轮测速等功能,这里上传下之前的工程文件,附部分项目笔记,希望对需要的人有帮助,有不对的地方还请指出来,谢谢!" }2 U  f' B4 k4 |

+ {' f2 t( c- n* e下面是设计报告的内容节选(清晰图片版请下载附件)3 d0 w5 ?1 w/ G- S4 U9 h
项目设计智能小车1、项目简介
! l, L( v6 N% F& f

本次项目中我们利用SMART103平台中的硬件资源控制电机驱动、红外遥控模块从而实现对小车的前进,后退,左右转弯以及速度调整,并能够持续加减速。速度状态通过LED指示状态来识别。通过此次项目,可以掌握电机驱动模块跟红外遥控模块的使用、I/O口作为输出模式时,CPU对I/O口的基本操作和控制,系统滴答定时器的工作原理、高级定时器TIM1的PWM调制原理、以及红外遥控器的工作原理、对系统工作有个整体认识。

2、电机驱动模块' s, g: T+ `! ~; {, g1 u' q, C
接口说明:
输出口: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初始化:
$ S; T; z0 O$ ~8 k; u

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中工作模式:
( u) [# P2 f  e+ X# f* P$ r! B

    3 p' Q, R# O. t

    ! ]# C- g4 t, a) Z) h7 A; X! M/ \8 q' P' k  o' e( N0 t) U8 b  H3 ]
    1 F  s4 n! G( J" t
    • 输入浮空                                                                      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,
      ) s" {( Q. Q' C, X, P

STM32的GPIO端口位配置表如下图所示:

STM32的输出模式配置如下表所示:

下面编写电机驱动模块IO初始化函数:

  m* ^" I: F$ q+ g& @% q8 ^

, e1 m3 Y' L0 h1 |7 o; |2 _2 E
; H; e$ T  e9 {( a' N7 d! p6 y( X, o2 m1 `. ?! n. X
) I! C) i( m% F4 T8 Q8 d  E8 K

. c; O. {2 S. t& z7 R

9 ]9 x( C2 S) R7 v" Q
Init_PWM_GPIO初始化% b/ i5 j- H  G: o" i6 J

脉冲宽度调制(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 输出的
2 L3 J5 }( O6 E3 L  ?! I5 v# A7 C# l频率,这就是 PWM 输出的原理。

9 K2 H2 z$ h" s( Q5 a, @* c

STM3内部PWM波产生原理:


9 P7 Y1 I# n" T# b7 l  j- w) S" w0 j

PWM产生的流程:

  • 使能定时器TIM1(高级定时器1)和相关IO口时钟。使能定时器1时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
    : T7 Q) ]' G) e2 A

使能GPIOF时钟:RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  • 初始化IO口为复用功能输出。函数:GPIO_Init();4 ~  m; O) a5 o3 Z5 o

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP; //复用功GPIOA8,GPIO9复用映射到定时器TIM1            

  • 初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
  • 初始化输出比较参数:TIM_OC1Init();TIM_OC2Init();+ k8 [& L. N1 A4 S& t0 E
  • 使能预装载寄存器:TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
    5 p: \! H& ^3 U7 n

                            使能预装载寄存器:TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);

  • 使能自动重装载的预装载寄存器允许位TIM_ARRPreloadConfig(TIM1,ENABLE);
  • 使能定时器,TIM_Cmd(TIM1,ENABLE);
  • 不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare1();; ]% v7 f" O( P0 Z( |! Y* w


/ N; }: @% g2 a+ n: m7 v1 u4 S

3、红外遥控模块7 p: d% ?5 w  |: R2 g( T
) D5 n' A% @' Q! S9 v7 X, |

一个通用的红外遥控系统由发射和接收两大部分组成,如图

编码格式:

目前广泛使用较普遍的两种:一种是NEC Protocol 的PWM( 脉冲宽度调制) 标准;另一种是Philips RC-5 Protocol 的PPM( 脉冲位置调制) 标准。

NEC 标准(代表芯片WD6122):遥控载波的频率为38kHz( 占空比为1:3) ;当某个按键按下时,系统首先发射一个完整的全码,然后经延时再发射一系列简码,直到按键松开即停止发射。NTC编码,引导码由一个9ms的载波波形和4.5ms的关断时间构成,它作为随后发射的码的引导,这样当接收系统是微处理器构成的时候,能更有效地处理码的接收与检测及其它各项控制之间的时序关系。编码采用脉冲位置调制方式(PPM)

红外NEC协议编码
2 s3 H: \' b8 s

利用脉冲之间的时间间隔来区分“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)组成。

编码构成:


, C0 d* K" h; @. {. a% F
7 A) R& S$ D. M8 g3 ~2 tInit_TELECONTRAL_IO初始化

0 h3 s# g  T, Q; j9 T
红外遥控初始化流程:

0 ~! v4 E5 K% A6 d+ A% ]2 g1 n
  • 初始化 GPIO_Pin_5并打开IO时钟使能,打开复用时钟,模式上 拉输入,速度50MHZ。: y( x7 u4 L+ r9 o7 V+ P6 w: `

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_AFIO,ENABLE);

  • 将GPIO_Pin_5的外部中断挂载到外部中断线上。" T+ p" w# F2 V: \" s4 L7 I* r3 N- ?

GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource5);

  • 初始化外部中断EXTI_Init(&EXTI_InitStruct);
  • 设置优先级分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  • 设置抢占优先级,响应优先级,              NVIC_Init(&NVIC_InitStruct);
  • 在中断服务函数中判断红外按键的状态;
  • 通过命令解析函数获取当前按键的指令状态int Remote_Process(void);
    8 p. n/ p3 |' Y  J0 P% u

! m, M- C. }% v0 _
5 V* \% u. E* E1 I0 @2 G

/ m3 n# @8 K6 [  r1 i) w
& L# `% y; `, r( n中断优先级分组
% x: s! e/ y6 `1 }4 ^  w. Q

" U- F8 n( a9 d, a7 L# k7 S8 Y4 N) {# e8 r! T' J$ ]
3 ~2 h0 d* n. P! f% Q
Control_Init9 C5 k7 ]2 y3 k1 H
红外遥控按键值获取:

4 r8 J% O0 a2 G8 r8 G0 n; [+ Y

通过获取到的按键值,编写小车控制的程序,并设置模式标志位,切换模式完成小车的前进、后退、左转、右转、停止、加减速等功能。同时将当前获取到的速度值跟小车的模式状态显示到LCD1602上面。

设置按键模式 :判断当前按键5是否被按下,在模式一与模式二之间进行切换。
& W5 U0 t* G3 O" `) c$ N# o
编写两种模式下的控制函数:
( b3 i8 D) U2 K4 p% S8 r$ C1 E2 R
单片机源程序如下(主程序):
5 v# ?9 R% m2 r; A% m/ t
8 J/ w' o! h7 i( H% S
  • #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();
  •         }
  • }

  •   J0 C7 R& R! A3 d

$ P. q/ x8 C) W/ @[color=rgb(51, 102, 153) !important]复制代码

# ^% A$ |5 r& x* Q
* T* q/ l* A5 w& t: K: j( B8 {
6 e1 W5 J" R( x: D. r所有资料51hei提供下载(内含完整源码与word格式清晰版的设计论文):2 K9 w, _( t+ D% e2 _( `0 I8 ^) L% r
出处---http://www.51hei.com/bbs/dpj-101997-1.html
9 H, {& h7 X+ o
' L9 \! U7 [5 Y( v) K' \9 q* r=======================
( E1 ?6 n" P. F/ D* b) Z% d: Y( v+ ], b, [) L& x0 i
第2篇。STM32智能小车 资料下载5 b  D! W6 i9 b/ U( b2 V& D
出处---http://www.51hei.com/bbs/dpj-88766-1.html
& b9 J" r2 i2 e# ^0 z+ m9 ]& k$ u5 u; ^' N4 }
=======================! ?; U& K4 \% [9 ^# @. X8 U
第3篇。STM32智能小车硬件结构与程序资料下载 带蓝牙,避障,跟踪等功能' `) o+ G% t6 X4 {
一款stm32单片机主控的智能小车,具有蓝牙和红外遥控,黑线循迹,自动避障,红外跟踪以及超声波测距等功能,是一款很典型功能非常全面的的智能小车。下面是他的硬件结构:: I$ Q! L5 H) a1 F. [# G# y& C8 O

; F+ P" f* g! b% i7 m小车外形:" Z4 T, f' B& o) J  R
) n+ D4 Z7 T) N7 s, S7 q1 d5 u
* F- k* I) q% \

4 a$ u3 Y! w' E智能小车各个部分的原理图:
5 m6 o; _5 F- Z8 @: T6 F
4 \7 ~2 ~' W  T2 Y$ f( E* {0 I& C. ~& `* X& F8 U5 i
) e8 ?. Y' v& h6 S; I4 Y

6 w. c8 S5 [5 v  z9 Y- j: v; X" K
手机蓝牙连线智能小车教程

" H4 ], ~9 z! r# V5 e
  • 首先烧录“小车蓝牙遥控实验”或“小车红外+蓝牙遥控实验”的程序到51核心板上,注意烧录时需要先断开蓝牙串口
  • 使用小车电池供电,打开开关,蓝牙模块会有蓝光闪烁
  • 打开手机蓝牙功能,可以搜索到以SPP开头的设备7 r2 z* [/ m5 n

' u4 D: r; ?: `  k/ Z3 X4 |8 h
  • 选择SPP开头的设备,输入密码,默认是1234
    % c# s+ \8 F: i( z9 o5 n" P5 F8 f
  • 确定之后即可连接成功  y4 {* s4 O4 t2 ]7 W6 ^: m- b* `
  • 打开手机app软件
    1 |; _  u0 f! {% k! j
  • 点击扫描查找可用的蓝牙设备
    5 f) e1 h( ]3 ~2 N3 u

3 p& o8 A* l5 Y, _
  • 手机会把可用的蓝牙设备列出来,注意这里可能扫描不到,需要多试几次
    ( r- z8 v; I6 Q* `
  • 选择扫描到的设备就进入开始界面
    6 H* ]8 S; k3 p  E. O, v1 S+ O
  • 点击模式可选择操作模式,提供有键盘模式和重力感应模式,默认为键盘模式
    + R* [- Z& `9 D: p4 M& A  a2 M
11、模式选择好之后进入操控主画面,目前支持前进、后退、左转、右转指令
源程序与其他资料下载:
% z$ m" L/ N0 K& @) [# O' Y' @http://www.51hei.com/bbs/dpj-79827-1.html. n% t+ C) \6 h4 ~
STM32智能小车源码程序:
+ _8 Y, e3 E- f8 v: {http://www.51hei.com/bbs/dpj-91757-1.html8 I, y  l6 G* c: `

/ R; F, X  z& Y1 d' ~
收藏 2 评论3 发布时间:2017-12-25 15:03

举报

3个回答
feixiang20 回答时间:2017-12-25 15:12:50
本帖最后由 feixiang20 于 2017-12-25 15:14 编辑
; \) j- K# b. d8 t5 ~1 S( t/ \6 P& U: y/ i) W
(出处网上)第4篇。STM32智能小车之路
. ]8 E  l$ D( T2 N* g8 G1 F& |3 o1 l: p2 z% p/ o& \& Z
最近学习了stm32,带着兴趣想做一个智能小车。不得不承认自己还是一个实实在在的菜鸟,好多知识到了用处都不会了,看了半天,才看懂。在网上看了下,全是关于51的,stm32的很少,而且也是很详细,看了还是不懂,自己既然做完了,拿出来和大家分享下,互相学习,希望大家提出点意见。
首先是选择车模,本来打算是选择四驱的,最后还是选择了2驱的,前轮用舵机实现,这样的话控制起来很灵活,也很好控制,具体舵机网上很多的,可以选个质量好点的,毕竟一分钱一分货,大家懂的。
      先晒下我的小车图片,虽然很简陋……

6 S3 K1 b, _& l2 |6 b% J; c
但是毕竟是自己做出来的,而且也不赖……
由于小车涉及到的知识多,我打算分开来介绍,主要为一下几个方面:
2、调节电机的速度,及控制小车的快慢;
3、舵机方向的调试;
4、壁障功能的实现,躲避障碍物;
6、红外控制,控制小车自行运动;
7、手机通过蓝牙控制小车;
8、上位机控制小车,基于Qt的;
9、整个小车功能整合讲解。
10、让小车变得智能化一些。在stm32中移植一个小型的系统---ucosii
* u' `; l' ?; e, S
feixiang20 回答时间:2017-12-25 15:16:08
第5篇。。基于STM32F401的无线遥控智能小车$ O0 f. B, F* s! D) h" ~" ^8 W. @
: B- ^/ s+ F* H
智能遥控小车原理介绍:
  ^1 ?) P' P' L  K9 K        本系统采用STM32F401作为手柄的主控芯片,STM32F103作为小车的主控芯片。小车采用L298N驱动电机, FUBATA-S3003型舵机转向,并搭载DHT11数字温湿度传感器采集温度和湿度数据,再通过NRF24L01无线通信模块把温度和湿度数据发送给手柄,手柄接收到数据后在mini12864液晶上显示出来温度和湿度。手柄采用按键和重力感应两种控制方式来控制小车的运动可以任意切换以达到不同类型用户的需求和服务。
9 }: [2 u0 G2 n3 C8 j0 _* l6 m        本系统软件设计分为两个部分:手柄部分、小车部分。手柄部分使用STM32F401作为平台,使用无线模块NRF24L01作为通讯模块向小车发送动作指令。8 k3 K3 x6 Z' N, g2 d7 [+ w! z. j  q
视频演示:+ P5 |9 y  ]' E4 M
智能遥控小车硬件模块组成:
. x8 h* U  t. k4 j' q0 C 1.手柄部分) {6 Q$ K3 H2 h8 `2 X) a+ Z
        该设计中,手柄为一块将评估板、液晶显示器、MPU6050模块、NRF24L01无线通信模块和6个按键连接在一起的万能洞洞板。6 {: n8 c0 [7 ~3 k# l
小车部分(如截图)。
. T+ j4 ~( q2 {6 A8 E* q& ?        该设计中,小车是有一块STM32最小系统板、L298N电机驱动、DHT11数字温湿度传感器、NRF24L01无线通信模块、HC-SR04超声波测距模块、FUBATA-S3003型舵机和两个减速电机组成(如截图)。
3 u  N  |  f/ F) q' I; ^手柄部分5 @7 l' Z$ U7 B' N# w
小车部分
: I0 P0 X7 o  ^* I8 t附件内容:
3 h- b. q, A& v4 Z2 N9 k, E2 q1.智能小车主控板电路原理图PDF档
  t9 s: l# J' ]4 A. l% B% X2.手柄评估板原理图
& q5 j/ V5 G5 G% N* t" M3.小车端源代码(有详细的中文注释): f- {6 J+ H/ c$ @- k
4.手柄端源代码(有详细的中文注释)
/ m2 E# a. v* A% ~. @' G& b5.智能小车论文、PPT讲解
0 t  f, @/ ?8 e6.相关的传感器模块资料等  H, u: c3 O. A; P
/ {# Z7 m: c3 F0 Q
详细请看---http://www.cirmall.com/circuit/1 ... D%E5%B0%8F%E8%BD%A6(%E5%8E%9F%E5%88%9B)#/details( ?8 i4 J; K: T8 k) w6 ~4 G  o
6 q8 l* f% W+ `+ ?$ W: f3 W" j* p1 _
$ K+ r2 f, h/ N0 \
5 X. s+ F# E: D- l4 A8 r5 x: E
, I0 e: x" J1 M! U

' m" \8 U5 D4 J# a4 l6 W1 F0 A- K
feixiang20 回答时间:2017-12-25 15:18:53
第6篇。STM32智能小车下载程序方法
! y. n1 {: ~, p) ~http://jingyan.baidu.com/article ... 54.html?allowHTTP=1
1 |6 |+ a' x9 n2 S! r# Q简单介绍:( d: C: M0 W" D5 _5 y0 e7 b
智能小车主要有以下功能:超声波避障模式、红外避障模式、寻迹模式、跟随模式、手势控制模式、体感模式。对于想学习智能小车软件编程的同学,首先要知道怎么下载调试好的程序。下面是智能小车下载程序的方法。- V; {4 s3 P* D7 M
先把小车和串口模块连接好在插上电脑,模块的VCC RXD TXD GND 分别于USB串口模块的3V  TX RX GND对应相接,注意TX和RX需要交叉,即TXD接RX,RXD接TX(连接线已经组合好,正确插上即可)。
6 J9 B+ M7 e& ]1 B1 d安装驱动:USB串口模块通常需要安装驱动程序CP210X,安装成功以后,将会再电脑的设备管理器里面看到对应的COM号。
1 ]7 ]0 f2 O$ d8 n( e+ z" a。。。$ N* m! }' a: K4 R* S) `6 ?
【详细看上面连接】
. M) Y2 p/ p  Y& F* y) |
+ H+ P* o: {. a' a  `( i+ h7 x3 Q8 U( _% b, ]  X0 Q

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版