位数: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,那么输入信号的实际电压范围为:
如果增益设置为1,则输入信号的实际电压范围为:
因此,增益设置决定了参考电压如何扩展到输入信号范围。也就是设置参考电压就是大于你检测口的输入电压。
#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);
}
}