简介
实际应用中, 我们经常需要将模拟量转换为数字量供 CPU 处理,如电池电压检测、温度检测等等,对于 CPU 来说,它能处理的是数字量,所以,需要通过 A/D 转换(模数转换)将时间连续、幅值也连续的模拟量转换为时间离散、幅值也离散的数字信号,从而实现 CPU对模拟信号的处理,能够实现A/D转换功能的电路称之为模数转换器(ADC: Analog-to-digitalconverter)。
ADC 的结构和实现原理有多种方式,常见的 ADC 的类型有积分型、逐次逼近型、 并行比较型/串并行型、Σ -Δ调制型等。
nRF52832 集成的是逐次逼近型 ADC,称为 SAADC(Successive approximation analog-todigital converter)。 SAADC 是利用二分法逐步比较,在有效精度范围内找到最接近输入模拟信号的数字量。由此可见,这种结构的 ADC 要完成一次转换,至少要比较 N 次, 所以其转换速度较慢,同时电路结构也比较简单,功耗较低,适用于便携式、穿戴式等低功耗应用领域。
nRF52832 的 SAADC 主要特征
nRF52832的ADC叫做SAADC,其特征如下:
- 8/10/12 位分辨率,使用过采样可达到 14 位分辨率。
- 共 8 个输入通道。
⚫ 单端输入时使用 1 个通道, 2 个通道可组成差分输入。
⚫ 单端和差分输入时均可配置为扫描模式。 - 满量程输入范围(0 to VDD)。
- 可以通过软件触发采样任务启动采样,也可以使用低功耗的 32.768kHz RTC 或更加精确
1/16MHz 定时器通过 PPI 触发采样任务,从而使能 SAADC 具备非常灵活的采样频率。 - SAADC 支持单次模式和扫描模式:
⚫ 单次模式一次采样一个通道。
⚫ 扫描模式按照顺序采样一系列通道。通道之间的采样延迟是 tack + tconv,各个通道
之间的采样延迟可能不一样,因为 tack是软件可配置的。 - 通过 EasyDMA 可以直接将采样结果保存到 RAM。
- 无需外部定时器即可实现连续采样。
- 单个采样和缓冲区满均可产生事件中断。
- 差分和单端采样数据存储为 16 位 2 的补码值。
- 内部电阻串。
- 即时门限监测功能。
nRF52832 的 ADC 支持多达 8 个外部模拟输入通道,它的数字引脚是可以自由映射的,但是模拟输入的引脚是固定的,如下表所示,ADC 和 COMP、 LPCOMP 等其它外设共用模拟输入 AIN0-AIN7,但是这些外设功能需要分配到不同的引脚
代码示例
以P0.04 io单次采样读取AD采样值为例
,对应ADC为 AIN2。
SAADC头文件
#include "nrf_delay.h" //nRF52832延时函数头文件
#include "nrf_drv_saadc.h"
SAADC配置
//SAADC事件回调函数,因为是堵塞模式,所以不需要事件,这里定义了一个空的事件回调函数
void saadc_callback(nrf_drv_saadc_evt_t const * p_event){}
//初始化SAADC,配置使用的SAADC通道的参数
void saadc_init(void)
{
ret_code_t err_code;
//定义ADC通道配置结构体,并使用单端采样配置宏初始化,
//NRF_SAADC_INPUT_AIN2是使用的模拟输入通道
nrf_saadc_channel_config_t channel_config =
NRFX_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN2);
//初始化SAADC,注册事件回调函数。
err_code = nrf_drv_saadc_init(NULL, saadc_callback);
APP_ERROR_CHECK(err_code);
//初始化SAADC通道0
err_code = nrfx_saadc_channel_init(0, &channel_config);
APP_ERROR_CHECK(err_code);
}
ADC数值读取
while(1)
{
//启动一次ADC采样(阻塞模式)。
nrfx_saadc_sample_convert(0,&saadc_val);
//串口输出ADC采样值。
printf("Sample value is: %d\r\n", saadc_val);
//延时300ms,方便观察SAADC采样数据
nrf_delay_ms(500);
}
效果如下
版权声明:本文为qq_32348883原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。