• nRF52832 之ADC的使用


    简介

        实际应用中, 我们经常需要将模拟量转换为数字量供 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"
    
    • 1
    • 2
    • 3

    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);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23

    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    效果如下

    在这里插入图片描述

  • 相关阅读:
    利用 Selenium 自动化 web 测试【步骤详解】
    计算机毕业设计django基于python研究生备考互助系统
    道德风险与信贷配给
    【PPT】ppt里面使用svg图标
    Ai-WB2模组HTTP 客户端 POST请求方法
    云原生之深入解析Redis On K8S编排部署与实战操作
    redis发布订阅问题
    适用于Mac的13个最佳照片恢复软件(优点和缺点)
    SpringBoot实现分页查询——基于SpringBoot和Vue的后台管理系统项目系列博客(七)
    超级水王问题
  • 原文地址:https://blog.csdn.net/qq_32348883/article/details/126571534