嵌入式(六)模数转换ADC | ADC 工作模式 寄存器 轮询和中断方式

本文主要是介绍嵌入式(六)模数转换ADC | ADC 工作模式 寄存器 轮询和中断方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1 CC2530的ADC模块
  • 2 ADC工作模式
  • 3 ADC相关寄存器
    • 3.1数据寄存器
    • 3.2 控制寄存器
  • 4 ADC初始化配置
  • 5 ADC使用方式
    • 5.1 轮询方式
    • 5.2 中断方式

模拟/数字转换 (Analog to Digital Converter,简称ADC)

是将输入的模拟信号转换为数字信号。

各种被测控的物理量(如:速度、压力、温度、光照强度、磁场等)是一些连续变化的物理量,传感器将这些物理量转换成与之相对应的电压和电流就是模拟信号。单片机只能接收数字信号,要处理这些信号就必须转换成数字信号,模拟/数字转换是数字测控系统中必须的信号转换。

原理是进行,以一定的频率采样电压值,连续采样一段时间

1 CC2530的ADC模块

CC2530的ADC模块 支持最高14位二进制 的模拟数字转换具有12位的有效数据位。

它包括一个输入多路切换器,具有8个各自可配置的通道;以及一个参考电压发生器。

转换结果通过DMA(直接内存访问)写入存储器,还具有多种运行模式。

先介绍运行模式

2 ADC工作模式

1 输入

ADC模块的输入——从哪些端口输入

对于CC2530的ADC模块,端口P0引脚可以配置为ADC输入端,

依次为AIN0~AIN7。

可以把输入配置为单端或差分输入

在选择单端输入的情况下,通道号码0-7

在选择差分输入的情况下,通道号码8-11,差分输入包括输入对AIN0-AIN1、

AIN2-AIN3、AIN4-AIN5和AIN6-AIN7 共四对、

通道12-15分别是GND,预留通道,温度传感器,AVDD5 在应用中这个输入可以实现一个电池电压监测器的功能。

为什么要进行差分输入,差分输入方式比单端输入来说,有更强的抗干扰能力

序列ADC转换与单通道ADC转换

3 ADC相关寄存器

3.1数据寄存器

ADC有两个数据寄存器:用来存放转换结果

ADCL(0xBA)-ADC数据低位寄存器、

ADCH(0xBB)-ADC数据高位寄存器,

3.2 控制寄存器

APCFG

8位模拟量输入来自I/O引脚,不必通过编程将这些引脚变为模拟输入。但是,当相应的模拟输入端在APCFG寄存器中被禁用时,此通道将被跳过。当使用差分输入时,相应的两个引脚都必须在APCFG寄存器中设置为模拟输入引脚。

APCFG寄存器描述如图所示

在这里插入图片描述

ADC还有三个控制寄存器:ADCCON1、ADCCON2和ADCCON3

ADCCON1

ADCCON1.ST用于启动一个转换序列。当没有转换正在运行时这个位设置为高电平

ADCCON1.STSEL位选择哪个事件将启动一个新的转换序列。该选项可以选择为外部引脚P2.0上升沿或外部引脚事件,之前序列的结束事件,定时器1的通道0比较事件或ADCCON1.ST是1。

ADCCON2

寄存器位ADCCON2.SCH用于定义一个ADC转换序列,如果ADCCON2.SCH设置为一个小于8的值,ADC转换序列包括

从0通道开始,直到并包括所设置的通道号码。当ADCCON2.SCH设置为一个8和12之间的值,转换序列包括

从通道8开始差分输入,到ADCCON2.SCH所设置的通道号码结束。

ADCCON2.SREF用于选择参考电压。

ADCCON2.SDIV位用来选择抽取率,抽取率的设置决定分辨率和完成一个转换所需要的时间。

ADCCON2.SCH设置转换序列的最后一个通道数

ADCCON3

单通道ADC转换通过写ADCCON3寄存器触发,转换立即开始。

除非一个转换序列已经正在进行,在这种情况下序列一完成,单个通道的ADC转换就会被执行。

除可以设置为按序列进行ADC转换之外,CC2530的ADC模块可以编程实现任何单个通道执行一个转换,包括温度传感器(14)和AVDD5/3(15)两个通道。

单通道ADC转换通过写ADCCON3寄存器触发,转换立即开始。除非一个转换序列已经正在进行,在这种情况下序列一完成,单个通道的ADC转换就会被执行。

4 ADC初始化配置

LED初始化

串口通信初始化

AD初始化

注意分辨率与精确度的区别

分辨率 分辨率由比特数决定,比如16位器件,则可以表示65536个独立的数字值,那么对于1bit而言,代表着最小的电平为 A D C 电压范围 × 1 65536 ADC电压范围× \frac{1}{65536} ADC电压范围×655361

精确度 是指对于给定模拟输入,实际数字输出与理论预期数字输出之间的接近度。

理论上精确度和分辨率相同,但由于实际中出现各种误差源,因而不能达到很高的精确度,比如只能16位器件只能提供12位精确度(有效数据),对于这种情况,4LSb(最低有效位)表示ADC中生成的随机噪声

电压计算公式 =ADC/精度*参考电压。

Value=(ADCH*256+ADCL)*3.3/8192。

ADC:把AD转换后得到的ADCL、ADCH做处理,将ADCL(低6位)放在低字节,ADCH(高8位)放在高字节。将一个uint16右移两位(最后两位没有用),即得到14位ADC。精度:根据所选位数,例如本任务位数选14位,精度=2^13=8192。

注意三个ADCCON1,2,3区别

首先通过ADCCON1寄存器将EOC标志清零。若为序列ADC转化则需要用到ADCCON2寄存器,若为单通道ADC转换则需要使用ADCCON3寄存器。通过这两个寄存器其一可以设置ADC转换的参考电压和通道的抽取率(精度)。若为ADCCON2寄存器还可以设置序列转换的范围,对于ADCCON3寄存器可以设置单个通道的转化。最后通过ADCCON1寄存器的STSEL位和ST位来启动ADC转换。

5 ADC使用方式

5.1 轮询方式

while(1) {if(ADCCON1>=0x80) { //ADCCON1.EOC,转换完毕判断LED1 = 0; //转换完毕指示LED2= 1; //打开数据处理指示灯temp[1] = ADCL;temp[0] = ADCH;adc |= (uint)temp[1];adc |= ( (uint) temp[0] )<<8;adc>>=2; // ADCL[1:0]没用使用num = adc*3.3/8192;//定参考电压为3.3V。14位分辨率adcdata[1] = (char)(num)%10+48;adcdata[3] = (char)(num*10)%10+48;UartTX_Send_String(adcdata,6); //串口送数LED2= 0; //完成数据处理delay(30000);InitialAD(); //启动下一次转换} 
}

5.2 中断方式

通过设置ADCCON3启动的单次ADC转换完成时才会产生中断。 (序列ADC转换完成不会产生中断)

#pragma vector = ADC_VECTOR
__interrupt void ADC_ISR(void) {float num; char temp[2]; uint adc=0;temp[1] = ADCL;temp[0] = ADCH;adc |= (uint)temp[1];adc |= ( (uint) temp[0] )<<8;adc>>=2; // ADCL[1:0]没用使用num = adc*1.25/8192;//参考电压为1.25V,12位有效位adcdata[1] = (char)(num)%10+48;adcdata[3] = (char)(num*10)%10+48;adcComplete1 = 1; //设置转换完成的全局变量
}

序列转换和单次转换的区别

这篇关于嵌入式(六)模数转换ADC | ADC 工作模式 寄存器 轮询和中断方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/582333

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

java实现docker镜像上传到harbor仓库的方式

《java实现docker镜像上传到harbor仓库的方式》:本文主要介绍java实现docker镜像上传到harbor仓库的方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 前 言2. 编写工具类2.1 引入依赖包2.2 使用当前服务器的docker环境推送镜像2.2

SQLite3 在嵌入式C环境中存储音频/视频文件的最优方案

《SQLite3在嵌入式C环境中存储音频/视频文件的最优方案》本文探讨了SQLite3在嵌入式C环境中存储音视频文件的优化方案,推荐采用文件路径存储结合元数据管理,兼顾效率与资源限制,小文件可使用B... 目录SQLite3 在嵌入式C环境中存储音频/视频文件的专业方案一、存储策略选择1. 直接存储 vs

嵌入式数据库SQLite 3配置使用讲解

《嵌入式数据库SQLite3配置使用讲解》本文强调嵌入式项目中SQLite3数据库的重要性,因其零配置、轻量级、跨平台及事务处理特性,可保障数据溯源与责任明确,详细讲解安装配置、基础语法及SQLit... 目录0、惨痛教训1、SQLite3环境配置(1)、下载安装SQLite库(2)、解压下载的文件(3)、

springboot项目打jar制作成镜像并指定配置文件位置方式

《springboot项目打jar制作成镜像并指定配置文件位置方式》:本文主要介绍springboot项目打jar制作成镜像并指定配置文件位置方式,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录一、上传jar到服务器二、编写dockerfile三、新建对应配置文件所存放的数据卷目录四、将配置文

SpringBoot集成LiteFlow工作流引擎的完整指南

《SpringBoot集成LiteFlow工作流引擎的完整指南》LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解Sp... 目录一、LiteFlow核心优势二、SpringBoot集成实战三、高级特性应用1. 异步并行执行2

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建