我是靠谱客的博主 慈祥睫毛,最近开发中收集的这篇文章主要介绍CC2530 ADC学习笔记CC2530 ADC学习笔记,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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

寄存器名称寄存器介绍
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;
}

二、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;
}

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]. CC2530数据手册

最后

以上就是慈祥睫毛为你收集整理的CC2530 ADC学习笔记CC2530 ADC学习笔记的全部内容,希望文章能够帮你解决CC2530 ADC学习笔记CC2530 ADC学习笔记所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(47)

评论列表共有 0 条评论

立即
投稿
返回
顶部