一、简介
- 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_AUXIO7 | DIO_7 |
ADC_COMPB_IN_AUXIO6 | DIO_8 |
ADC_COMPB_IN_AUXIO5 | DIO_9 |
ADC_COMPB_IN_AUXIO4 | DIO_10 |
ADC_COMPB_IN_AUXIO3 | DIO_11 |
ADC_COMPB_IN_AUXIO2 | DIO_12 |
ADC_COMPB_IN_AUXIO1 | DIO_13 |
ADC_COMPB_IN_AUXIO0 | DIO_14 |
三、移植文件
链接:https://pan.baidu.com/s/1y1n-glWsh-Sl6yt-PZoX_A 提取码:b0z6
将 board_adc.c 、 board_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