|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
蓝牙心率防水运动手环 ——疯壳·智能穿戴开发系列 电池电量检测
8 @, B( [' n) t# J0 a0 P
2 H4 j$ T0 M/ A
+ n# `# C& O0 j. W" J5 p: B5 O6 O" i6 {. I* U/ _* @% `
" O' y; V/ `0 l2 o& q! \0 r) w
1 ADC 简介, L5 G U" N% U: Q
; q$ `) F6 q7 m+ E' `
ADC(Analog-to-Digital Converter),模/数转换器或者模数转换器,是指将连续变化的模拟信号转换为离散的数字信号的器件。- x2 l# J4 j2 b2 F. {
我们 DA14580 集成一个高速超低功耗的 10 位通用模数转换器。可以工作于单端模式也可以工作于差分模式。ADC 模块有一个 1.2V 的电压校准器,作为满量程的参考电压。' }$ | A* z- V: b5 X
该 ADC 模块是 10 位动态模数转换,转换时间为 65ns;最大的采样率为3.3MHz;超低功耗(在 100KHz 的采样速率下典型供电电流为 5uA);有单端与差分两个输入比例;有 4 个单端或者 2 个差分输入通道;电池检测功能;斩波器功能;偏移和零刻度调整;公共端模式输入电平调整。
/ B8 L8 j2 m" `- K$ g 由于电池电压与其放电时长成负相关关系,我们就可以通过 DA14580 的 ADC测量电池电压,直接判断我们所使用的电池剩余电量大小。! U+ T4 G9 N2 {, _* q; M9 D
; X* l5 _0 j5 ^
2 硬件设计( I2 [) _6 E% B5 ]1 T) C6 U
1 v" M, s7 E1 s, u l
本次 DA14580 采用 P01 脚直接测量电源电压。" K1 c6 ]( i: {4 U! l
/ r0 h: G7 o6 U4 o$ J- d- f& N! K7 Q2 W
$ O8 U" q4 ^1 l3 `" Z, i图 1
) [- g" P+ d7 M; ], u; @: j; h
" C2 W! c6 l) U* z3 软件设计
5 U# S$ S/ w2 e% L8 v! b8 Z5 W5 c1 p6 q
软件开始,第一步要进行的是系统初始化。1 \- C: X% d* F- l* S& \; N; [+ f
8 ^- _+ b7 Z& G0 I# K( V W9 S. G8 D+ `' r
/ B$ H. g9 s$ g' Z% t0 X7 ]
0 | H& A4 u+ M1 |, `1 k; t0 f
( k+ D0 e& m3 ~7 d
由于我们要使用串口打印,就要配置我们要使用的串口。首先,要点调用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 个流程,就可以通过串口打印信息了。+ ]0 ?! K& ]; d* k1 t3 w9 G
关于 ADC 采集电压,主要是调用下边的函数
/ H, G3 o) L7 U: j* g3 U. R8 ~! x
% \0 k, ~* x0 d2 j9 R3 @
$ f5 p M- j q. W
% U; B# B! X; o1 T( y* G4 [0 a$ W
1 r! b6 }6 x9 v9 ?7 z9 q! q% h% v( h) _2 }8 A1 T& 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。
. Q* P3 }0 S' q2 c9 W# b 完成 ADC 初始化后,就要使能相关的 ADC 通道。adc_enable_channel(uint16_t input_selection),本次使用的是通道 ADC_CHANNEL_VBAT3V。
9 Q8 w7 N; t/ k) s: K8 D5 w 完成 ADC 的初始化和通道使能后,就可以调用 adc_get_sample(void)获取数字电压。
3 B8 w3 ^8 Z$ b2 f% Q) c* S4 m! F4 Y5 b5 O3 y) t7 B, ]; R
^& N, @. Q4 E
; A& U* i0 E) `+ l& k7 O: K, h
8 y% S$ m! ]/ S! A7 Y 最后就是通过下面函数将数字电压转换为剩余电量百分比。
* w3 ?; J( K$ Q, d9 Y$ N4 X2 M: V- Y- h& @' O( c; f% x
* O8 P2 J7 _% s# r8 z7 r
+ T' f) {* a7 K& {4 P& q1 w
这是函数采用的分段的形式,这是由于我们的电池电压与电池剩余电量的关系是一条曲线,通过分段计算,可以提高精度。当然,大家也可以根据自己的实际情况改动上述函数。3 Z, T8 F; e6 m8 g" G
. n, s( [4 h g; c" R
1 V! p% e; {; n1 L
4 实验现象; M7 W+ r7 Y$ z* |! s6 B# [# k6 S0 ^
. u& v' @% y, Z; P' |( d
首先,插好 Jlink 和 USB 转串口,然后打开打开串口调试助手。% d% @- K3 f3 [$ ?
* C: c# x2 f. z) |
(1)选择串口号,我们图中是 COM1,这个根据实际情况选择。! l4 D: M1 l6 A2 P/ ^
- E- {0 n' j3 X/ V# c* r" u (2)配置串口参数,波特率为 115200,数据位 8,停止位 1,没有校验位和控制流,与下图一致。
2 x" h0 D h+ W/ V
+ S# o) R( Z+ U: y; I (3)点击打开串口。6 s3 \% I8 z$ k9 W
& t, z5 ~9 \8 a( J% Y- I% B* ?
4 s1 A- }/ r: E图 2. i# i6 g- u1 A4 P, x
配置完串口之后,打开我们提供的代码。* ?+ n" h2 B1 L+ v8 V; L2 S
. B B2 ]9 U" u8 A
(1)点击仿真按键。
) G4 V" z4 `! C7 B; q: {" L3 R) B4 S) d5 T/ s7 l5 o9 r
7 E6 X2 D' o" a: r3 @
图 3
8 O& ~+ t( s+ @) F6 r* k$ M(2)点击运行代码。1 N/ V3 L$ Z( \4 B6 T$ H5 x l
- \, e: @, `) [
- J% ]/ `5 V6 c3 c& E$ q/ j9 c/ J
图 4
2 U9 X9 _/ j2 N4 o3 t9 `+ ^& \1 g6 `0 k
9 y+ l( d9 K( f4 b* ?
完成之后,就能看到串口调试助手接收框信息如下。$ t0 C: t% G8 r& T
. p/ S7 L& J% F, P3 i3 I' [) o5 Z
/ L, @3 J+ s8 a& O% r. S% i图 5+ |: z# \# H2 J$ M4 G* a9 K, @
7 ?; |9 `4 m$ r3 e' Y& G
0 t g& Q! {! g* p8 ]
% A% ^" o( Y' r- I7 _0 t) A% X3 K" {& b: e
|
|