一、簡介
- 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 ADC_Read(void)
{
uint16 adcResult;
s_adcConfig[BOARD_ADCCHANNEL7].fxnTablePtr->convertFxn(s_adcHandle, &adcResult);
return adcResult;
}
/**
@brief ADC短暫讀取
@param 無
@return 讀取電壓值
*/
uint32 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 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_AUXIO7
typedef enum
{
BOARD_ADCCHANNEL7 = 0,
BOARD_ADCDCOUPL,
BOARD_ADCVSS,
BOARD_ADCVDDS,
BOARD_ADCCOUNT
} Board_ADCName_t;
/*********************************************************************
* API FUNCTIONS
*/
void ADC_Init(void);
uint16 ADC_Read(void);
uint32 Adc_OneShotRead(void);
#endif /* _BOARD_ADC_H_ */
四、API調用
需包含頭文件 board_adc.h
ADC_Init
功能 | ADC的初始化函數 |
---|---|
函數定義 | void ADC_Init(void) |
參數 | 無 |
返回 | 無 |
ADC_Read
功能 | ADC讀取,需在ADC_Init初始化後 |
---|---|
函數定義 | uint16 ADC_Read(void) |
參數 | 無 |
返回 | 讀取電壓值 |
Adc_OneShotRead
功能 | ADC讀取,無需ADC_Init初始化 |
---|---|
函數定義 | uint32 Adc_OneShotRead(void) |
參數 | 無 |
返回 | 讀取電壓值 |
五、使用例子
1)添加頭文件(例simple_peripheral.c中)
#include "board_adc.h"
2)添加初始化代碼(simple_peripheral.c的SimplePeripheral_init函數末尾中)
ADC_Init();
3)在定時器回調或按鍵回調中 讀取電壓值(使用Adc_Read())
uint8 electricArr[2];
uint16 electricAdcValue = Adc_Read();
*(electricArr + 1) = (uint8)(0xFF & electricAdcValue);
*(electricArr) = (uint8)((0xFF00 & electricAdcValue) >> 8);
4)在定時器回調或按鍵回調中 讀取電壓值(使用Adc_OneShotRead())
uint8 electricArr[4];
uint32 electricAdcValue = Adc_Read();
*(electricArr + 3) = (uint8)(0xFF & electricAdcValue);
*(electricArr + 2) = (uint8)((0xFF00 & electricAdcValue) >> 8);
*(electricArr + 1) = (uint8)((0xFF0000 & electricAdcValue) >> 16);
*(electricArr) = (uint8)((0xFF000000 & electricAdcValue) >> 24);
• 由 Leung 寫於 2019 年 11 月 12 日
• 參考:CC2640R2F ADC設置(基於SDK 1.40版本 替代ADC_open)
CC2640R2F 之ADC驅動實現及源碼
ADCCC26XX.h File Reference