实际应用中, 我们经常需要将模拟量转换为数字量供 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的ADC叫做SAADC,其特征如下:
nRF52832 的 ADC 支持多达 8 个外部模拟输入通道,它的数字引脚是可以自由映射的,但是模拟输入的引脚是固定的,如下表所示,ADC 和 COMP、 LPCOMP 等其它外设共用模拟输入 AIN0-AIN7,但是这些外设功能需要分配到不同的引脚
以P0.04 io单次采样读取AD采样值为例
,对应ADC为 AIN2。
#include "nrf_delay.h" //nRF52832延时函数头文件
#include "nrf_drv_saadc.h"
//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);
}
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);
}