NRF51822——ADC学习笔记

版权声明:原创文章转载请注明出处。 https://blog.csdn.net/wwt18811707971/article/details/80529699

1. 概述

1.1 通道配置

nRF51822 的ADC 有8个通道:AIN0-AIN7。如下图:

这里写图片描述

CONFIG寄存器:选择ADC的输入通道。

如上图,ADC不仅可以测量8个通道的输入进过比例转换后的模拟电压(比如选择1/3,则实际adc转换的数据为外部输入电压的1/3),还可以测量 VDD/3 和VDD*2/3的电压值,也是通过CONFIG寄存器来设置。

CONFIG中的RES位:控制adc的精度。

CONFIG中的REFSEL:选择参考电压,同样参考电压也可以经过一定比列缩放。

1.2 采集电压配置

使用ADC时,先要确定ADC的参考电压,分压设置,电压采集范围。

参考电压选择:1.2 V VBG内部参考电压;1.0V的AREF外部参考电压;VDD3.0V、VDD 1/2三种。输入电压的采样范围和参考电压、分压设置有关。

若输入电压小于ADC采样范围时,就不能充分利用分辨率。若大于ADC采样范围,会将大于ADC采样范围的最大电压限制在ADC采样范围的最大值上,即饱和点。采样范围:0V—-饱和点电压。

这里写图片描述

1.3 最大输入电压配置规则

(1)分压后的AIN管脚的电压不高于2.4V:输入电压 * 分压 = Vmax=2.4V;

(2)GPIO引脚电压不高于VDD+0.3V时,参考电压对照最大额定值。

eg:当使用 2/3 分压时,AIN引脚上的电压可以为2.4/(2/3)=3.6V,为了遵循规则二,VDD必须为3.3V或者以上的电压。

ADC管脚上的输入AIN的最大电压值为:

这里写图片描述

2. ADC使用配置

所有参数的配置都可以通过 CONFIG 寄存器配置,如输入选择、参考电压、分辨率和分压系数等。

注:转换期间不能更改ADC的配置。

ADC 使用时,首先触发START任务来执行ADC转换,可以直接从CPU中写该任务的寄存器或者通过PPI触发这个任务。ADC在采样期间会处于忙状态,ADC忙或者准备状态都可以通过BUSY寄存器检测。ADC转换完成后,会产生一个END事件,转换结构可以从RESULT寄存器中读出,同时ADC的模拟部分将关闭以节省功耗。

寄存器 功能
INTEN 改寄存器用来设置 转换完成后是否触发中断。
BUSY 用来查看ADC转换是否已经完成。通常在轮训方式中使用。
ENABLE 使能adc
RESULT 存储 adc 转换后的结果

2.1 ADC采样

ADC本身只支持单次采样操作,即每一次转换都需要由START task 任务开启。如果要实现连续ADC转换,可以通过不断的触发START task任务来实现。eg:使用定时器通过PPI 触发START task任务。

2.2 ADC引脚配置

可以通过PSEL寄存器来选择模拟的输入管脚。ADC输入:AIN0——AIN7。选择的模拟管脚通过ENABLE寄存器可以被ADC获取。

2.3 ADC共享配置

ADC可以与其他具有相同 ID 的外设共享寄存器和资源。配置和使用 ADC 前,需要关闭其他与之相同 ID 的外设。ADC使用同一个模拟引脚作为 LPCOMP。所以在使用ADC前,必须关闭LPCOMP。

3. ADC实例编写

3.1 ADC采样分辨率

采样精度可以通过 CONFIG 寄存器的最低两位进行配置。RES=0:8位;RES=1:9位;RES=2:10位;

这里写图片描述

3.2 输入电压

ADC模块的输入电压包栝两种:外部管脚的输入电压和供电电压。设置 CONFIG 寄存器的2~4位的 INPSEL 域。

INPSEL 值 得到结果
0 ADC外部管脚输入,不分压
1 ADC外部管脚输入,配置2/3分压
2 ADC外部管脚输入,配置1/3分压
5 VDD供电的2/3分压
6 VDD供电的1/3分压

这里写图片描述

3.3 参考电压

参考电压有三种,可通过CONFIG的5~6位设置REFSEL域。

REFSEL 结果
0 选择内部1.2v VBG为参考电压
1 选择外部AREF0,AREF1的输入电压为参考电压
2 选择供电VDD的1/2分压(VDD:1.7V~2.6V)
3 选择供电VDD的1/3分压(VDD:2.5V~3.6V)

3.4 输入管脚配置

ADC 的输入引脚,可以选择AIN0—AIN7,对应的 GPIO 为 P0.00—P0.07。

这里写图片描述

3.5 实现例程

//初始化设置
void Adc_Init(uint8_t AdcRes,uint8_t AdcPin)
{

   if(AdcPin <= 7)
     {                     //多小位                         //BBB=2
       NRF_ADC->CONFIG = AdcRes << ADC_CONFIG_RES_Pos |     //分辨率设置
                  ADC_CONFIG_INPSEL_AnalogInputOneThirdPrescaling << ADC_CONFIG_INPSEL_Pos |    //设置采样电压的分压
                  ADC_CONFIG_REFSEL_SupplyOneThirdPrescaling << ADC_CONFIG_REFSEL_Pos | //设置参考电压
                  (1 << AdcPin) << ADC_CONFIG_PSEL_Pos; //配置输入管脚    
                          //cc=3
             NRF_ADC->ENABLE = 1;  //ADC使能

    }
 }

//数据读取
/******************************************************************
*参考电压:1/3供电电压(3.3V/3)---V1
*采样精度:10位
*输入电压:1/3分压-----V2
*计算公式:V1/2^10*AdcDat*V2 = (3.3/3/1024)*AdcDat*3 = 实测电压
******************************************************************/

uint16_t Adc_Read_Value(void) //读取数据
{
  uint16_t AdcDat;

  NRF_ADC->TASKS_START = 1;     //启动ADC转换
  while(NRF_ADC->EVENTS_END == 0);  //等待转换结束
  NRF_ADC->EVENTS_END = 0;
  AdcDat = NRF_ADC->RESULT; //读出转换结果

  return AdcDat;    
}

//多次测量取平均值
//ADC采集取平均值
uint16_t Get_Adc_Average(uint8_t times)
{
    uint8_t cnt;
    uint16_t AdcVal=0;

    for(cnt=0;cnt<times;cnt++)
    {
        AdcVal += Adc_Read_Value();
        nrf_delay_ms(5);
    }
    return AdcVal/times;
}

参考:

1.BLE-NRF51822教程14-adc和电池电量服务

猜你喜欢

转载自blog.csdn.net/wwt18811707971/article/details/80529699