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和电池电量服务
<http://blog.chinaunix.net/uid-28852942-id-5711152.html>

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信