概述
CC2530 ADC学习笔记
CC2530的ADC最大支持14位(实际上为12位)的模拟数字转换。它包括一个模拟多路转换器,具有多达8个可独立配置的通道以及一个参考电压发生器。
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数据手册
最后
以上就是慈祥睫毛为你收集整理的CC2530 ADC学习笔记CC2530 ADC学习笔记的全部内容,希望文章能够帮你解决CC2530 ADC学习笔记CC2530 ADC学习笔记所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复