• 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

    效果如下

    在这里插入图片描述

  • 相关阅读:
    python---文件的操作、异常处理、模块、包
    MIT 6.824 -- Cache Consistency -- 11
    国产集成开发环境工具 CEC-IDE
    Python-Opencv应用实例之头发自动分割、计数、特征统计智能分析系统
    【JAVA基础】【查漏补缺】10 - 面向对象进阶(包、代码块、抽象类、接口、内部类)
    【T+】畅捷通T+服务管理中,异步任务服务(TPlusPopAsyncTaskService1700)无法启动
    Mysql 聚合函数的使用
    图书借阅管理系统的设计与实现/书籍借还管理系统
    Vue2&3全面知识总结六
    redis 生成流水工具类
  • 原文地址:https://blog.csdn.net/qq_32348883/article/details/126571534