找回密码
 注册
关于网站域名变更的通知
查看: 178|回复: 0
打印 上一主题 下一主题

【飞控开发基础教程1】疯壳·开源编队无人机-GPIO

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2022-7-6 12:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
COCOFLY教程
——疯壳·无人机系列
GPIO(LED 航情灯、信号灯控制)

" j7 X6 v' u* |6 N' R& c2 _/ f# m" f8 |
) U0 Z7 [1 K6 W4 _

1 ~- g7 t! p, V2 q# ]     6 S: r* q/ @0 }8 }0 A$ w6 M1 E
    图1
! k- R, F% e  I% ?& E' o% [  T9 \' q* G' ^! J  M% z! K) [
    一、LED
: I6 _( E/ q. V( {( P# d( Q    1.1LED 简介- ?" Z# l" K8 R6 {  k) R
    LED(Light Emitting Diode)即为发光二极管的缩写。LED 是一种在生活中非常常见的照明发光器件。LED 的在我们生活中形态种类非常的多,如下图所示。- Z& P) Y/ g0 h2 C: M3 ~. ]

5 M7 P3 r7 G" d' C$ V! a    
4 h: s) M. n2 X) j2 i; g    图2                                                                                            图3% s# Y' T" `1 _& d% a4 O# P4 }
    尽管 LED 在我们生活中形态非常地多,但这所有的 LED 在电路里均使用如下图所示的符号来表示。
1 o% G/ u( ?1 r" M; ?7 X4 s- L
: P$ b$ d+ n. Y1 A1 K6 v    
# h7 |, [, L! n" g    图4
7 C0 o& _$ d/ x3 {5 n" `9 m3 ^3 `/ c. Z
    1.2LED 发光原理9 K9 j' I3 j* q. _! `
    LED 最重要的一个发光结构就是灯内如绿豆大小般的灯珠。虽然它的体积很小,但它却内有乾坤,如下图所示为 LED 内部构造。/ s0 [1 u( |( D' b/ ~1 ~

/ X! h& P1 `; X' r    9 K; n: E* K1 Y$ s7 Y
    图5
  Z+ |, H5 B! b2 v# Y8 m% S% d& w& Y7 r0 Q5 Q
    这个结构极其复杂,一共分为好几层:最上层叫做 P 型半导体层、中间层为发光层、最下层叫做 N 型半导体层。: c: t- ]! [% R& p4 [7 J4 x6 B
    从物理学角度来理解:当电流通过晶片时,N 型半导体内的电子与 P 型半导体内的空穴在发光层剧烈地碰撞复合产生光子,以光子的形式发出能量(即大家看见的光)。
2 O7 a! M( T( g! L8 e& O+ ^    二、GPIO: a/ g; X- w  _2 \9 t
    2.1GPIO 简介
3 h) t/ @0 e5 x$ m: c+ S    GPIO(General-purpose input/output),通用的输入输出的简称,单片机的引脚可以供使用者自由使用,可以配置为输出,也可以配置为输入。其中输出又可以是输出“高电平”或者“低电平”。在电子电路中“高电平”是电压高的状态, 用逻辑来表示即为 1,“低电平”是电压低的状态,用逻辑来表示即为 0。
( C" i1 _- m( A$ x    STM32F103 系列是意法半导体基于 ARM Cortex M3 内核的 32 位单片机, 飞控上用的主核心是 48 脚的 STM32F103CBT6,其引脚如下图所示。
; L  B2 d  A6 T. n
  B, R, t2 l" P2 H4 ]
- @& x# M5 Y( G    
/ B0 V4 ?- D- z0 e" j' i0 W    图6
. T  s! |9 M8 ?1 Z; V  D$ b8 C2 M, O9 U0 u9 p$ f! _: I# }% E  `' x2 I
    STM32F103CBT6 的 GPIO 的功能较多,有 A、B、C、D 等四组 GPIO,每组每个 GPIO 口都可以作为输出输出口使用之外, 还能作为复用引脚使用, 比如串口、I2C、SPI 等特殊接口的引脚。 但是需要注意的是每个引脚的复用功能是有限制的, 所以硬件连接时需要注意每个引脚有哪些复用功能, 这个可以在STM32F103 的数据手册中查看。GPIO 口一共有 8 种模式,分别为:浮空输入, 上拉输入,下拉输入,模拟输入,开漏输出,推挽输出,推挽式复用功能,开漏式复用功能,如下表所示。
' h* S/ P! m$ V3 {7 }  E3 _    STM32F103GPIO 工作模式; w6 J* G6 x2 p. b

) y, _/ w7 Z# k5 I; A     ( i% F1 J: h- S1 B
    图7
6 F4 z% Z/ e4 T$ ^  t1 W    这 8 种功能我们就不一一介绍了, 有兴趣可以上网搜索了解一下,这里主要讲解一下开漏输出和推挽输出的区别。
6 D1 S1 _( p0 t: M    (1)开漏输出:+ n6 ?: ^1 c% c% E7 B+ \
    输出端相当于三极管的集电极. 需要上拉电阻才能得到高电平, 利用外部上拉电阻的驱动能力,减少 IC 内部的驱动,驱动能力强,适合于做电流型的驱动, 可达到 20mA。3 w- Q, _( n, N
    (2)推挽输出:  N' `/ k5 H3 s5 a+ R
    可以输出高,低电平,连接数字器件,是由两个参数相同的三极管或 MOSFET 以推挽方式连接,各负责正负半周的波形放大任务。电路工作时,两只对称的功率开关管每次只有一个导通,所以导通损耗小、效率高,既提高电路的负载能力, 又提高开关速度。6 X" i) u* m& V$ d4 |! [3 k* l. S
    总结一下:推挽输出可以输出强高低电平,连接数字器件;而开漏输出只可以输出低电平,高电平得靠外部电阻拉高。输出端相当于三极管的集电极,要得到高电平状态需要上拉电阻才行,适合于做电流型的驱动,其吸收电流的能力相对强(一般 20ma 以内)。$ h5 {" Z$ }6 q* v$ Q) A+ n
    2.2GPIO 相关寄存器: }; S) {8 R7 k7 q2 C; H$ k
    STM32F103 的每个 GPIO 端口有:两个 32 位配置寄存器(GPIOx_CRL 和GPIOx_CRH)、两个 32 位数据寄存器(GPIOx_IDR 和 GPIOx_ODR)、一个 32 位置位/复位寄存器(GPIOx_BSRR)、一个 16 位复位寄存器(GPIOx_BRR)、一个 32 位锁定寄存器(GPIOx_LCKR)。: a$ [2 T* ~" K
    (1)GPIOx_CRL 寄存器(x=A~G)
- |7 b$ E% \" ], U" o2 Z4 A% a  b+ P" j5 K- W% r
    : n# _& N; @/ x6 H
    图8+ I$ B. K0 T1 p1 v/ ?( R! v
    该寄存器用于配置 IO0~7 的输入输出模式以及速率设置。$ _' E0 J" X. R/ x- |
    (2)GPIOx_CRH 寄存器(x=A~G)
! g: h& ?5 D5 e0 ^( n: L2 ~7 O
$ l5 @% S$ P$ x) b2 k. X- n; Y, H$ m, U0 c1 O% M3 F  X# U) n( [# T
4 T1 u- A/ f% V$ O- V; x
    图9
0 r& U5 f" F" E; ]4 j( b    该寄存器用于配置 IO8~15 的输入输出模式以及速率设置。
9 I% }2 F, O. ^# P    (3)GPIOx_IDR 寄存器(x=A~G)4 u" Z) ]9 L  h* A- Y( g, J
; z) M2 m! J2 x3 O6 N3 C
    4 e+ u7 {" |3 Z2 X. y* i5 D
    图10
& b2 N3 }0 q$ l, V) A    IDR 是 GPIO 的输入数据寄存器。通过 IDR 寄存器可以读出 IO 的状态。需要注意的是 IDR 寄存器只能以字(16 位)的形式读出。
8 ~) [, M5 v$ k* B+ z/ W& e: a    (4)GPIOx_ODR 寄存器(x=A~G)+ J+ @* v' l( t" p

# @* e. L) B3 Y+ Y/ i) ]    
9 u5 L: Y) S) J4 G  m    图116 L/ n4 t9 g3 r( Y" B

2 B# _# q7 @& j7 Z    ODR 是 GPIO 的输出数据寄存器。通过 ODR 寄存器可以输出高低电平。( U1 l9 |8 z6 u7 Z4 n" b
    (5)GPIOx_BSRR 寄存器(x=A~G)
& ^' Y) I; R+ ?/ V$ s4 [  M/ _5 \* X# C: x
    $ A$ V: _- J1 l- N  R
    图12
2 [+ }' ?2 \! V/ u: ~3 W1 P. k- a) I" q
    BSRR 是GPIO 的端口位设置/清除寄存器。BSRR 寄存器的高 16 位是清除IO 位,低 16 位是置位 IO 位。需要注意的是 BSRR 只有在写入 1 的时候,相应的功能才有作用,写入 0 是无效的。1 i: t; h9 t) _6 M7 T- j3 D
    (6)GPIOx_BRR 寄存器(x=A~G)
% c! ]. z3 r4 ?$ v! U' Q9 B3 `; _$ b0 ^
   
* k% h. N8 q4 n4 R$ u1 ^8 ]    图136 N, q5 v' m/ Q- ]' [  c
    BRR 是 GPIO 的端口位清除寄存器。BRR 基础只有在写入 1 的时候,相应的功能才有作用,写入 0 无效。  V+ I- m; g( t9 l, ^- Y
    (7)GPIOx_LCKR 寄存器(x=A~G)' [; L, ?# O" {3 d
; c/ `2 v. O! ^/ ]0 O0 I
    1 Y1 ?6 E1 t2 m4 {1 m
    图14
/ V- d, h0 F& r# C7 u    LCKR 是GPIO 的端口配置锁定寄存器。LCKR 寄存器用来锁定IO 口的配置, 设置后,除了复位后不能再配置 IO 的状态。
% I" u3 H" S' l" r. H
: l1 @' ~; @* E1 e# u; b' J    2.3GPIO 实验* s: z* w5 h; X! Y; Z
    本节实验的内容是周期性点亮无人机的航情灯以及信号灯,其中航情灯在四个螺旋桨底下,而信号灯则在开关两侧。
! L: g* c$ a3 [$ ?1 L    查看原理图可以得知无人机的航情灯同一接在 NPN 三极管 Q1 上,而三极管的基极又接在了单片机的 PA8 上;两个信号灯分别接在了 PC13 和 PC14 上。  ?/ }( _* `3 k5 h; f1 @6 z5 }3 h

5 T/ |( u5 C; ^' f1 X# z' w7 D& h3 H+ x. M9 N
+ z$ I; u: I6 d6 g8 n     - ~( G3 ~/ W  s- g. r2 E1 v
    图15                                                                                            图16# Z! H5 L8 y5 h5 ?# F8 c* J6 n
  _$ Y& K& u0 V

" v) q& p  s; P9 @    ( @2 [0 C- G2 }. g7 d! F
    图17  z- v! O' L# a; V/ M7 q
, E6 {- i) m' e
    编写代码的思路如下表所示% }1 [3 u8 o; B8 A
/ V0 L1 n- |* S) _
    4 L9 n$ @( h7 _! h1 j" ~
    图18
! h* G) W+ O  d: a# I    按照代码思路,编写代码(通过调用官方库) 如下图所示:
( }- ~0 w- G; }0 k# v% b  z2 G6 v+ j, y! ]3 X4 c% `6 _  E8 a; B
    & i3 w+ n& t: S5 G% n
    图195 l# i6 b4 P0 S1 }
6 B* a  H& ?9 \* S% o. K

. O" W4 H4 A0 Y    
# R7 l+ x+ j+ `7 a8 h9 ^    图202 p  P$ b2 I  a2 b6 u
    完成配置后只需要周期点亮以及关闭 LED 即可。
2 {8 h5 r: |# ?8 ?$ ]  o& Y8 K2 |7 Z( ~1 f' U5 n7 {
   , Z) {# P) C( a  k9 |$ \
    图21" Y: p" D/ t" }& ~7 @- D9 h
    其中延时如下图所示。8 B% R# l6 a2 k% Z9 a

/ G: t- Z3 y0 P" \- ~+ w6 _  e& u    
+ L  D1 C" V/ r, H    图22( T% d( ^! E2 G% [
    保存、编译、下载,如下图所示,1 为保存,2 为编译,3 为下载。9 [2 p( ]' Z# ?! j# ?
- i' z% K/ |* _" }

8 f1 Y) o( R1 m# J( }4 ?6 {: z4 K    
  v( z0 k7 R4 W; |, E8 \$ {. W) m    图234 P! o+ c; H! T' _/ a3 Y5 S- Q
    下载代码到飞控上,就可以看到飞控的 LED 指示灯以及四个螺旋桨下面的航情灯周期闪烁的现象了,如下图所示。) W: i# W. H: B9 s4 \
8 t, U, x/ C  s
$ b0 N4 F0 }+ c, w. I+ w
   
3 N" D* z6 U/ u0 M; L/ e( }    图24: Y$ m9 l4 ~/ y7 a
- o( z/ y! s$ A! j7 n. c$ l' w
/ ]+ O- R6 h; u2 E% A9 t
配套资料:http://www.fengke.club
# L+ [) |) M8 x& j套件地址:http://shop115904315.taobao.com & [. Z8 A' L% Z+ y: I
文件下载请点击: 【1】GPIO(LED航情灯、信号灯控制).pdf (1.02 MB, 下载次数: 0)
( z) a. C2 M5 n* P5 {& m- X. K' S: B; p$ C2 X
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-25 21:10 , Processed in 0.125000 second(s), 27 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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