位数:12bit、10bit、8bit

一般就是对应的ADC值分别为:4095、1023、255,也就选用对应位数时ADC的最大值。

增益的作用

增益设置用于放大或缩小输入信号,使其适配到ADC的输入范围。增益设置可以通过配置SAADC的通道配置寄存器来实现。nRF52840支持的增益设置包括以下几种:

  • 1/6
  • 1/5
  • 1/4
  • 1/3
  • 1/2
  • 1
  • 2
  • 4

参考电压

nRF52840的SAADC支持内部参考电压和外部参考电压。内部参考电压通常为0.6V,外部参考电压可以通过外部引脚提供。默认情况下,内部参考电压是0.6V,并且通过增益配置进一步调整。

增益与参考电压的关系

增益与参考电压共同决定了ADC输入信号的电压范围。例如,当使用内部参考电压0.6V时,不同的增益设置会改变ADC的实际输入范围。

假设使用内部参考电压0.6V,增益设置为1/6,那么输入信号的实际电压范围为:

Nordic的ADC位数、增益调制与参考电压_驱动开发

如果增益设置为1,则输入信号的实际电压范围为:

Nordic的ADC位数、增益调制与参考电压_mcu_02

因此,增益设置决定了参考电压如何扩展到输入信号范围。也就是设置参考电压就是大于你检测口的输入电压。

提醒:如果设备连接了串口,且串口选择的电压为5V,超过了芯片正常运行电压可能会导致ADC采集的数据偏高。

#include <stdbool.h>
#include <stdint.h>
#include "nrf_drv_saadc.h"
#include "app_error.h"
#include "boards.h"
#include "nrf_delay.h"
#include "app_util_platform.h"

AIN0: 映射到引脚P0.02。
AIN1: 映射到引脚P0.03。
AIN2: 映射到引脚P0.04。
AIN3: 映射到引脚P0.05。
AIN4: 映射到引脚P0.28。
AIN5: 映射到引脚P0.29。
AIN6: 映射到引脚P0.30。
AIN7: 映射到引脚P0.31。

// SAADC事件处理函数
void saadc_callback(nrf_drv_saadc_evt_t const * p_event)
{
    // 在此处处理SAADC事件
}

void saadc_init(void)
{
    ret_code_t err_code;

    nrf_drv_saadc_config_t saadc_config = NRF_DRV_SAADC_DEFAULT_CONFIG;
    saadc_config.resolution             = NRF_SAADC_RESOLUTION_12BIT;
    saadc_config.oversample             = NRF_SAADC_OVERSAMPLE_DISABLED;
    saadc_config.interrupt_priority     = 6;                    
    saadc_config.low_power_mode         = 0;  

    // 配置SAADC通道
    nrf_saadc_channel_config_t channel_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);
    
    // 修改增益设置为1,以适应较大的输入范围
    channel_config.gain = NRF_SAADC_GAIN1;

    // 初始化SAADC
    err_code = nrf_drv_saadc_init(&saadc_config, saadc_callback);
    APP_ERROR_CHECK(err_code);

    // 初始化SAADC通道
    err_code = nrf_drv_saadc_channel_init(0, &channel_config);
    APP_ERROR_CHECK(err_code);
}

int main(void)
{
    // 初始化板子上的LED和按钮
    bsp_board_init(BSP_INIT_LEDS);

    // 初始化SAADC
    saadc_init();

    // 配置一个变量来存储ADC结果
    nrf_saadc_value_t adc_value;
    
    while (true)
    {
        // 启动SAADC转换并读取值
        ret_code_t err_code = nrf_drv_saadc_sample_convert(0, &adc_value);
        APP_ERROR_CHECK(err_code);

        // 将ADC值转换为电压
        float voltage = (adc_value / 4095.0) * 0.6; // 0.6V为参考电压

        // 在此处可以使用转换后的电压值
        // 例如:通过串口输出电压值

        // LED闪烁表示程序正在运行
        bsp_board_led_invert(BSP_BOARD_LED_0);
        nrf_delay_ms(500);
    }
}