【CC2530入门教程-06】CC2530的ADC工作原理与应用_cc2530那些引脚具有adc功能

36 阅读5分钟

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

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

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

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

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

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

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

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

 

三、ADC模块的信号输入

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

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

        <2> 差分输入对:AIN0AIN1、AIN2AIN3、AIN4AIN5、AIN6AIN7。

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

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

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

        <6> 单端电压输入AIN0~AIN7,以通道号码0~7表示;四个差分输入对则以 通道号码8~11表示;温度传感器的通道号码为14AVDD5/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有两个数据寄存器:ADCLADCH;三个控制寄存器:ADCCON1ADCCON2ADCCON3;分别用来配置ADC并返回转换结果。

 

五、实训项目:定时采集电压数据发送到上位机

【1】配置APCFG寄存器

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

      注意: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


**收集整理了一份《2024年最新物联网嵌入式全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升的朋友。**
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/bbf03fc1f204495b8fc5d2d22318efb4~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1748271430&x-signature=YXc6N4Ut7NOpyn7nQOoggqfx%2FO8%3D)
![img](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/e2331aa5935145348b2ab44f930647f9~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1748271430&x-signature=SXUA0gGo6cpdDvB7qGE4CJTfhW4%3D)

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人**

**都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**