实际应用中,我们经常需要将模拟量转换为数字量供 CPU 处理,如电池电压检测、温度检测等等,对于 CPU 来说,它能处理的是数字量,所以,需要通过 A/D 转换(模数转换)将时间连续、幅值也连续的模拟量转换为时间离散、幅值也离散的数字信号,从而将实现CPU 对模拟信号的处理,能够实现 A/D 转换功能的电路称之为模数转换器(ADC:Analog-to-digital converter)。
ADC 的结构和实现原理有多种方式,常见的 ADC 的类型有积分型、逐次逼近型、并行比较型/串并行型、Σ-Δ调制型等。nRF52832 集成的是逐次逼近型 ADC,称为 SAADC(Successive approximation analog-todigital converter)。SAADC 是利用二分法逐步比较,在有效精度范围内找到最接近输入模拟信号的数字量。由此可见,这种结构的 ADC 要完成一次转换,至少要比较 N 次,所以其转换速度较慢,同时电路结构也比较简单,功耗较低,适用于便携式、穿戴式等低功耗应用领域。
主要特点
nRF52832 的 SAADC 主要特征如下:
- 8/10/12 分辨率,使用过采样可达到 14 位分辨率。
- 多达 8 个输入通道。
- 单端输入时使用 1 个通道,2 个通道可组成差分输入。
- 单端和差分输入时均可配置为扫描模式。
- 满量程输入范围(0 to VDD)。
- 可以通过软件触发采样任务启动采样,也可以使用低功耗的 32.768kHz RTC 或更加精确
1/16MHz 定时器通过 PPI 触发采样任务,从而使能 SAADC 具备非常灵活的采样频率。 - nRF52832 的 SAADC 支持单次模式和扫描模式:
- 单次模式一次采样一个通道。
- 扫描模式按照顺序采样一系列通道。Sample delay between channels is tack + tconv
which may vary between channels according to user configuration of tack.
- 通过 EasyDMA 可以直接将采样结果保存到 RAM。
- 无需外部定时器即可实现连续采样。
- 可配置通道输入负载电阻。
- 具备采样值门限检测功能。
共享资源
ADC 可以和 COMP、LPCOMP 等其它外设共用模拟输入 AIN0-AIN7,但是这些外设功能需要分配到不同的引脚。并且不建议为两个外设选择相同的模拟输入引脚。
功能概述
nRF52832 的 ADC 支持多达 8 个外部模拟输入通道,可以工作于单次模式和采样速率可配置的扫描模式。模拟输入通道可以配置为 8 个单端输入或 4 组差分输入或者单端、差分混合输入(一部分模拟输入通道用作单端输入,一部分用作差分输入)。
每一个 ADC 采样通道都可以配置为 AIN0 ~AIN7 或 VDD,所有通道都可以进行单次或者连续采样,多个通道可以使用扫描模式按照通道顺序采样,另外,ADC 通道也可以过采样以提高噪声性能。
从上面的原理框图可以看到,芯片内部,ADC 是一个差分模数转换器,包含正极输入RESP 和负极输入 RESN,他们的引脚都可以从 AIN0~AIN7 中选择。默认情况下,ADC 的配置的是单端输入(即 CH[n].CONFIG 寄存器中的 MODE = 0),此时,芯片内部将 ADC 负极输入短接到地。
使用单端模式时,是将内部地和外部待测电压的参考地假设为一样来考虑的,但是地弹噪声会导致 ADC 产生误差,如果这个误差超过我们能接受的范围,建议使用差分输入。
在参考源上,相对于 nRF51822,nRF52832 取消了外部参考源,只能使用内部参考源。
使用 ADC 时,通过 CH[n].PSELP 和 CH[n].PSELN 配置通道的模拟输入引脚,通过CH[n].CONFIG 配置 ADC 的参数,包括:模拟输入端口负载电阻、增益、参考电压、采样时间、单端或差分输入模式等。
ADC 输出的采样取决与 CH[n].CONFIG 和 RESOLUTION 寄存器配置的参数,采样结果计算公式如下:
采
样
结
果
=
[
V
(
P
)
–
V
(
N
)
]
∗
G
A
I
N
R
E
F
E
R
E
N
C
E
∗
2
(
R
E
S
O
L
U
T
I
O
N
−
m
)
采样结果 = \frac{[V(P) – V(N) ] * GAIN}{REFERENCE * 2 ^{(RESOLUTION - m)}}
采样结果=REFERENCE∗2(RESOLUTION−m)[V(P)–V(N)]∗GAIN
其中:
- V( P):ADC 输入正极。
- V(N):ADC 输入负极。
- GAIN:CH[n].CONFIG 寄存器中设置的增益 GAIN。
- REFERENCE:参考电压。
- m:如果 ADC 配置为单端模式,m = 0,如果 ADC 配置为差分模式,m = 1。
工作模式
nRF52832 的 ADC 有 3 种工作模式:单次模式、连续模式和扫描模式。各个模式的具体描述如下:
1. 单次模式(one-shot mode)
nRF52832没有专门用来配置ADC为单次模式的寄存器,当我们通过配置CH[n].PSELP、CH[n].PSELN 和 CH[n].CONFIG 只使能一个 ADC 通道的时候,ADC 工作于单次模式。触发采样任务后,ADC 开始采样输入电压,采样时间通过 CH[n].CONFIG.TACQ 配置。EVENTS_DONE 事件表明了一次采样的完成,单次采样模式下,在没有过采样发生的情况下 EVENTS_RESULTDONE 事件等同于 EVENTS_DONE 事件,注意在实际采样数据通过EasyDMA 被保存到 RAM 之前,这两个事件都会产生。
2. 连续模式(continuous mode)
可以通过下面两种方式实现连续模式:
- 使用 ADC 内部定时器实现定时采样,ADC 有一个 SAMPLERATE 寄存器,该寄存器可以配置为 Timer,配置 SAMPLERATE 的比较值 SAMPLERATE.CC 即可实现定时采样。这种方式下,触发一次采样任务即可对所有使能的通道进行采样。
- 使用 nRF52832 的通用定时器定时通过 PPI 触发采样,实现连续采样。这种方式不能算是 ADC 本身的连续采样功能,因为它是借助了其他外设实现的连续采样。
采样速率由 SAMPLERATE.CC 控制,即定时时间长,采样速率慢,定时时间短,采样速率快,需要注意的是,使用连续采样模式的时候,采样速率应符合下面的公式:
f
S
A
M
P
L
E
<
1
[
t
A
C
Q
+
t
c
o
n
v
]
f_{SAMPLE} < \frac{1}{[t_{ACQ} + t_{conv}]}
fSAMPLE<[tACQ+tconv]1
使用 SAMPLERATE 的 Timer 实现的连续采样不能和扫描模式结合使用,连续采样模式下只能使用一个通道。
EVENTS_DONE 事件表明了一次采样的完成,连续采样模式下,在没有过采样发生的情况下 EVENTS_RESULTDONE 事件等同于 EVENTS_DONE 事件,注意在实际采样数据通过 EasyDMA 被保存到 RAM 之前,这两个事件都会产生。
3. 扫描模式(scan mode)
nRF52832 同样没有专门用来配置 ADC 为扫描模式的寄存器,那么, 扫描模式是怎么进入的?
当我们使能一个 ADC 通道,ADC 工作于单次模式,当使能的通道数量大于 1 个,ADC进入扫描模式。扫描模式下,采样所有通道花费的总时间如下式:
T
o
t
a
l
t
i
m
e
<
S
u
m
(
C
H
[
x
]
.
t
A
C
Q
+
t
c
o
n
v
)
,
x
=
0..
使
能
的
通
道
数
量
Total time < Sum(CH[x]. t_{ACQ} + t_{conv}), x=0..使能的通道数量
Totaltime<Sum(CH[x].tACQ+tconv),x=0..使能的通道数量
EVENTS_DONE 事件表明了一次采样的完成,扫描模式下,在没有过采样发生的情况下EVENTS_RESULTDONE 事件等同于 EVENTS_DONE 事件,注意在实际采样数据通过EasyDMA 被保存到 RAM 之前,这两个事件都会产生。