|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 电池电量检测
2 w+ T$ \. k, z1 X8 y% `0 T9 E* V
: q7 n0 `. J- U; ~6 I4 g3 d; N( o! K' a5 w- J) z
: T+ L z/ m! ~
4 F9 @8 ^1 a. C) H7 n M1 ADC 简介- Z: Y) p1 E0 J% c
; E$ t z; ]" [; c. K4 c' F, C ADC(Analog-to-Digital Converter),模/数转换器或者模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。/ ~+ O. Z/ Z1 h( G* H, B+ m
我们 DA14580 集成一个高速超低功耗的 10 位通用模数转换器。可以工作于单端模式也可以工作于差分模式。ADC 模块有一个 1.2V 的电压校准器,作为满量程的参考电压。
' m. e' p2 R9 O4 z 该 ADC 模块是 10 位动态模数转换,转换时间为 65ns;最大的采样率为3.3MHz;超低功耗(在 100KHz 的采样速率下典型供电电流为 5uA);有单端与差分两个输入比例;有 4 个单端或者 2 个差分输入通道;电池检测功能;斩波器功能;偏移和零刻度调整;公共端模式输入电平调整。/ j) \: j! ?/ u
由于电池电压与其放电时长成负相关关系,我们就可以通过 DA14580 的 ADC测量电池电压,直接判断我们所使用的电池剩余电量大小。3 l/ d9 {/ }. B
$ T/ ~; N( n; Y2 硬件设计1 M% |% R# ^5 E
1 L }" e; q* i O: [8 a4 J
本次 DA14580 采用 P01 脚直接测量电源电压。' p X, J/ @ Q( c1 w
! ]1 L( e: [# U. |6 S% F
, l/ e# |: r; x. C图 1; Q4 t, Z' r3 F8 c; @
a" d- |7 U, B `$ B1 B7 u: D3 软件设计6 ?6 y- Q0 i' h" D
/ X* @+ H, v7 X9 n9 S0 E$ |
软件开始,第一步要进行的是系统初始化。
( [+ n. H; a4 P: Q3 Z
- M8 ~! [5 \1 |6 ^- T5 C0 E
; h. Q; d% K+ \( B4 K( j5 H9 x
8 g* @- Z; [# `' J% d
, N0 E" _6 [; y6 o& q3 i {9 j
) W7 X4 R+ b0 v/ | 由于我们要使用串口打印,就要配置我们要使用的串口。首先,要点调用GPIO_ConfigurePin(UART2_GPIO_PORT, UART2_TX_PIN, OUTPUT, PID_UART2_TX,false) GPIO_ConfigurePin(UART2_GPIO_PORT, UART2_RX_PIN, INPUT, PID_UART2_RX, false)配置我们使用的串口管脚,然后使用 SetBits16(CLK_PER_REG, UART2_ENABLE,1) 来使能我们要使用的串口 2 , 最后调用uart2_init(UART2_BAUDRATE,UART2_DATALENGTH)初始化串口。完成以上的 3 个流程,就可以通过串口打印信息了。; g6 U4 x. z9 G2 {6 o( o
关于 ADC 采集电压,主要是调用下边的函数& @9 x1 E7 `* \+ C4 A
( H1 r* Z+ m! g( m' m. V1 K
8 C, O( V- u, p. b" Z+ z2 y
0 c/ B) ]' ?( _' C: U0 H
$ n+ I1 p$ |, L2 a: X9 f
( X# v- y5 K, G5 k: y. B l/ P
在这个函数中, 首先是采用 adc_init(uint16_t mode, uint16_t sign, uint16_tattn),对 ADC 进行初始化。第一个参数 mode 是 ADC 模式选择,0 表示差分模式,GP_ADC_SE(0x800)表示单端模式,我们采用的是 GP_ADC_SE,单端模式。第二个参数 sign,0 表示默认模式,这里用P_ADC_SIGN(0x0400),选择通过相反的ADC 符号获取两个采样值来取消内部的偏置电压。最后的参数 attn 设置输入最大电压值,0 对应 1.2v,这里选 GP_ADC_ATTN3X(0x0002)对应 3.6v。
4 Z& p/ K0 v. _ 完成 ADC 初始化后,就要使能相关的 ADC 通道。adc_enable_channel(uint16_t input_selection),本次使用的是通道 ADC_CHANNEL_VBAT3V。
3 h5 z' p2 r& Y' s# _# Y2 ^ 完成 ADC 的初始化和通道使能后,就可以调用 adc_get_sample(void)获取数字电压。
0 c* x* |, d8 K. S; Q( y/ `3 j6 ?( [7 b# ?
" X( z# r4 C0 T, z P4 |3 d! i
) O+ a9 |* y8 c( l% V4 s5 N: v0 {3 R U& [. a
最后就是通过下面函数将数字电压转换为剩余电量百分比。" H" |2 @* b5 M" E# R' {5 q' ]
6 b1 T2 M' U) n3 `) f8 n5 X$ ]
! r/ a+ N) T0 `; U( V
9 n8 x$ t3 b5 k5 w9 J! |
这是函数采用的分段的形式,这是由于我们的电池电压与电池剩余电量的关系是一条曲线,通过分段计算,可以提高精度。当然,大家也可以根据自己的实际情况改动上述函数。" m9 L5 h; s2 L$ }1 }9 W
3 i( D4 P5 u# s h8 \0 v S+ c! ~6 e3 o
4 实验现象
. p& ~8 P& O7 r
: Q& {% u( S$ a" t( b. \. Z3 U f% _ 首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。$ j# Y. v" a/ I5 z9 a3 ?, S
% e. C" b+ h4 t) [( W. D; W
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。, m& B3 }/ S8 e- G3 L- H; {' |
" X& T5 R8 a/ |3 P3 _# Z9 r8 B* C* L
(2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
; v# p; ~1 q, \ v& n" v" ?# \8 E) W
(3)点击打开串口。
$ u3 ^# d5 R9 d2 f. e+ y @/ ~
1 @+ q2 R l$ t6 q
. B+ H; h# Q$ k8 J
图 2% |& y5 \2 ]$ A, V! b9 D* G! ^$ Z- j
配置完串口之后,打开我们提供的代码。
3 C) }) b2 i% ], t5 k" K* d; K9 g- N7 | x6 ?. D
(1)点击仿真按键。- r- T: l! v* ^/ [6 m$ x
5 H# |# w) [( y
9 K0 x ~- M0 Z4 L, k9 |0 g
图 3
! J/ j) `* J% @; _0 T: Q0 g4 G(2)点击运行代码。4 M/ Z5 s- |( d: `, ^5 N+ q
- r, n5 i% z" C' c2 k7 z
$ }* M4 u) g+ c7 [ v4 Y2 B B7 n
图 4
# p' z4 e) x5 n* r, \$ F4 |: u0 M7 \+ ^6 L, F/ |
1 l5 n: N% b3 @/ k完成之后,就能看到串口调试助手接收框信息如下。% E0 w- H/ E/ @! f8 y6 h6 W5 w
, O+ c6 z& g1 o0 \ R4 M% X; F
/ N0 E% q; N( o: [' \8 W/ N* {
图 5* r8 t. z; n% K5 j" }
0 e/ s8 r. \4 U) O6 {3 T2 P
2 G$ e0 Q3 ~0 B: G) j. o0 F% m( e, ]4 j' C! Q2 I4 s- m7 B( [4 T
/ {/ W, _# d( Q2 H* \9 A0 X/ d |
|