简介

    实际应用中, 我们经常需要将模拟量转换为数字量供 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,其特征如下:

  1. 8/10/12 位分辨率,使用过采样可达到 14 位分辨率。
  2. 共 8 个输入通道。
    ⚫ 单端输入时使用 1 个通道, 2 个通道可组成差分输入。
    ⚫ 单端和差分输入时均可配置为扫描模式。
  3. 满量程输入范围(0 to VDD)。
  4. 可以通过软件触发采样任务启动采样,也可以使用低功耗的 32.768kHz RTC 或更加精确
    1/16MHz 定时器通过 PPI 触发采样任务,从而使能 SAADC 具备非常灵活的采样频率。
  5. SAADC 支持单次模式和扫描模式:
    ⚫ 单次模式一次采样一个通道。
    ⚫ 扫描模式按照顺序采样一系列通道。通道之间的采样延迟是 tack + tconv,各个通道
    之间的采样延迟可能不一样,因为 tack是软件可配置的。
  6. 通过 EasyDMA 可以直接将采样结果保存到 RAM。
  7. 无需外部定时器即可实现连续采样。
  8. 单个采样和缓冲区满均可产生事件中断。
  9. 差分和单端采样数据存储为 16 位 2 的补码值。
  10. 内部电阻串。
  11. 即时门限监测功能。

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 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_32348883/article/details/126571534