本博客参考https://blog.csdn.net/qq_36347513/article/details/103853796

本博客基于NRF——SDK17.0.0协议栈的ble_app_template工程添加SAADC功能。

直接上代码,下面会有ADC的介绍:

/********************************************************************** INCLUDES*/
#include "nrfx_saadc.h"
#include "nrf_drv_saadc.h"
#include "app_error.h" #include "board_adc.h"#include "nrf_log.h"static void adcCallbackFunc(nrf_drv_saadc_evt_t const* pEvent);/********************************************************************** LOCAL VARIABLES*/
static nrf_saadc_value_t s_bufferPool[SAMPLES_IN_BUFFER];/********************************************************************** PUBLIC FUNCTIONS*//**@brief ADC的初始化函数@param 无@return 无*/
void ADC_Init(void)
{ret_code_t errCode;// ADC初始化errCode = nrf_drv_saadc_init(NULL, adcCallbackFunc);APP_ERROR_CHECK(errCode);// ADC通道配置nrf_saadc_channel_config_t channelConfig = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0); // 单端输入// ADC通道初始化errCode = nrf_drv_saadc_channel_init(0, &channelConfig);APP_ERROR_CHECK(errCode);// 缓冲配置errCode = nrf_drv_saadc_buffer_convert(s_bufferPool, SAMPLES_IN_BUFFER);APP_ERROR_CHECK(errCode);
}/**@brief ADC读取@param 无@return 结果在回调函数的缓冲区中
*/
void ADC_Read(void)
{ret_code_t errCode;errCode = nrf_drv_saadc_sample();APP_ERROR_CHECK(errCode);
}/**@brief 开启ADC,与初始化没有区别,为了与Disable成对出现@param 无@return 无
*/
void ADC_Enable(void)
{ADC_Init();
}/**@brief 禁用ADC@param 无@return 无
*/
void ADC_Disable(void)
{nrfx_saadc_uninit();
}/********************************************************************** LOCAL FUNCTIONS*//**@brief ADC中断处理回调函数@param 无@return 无*/
static void adcCallbackFunc(nrf_drv_saadc_evt_t const* pEvent)
{if (pEvent->type == NRF_DRV_SAADC_EVT_DONE)                                                                   // 采样完成{nrf_saadc_value_t adcResult;uint16_t batteryVoltage;uint8_t batteryPercentage;ret_code_t errCode;// 设置好缓存,为下次转换缓冲做准备,并且把导入到缓冲的值提取出来errCode = nrf_drv_saadc_buffer_convert(pEvent->data.done.p_buffer, SAMPLES_IN_BUFFER);APP_ERROR_CHECK(errCode);adcResult = pEvent->data.done.p_buffer[0];// 电池电压转换计算batteryVoltage = ADC_RESULT_IN_MILLI_VOLTS(adcResult);}
}/****************************************************END OF FILE****************************************************/
#ifndef _BOARD_ADC_H_
#define _BOARD_ADC_H_/********************************************************************** INCLUDES*/
#include "nordic_common.h"/********************************************************************** DEFINITIONS*/
#define ADC_REF_VOLTAGE_IN_MILLIVOLTS   600                 /**< Reference voltage (in milli volts) used by ADC while doing conversion. */
#define ADC_PRE_SCALING_COMPENSATION    6                   /**< The ADC is configured to use VDD with 1/3 prescaling as input. And hence the result of conversion is to be multiplied by 3 to get the actual value of the battery voltage.*/
#define DIODE_FWD_VOLT_DROP_MILLIVOLTS  1000                    /**< Typical forward voltage drop of the diode . */
#define ADC_RES_10BIT                   1024                /**< Maximum digital value for 10-bit ADC conversion. */// VP = (RESULT * REFERENCE / 2^10) * 6
#define ADC_RESULT_IN_MILLI_VOLTS(ADC_VALUE)\((((ADC_VALUE) * ADC_REF_VOLTAGE_IN_MILLIVOLTS) / ADC_RES_10BIT) * ADC_PRE_SCALING_COMPENSATION) #define SAMPLES_IN_BUFFER             1/********************************************************************** API FUNCTIONS*/
void ADC_Init(void);
void ADC_Read(void);
void ADC_Enable(void);
void ADC_Disable(void);#endif /* _BOARD_ADC_H_ */
int main(void)
{bool erase_bonds;// Initialize./***********************************************************************************/log_init();timers_init();buttons_leds_init(&erase_bonds);Board_LED0Init();SPI_Init();ADC_Init();/***********************************************************************************/power_management_init();ble_stack_init();gap_params_init();gatt_init();advertising_init();services_init();conn_params_init();peer_manager_init();/**********************************************************************************/// Start execution.NRF_LOG_INFO("Template example started.");application_timers_start();advertising_start(erase_bonds);ADC_Disable();  // Enter main loop.for (;;){idle_state_handle();}
}

我们在卖弄函数中对ADC进行初始化操作。

接下来我们还需要打开关于ADC的宏定义

同时并在工程中添加关于SAADC的驱动库:

这两个文件分别在SDK包中的integration与modules文件夹下面

不然就会报错,说明找不到ADC初始化的某些函数

NRF52832 中 ADC 为一个 逐次逼近(SAADC) 模拟数字转换器

  • 8/10/12 位分辨率,采用过采样可以达到 14 位分辨率。
  • 多达 8 个输入通道:
    单端输入时有 1 个通道,2 个通道组成差分输入。
    单端和差分输入时可以配置成扫描模式。
  • 满量程输入范围为 0 和 VDD
  • 可以通过软件触发采样任务启动采样,也可以使用低功耗 32.768KHz 的 RTC 定时器或更精确的 1/16MHz 定时器通过 PPI 来触发采样任务。
  • NRF52832 的 SAADC 支持 单次模式和扫描模式
    单次的采集模式只使用一个采集通道。
    扫描模式是按照顺序采样一系列通道。Sample delay between channels is tack + tconv
    which may vary between channels according to user configuration of tack.
  • 通过 EasyDMA 可以直接将采样结果保存到 RAM。
  • 无需外部定时器即可实现连续采样。
  • 可配置通道输入负载电阻。
  • 具备采样值门限检测功能。
nrf_saadc_channel_config_t channelConfig = NRF_DRV_SAADC_DEFAULT_CHANNEL_CONFIG_SE(NRF_SAADC_INPUT_AIN0);   // 单端输入

用来进行ADC通道的配置

void ADC_Read(void)

此函数用来读取adc转换的结果,结果存放在回调函数的缓冲区中

adcCallbackFunc(nrf_drv_saadc_evt_t const* pEvent)

为ADC中断处理回调函数

nrf_drv_saadc_sample()启动一次ADC转换,这一次的转换包括配置的所有ADC通道的转换。

(1)在回调函数中,我们首先判断事件类型,如果时缓存区有数据事件类型才开始处理数据。

(2)p_event-> data.done.p_buffer实质就是我们开始定义的ADC数据缓冲区adc_buffer [2] [SAMPLES_IN_BUFFER],通过nrf_drv_saadc_buffer_convert()函数在初始化时绑定。

(3)不同的通道采集的数据,存放在缓存数组的不同下标元素位上存放顺序与我们使用的通道有关,低通道采集的数据存在低下标元素位上例如:。我们使用的channel_7采集电池电压,CHANNEL_1采集温度电阻,p_event-> data.done.p_buffer [0]就时CHANNEL_1转换完成的数据,p_event-> data.done.p_buffer [1]是channel_7转换完成的数据。

NRF52832 saadc相关推荐

  1. Nrf52832 SAADC

    一. 测试平台 环境:win10,64位,MDK集成开发环境.        SDK:nRF5_SDK_15.2        协议栈:s132_nrf52_6.1_softdevice.hex.   ...

  2. Nordic开发笔记

    Nordic开发问题记录 定时模块app_timer用法及常见问题-nRF5 SDK模块系列二 Nrf SDK introduce nRF52840 PCA10056基于SES的编译运行(一) nRF ...

  3. NRF52832学习笔记(33)——低功耗实现

    一.功耗模式 nRF52 上只有两种电源模式:SYSTEM_ON 和 SYSTEM_OFF 1.1 SYSTEM_ON低功耗模式 SYSTEM_ON:此状态有持续延迟和低功率子模式.当系统空闲进入 S ...

  4. nRF52832的硬件资源小结

    nRF52832是NRODIC公司推出的一款带有低功耗蓝牙功能的ARM Cortex-M4 32-bit 浮点单元处理器,64MHz时钟, 存储器有两种配置:512kB flash/64kB RAM和 ...

  5. nRF52832 之ADC的使用

    简介     实际应用中, 我们经常需要将模拟量转换为数字量供 CPU 处理,如电池电压检测.温度检测等等,对于 CPU 来说,它能处理的是数字量,所以,需要通过 A/D 转换(模数转换)将时间连续. ...

  6. nrf52832概述

    nrf52832特点 1.具有32个IO口(P0.0-P0.31),每个都可以单独访问,M4内核 2.具有8个带模拟通道的GPIO,可用于SAADC,COMP,LPCOMP输入 3.可以配置输入驱动强 ...

  7. NRF52832与W25Q80通信

    1 NRF52832SPI主机的功能描述 nRF52832SPIM的主要特征 3个SPI实例 支持SPI的模式0到模式3 支持DMA Individual selection of IO pin fo ...

  8. NRF52810能不能替代NRF52832

    NRF52810能不能替代NRF52832?答案是可以的. 主要是FALSH和RAM有点不一样. 先给大家说说他的特征 关键特性 64 MHz的手臂®Cortex-M4 192kb Flash + 2 ...

  9. nRF52 SAADC 直接操作寄存器

    #include<nrf.h> int main(void) { volatile int16_t result = 0; volatile float precise_result = ...

最新文章

  1. 高校开学需要重新分配宿舍!国家卫健委和教育部发布重要通知
  2. javaweb 之Ajax
  3. 运用深度学习教机器人理解自然语言
  4. DC的网络连接端口与防火墙设置[为企业部署Windows Server 2008系列十]
  5. visual studio code搭建本地服务器(node.js+express)
  6. office漏洞利用--获取shell
  7. html5图片长按保存,一文彻底解决HTML5页面中长按保存图片功能
  8. stl vector 函数_vector :: crbegin()函数,以及C ++ STL中的示例
  9. 链接脚本文件(*.lds)
  10. 智能云端服务器连接不了,智能云解析,智能在哪里?
  11. 软件工程学习进度第六周暨暑期学习进度之第六周汇总
  12. 【OpenCV应用】python处理行李图像匹配项目——图像(简单)清晰化
  13. 数据分析中会常犯哪些错误,如何解决? 六
  14. html下播放.wav,wav格式文件用什么播放
  15. 如何落户北京?19年积分落户规模为6000人!
  16. 报错 Illegal instruction
  17. CITA v0.15 Release
  18. windows下载并安装JDK
  19. Cacti登录密码忘记,重置Cacti密码
  20. 手把手带你快速入门Electron

热门文章

  1. 【无标题】手写输入文字时,文本框输入最后一个汉字会丢失
  2. OpenCV-图像梯度 sobel算子
  3. 新闻发布系统——用例图知识,温故知新
  4. 《下一个倒下的会不会是华为》读后感
  5. 最新版k8s 1.25版本安装
  6. jsp中的表单form action指向servlet类
  7. OJ刷题(LeetCode) day03| 猴子爬山
  8. 移动web开发,ios下移除input默认样式
  9. 偷偷爆料下各公司年终奖情况!(1.30 日最新版)
  10. 【python】列出http://www.cnblogs.com/xiandedanteng中所有博文的标题