嵌入式(六)模数转换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

相关文章

shell脚本批量导出redis key-value方式

《shell脚本批量导出rediskey-value方式》为避免keys全量扫描导致Redis卡顿,可先通过dump.rdb备份文件在本地恢复,再使用scan命令渐进导出key-value,通过CN... 目录1 背景2 详细步骤2.1 本地docker启动Redis2.2 shell批量导出脚本3 附录总

Oracle查询表结构建表语句索引等方式

《Oracle查询表结构建表语句索引等方式》使用USER_TAB_COLUMNS查询表结构可避免系统隐藏字段(如LISTUSER的CLOB与VARCHAR2同名字段),这些字段可能为dbms_lob.... 目录oracle查询表结构建表语句索引1.用“USER_TAB_COLUMNS”查询表结构2.用“a

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.

Oracle数据库定时备份脚本方式(Linux)

《Oracle数据库定时备份脚本方式(Linux)》文章介绍Oracle数据库自动备份方案,包含主机备份传输与备机解压导入流程,强调需提前全量删除原库数据避免报错,并需配置无密传输、定时任务及验证脚本... 目录说明主机脚本备机上自动导库脚本整个自动备份oracle数据库的过程(建议全程用root用户)总结

Debian系和Redhat系防火墙配置方式

《Debian系和Redhat系防火墙配置方式》文章对比了Debian系UFW和Redhat系Firewalld防火墙的安装、启用禁用、端口管理、规则查看及注意事项,强调SSH端口需开放、规则持久化,... 目录Debian系UFW防火墙1. 安装2. 启用与禁用3. 基本命令4. 注意事项5. 示例配置R

最新Spring Security的基于内存用户认证方式

《最新SpringSecurity的基于内存用户认证方式》本文讲解SpringSecurity内存认证配置,适用于开发、测试等场景,通过代码创建用户及权限管理,支持密码加密,虽简单但不持久化,生产环... 目录1. 前言2. 因何选择内存认证?3. 基础配置实战❶ 创建Spring Security配置文件

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

C#监听txt文档获取新数据方式

《C#监听txt文档获取新数据方式》文章介绍通过监听txt文件获取最新数据,并实现开机自启动、禁用窗口关闭按钮、阻止Ctrl+C中断及防止程序退出等功能,代码整合于主函数中,供参考学习... 目录前言一、监听txt文档增加数据二、其他功能1. 设置开机自启动2. 禁止控制台窗口关闭按钮3. 阻止Ctrl +

linux批量替换文件内容的实现方式

《linux批量替换文件内容的实现方式》本文总结了Linux中批量替换文件内容的几种方法,包括使用sed替换文件夹内所有文件、单个文件内容及逐行字符串,强调使用反引号和绝对路径,并分享个人经验供参考... 目录一、linux批量替换文件内容 二、替换文件内所有匹配的字符串 三、替换每一行中全部str1为st