【CC2530入门教程-06】CC2530 ADC工作原理及应用
将随时间连续变化的模拟量转换为有或无脉冲的数字量的过程称为数字化,实现数字化的关键器件是ADC。CC2530的ADC模块支持高达14位二进制模数转换,具有12个有效数据位,并且包括一个具有8个可单独配置通道的模拟多路复用器和一个参考电压发生器。8 个独立输入通道接受单端或差分信号。参考电压可选择内部单端、外部单端、外部差分或AVDD5。当 ADCCON1.EOC 设置为 1 时,数字转换结果可用,并且始终驻留在组合的 ADCH 和 ADCL 寄存器的 MSB 段中。寄存器:ADC有两个数据寄存器:ADCL和ADCH; 三个控制寄存器:ADCCON1、ADCCON2、ADCCON3; 分别用于配置ADC并返回转换结果。对于单通道 ADC 转换,只需将控制字写入 ADCCON3 寄存器即可。
第六课 CC2530的ADC工作原理及应用
广东职业技术学院欧浩源
1.A/D转换的基本工作原理
将随时间连续变化的模拟量转换为有或无脉冲的数字量的过程称为数字化,实现数字化的关键器件是ADC。
ADC:数模转换器,将时间和幅度连续的模拟量转换为时间和幅度离散的数字量。 A/D转换一般要经过采样、保持、量化和编码四个过程。
2、CC2530的A/D转换模块
CC2530的ADC模块支持高达14位二进制模数转换,具有12个有效数据位,并且包括一个具有8个可单独配置通道的模拟多路复用器和一个参考电压发生器。
ADC模块具有以下主要特点:
可选择抽取率,设置分辨率(7~12 位)。
8 个独立输入通道接受单端或差分信号。
参考电压可选择内部单端、外部单端、外部差分或AVDD5。
单通道转换结束时可以生成中断请求。
DMA 触发可以在序列转换结束时发出。
片上温度传感器可用作输入。
电池电压测量功能。
3、ADC模块信号输入
端口0引脚可配置为ADC输入端,依次为AIN0~AIN7:
输入可配置为单端或差分输入。
差分输入对:AIN0~AIN1、AIN2~AIN3、AIN4~AIN5、AIN6~AIN7。
片上温度传感器的输出也可以用作ADC的输入来测量芯片的温度。
AVDD5/3对应的电压可以作为ADC输入,实现电池电压监控。
这些引脚上不能使用负电压和大于 VDD 的电压。
单端电压输入AIN0~AIN7用通道号0~7表示; 四个差分输入对用通道号8~11表示; 温度传感器通道数为14; AVDD5/3电压输入通道数为15。
四、ADC相关的几个概念
顺序ADC转换:多通道ADC转换可以顺序进行,结果通过DMA传输到内存,无需CPU的任何参与。
单通道ADC转换:在程序设计中,单通道ADC转换是通过写ADCCON3寄存器来触发的。 一旦寄存器被写入,转换立即开始。
参考电压:内部产生的电压、AVDD5 引脚、AIN7 输入引脚的外部电压或 AIN6~AIN7 输入引脚的差分电压。
转换结果:数字转换结果以2的补码形式表示。 对于单端,结果始终为正。 对于差分配置,两个引脚之间的差值会被平移,该差值可能为负值。 当 ADCCON1.EOC 设置为 1 时,数字转换结果可用,并且始终驻留在组合的 ADCH 和 ADCL 寄存器的 MSB 段中。
中断请求:当通过写ADCCON3触发单通道转换时,会产生中断,当顺序转换完成时,不会产生中断。 每次序列转换完成时,ADC 都会生成 DMA 触发。
寄存器:ADC有两个数据寄存器:ADCL和ADCH; 三个控制寄存器:ADCCON1、ADCCON2、ADCCON3; 分别用于配置ADC并返回转换结果。
5、培训项目:定期采集电压数据并发送给上位机
[1]配置APCFG寄存器
使用ADC时,端口0引脚必须配置为ADC模拟输入。 要将端口 0 引脚配置为 ADC 输入,APCFG 寄存器中的相应位必须设置为 1。该寄存器的默认值为 0,即选择端口 0 作为非模拟输入,即作为数字输入。输入/输出端口。
注:APCFG 寄存器的设置将覆盖 P0SEL 的设置。
[2] 配置ADCCON3寄存器
对于单通道 ADC 转换,只需将控制字写入 ADCCON3 寄存器即可。
[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 } } }
[结论]:
CC2530 微控制器入门基础教程到此结束。
了解并能够独立完成以上六个基本模块的应用,可以说基本掌握了CC2530的基本应用,为以后学习Zigbee组网应用打下了良好的基础。
对于CC2530来说,低功耗无线网络应用才是它真正的使命。 有了我们入门的基础,以后如果有时间,我会制作OSAL操作系统和z-Stack协议栈应用两个系列教材,让大家真正掌握CC2530应用的精髓。
-------------------------------------------------- -------------------------------------------------- ----------------