CC2530 ADC学习笔记

CC2530 ADC学习笔记

CC2530的ADC最大支持14位(实际上为12位)的模拟数字转换。它包括一个模拟多路转换器,具有多达8个可独立配置的通道以及一个参考电压发生器。
ADC框图如下所示:

由图中可知CC2530的AD有多种输入通道如AIN0~AIN7、VDD/3、温度传感器等。
CC2530的采样精度有7Bit、9Bit、10Bit、12Bit四种,可通过对ADCCON2寄存器、ADCCON3寄存器进行配置来改变ADC的采样精度。

一、GPIO配置

由于ADC的AIN引脚设定在P0端口,因此需要对P0端口的寄存器进行配置。需要配置的寄存器有:APCFG寄存器、P0SEL寄存器、P0DIR寄存器(CC2530的GPIO默认情况下为输入状态)。

寄存器名称 寄存器介绍
APCFG P0.0~P0.7模拟IO功能配置
P0SEL P0.0~P0.7外设功能选择
P0DIR P0.0~P0.7引脚方向

注:P0.0对应AIN0, P0.7对应AIN7;

例程:

/** ADC AIN通道引脚定义 */
#define USE_P0_0_AS_ADC_CH0 (0x01)
#define USE_P0_1_AS_ADC_CH1 (0x02)
#define USE_P0_2_AS_ADC_CH2 (0x04)
#define USE_P0_3_AS_ADC_CH3 (0x08)
#define USE_P0_4_AS_ADC_CH4 (0x10)
#define USE_P0_5_AS_ADC_CH5 (0x20)
#define USE_P0_6_AS_ADC_CH6 (0x40)
#define USE_P0_7_AS_ADC_CH7 (0x80)

/**
 *******************************************************************************
 * @brief   ADC通道初始化函数
 * @param   [in/out]  channel    初始化通道
 * @return  [in/out]  void
 * @note    NONE
 *******************************************************************************
 */
void MCU_ADC_CH_Init( uint8 channel )
{
    APCFG |= channel;
    P0SEL |= channel;
    //P0DIR &= ~channel;
    //P0INP |= channel;
}

二、ADC配置

ADC有6个控制寄存器,它们分别是:ADCL寄存器、ADCH寄存器、ADCCON1寄存器、ADCCON2寄存器、ADCCON3寄存器、TR0寄存器。

1. ADC数据寄存器介绍

ADCL寄存器和ADCH寄存器保存的是AD转换完成的结果,数据以2的补码形式表现。下表为采样精度与有效数据解析表:

采样精度 有效数据(从低到高)
7 Bit ADCH寄存器的第0位到第6位
9 Bit ADCL寄存器的第6位到ADCH寄存器的第6位
10 Bit ADCL寄存器的第5位到ADCH寄存器的第6位
12 Bit ADCL寄存器的第3位到ADCH寄存器的第6位

例程

/**
 *******************************************************************************
 * @brief       读取AD转换数值
 * @param       [in/out]  void
 * @return      [in/out]  bool    程序运行状态
 * @note        ADC工作在单次转换模式
 *******************************************************************************
 */
bool Rd_ADC_Data( uint16 *data, uint8 convert_bit )
{
    uint16 temp = (uint16)(ADCH << 8);
    temp |= (uint16)ADCL;

    if( !MCU_ADC_FLAG )
    {
        return false;
    }

    switch(convert_bit)
    {
        case ADC_CONVERT_7BIT:
            temp >>= 8;
            *data = temp & ~(1 << 8);
            break;
        case ADC_CONVERT_9BIT:
            temp >>= 5;
            *data = temp & ~(1 << 10);
            break;
        case ADC_CONVERT_10BIT:
            temp >>= 4;
            *data = temp & ~(1 << 11);
            break;
        case ADC_CONVERT_12BIT:
            temp >>= 2;
            *data = temp & ~(1 << 13);
            break;
        default:
            return false;
            break;
    }

    return true;
}

2. ADCCON1寄存器介绍

名称 功能介绍 占用空间 参数枚举
EOC ADC转换完成标志 1 Bit -
- - - 0(转换未完成)
- - - 1(转换完成)
ST 软件开启转换位 1 Bit -
- - - 0(ADC没有转换任务)
- - - 1(软件触发ADC转换信号)
STSEL 配置AD转换触发信号 2 Bit
- - - 00(P2.0引脚触发AD转换)
- - - 01(ADC一直处于转换状态,不等待触发信号)
- - - 10(定时器0通道1比较事件触发AD转换)
- - - 11(ST触发AD转换)
RCTRL 控制16位随机数发生器 2 Bit 不介绍
- 保留 2 Bit -

3. ADCCON2、ADCCON3寄存器介绍

名称 功能介绍 占用空间 参数枚举
REF ADC转换参考电压 2 Bit -
- - - 00(使用内部参考电压)
- - - 01(使用AIN7引脚上的外部点电压作为参考电压)
- - - 10(使用AVDD5作为参考电压)
- - - 11(使用AIN6-AIN7差分输入外部电压作为参考电压)
DIV ADC转换抽取率(转换时间和转换精度) 2 Bit -
- - - 00(转换精度为7)
- - - 01(转换精度为9)
- - - 10(转换精度为10)
- - - 11(转换精度为12)
CH ADC采样通道 4 Bit -
- - - 0000(配置ADC采样通道为AIN0)
- - - 0001(配置ADC采样通道为AIN1)
- - - 0010(配置ADC采样通道为AIN2)
- - - 0011(配置ADC采样通道为AIN3)
- - - 0100(配置ADC采样通道为AIN4)
- - - 0101(配置ADC采样通道为AIN5)
- - - 0110(配置ADC采样通道为AIN6)
- - - 0111(配置ADC采样通道为AIN7)
- - - 1000(配置ADC采样通道为AIN0-AIN1电压)
- - - 1001(配置ADC采样通道为AIN2-AIN3电压)
- - - 1010(配置ADC采样通道为AIN4-AIN5电压)
- - - 1011(配置ADC采样通道为AIN6-AIN7电压)
- - - 1100(GND)
- - - 1101(正参考电压)
- - - 1110(温度传感器)
- - - 1111(VDD/3)

配置ADCCON2寄存器完成循环AD转换,配置ADCCON3寄存器完成单次AD转换。

例程:

// AD参考电压配置
#define ADC_SREF_VREF       (0x00)
#define ADC_SREF_AIN7       (0x01)
#define ADC_SREF_AVDD       (0x02)
#define ADC_SREF_AIN6_AIN7  (0x03)

// AD转换精度
#define ADC_CONVERT_7BIT    (0x00)
#define ADC_CONVERT_9BIT    (0x10)
#define ADC_CONVERT_10BIT   (0x20)
#define ADC_CONVERT_12BIT   (0x30)

// AD转换通道
#define ADC_CONVERT_CH0     (0x00)
#define ADC_CONVERT_CH1     (0x01)
#define ADC_CONVERT_CH2     (0x02)
#define ADC_CONVERT_CH3     (0x03)
#define ADC_CONVERT_CH4     (0x04)
#define ADC_CONVERT_CH5     (0x05)
#define ADC_CONVERT_CH6     (0x06)
#define ADC_CONVERT_CH7     (0x07)
// AD转换差分输入信号
#define ADC_CONVERT_CH0_CH1 (0x08)
#define ADC_CONVERT_CH2_CH3 (0x09)
#define ADC_CONVERT_CH4_CH5 (0x0A)
#define ADC_CONVERT_CH6_CH7 (0x0B)
// AD转换其它信号
#define ADC_CONVERT_GND     (0x0C)
#define ADC_CONVERT_VREF    (0x0D)
#define ADC_CONVERT_TEMP    (0x0E)
#define ADC_CONVERT_VDD_3   (0x0F)

// 启动ADC转换
#define MCU_ADC_START()     ( ADCCON1 |= 0x70 )
// ADC转换完成标识
#define MCU_ADC_FLAG        ( ADCCON1 & 0x80 )
// 使能AD转换中断
#define enable_adc_isr()    (IEN0 |= 0x02)
//失能AD转换中断
#define disable_adc_isr()   (IEN0 &= ~0x02)

/**
 *******************************************************************************
 * @brief       ADC启动单次转换函数
 * @param       [in/out]  channel        转换通道
 * @param       [in/out]  convert_bit    转换数据打小
 * @return      [in/out]  void
 * @note        None
 *******************************************************************************
 */
void MCU_ADC_SIGNAL_START( uint8 adc_ref, uint8 channel, uint8 convert_bit )
{
    ADCCON3 = adc_ref | channel | convert_bit;
    enable_adc_isr();
    MCU_ADC_START();
}

三、参考资料

[1]. CC2530数据手册

猜你喜欢

转载自blog.csdn.net/qq_15647227/article/details/53393253