|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
COCOFLY教程 ——疯壳·无人机系列 GPIO(LED 航情灯、信号灯控制)
! j& @$ v3 r; J4 s% p- ]7 e- v1 e5 y. D
' R1 ~3 I _. H3 K4 \7 ]
8 U0 b* K) H) w/ j, j
2 T) B7 j0 p" J: d, N# P' \* R% m 图1
+ ?( Q! ~ a7 B7 [0 X$ M% q, a2 _% `0 C8 N9 i: \8 s
一、LED. U# T/ o9 j3 B1 M, j$ X6 D
1.1LED 简介
, F, P+ d/ D, u: J LED(Light Emitting Diode)即为发光二极管的缩写。LED 是一种在生活中非常常见的照明发光器件。LED 的在我们生活中形态种类非常的多,如下图所示。9 C7 a; B7 x- L3 ~0 N3 t
0 ^. f3 ?4 y }1 E3 U8 f
+ F7 H4 n/ x0 z+ d" V/ \ 图2 图38 x" h# i: @' j0 v8 s, i
尽管 LED 在我们生活中形态非常地多,但这所有的 LED 在电路里均使用如下图所示的符号来表示。$ s! ^8 R+ G: M7 M+ ]2 e6 r
! L2 C- ?3 S P1 ]( `
]& \ d& I+ U1 w7 G. j+ ]3 O
图4
7 E: l9 y$ L" |. m: e$ w/ p+ J) x D5 D4 g8 M p Y7 M3 [
1.2LED 发光原理3 e# I7 o; d% h6 c. ^6 T
LED 最重要的一个发光结构就是灯内如绿豆大小般的灯珠。虽然它的体积很小,但它却内有乾坤,如下图所示为 LED 内部构造。8 ?/ B) ?0 j. N( f
# {7 O; ]$ e! C9 e3 [
' }! J X& \# \4 h. L+ @5 @- S( N) k. z 图5
( h! c4 s f5 G3 \+ C4 B9 w/ r9 O* x- }5 Y
这个结构极其复杂,一共分为好几层:最上层叫做 P 型半导体层、中间层为发光层、最下层叫做 N 型半导体层。
. ]# H9 K$ ~$ h; L 从物理学角度来理解:当电流通过晶片时,N 型半导体内的电子与 P 型半导体内的空穴在发光层剧烈地碰撞复合产生光子,以光子的形式发出能量(即大家看见的光)。
\* y( w0 }, u/ H7 G" n6 o 二、GPIO* R9 j3 @" A$ D; w& W" a) A, a& Y( U, y3 z
2.1GPIO 简介
6 B c/ z. E' o _ GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。
7 B# b& N1 }) L STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 飞控上用的主核心是 48 脚的 STM32F103CBT6,其引脚如下图所示。
: E1 Q. t4 P4 ]/ T$ c Q0 i
8 X5 U: I; N: K" }4 u+ {
5 P5 {8 V6 I9 C0 Z" G" r; y
% X) z: ]( E& M 图6- r' c# ]: b r% P+ v' L6 b/ v
4 V. P! b. ^5 n+ q STM32F103CBT6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入,开漏输出,推挽输出,推挽式复用功能,开漏式复用功能,如下表所示。
$ p/ R: v0 a- D STM32F103GPIO 工作模式9 H* I' r4 S! g8 d6 w! s9 s. W. r
7 Z1 s8 O# @* ~* U" t
' ?" t1 \$ P" g( c
图7/ x2 B% M* f9 D3 I T4 ^
这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。 n( L6 X8 P E* ]
(1)开漏输出:* s" w5 d& m" I- B0 K# a3 U! |
输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。
* T: t% P w1 R+ [3 ? (2)推挽输出: E; x4 `' O+ i! c
可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或 MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。
) D) ^; x8 ]2 A 总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。$ o1 G+ I; u! `" e3 ~
2.2GPIO 相关寄存器
. D6 E; x2 R% L; N! U0 H6 b* D STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。; |4 I2 S4 l: c( x+ }+ I2 O+ A
(1)GPIOx_CRL 寄存器(x=A~G)" X6 m; m! E# d
1 l4 E4 W+ q5 `- K) t( K# c! f
* }) v) t2 v; X( k# m4 F& z$ a5 Y 图88 r9 y+ L/ l/ d, x9 h$ y1 i
该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。
" Q1 u+ S' |! O4 x" M* N (2)GPIOx_CRH 寄存器(x=A~G)7 x: v# _5 K* _9 j) l3 @) q8 T
7 a3 J. F3 x9 u. E, N
. \1 y. {0 z, [1 b& b7 f- V- r* |* ?, L
9 U" r' e! J, p; C& \
图9
# D& j. `' w& p( ]! i p 该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。- M; \3 q" a6 g5 n& m1 z
(3)GPIOx_IDR 寄存器(x=A~G)+ n( u% _+ k0 X0 I0 P! }
! X- S- n6 P2 O/ |) A
- K8 `% {* _' k2 R
图10
9 M% R2 y, ^8 v8 j IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
@) b' D" V! {& |, |* p' k (4)GPIOx_ODR 寄存器(x=A~G)7 X7 l* c/ o0 N2 n4 A
R2 H' b! u) e, f* g& L
' a, }& F: ^' ?6 n& K/ C+ a 图11
: k2 ^6 ?) a; Z$ b$ n1 ~# V2 R( Y! S# B# J7 b g
ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。
/ G B/ G+ h3 Y6 b; I (5)GPIOx_BSRR 寄存器(x=A~G)
+ ]6 _' v u8 F$ H. \$ w* C& |5 P) i% ^& G' t( q+ M
1 s- M' h! ~) D4 H+ a5 I1 k( ?
图12
& X5 c: W" U- l3 N9 f2 m9 G! i
0 s5 O# z) ?8 o. D BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。
( W, s- h2 g% c2 _% u/ l (6)GPIOx_BRR 寄存器(x=A~G)
% `; N h3 ^! u( R3 L
! B+ W* e6 O- W+ x) |( e8 t8 `
6 t" K' K/ ?3 j% I/ }( W
图138 n# W8 Z- s, T$ Z3 f5 t% T" n# q
BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。
D1 }7 |" r5 x. q: p (7)GPIOx_LCKR 寄存器(x=A~G)( H0 d% B0 _7 Y6 N* w
: }& q8 H; F) ~' R% t4 [
1 [6 h d, d! H9 t4 V: ~ 图14, H. T7 S8 P* {0 Z, [/ C
LCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。
" | ^, U" U9 A
7 H: D: S& V0 L 2.3GPIO 实验) q! M8 k) D) X5 m0 c
本节实验的内容是周期性点亮无人机的航情灯以及信号灯,其中航情灯在四个螺旋桨底下,而信号灯则在开关两侧。3 n& |2 y3 D, l$ A3 p
查看原理图可以得知无人机的航情灯同一接在 NPN 三极管 Q1 上,而三极管的基极又接在了单片机的 PA8 上;两个信号灯分别接在了 PC13 和 PC14 上。 P* L% q5 h0 A. V+ c
2 ^: a: l! u8 b" E0 ~1 a2 U' g( x/ }! E( c
O9 j* S- F3 a" U4 \ 图15 图16
/ F6 C( `9 g" C$ O1 h5 L8 t& D. _) N% t% e0 U* _
$ m, ~$ d- E, |! W; M: l# Q
" S/ j% x* E9 V: C# q 图17
3 c+ T2 W) H# f; c( {) T; Y3 M6 e! x
编写代码的思路如下表所示* ]$ I& s* F* i2 g# ]! }. b
+ G- g& g7 ~+ ^, ]4 }: O7 }
3 i' }) O2 Z9 ?9 [ e
图181 \. y4 k- H3 o2 Z6 J7 W
按照代码思路,编写代码(通过调用官方库) 如下图所示:
: q5 m* o7 V* f/ m/ E' [- ~
8 p( k/ F& z( H+ k2 Z/ _7 G% w) m
$ B% @# B: i) V" L+ U 图194 \5 v+ K [9 o! |
K- d' X: s O7 d5 S
% |1 [/ f; T5 S; F/ v
# D5 B: q; g) C6 B 图20+ S D$ O/ |; K: E9 e6 Z" u
完成配置后只需要周期点亮以及关闭 LED 即可。
3 P1 N7 W+ \* p& p! J( }5 [+ _
& s" W# S3 ~! O- p
/ z' M' Q) p, P( A' u1 s
图215 H3 F6 x' [. ]7 W
其中延时如下图所示。* m/ o! ? J2 f6 x
. P) C8 ~& ?! _! a* T$ \
# l. t5 ]; B, X8 K7 W. a) K# s 图22
, X( i% R1 `/ ~! l( K) Z/ N 保存、编译、下载,如下图所示,1 为保存,2 为编译,3 为下载。8 Q0 U% ?& g% j( U% i+ a6 s
! f/ o$ [; r: ~; h
. m7 b" R/ F- J( W0 G$ P8 U
" [5 |6 l. s8 |$ g% P! H& J% N9 R
图233 v$ d% y5 f9 ?2 T' z5 r1 S# E
下载代码到飞控上,就可以看到飞控的 LED 指示灯以及四个螺旋桨下面的航情灯周期闪烁的现象了,如下图所示。
9 o' F2 j& Y; @* G
, r- R3 s7 `; X5 p1 Y, l3 M6 j. _5 L2 w! y! ~, q: y, R
. p4 @2 [6 K; p1 y l4 n, O. y
图24
! r- u5 A1 O% S% j5 `
4 o* Q4 R: Z* B; T) {% Y. e, T: @3 s- b. b
配套资料:http://www.fengke.club u- R. v( x- @0 U4 K) y8 ^( X+ E
套件地址:http://shop115904315.taobao.com 5 w7 |2 t) p* J+ D, h$ s/ H( ]* b
文件下载请点击:
【1】GPIO(LED航情灯、信号灯控制).pdf
(1.02 MB, 下载次数: 0)
' J, F0 p, \: e$ U
m' l! `% }4 r, V |
|