Nordic52810入门篇-ADC模数转换

本文深入解析Nordic52810的逐次逼近式模拟数字转换器(SAR ADC),介绍其工作原理、支持的分辨率、输入通道特性、工作模式、寄存器配置及驱动接口,提供初始化与采样事件配置的实例代码。

一、前言

Nordic52810使用的是逐次逼近式模拟数字转换器(SAR),在每一次转换过程中,通过遍历所有的量化值并将其转为为模拟值,将输入信号与其逐一比较,最终得到输出的数字信号(百度百科)
ps:如有错误,请留言指正,谢谢

二、工作原理

功能特点

  • 支持8位/10位/12位分辨率,过采样支持14位分辨率
  • 支持8个输入通道(单端输入与差分输入)
  • 可以配合PPI主动触发采样任务(低功耗模式下,RTC定时唤醒后进行采样)
  • 支持EasyDMA进行数据采样
  • 采样电压值范围(0 ~ VDD)
  • 支持连续循环采样模式
  • 可配置内部输入负载阻抗,可检测采样值门限

共享资源

  • 外设COMP也使用模拟输入引脚AIN0-AIN7,为了防止出现冲突,不建议配置到同一个模拟输入引脚

原理框图

ADC默认配置为单端输入模式,此时负极输入内部会接地。但是由于芯片引脚会存在电感电容等寄生参数,会造成地弹噪声,测量数据会存在偏差,对采样数据有要求的情况下可以使用差分输入模式
在这里插入图片描述

数字输出
输出结果主要由CH[n].CONFIGRESOLUTION寄存器来设置,公式如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIyBt6dz-1573728834529)(en-resource://database/2647:1)]

  • :正极输入电压
  • V(N):负极输入电压
  • GAIN:增益
  • REFERENCE:参考电压

三、工作模式

ADC可配置成三种工作模式:单次模式连续模式扫描模式

  • 单次模式(One hsot mode):仅配置了一个有效的采样通道
  • 连续模式(Continuous mode):连续采样主要是通过内部定时器进行定时采样,也可配合PPI触发采样
  • 扫描模式(scan mode):当有效通道大于1个时,通过扫描模式进行逐个有效通道的采样

四、寄存器

  • INTEN:中断控制寄存器,写1使能中断,写0禁用中断(按位配置中断)
  • INTENSET:中断使能寄存器,写1有效
  • INTENCLR:中断禁用寄存器,写1有效
  • STATUS:状态寄存器,读取到0为ADC空闲(当前未在转换),读取到1位ADC忙(转换过程中)
  • ENABLE:ADC外设使能寄存器,写1使能,写0禁用;使能前必须确认输入引脚已经被配置
  • CH[0-7].PSELP:选择通道0-7中正极输入引脚
  • CH[0-7].PSELN:选择通道0-7中负极输入引脚
  • CH[0-7].CONFIG:配置寄存器,可配置为输入模式(差分、单端)、增益、参考电压与转换速率
  • CH[0].LIMIT:门限监控事件配置,高于门限或低于门限可触发事件中断

五、相关接口

SAADC的驱动目录在modules\nrfx\drivers\src\nrfx_saadc.c

  • nrfx_saadc_init:初始化saadc,主要配置分辨率与过采样
  • nrfx_saadc_channel_init:配置采样模式(单端、差分),通道与关联引脚
  • nrfx_saadc_buffer_convert:触发adc转换,形参为adc转换的缓存与需要转换的缓存大小

六、实例代码

saadc初始化

实例使用的工程目录为examples\peripheral\saadc saadc.eww,使用通道0,引脚为PIN2,可以修改channel_config结构修改参数

void saadc_init(void)
{
    ret_code_t err_code;
    nrf_saadc_channel_config_t channel_config =
        NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);

    err_code = nrf_drv_saadc_init(NULL, saadc_callback);
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_channel_init(0, &channel_config);//通道0
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[0], SAMPLES_IN_BUFFER);//接收缓存
    APP_ERROR_CHECK(err_code);

    err_code = nrf_drv_saadc_buffer_convert(m_buffer_pool[1], SAMPLES_IN_BUFFER);
    APP_ERROR_CHECK(err_code);

}

主函数

int main(void)
{
    uint32_t err_code = NRF_LOG_INIT(NULL);
    APP_ERROR_CHECK(err_code);

    NRF_LOG_DEFAULT_BACKENDS_INIT();

    ret_code_t ret_code = nrf_pwr_mgmt_init();
    APP_ERROR_CHECK(ret_code);

    saadc_init();
    saadc_sampling_event_init();
    saadc_sampling_event_enable();
    NRF_LOG_INFO("SAADC HAL simple example started.");

    while (1)
    {
        nrf_pwr_mgmt_run();
        NRF_LOG_FLUSH();
    }
}
### Nordic nRF52810 的硬件规格 nRF52810 是一款由 Nordic Semiconductor 推出的低功耗蓝牙 (Bluetooth Low Energy, BLE) SoC,适用于物联网设备和其他无线应用。其主要特点包括: - **处理器核心**: 基于 ARM Cortex-M0+ 架构,运行频率高达 32 MHz[^1]。 - **内存配置**: 集成了 64 KB Flash 和 16 KB RAM,适合轻量级的应用场景。 - **射频性能**: 支持 2.4 GHz ISM 波段,具有出色的灵敏度和发射功率调节能力,能够满足多种通信距离需求。 ### 开发资源与工具链支持 为了方便开发者快速上手并构建基于 nRF52810 的项目,Nordic 提供了一系列开发资源和支持文档: - **SDK 下载**: 官方提供了 nRF5 SDK,其中包含了丰富的示例代码以及外设驱动程序库。 - **开发环境搭建指南**: 参考《Nordic52810开发手记—环境安装》一文中描述的方法可以完成必要的软件设置过程。 以下是用于初始化项目的简单 C 语言模板代码片段: ```c #include "nrf.h" void clock_initialization(void){ NRF_CLOCK->TASKS_HFCLKSTART = 1; // 启动高频晶体振荡器 } int main(){ clock_initialization(); while(1){ __WFI(); // 进入等待中断模式以节省电能消耗 } } ``` 此代码展示了如何启动内部时钟源以便后续操作正常执行。 ### 使用教程概览 对于初学者而言,《Nordic52810开发手记》系列文章是一个很好的起点,它不仅介绍了基础概念还涵盖了实际动手实践部分。通过这些材料的学习可以帮助理解芯片的工作原理及其周边电路设计要点。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值