(转)CC2530 ADC学习笔记

(转自) http://blog.csdn.net/qq_15647227/article/details/53393253

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默认情况下为输入状态)。

寄存器名称寄存器介绍
APCFGP0.0~P0.7模拟IO功能配置
P0SELP0.0~P0.7外设功能选择
P0DIRP0.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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

二、ADC配置

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

1. ADC数据寄存器介绍

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

采样精度有效数据(从低到高)
7 BitADCH寄存器的第0位到第6位
9 BitADCL寄存器的第6位到ADCH寄存器的第6位
10 BitADCL寄存器的第5位到ADCH寄存器的第6位
12 BitADCL寄存器的第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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

2. ADCCON1寄存器介绍

名称功能介绍占用空间参数枚举
EOCADC转换完成标志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寄存器介绍

名称功能介绍占用空间参数枚举
REFADC转换参考电压2 Bit-
---00(使用内部参考电压)
---01(使用AIN7引脚上的外部点电压作为参考电压)
---10(使用AVDD5作为参考电压)
---11(使用AIN6-AIN7差分输入外部电压作为参考电压)
DIVADC转换抽取率(转换时间和转换精度)2 Bit-
---00(转换精度为7)
---01(转换精度为9)
---10(转换精度为10)
---11(转换精度为12)
CHADC采样通道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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

三、参考资料

[1]. CC2530数据手册

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值