【CC2530入门教程-06】CC2530的ADC工作原理与应用

article/2025/5/11 10:59:58

【CC2530入门教程-06】CC2530的ADC工作原理与应用

【CC2530入门教程-05】CC2530的串行接口原理与应用

【CC2530入门教程-04】CC2530的定时/计数器原理与应用

【CC2530入门教程-03】CC2530的中断系统及外部中断应用

【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制

【CC2530入门教程-01】CC2530微控制器开发入门基础


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

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

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

 

二、CC2530的A/D转换模块

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

        该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表示;温度传感器的通道号码为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_3P0SEL = 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字节数据写入U0DBUFwhile(!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通道0ADCCON3 = (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}}
}

 


http://chatgpt.dhexx.cn/article/2N4KE681.shtml

相关文章

【CC2530入门教程-01】CC2530微控制器开发入门基础

【CC2530入门教程-06】CC2530的ADC工作原理与应用 【CC2530入门教程-05】CC2530的串行接口原理与应用 【CC2530入门教程-04】CC2530的定时/计数器原理与应用 【CC2530入门教程-03】CC2530的中断系统及外部中断应用 【CC2530入门教程-02】CC2530的通用I/O端口输入和输出控制…

CC2530概述(简单了解)

CC2530概述简单版 CC2530是由TI公司生产&#xff08;德州仪器&#xff09;用于 2.4Ghz IEEE 802.15.4、ZigBee 和RF4CE 的片上系统&#xff08;SOC&#xff09;&#xff0c;经济实惠功耗低。 CC2530F256 结合了ZigBee 协议栈&#xff08;Z-Stack&#xff09;。 什么是片上系统…

单片机CC2530学习笔记

文章目录&#xff1a; 一&#xff1a;与或操作 二&#xff1a;CC2530的通用 IO及相关寄存器 1.与通用I/O端口相关常用的4个寄存器 2.PxSEL寄存器与PxDIR寄存器 3.P0INP寄存器与P1INP寄存器与P2INP 三&#xff1a;按键的工作原理与程序设计思路 四&#xff1a;CC2530的中…

c语言长空格的代码是什么,c语言中表示空格的是什么代码?

分析如下&#xff1a; 不是所有字符都需要转义的&#xff0c;空格直接就敲空格&#xff0c;或者使用ASCII码值赋值为32。 空格没有转义字符。合法转义字符如下&#xff1a; \a 响铃(BEL) 、\b 退格(BS)、\f 换页(FF)、\n 换行(LF)、\r 回车(CR)、\t 水平制表(HT)、\v 垂直制表(…

读入带空格的字符串 C语言

如何输出带空格的字符串 C语言默认是遇到空格&#xff0c;即代表输入的字符串的结束处 那么该如何读入带空格的字符串呢&#xff1f; scanf("%[^\n]", buf); //回车结束 这样的话就可以读入空格啦 表达式的意思为遇到’\n’才读取结束 请看演示代码 #include <…

C语言去除一段字符串中的空格

函数说明 将字符串中的所有空格都去掉。该函数简单但实用性强&#xff0c;可以作为字符串过滤器使用&#xff0c;随便改一下就可以实现去掉任意字符的功能&#xff0c;建议程序员的代码库里可以收藏一段该类型代码&#xff0c;用取方便。 函数实现 #include <stdio.h>…

C语言删除字符串中的空格

实现思路&#xff1a;分别定义2个指针&#xff0c;一个快指针s1, 一个慢指针s2,s1负责快速移动&#xff0c;遍历我们的的字符串&#xff0c;遇到空格就跳过&#xff0c;不是空格&#xff0c;就赋值给我们的s2,我们s2再往后移动&#xff0c;这样就把空格挤掉了。 最后别忘记s2 …

c语言空格符 r t,c语言中、\t \r \n 和空格什么意思

具体意思&#xff1a; 都是转义字符&#xff0c;空格就是单纯的空格&#xff0c;输入时可以输入空格 \t 跳格 \r 回车 \n 换行 \\ 反斜杠 \a 警告 \b 退格 \f 换页 \v 垂直跳格 \ddd ddd 是 1、2 或 3 位八进制数字。 转义字符串(E…

c++之静态数据成员与静态成员函数

什么是静态数据成员&#xff1f; 数据成员我们之前学过&#xff0c;是对象的属性。 同一个类&#xff0c;不同的对象&#xff0c;可能拥有不同的属性 例如一个车行&#xff0c;不同的车有不同的颜色&#xff0c;不同的耗油量。。。等等属性 但是当我们统计一个公有的数据&am…

类的静态数据成员和静态成员函数

一.什么是类的静态成员 静态成员变量和全局变量都存储在全局/静态区,它们都是在程序编译时创建,直到编译结束才被收回.所以全局变量和静态成员变量的功能差不多,只是创建的方式不同,类的静态成员创建在类中,全局变量创建在程序开头. 二.为什么要用类的静态成员而不用全局变量 …

37.【C/C++ 静态数据成员和静态成员函数 (超详解)】

静态函数 &#xff08;一&#xff09;、什么是静态函数?1.static变量2.static函数&#xff08;也叫内部函数&#xff09; &#xff08;二&#xff09;、静态数据成员1.空间分配和释放2.静态数据成员初始化效果展示: 3.静态数据成员的访问代码展示:效果展示: (四)、静态成员函数…

[C++] 类的静态成员 (静态数据成员 和 静态成员函数)

目录 一、声明静态成员&#xff1a; 二、定义静态成员&#xff1a; 三、使用类的静态成员&#xff1a; 四、静态成员类内初始化&#xff1a; 五、静态成员与普通成员的区别&#xff1a; 六、案例代码&#xff1a; 类内的静态成员包括&#xff1a; 静态数据成员 和 静态成…

对静态数据成员进行初始化

1.如果希望同类的各个对象中的数据成员的值是一样的&#xff0c;就可以把它定义为静态数据成员。 2.静态数据成员是在编译时预留空间的&#xff0c;在程序开始运行时被分配空间&#xff0c;到程序结束才释放空间。 3.静态数据成员可以初始化&#xff0c;但只能在类体外进行初…

静态数据成员与非静态数据成员的区别

数据成员&#xff1a; 静态数据成员是类的一部分&#xff0c;为类的所有实例共享(静态区)&#xff1b; 非静态数据成员&#xff0c;类的每个实例都有一份拷贝(动态区)。 静态数据成员的访问&#xff1a; 静态数据成员是类的一部分&#xff0c;在产生任何实例之前已经存在&a…

静态数据成员和静态数据成员函数

c中的static静态数据成员和静态成员函数应该是让大家比较头疼的东西&#xff0c;好像也是找工作公司面试中常常问到的东西。我自己也深有体会&#xff0c;在学习c的过程中&#xff0c;总感觉static很烦人&#xff0c;但是又是一个必须懂的东西&#xff0c;所以今天就对静态数据…

静态数据成员(C++)

目录 一、静态数据成员 1.1、定义 1.2、声明 1.3、初始化 1.4、普通访问 1.5、对象访问 二、静态成员函数 一、静态数据成员 1.1、定义 我们都知道&#xff0c;类是对具有相同属性和相同行为的一组对象的描述。 有时侯&#xff0c;我们希望每定义一个对象&#xff0c…

C语言文件 open函数和fopen函数

open 头文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>定义函数&#xff1a; int open(const char * pathname, int flags); int open(const char * pathname, int flags, mode_t mode);函数说明&#xff1a; 参数1…

VS中fopen_s函数的用法(fopen函数的扩展)

使用方法&#xff1a; 首先看fopen的代码&#xff1a; FILE* fp null; fp fopen(filename,"w") if(fp!null) { // 打开文件成功 }再来看fopen_s的用法&#xff1a; FILE* fp null; errno_t err 0; err fopen_s(&fp,filename,"w") if(err0) { /…

Vxworks或Workbench编译环境下fopen函数的用法

Vmware虚拟机下建立了Vxwork操作系统&#xff0c;Workbench连接对应的Vxworks操作系统进行编程&#xff0c;在此环境下进行编译c或者c语言过程中&#xff0c;用fopen或fprintf将变量输出至文件&#xff0c;过程中要注意的是&#xff0c;此时的Vxworks操作系统没有与Windows的c、…

fopen()函数的使用方法

语法&#xff1a; FILE *fopen(const char *filename, const char *mode); 返回值&#xff1a; fopen函数返回新打开文件的文件指针&#xff1b; 如果此文件不能打开&#xff0c;则返回NULL指针。 表格清晰可见&#xff1a; 模式描述文件可否存在"r"打开文件仅供…