9

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

 2 years ago
source link: https://blog.51cto.com/u_11822586/5342422
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

第一章 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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK