1.ADC类型是逐次迫进型;
2.分辨率分别是8/10/12 bit,使用过采样可以达到14 bit(不能使用于多通道扫描);
3.自带两路EasyDMA可用于数据存储;
4.基准电压配置
使用内部的基准电压(0.6 V)或者VDD/4,还要配置电压增益分别为gain,ADC通道输入电压范围0.6/gain;
5.使用方式
(1)单次使用
(2)连续转换
(3)过采模式
过采样并不能改善积分非线性(INL)或差分非线性(DNL)。
•使用本地计时器或通用计时器和PPI配置固定采样率以触发SAMPLE任务•从软件触发SAMPLE 2 OVERSAMPLE时间•启用BURST模式CH [n] .CONFIG.BURST可以是 启用以避免将SAMPLE任务设置为OVERSAMPLE次。
当BURST = 1时,ADC将以最快的速度对输入进行2 OVERSAMPLE采样(实际时序:<(t ACQ + t CONV)×2 OVERSAMPLE)。
因此,对于用户而言,它看起来就像转换花费了更长的时间,但除此之外,它类似于单次模式。
(4)扫描模式:多通道扫描
6.采样通道
拥有两个采样通道,可以配置差分电路降低噪声提高精度,CH[x].PSELP为正通道,CH[x].PSELN为负通道;
单通道测量只需配置CH[x].PSELP通道,CH[x].PSELN为NC就会自动接到GND;
一共有8组CH[x]通道可以配置,配置多组就会变成扫描模式,如果多个ADC输入,又不使用扫描模式,就只能就同一组CH[x]通道重新映射ADC引脚。
//通道组的基础参数设置
NRF_SAADC->CH[0].CONFIG = (SAADC_CH_CONFIG_GAIN_Gain1_6 << SAADC_CH_CONFIG_GAIN_Pos) |
(SAADC_CH_CONFIG_MODE_SE << SAADC_CH_CONFIG_MODE_Pos) |
(SAADC_CH_CONFIG_REFSEL_Internal << SAADC_CH_CONFIG_REFSEL_Pos) |
(SAADC_CH_CONFIG_RESN_Bypass << SAADC_CH_CONFIG_RESN_Pos) |
(SAADC_CH_CONFIG_RESP_Bypass << SAADC_CH_CONFIG_RESP_Pos) |
(SAADC_CH_CONFIG_TACQ_3us << SAADC_CH_CONFIG_TACQ_Pos);
// 配置通道
NRF_SAADC->CH[0].PSELP = SAADC_CH_PSELP_PSELP_AnalogInput0<< SAADC_CH_PSELP_PSELP_Pos;
NRF_SAADC->CH[0].PSELN = SAADC_CH_PSELN_PSELN_NC << SAADC_CH_PSELN_PSELN_Pos;
//设置分辨率
NRF_SAADC->RESOLUTION = SAADC_RESOLUTION_VAL_12bit << SAADC_RESOLUTION_VAL_Pos;
// 转换数据大小和存放数据的内存地址
NRF_SAADC->RESULT.MAXCNT = 1;
NRF_SAADC->RESULT.PTR = (uint32_t)&result;
// 任务触发采集
NRF_SAADC->SAMPLERATE = SAADC_SAMPLERATE_MODE_Task << SAADC_SAMPLERATE_MODE_Pos;
// 使能SAADC
NRF_SAADC->ENABLE = SAADC_ENABLE_ENABLE_Enabled << SAADC_ENABLE_ENABLE_Pos;
//使能中断
NVIC_EnableIRQ(SAADC_IRQHandler);
NVIC_SetPriority(SAADC_IRQHandler,1);
// 使能中断、启动SAADCZ任务
NRF_SAADC->ENABLE =SAADC_ENABLE_ENABLE_Enabled;
NRF_SAADC->TASKS_START = 1;
while (NRF_SAADC->EVENTS_STARTED == 0);
NRF_SAADC->EVENTS_STARTED = 0;
// 启动采样
NRF_SAADC->TASKS_SAMPLE = 1;
3.中断服务函数
//等待转换完成
if (NRF_SAADC->EVENTS_END != 0) {
NRF_SAADC->EVENTS_END = 0;
adc_result = result; //result设置内存地址
NRF_ADC->TASKS_STOP = 1;
app_sched_event_put(&adc_result,4,s_battery_sched);
}
//停止任务
NRF_SAADC->TASKS_STOP = 1;
while (NRF_SAADC->EVENTS_STOPPED == 0);
NRF_SAADC->EVENTS_STOPPED = 0;
//关闭中断
NRF_ADC->ENABLE = SAADC_ENABLE_ENABLE_Disabled;
1.分辨率的提高,NRF51是8/9/10 bit;
2.可以使用差分输入,减少噪声,提高精度;
3.ADC通道引脚电压范围不同
(1).NRF51无论是外部电路1/2或者1/3还是内部电压,基本输入电压范围0-1.2V;
(2).NRF51配置0.6V内部基准电压,使用增益为1/6时,基本输入电压范围0-3.6V,能减少外部硬件分压电路,减少电阻精度带来的误差;
4.NRF52在任务触发采集时,需要加程序NRF_SAADC->TASKS_SAMPLE = 1;
来采样,NRF51则直接NRF_ADC->TASKS_START = 1;
即可;