美文网首页物联网loT从业者物联网相关技术研究
CC2640R2F学习笔记(27)——ADC使用

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

作者: Leung_ManWah | 来源:发表于2019-11-12 18:16 被阅读0次

    一、简介

    • 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.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_AUXIO7
    
    typedef 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 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_t electricArr[2];
    uint16_t electricAdcValue = ADC_Read();
    *(electricArr + 1) = (uint8)(0xFF & electricAdcValue);
    *(electricArr) = (uint8)((0xFF00 & electricAdcValue) >> 8);
    

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

    uint8_t electricArr[4];
    uint32_t electricAdcValue = ADC_OneShotRead();
    *(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

    相关文章

      网友评论

        本文标题:CC2640R2F学习笔记(27)——ADC使用

        本文链接:https://www.haomeiwen.com/subject/ffmqictx.html