CC2640R2F学习笔记(27)——ADC使用

news/2024/12/29 21:38:41/

一、简介

  • CC2640R2F 的 ADC 是几位的、几个通道的?

12 位模数转换器 (ADC)、200MSPS、8 通道模拟多路复用器。

  • 使用的是什么参考源?

参考源有两种,一种是内部的固定 4.3V 参考源,一种是内部的电池电压。
本文采用的 4.3V 固定参考源,因为如果参考源使用电池,一旦电池电量下降将影响 ADC 的准确性。

  • ADC 的 8 个通道分别为什么引脚?

  • 假设读到的是 0XC00(十进制是 3072),代表 ADC 采集的是几 V 电压?

CC2640R2F 的 ADC 是 12 位的,也就是 4096,本文使用的是 4.3V 固定参考电压。
所以 4096/4.3=3072/x,则 x=3.225。
表示 ADC 采集的是 3.225V 电压。

二、硬件连接

5x5芯片

功能口引脚
ADC_COMPB_IN_AUXIO7DIO_7
ADC_COMPB_IN_AUXIO6DIO_8
ADC_COMPB_IN_AUXIO5DIO_9
ADC_COMPB_IN_AUXIO4DIO_10
ADC_COMPB_IN_AUXIO3DIO_11
ADC_COMPB_IN_AUXIO2DIO_12
ADC_COMPB_IN_AUXIO1DIO_13
ADC_COMPB_IN_AUXIO0DIO_14

三、移植文件

链接:https://pan.baidu.com/s/1y1n-glWsh-Sl6yt-PZoX_A 提取码:b0z6
board_adc.cboard_adc.h 两个文件拖拽至CCS工程的Application文件夹下

添加文件过程中,选项选择如下

3.1 board_adc.c

/********************************************************************** INCLUDES*/
#include "_hal_types.h"
#include <ti/drivers/adc/ADCCC26XX.h>
#include <ti/drivers/pin/PINCC26XX.h>
#include <driverlib/aux_adc.h>
#include <driverlib/aux_wuc.h>#include "board_adc.h"/********************************************************************** LOCAL VARIABLES*/
static ADCCC26XX_Object s_adcCC26XXObject[BOARD_ADCCOUNT];static const ADCCC26XX_HWAttrs s_adcCC26XXHWAttrs[BOARD_ADCCOUNT] =
{{.adcDIO = BATTERY_ADC_IO,  // DIO_7.adcCompBInput = ADC_COMPB_IN_AUXIO7,.refSource = ADCCC26XX_FIXED_REFERENCE,.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,.inputScalingEnabled = true,.triggerSource = ADCCC26XX_TRIGGER_MANUAL,.returnAdjustedVal = 0},{.adcDIO = PIN_UNASSIGNED,.adcCompBInput = ADC_COMPB_IN_DCOUPL,.refSource = ADCCC26XX_FIXED_REFERENCE,.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,.inputScalingEnabled = true,.triggerSource = ADCCC26XX_TRIGGER_MANUAL,.returnAdjustedVal = 0},{.adcDIO = PIN_UNASSIGNED,.adcCompBInput = ADC_COMPB_IN_VSS,.refSource = ADCCC26XX_FIXED_REFERENCE,.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,.inputScalingEnabled = true,.triggerSource = ADCCC26XX_TRIGGER_MANUAL,.returnAdjustedVal = 0},{.adcDIO = PIN_UNASSIGNED,.adcCompBInput = ADC_COMPB_IN_VDDS,.refSource = ADCCC26XX_FIXED_REFERENCE,.samplingDuration = ADCCC26XX_SAMPLING_DURATION_2P7_US,.inputScalingEnabled = true,.triggerSource = ADCCC26XX_TRIGGER_MANUAL,.returnAdjustedVal = 0}
};static const ADC_Config s_adcConfig[BOARD_ADCCOUNT] =
{{&ADCCC26XX_fxnTable,&s_adcCC26XXObject[BOARD_ADCCHANNEL7],&s_adcCC26XXHWAttrs[BOARD_ADCCHANNEL7]},{&ADCCC26XX_fxnTable,&s_adcCC26XXObject[BOARD_ADCDCOUPL],&s_adcCC26XXHWAttrs[BOARD_ADCDCOUPL]},{&ADCCC26XX_fxnTable,&s_adcCC26XXObject[BOARD_ADCVSS],&s_adcCC26XXHWAttrs[BOARD_ADCVSS]},{&ADCCC26XX_fxnTable,&s_adcCC26XXObject[BOARD_ADCVDDS],&s_adcCC26XXHWAttrs[BOARD_ADCVDDS]},
};// ADC句柄及参数
static ADC_Handle s_adcHandle;
static ADC_Params s_adcParams;/********************************************************************** PUBLIC FUNCTIONS*/
/**@brief ADC的初始化函数@param 无@return 无
*/
void ADC_Init(void)
{ADC_Params_init(&s_adcParams);s_adcParams.isProtected = TRUE;s_adcConfig[BOARD_ADCCHANNEL7].fxnTablePtr->closeFxn((ADC_Handle)&s_adcConfig[BOARD_ADCCHANNEL7]);s_adcHandle = s_adcConfig[BOARD_ADCCHANNEL7].fxnTablePtr->openFxn((ADC_Handle)&s_adcConfig[BOARD_ADCCHANNEL7],&s_adcParams);
}/**@brief ADC读取@param 无@return 读取电压值
*/
uint16_t ADC_Read(void)
{uint16_t adcResult;s_adcConfig[BOARD_ADCCHANNEL7].fxnTablePtr->convertFxn(s_adcHandle, &adcResult);return adcResult;
}/**@brief ADC短暂读取@param 无@return 读取电压值
*/
uint32_t ADC_OneShotRead(void)
{AUXWUCClockEnable(AUX_WUC_MODCLKEN0_ANAIF_M | AUX_WUC_MODCLKEN0_AUX_ADI4_M);AUXADCSelectInput(ADC_COMPB_IN_AUXIO7);AUXADCEnableSync(AUXADC_REF_FIXED, AUXADC_SAMPLE_TIME_2P7_US, AUXADC_TRIGGER_MANUAL);AUXADCGenManualTrigger();uint32_t adcValue = AUXADCReadFifo();AUXADCDisable();return adcValue;
}

3.2 board_adc.h

#ifndef _BOARD_ADC_H_
#define _BOARD_ADC_H_/********************************************************************** INCLUDES*/
#include "_hal_types.h"/********************************************************************** DEFINITIONS*/
#define BATTERY_ADC_IO              IOID_7
#define ADC_CHANNEL_IOID7           ADC_COMPB_IN_AUXIO7typedef enum
{BOARD_ADCCHANNEL7 = 0,BOARD_ADCDCOUPL,BOARD_ADCVSS,BOARD_ADCVDDS,BOARD_ADCCOUNT
} Board_ADCName_t;/********************************************************************** API FUNCTIONS*/
void ADC_Init(void);
uint16_t ADC_Read(void);
uint32_t ADC_OneShotRead(void);#endif /* _BOARD_ADC_H_ */

四、API调用

需包含头文件 board_adc.h

ADC_Init

功能ADC的初始化函数
函数定义void ADC_Init(void)
参数
返回

ADC_Read

功能ADC读取,需在ADC_Init初始化后
函数定义uint16_t ADC_Read(void)
参数
返回读取电压值

ADC_OneShotRead

功能ADC读取,无需ADC_Init初始化
函数定义uint32_t ADC_OneShotRead(void)
参数
返回读取电压值

五、使用例子

1)添加头文件(例simple_peripheral.c中)

#include "board_adc.h"

2)添加初始化代码(simple_peripheral.c的SimplePeripheral_init函数末尾中)

ADC_Init(); 

3)在定时器回调或按键回调中 读取电压值(使用ADC_Read())

uint8_t electricArr[2];
uint16_t electricAdcValue = ADC_Read();
*(electricArr + 1) = (uint8_t)(0xFF & electricAdcValue);
*(electricArr) = (uint8_t)((0xFF00 & electricAdcValue) >> 8);

4)在定时器回调或按键回调中 读取电压值(使用ADC_OneShotRead())

uint8_t electricArr[4];
uint32_t electricAdcValue = ADC_OneShotRead();
*(electricArr + 3) = (uint8_t)(0xFF & electricAdcValue);
*(electricArr + 2) = (uint8_t)((0xFF00 & electricAdcValue) >> 8);
*(electricArr + 1) = (uint8_t)((0xFF0000 & electricAdcValue) >> 16);
*(electricArr) = (uint8_t)((0xFF000000 & electricAdcValue) >> 24);

• 由 Leung 写于 2019 年 11 月 12 日

• 参考:CC2640R2F ADC设置(基于SDK 1.40版本 替代ADC_open)
    CC2640R2F 之ADC驱动实现及源码
    ADCCC26XX.h File Reference


http://www.ppmy.cn/news/481908.html

相关文章

RFSoC应用笔记 - RF数据转换器 -06- RFSoC关键配置之RF-ADC内部解析(四)

前言 RFSoC中最重要的部分是射频直采ADC和DAC的配置&#xff0c;因此了解内部相关原理结构可以帮助我们更好理解相关功能配置参数含义。本文参考官方手册&#xff0c;主要对RFSoC ADC的可编程逻辑数据接口、多频带操作、以及奈奎斯特区的操作进行介绍。 文章目录 前言RF-ADC …

Stm32f103 ADC 学习笔记

原文地址为&#xff1a; Stm32f103 ADC 学习笔记 在做有AD模块项目的时候遇到几个问题&#xff1a; 1&#xff0c; ADC配合DMA采样规则是怎样的。 2&#xff0c; ADC在DMA采可否不连续采样&#xff0c;以提高有效采样使用率和降低功耗。 3&#xff0c; 如何提高有效利用…

Zynq Ultrascale+ RF Data Coverter IP配置 - ADC

Zynq Ultrascale RF Data Coverter IP配置中的有关概念-ADC ADC xczu28dr-ffvg1517-2共有8个ADC,分布在4个Tile上&#xff0c;图为tile225&#xff0c;另外三个tile为226、227、228 4个tile各自拥有一个独立的PLL。2个12bit/DAC,2个mixer&#xff0c;Tile中的mixer是用于I/Q混…

单片机ADC0808,DAC0832信号发生器

1. 设计内容和设计要求 1.1 设计内容 利用AT89C52单片机、DAC0832、ADC0808设计信号发生器&#xff0c;能够产生固定幅值的方波、锯齿波、三角波及正弦波。要求能够调节信号的幅度及频率&#xff0c;并在波形切换过程中&#xff0c;能够给予相应的指示。其中幅值采用DAC0832进行…

linux adc时钟设置,linux设备驱动归纳总结(十三):1.触摸屏与ADC时钟

linux设备驱动归纳总结(十三)&#xff1a;1.触摸屏与ADC时钟 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 这节的内容说不上是驱动&#xff0c;只是写个代码让触摸屏能够工作&#xff0c;随便介绍一下时钟子系统(我不知道这样叫合…

10个ADC滤波算法

1、限幅滤波法&#xff08;又称程序判断滤波法&#xff09; A、方法&#xff1a; 根据经验判断,确定两次采样允许的最大偏差值&#xff08;设为A&#xff09;每次检测到新值时判断&#xff1a; 如果本次值与上次值之差<A,则本次值有效 如果本次值与上次值之差>A,则…

9、ADC

1、12位ADC是一种逐次逼近型模拟数字转换器。 它有多达18个通道&#xff0c;可测量16个外部和2个内部信号源。 各通道的A/D转换可以单次、连续、扫描或间断模式执行。 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中。 模拟看门狗特性允许应用程序检测输入…

震旦adc225扫描到u盘_复印机扫描安装设置

网络扫描设置与使用简易操作手册 复印机扫描到电脑安装视频 网络扫描设置与使用 一.复印机端设置IP地址、子网掩码、网关: 1. 先按操作面板上的“效用/计数器”键 2.按“管理员管理”键 3.输入管理员密码,默认为“00000000”然后按“输入” 4.选择“管理员2” 5.选择“网…