0
点赞
收藏
分享

微信扫一扫

#导入Word文档图片# CC2530 ADC配置步骤


第一章 A/D转换的基本工作原理

将时间上连续变化的模拟量转化为脉冲有无的数字量,这一过程就叫做数字化,实现数字化的关键设备是ADC。

ADC:数模转换器,将时间和幅值连续的模拟量转化为时间和幅值离散的数字量,A/D转换一般要经过采样、保持、量化和编码4个过程。

#导入Word文档图片# CC2530 ADC配置步骤_差分

第二章 CC2530的A/D转换模块

CC2530的ADC模块支持最高14位二进制的模拟数字转换,具有12位的有效数据位,它包括一个模拟多路转换器,具有8个各自可配置的通道,以及一个参考电压发生器。

#导入Word文档图片# CC2530 ADC配置步骤_引脚_02

该ADC模块有如下主要特征:

<1> 可选取的抽取率,设置分辨率(7~12位)。

<2> 8个独立的输入通道,可接收单端或差分信号。

<3> 参考电压可选为内部单端、外部单端、外部差分或AVDD5。

<4> 单通道转换结束可产生中断请求。

<5> 序列转换结束可发出DMA触发。

<6> 可将片内温度传感器作为输入。

<7> 电池电压测量功能。


第三章 ADC模块的信号输入

端口0引脚可以配置为ADC输入端,依次为AIN0~AIN7:

<1> 可以把输入配置为单端输入或差分输入。

<2> 差分输入对:AIN0~AIN1、AIN2~AIN3、AIN4~AIN5、AIN6~AIN7。

<3> 片上温度传感器的输出也可以作为ADC的输入用于测量芯片的温度。

<4> 可以将一个对应AVDD5/3的电压作为ADC输入,实现电池电压监测。

<5> 负电压和大于VDD的电压都不能用于这些引脚。

<6> 单端电压输入AIN0~AIN7,以通道号码0~7表示;四个差分输入对则以 通道号码8~11表示;温度传感器的通道号码为14;AVDD5/3电压输入的通道号码为15。

第四章 ADC相关的几个概念

<1> 序列ADC转换:可以按序列进行多通道的ADC转换,并把结果通过DMA传送到存储器,而不需要CPU任何参与。

<2> 单通道ADC转换:在程序设计中,通过写ADCCON3寄存器触发单通道ADC转换,一旦寄存器被写入,转换立即开始。

<3> 参考电压:内部生成的电压、AVDD5引脚、适用于AIN7输入引脚的外部电压,或者 适用于AIN6~AIN7输入引脚的差分电压。

<4> 转换结果:数字转换结果以2的补码形式表示。对于单端,结果总是正的。对于差分配置,两个引脚之间的差分被转换,可以是负数。 当ADCCON1.EOC设置为1时,数字转换结果可以获得,且结果总是驻留在ADCH和ADCL寄存器组合的MSB段中。

<5> 中断请求:通过写ADCCON3触发一个单通道转换完成时,将产生一个中断,而完成 一个序列转换时,是不产生中断的。当每完成一个序列转换,ADC将产生 一个DMA触发。

<6> 寄存器:ADC有两个数据寄存器:ADCL和ADCH;三个控制寄存器:ADCCON1、ADCCON2、ADCCON3;分别用来配置ADC并返回转换结果。


第五章ADC配置步骤

【1】配置APCFG寄存器

当使用ADC时,端口0的引脚必须配置为ADC模拟输入。要配置一个端口0引脚为一个ADC输入,APCFG寄存器中相应的位必须设置为1。这个寄存器的默认值是0,选择端口0为非模拟输入,即作为数字I/O端口。

注意:寄存器的设置将覆盖P0SEL的设置。

#导入Word文档图片# CC2530 ADC配置步骤_寄存器_03

【2】配置ADCCON3寄存器

单通道的ADC转换,只需将控制字写入ADCCON3寄存器即可。

#导入Word文档图片# CC2530 ADC配置步骤_寄存器_04

#导入Word文档图片# CC2530 ADC配置步骤_引脚_05

【3】ADC初始化

主要对端口的功能进行选择,设置其传输方向,并将端口设置为模拟输入。

【4】ADC数据采集

首先将ADCIF标志位清0,接着对ADCCON3寄存器设置,该寄存器一旦被写入,转换立即开启;然后等待ADCIF置1,这时候转换完成,读取数据即可。

【5】源代码

#include "ioCC2530.h"

/*===============定时器1初始化函数==================*/

void Init_Timer1()

{

T1CC0L = 0xd4; //设置最大计数值的低8位

T1CC0H = 0x30; //设置最大计数值的高8位

T1CCTL0 |= 0x04; //开启通道0的输出比较模式

T1IE = 1; //使能定时器1中断

T1OVFIM = 1; //使能定时器1溢出中断

EA = 1; //使能总中断

T1CTL = 0x0e; //分频系数是128,模模式

}

unsigned char count = 0;

unsigned char F_time = 0;

/*================定时器1服务函数====================*/

#pragma vector = T1_VECTOR

__interrupt void Timer1_Sevice()

{

T1STAT &= ~0x01; //清除定时器1通道0中断标志

count++;

if(count == 10) //定时1秒到

{

F_time = 1;

count = 0;

}

}

/*===================UR0初始化函数====================*/

void Init_Uart0()

{

PERCFG = 0x00; //串口0的引脚映射到位置1,即P0_2和P0_3

P0SEL = 0x0C; //将P0_2和P0_3端口设置成外设功能

U0BAUD = 59; //16MHz的系统时钟产生9600BPS的波特率

U0GCR = 9;

U0UCR |= 0x80; //禁止流控,8位数据,清除缓冲器

U0CSR |= 0xC0; //选择UART模式,使能接收器

UTX0IF = 0; //清除TX发送中断标志

URX0IF = 0; //清除RX接收中断标志

URX0IE = 1; //使能URAT0的接收中断

EA = 1; //使能总中断

}

unsigned char dat[4];

/*===================UR0发送字符串函数==================*/

void UR0SendString(unsigned char *str, unsigned char count)

{

while(count--)

{

U0DBUF = *str++; //将要发送的1字节数据写入U0DBUF

while(!UTX0IF); //等待TX中断标志,即数据发送完成

UTX0IF = 0;

}

}

/*===================ADC初始化函数====================*/

void Init_ADC0()

{

P0SEL |= 0x01; //P0_0端口设置为外设功能

P0DIR &= ~0x01; //P0_0端口设置为输入端口

APCFG |= 0x01; //P0_0作为模拟I/O使用

}

/*===================读取ADC的数据====================*/

void Get_ADC0_Value()

{

ADCIF = 0;

//参考电压选择AVDD5引脚,256抽取率,AIN0通道0

ADCCON3 = (0x80 | 0x10 | 0x00);

while(!ADCIF); //等待A/D转换完成,

dat[0] = 0xaf;

dat[1] = ADCH; //读取ADC数据低位寄存器

dat[2] = ADCL; //读取ADC数据高位寄存器

dat[3] = 0xfa;

}

/*=======================主函数======================*/

void main()

{

Init_Uart0();

Init_Timer1();

Init_ADC0();

while(1)

{

if(F_time == 1) //定时1秒时间到

{

Get_ADC0_Value(); //进行A/D转换并读取数据

UR0SendString(dat,4); //向上位机发送数据

F_time = 0; //定时1秒标志清0

}

}

}


举报

相关推荐

0 条评论