|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 电池电量检测
* n1 W4 [4 @6 j5 o: j
+ J6 q Q: f9 |" |6 X1 j+ y/ j" L5 b0 f0 l$ e0 Y9 m' i" X8 x m% i
. T5 ?: g8 M. o9 g1 C
. v4 k# j; D6 @9 }& u$ u1 ADC 简介
3 F+ h( ]5 y, f" t/ U, @8 K0 m: T4 f# G/ v0 q, N7 ~
ADC(Analog-to-Digital Converter),模/数转换器或者模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。
$ T: ]2 I. c$ u5 j6 Y7 N) {7 G 我们 DA14580 集成一个高速超低功耗的 10 位通用模数转换器。可以工作于单端模式也可以工作于差分模式。ADC 模块有一个 1.2V 的电压校准器,作为满量程的参考电压。5 m6 H$ p- t, r+ l, _
该 ADC 模块是 10 位动态模数转换,转换时间为 65ns;最大的采样率为3.3MHz;超低功耗(在 100KHz 的采样速率下典型供电电流为 5uA);有单端与差分两个输入比例;有 4 个单端或者 2 个差分输入通道;电池检测功能;斩波器功能;偏移和零刻度调整;公共端模式输入电平调整。; _- j2 R, P. X O) ]. c' D q1 K5 H
由于电池电压与其放电时长成负相关关系,我们就可以通过 DA14580 的 ADC测量电池电压,直接判断我们所使用的电池剩余电量大小。
" r" c& W& Z( S; Z3 t3 A8 F9 c7 b5 g! T& b; g% B
2 硬件设计8 {$ _) \2 K1 W- n5 S; ~
6 t/ z7 ]% k% I4 ^- Y- ]0 m1 V& [
本次 DA14580 采用 P01 脚直接测量电源电压。
1 z% E7 B/ b) A2 n: O" Y8 Z* A7 s# b2 m" `. l/ [
; r/ c4 \" L; @4 D8 A7 Y
图 1; a; u% Q7 C. h( ]% b, {7 M
- e/ R' N( d- z
3 软件设计' m" L0 {0 w3 E1 R) O
?/ a6 Y8 K x, a; y# g! L6 a 软件开始,第一步要进行的是系统初始化。
1 M; ^! H$ A2 R/ x' K" N1 q3 b- ~+ y- S
+ ^4 D2 O3 R$ c# t9 B# H6 E
/ L, E0 a! n$ D) d3 G/ j: |
. }0 H) I: _% M# _, q4 ?% m; z* e; Y6 t0 S% r) n8 @( K
由于我们要使用串口打印,就要配置我们要使用的串口。首先,要点调用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 个流程,就可以通过串口打印信息了。. [+ m: g2 c! T; D* n& C
关于 ADC 采集电压,主要是调用下边的函数& _; [ v& Z/ W/ V- N
* q8 E0 g+ E, C- z5 {6 C8 x
4 k. ?+ k9 H) h/ O( r
d: V$ H9 ]' L, b {
6 P; }: t. d: t3 @
9 D2 h; K! t& ~ 在这个函数中, 首先是采用 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。. F' t# G: z; o# r- B' Y
完成 ADC 初始化后,就要使能相关的 ADC 通道。adc_enable_channel(uint16_t input_selection),本次使用的是通道 ADC_CHANNEL_VBAT3V。
8 P, W2 y4 L* Y2 R7 D; D 完成 ADC 的初始化和通道使能后,就可以调用 adc_get_sample(void)获取数字电压。
! T3 j% i0 ]( I
$ m# t* C+ H, t4 K
! ]; i/ v8 O( j4 M. e1 G! S0 L- n' R
. V' H" h0 y) j& Q! v2 z o. v" a0 _ Y. s8 D, J) V S# [) S
最后就是通过下面函数将数字电压转换为剩余电量百分比。
; V4 M! R2 l8 f% t) b
# M2 X" f+ W% `# K2 B: i! B# i
, R) g; m' a/ E7 U" M8 W7 c0 f B) I. G& U# |" W, d5 L# o1 y9 Q9 }' z) `
这是函数采用的分段的形式,这是由于我们的电池电压与电池剩余电量的关系是一条曲线,通过分段计算,可以提高精度。当然,大家也可以根据自己的实际情况改动上述函数。
" p# Q p; f2 b% L4 S" v# P
' t& a- s) C" B* \% A9 [) z- I4 x2 B% Q) u, M
4 实验现象
4 ?, u B( o$ h: y5 L$ |9 C
3 y5 K: }5 b0 {% A! T 首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。
1 l' [; ~* T2 N: I$ M4 H/ ]7 a
" ^8 Z( W" V+ [7 }+ `- V (1)选择串口号,我们图中是 COM1,这个根据实际情况选择。
3 c, d0 c9 h' J2 n& O' L
% _! g# u; x7 Z+ _) y9 |8 y (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。& B& l( n# h; L( Z, E$ l& L+ n
5 ^, V" l; _( v. J: o (3)点击打开串口。
) s1 X" q2 f7 X% j7 ]% ?6 S- c
2 G% P6 f' l0 E
" j& b' p9 ?' A9 s* l4 b+ T
图 21 O: k' I8 C }8 F0 q9 h, Z
配置完串口之后,打开我们提供的代码。
( t) O& i- u- `5 s7 b9 b r& D
2 @, F; W1 M1 G, @ J: ^2 V(1)点击仿真按键。
+ P2 J# d9 F( a% e X; t/ U m* c
% I9 Z& W0 B1 X' o% k" }
0 \% |- w+ I1 v1 d8 P; X
图 36 G) Y9 {" n6 O# ~* V
(2)点击运行代码。
, V* m2 @9 N) {- y( i1 R6 M6 d. S8 T0 V
$ u2 v" {* U) x( e O/ C4 B5 h图 4
2 B! K) w! B% r3 M
( p. O# Q5 u# D( Y
2 N6 q% ?4 U+ D1 e! }完成之后,就能看到串口调试助手接收框信息如下。
# Z4 j+ s' K V8 | H! q
# s% Z6 d" c" k# E& [/ [/ r
. _- k: Q' C. z X4 |% v
图 5
# w' O% O- s$ ~- A
" |+ q W4 p& F( J- X( p$ M* [1 M- t/ e4 y3 z. r
- N5 L7 N3 X4 r9 p; h+ Y3 X; [5 B' }& M- \( Q
|
|