|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机系列 GPIO(LED 航情灯、信号灯控制) ( r0 {" v. n9 V% W8 q' D+ s
$ p/ {9 c. z& \! C) T
& N/ j" ]" N0 t4 M) n% n
8 J( S; S% h3 A8 h3 \; I
- ]1 U# T$ S. U0 f* f4 W B; X 图1
9 C2 s, b- D+ b0 S0 F: G0 w1 h: p) R1 |+ d& ? U% Y% p! ?& m
一、LED+ n* Z7 Z( q! g* V1 z( l
1.1LED 简介
: g8 @5 {5 R9 A& h5 k: i LED(Light Emitting Diode)即为发光二极管的缩写。LED 是一种在生活中非常常见的照明发光器件。LED 的在我们生活中形态种类非常的多,如下图所示。
" o. w2 z9 x6 o9 V7 R8 g
- k$ w4 H `" n) R
6 E9 s D/ V& ?, m4 v# A! n8 x
图2 图3
9 W! u n* X% Q: n& D" I 尽管 LED 在我们生活中形态非常地多,但这所有的 LED 在电路里均使用如下图所示的符号来表示。+ g6 }8 `! x# t, p/ p
! X$ P$ B( ^/ C+ q, r# ]& |
( j: e- P( Y1 @) q8 m 图4
3 G- R6 E# E! X3 W/ d" ^
4 Z* L5 e1 I7 F0 z2 Q# Z' X n 1.2LED 发光原理- x- K. {) d0 ?( u- L0 t
LED 最重要的一个发光结构就是灯内如绿豆大小般的灯珠。虽然它的体积很小,但它却内有乾坤,如下图所示为 LED 内部构造。
- ^# \) [, R2 \2 S7 D
- } l) r8 S0 O$ m+ f/ b
) R% B! A W, n/ d n$ ]1 j
图5; N& e% _! }3 }+ H2 G4 p) X0 O; Y
5 k: Q7 L! f7 v. n7 q; v& v7 P. c$ N
这个结构极其复杂,一共分为好几层:最上层叫做 P 型半导体层、中间层为发光层、最下层叫做 N 型半导体层。( d& e7 o, G. a+ Q7 o6 a, D6 Y
从物理学角度来理解:当电流通过晶片时,N 型半导体内的电子与 P 型半导体内的空穴在发光层剧烈地碰撞复合产生光子,以光子的形式发出能量(即大家看见的光)。
6 |5 T: W% S: Q 二、GPIO
7 @) ]3 d$ Y0 X 2.1GPIO 简介
0 U4 _3 G) d! }" X GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。9 m" E7 s' w% v$ U6 I, K, @- o
STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 飞控上用的主核心是 48 脚的 STM32F103CBT6,其引脚如下图所示。
' `4 ?* N9 s5 G/ [) a
2 l- V% L' m K3 F$ [8 _
, I1 d7 F) J* ]( c: E$ G( d
2 k+ v3 q4 x$ S# P4 B% o
图6* V1 Y0 t% ?) n" z# v- `5 u
; M5 D! D3 P1 s STM32F103CBT6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入,开漏输出,推挽输出,推挽式复用功能,开漏式复用功能,如下表所示。
! Z1 e! [0 |7 m/ v$ B. b STM32F103GPIO 工作模式
: I) {3 ^7 x% n7 C/ ~8 s" c' q* ?; t7 i8 l: P2 c1 c5 C* b
) h) i- r ~5 | g$ K; ^; ?
图7# r( E# B, @8 w7 l
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。% V4 c3 _9 w2 m5 o, r
(1)开漏输出:6 X6 Q; H3 f9 V, }5 q5 u
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。
3 l+ o. x; w. C- p9 T (2)推挽输出:
$ c/ w$ m. d# [; B 可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或 MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。# j8 C: E( Z4 k; W* p+ Y7 B7 `
总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。
' V' ^8 i4 e9 N9 M, |" ? n 2.2GPIO 相关寄存器
! r2 N5 W+ s/ C& P& s STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。7 v) i& ]! X* \3 g4 u
(1)GPIOx_CRL 寄存器(x=A~G)4 h/ p" {/ m; Q
o% H2 {2 O! P, R/ X* g0 J. x
* w, v3 C; |' j, f5 }$ @ 图8
9 J4 `- ^. c+ |/ | 该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。
( A& x9 N% P& J9 Z3 o( N (2)GPIOx_CRH 寄存器(x=A~G)
2 o! ~9 d1 g6 }& m; ~
& v2 T% V9 d& F. Z j a) W$ D
7 p! [1 f, Q( H0 B; K
, \! R, Z" g; V2 o# F
图9
7 k+ ]) C K. E% ^5 Y 该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
% t% B, l# d* h/ H$ B: b# C- | ] (3)GPIOx_IDR 寄存器(x=A~G)
! N9 @! T, }* Y3 J6 w8 |( a: s
$ w( |* f O! p1 k8 s' E4 w/ u
* x: K4 V4 \4 g1 F0 A 图10
$ {( q8 j$ C1 X! q/ V IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。; u0 a/ i( \9 y2 L c
(4)GPIOx_ODR 寄存器(x=A~G)) M v5 G" q! w
# x# J6 }* D, f% }
0 E! k. _" X3 E1 u
图11
/ c% C; y- w# k" z- _( o2 S) h/ k+ H4 l" a2 K
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。
) X, u* y# I% t1 A2 r1 ~) k (5)GPIOx_BSRR 寄存器(x=A~G)
# M! U0 S$ g1 h" m" r; j g5 n' r. p& P `8 v! \, `4 r( D4 X9 r- s
1 e* S X: a4 Z9 M8 F5 g% p
图12: I; O' S# T6 m
1 n: \- c5 O ^- X& {; A* }/ O5 U BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。9 I+ h2 P- F1 R' s( C$ g; _6 [
(6)GPIOx_BRR 寄存器(x=A~G)
. d* |2 B1 y, R" f J3 E# i8 ~& S
6 j4 C% U( ?+ K( {( K
图13
: a$ Q( a, A4 `$ Q/ b/ L4 d BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。
8 V: p/ e$ K0 S' X (7)GPIOx_LCKR 寄存器(x=A~G)
, k2 a6 ~1 G+ N( C+ V* h
; C' A: Q+ K( q/ }2 o& b
5 y, C# T" X: l" ?: S# ]
图144 l( K! c3 y' A' b
LCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。" H/ ^& K9 L2 O, R+ |. f1 {. m
& P1 p N! r& d7 M! u1 U7 D- i
2.3GPIO 实验
+ Q5 v: b/ E7 ` B, { 本节实验的内容是周期性点亮无人机的航情灯以及信号灯,其中航情灯在四个螺旋桨底下,而信号灯则在开关两侧。
& y% J7 ^6 C$ ^, @+ j 查看原理图可以得知无人机的航情灯同一接在 NPN 三极管 Q1 上,而三极管的基极又接在了单片机的 PA8 上;两个信号灯分别接在了 PC13 和 PC14 上。
$ t' z/ E( c6 A; c8 I5 Z- D' w
! a1 I' s/ `5 G0 ^4 G& I. N. w+ m8 ^* z9 P
4 h; A+ J7 U( h I- t 图15 图16
7 v3 f( C) z: c! P0 f
4 g+ n. t+ [+ H. G- W
% P& K$ K& }: |3 ?) T3 t: I
; K s$ R0 \' ^! H- G9 o3 u
图17 q! P" _7 b b$ S! s
) ~' j5 H g& Z5 {: b. o" c0 W 编写代码的思路如下表所示0 t8 b! k( c+ J8 x+ K4 b
8 Z$ W2 O- }- h
6 A5 q) c' f( j: ^4 R) I
图18
8 B) T/ [" `# M) ]2 f0 x+ f( [2 f 按照代码思路,编写代码(通过调用官方库) 如下图所示: P2 M. q& F" |* Z$ ^6 O& N
: ?$ u) `7 @. R: |* ]5 N" \( d Z
( E! ~8 O. ^$ e. w. i s$ m) G+ W
图193 A- V1 J# V0 t- X! L
$ j6 w, m1 `4 x3 y$ o
; h9 i5 H8 i Q" ]3 {/ A
- M+ V3 F1 K( e, N c
图20
5 ^9 b6 f$ Z9 J/ N 完成配置后只需要周期点亮以及关闭 LED 即可。
& `& D9 a2 A- b" M- e" y6 W# y# S7 U1 F _& T/ U( x; i- U4 Q
# K7 T7 U/ n- u# t: @* l% H8 W5 g 图210 X+ U% d' o; P+ n' w! R" e* g6 _1 e; W
其中延时如下图所示。
% c3 t9 N: T% s6 U7 H3 |2 c" ~( H. h3 S3 g7 w7 h) L
- [# G: r2 }& P ?3 A 图22
) l6 V4 h; v6 ]2 P# Z 保存、编译、下载,如下图所示,1 为保存,2 为编译,3 为下载。
8 j+ K9 L4 X0 B: M$ i! A8 B5 e* ]: w
; g7 C' @( d; Y: `# ^( V! L% G, f% N
! P6 ?8 K- c: X4 r8 e ^
0 Z6 E [( G' Z- s8 j 图237 o2 w" g1 I) l" X% ]/ m/ R
下载代码到飞控上,就可以看到飞控的 LED 指示灯以及四个螺旋桨下面的航情灯周期闪烁的现象了,如下图所示。
3 L4 n: C) K. y/ i. l9 G4 T- U
/ p N: K3 q' W7 [& F' g
, w8 b* z0 m7 t; ?3 V3 f9 o
7 o) @# g6 G( `
图24
& S4 f- u) V3 l
0 f$ A3 H% p7 a) v) H' S L" |/ p# x [9 T! b1 I
配套资料:http://www.fengke.club
! l9 ]3 z/ `! F: t& h; `$ G; x套件地址:http://shop115904315.taobao.com # |5 C4 R7 o+ b+ g* |
文件下载请点击:
【1】GPIO(LED航情灯、信号灯控制).pdf
(1.02 MB, 下载次数: 0)
* r8 z: H3 E) j- a
4 [ W1 W9 s9 |6 x2 J. L" u! c |
|