A/D转换的工作原理是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A/D转换的工作原理是啥相关的知识,希望对你有一定的参考价值。
A/D转换器的工作原理,主要介绍以下三种方法:
1、逐次逼近法:
逐次逼近式A/D是比较常见的一种A/D转换电路,转换的时间为微秒级。
采用逐次逼近法的A/D转换器是由一个比较器、D/A转换器、缓冲寄存器及控制逻辑电路组成,如图所示。
基本原理是从高位到低位逐位试探比较,好像用天平称物体,从重到轻逐级增减砝码进行试探。逐次逼近法转换过程是:初始化时将逐次逼近寄存器各位清零。
转换开始时,先将逐次逼近寄存器最高位置1,送入D/A转换器,经D/A转换后生成的模拟量送入比较器,称为 Vo,与送入比较器的待转换的模拟量Vi进行比较,若Vo<Vi,该位1被保留,否则被清除。
然后再置逐次逼近寄存器次高位为1,将寄存器中新的数字量送D/A转换器,输出的 Vo再与Vi比较,若Vo<Vi,该位1被保留,否则被清除。
重复此过程,直至逼近寄存器最低位。转换结束后,将逐次逼近寄存器中的数字量送入缓冲寄存器,得到数字量的输出。逐次逼近的操作过程是在一个控制电路的控制下进行的。
2、双积分法:
采用双积分法的A/D转换器由电子开关、积分器、比较器和控制逻辑等部件组成。
基本原理是将输入电压变换成与其平均值成正比的时间间隔,再把此时间间隔转换成数字量,属于间接转换。
双积分法A/D转换的过程是:先将开关接通待转换的模拟量Vi,Vi采样输入到积分器,积分器从零开始进行固定时间T的正向积分,时间T到后,开关再接通与Vi极性相反的基准电压VREF,将VREF输入到积分器,进行反向积分,直到输出为0V时停止积分。
Vi越大,积分器输出电压越大,反向积分时间也越长。计数器在反向积分时间内所计的数 值,就是输入模拟电压Vi所对应的数字量,实现了A/D转换。 双积分式AD转换原理图
3、电压频率转换法:
它的工作原理是V/F转换电路把输入的模拟电压转换成与模拟电压成正比的脉冲信号。电压频率转换法
电压频率转换法的工作过程是:当模拟电压Vi加到V/F的输入端,便产生频率F与Vi成正比的脉冲,在一定的时间内对该脉冲信号计数,时间到,统计到计数器的计数值正比于输入电压Vi,从而完成A/D转换。
扩展资料:
DA转换器的内部电路构成无太大差异,一般按输出是电流还是电压、能否作乘法运算等进行分类。大多数DA转换器由电阻阵列和n个电流开关(或电压开关)构成。
按数字输入值切换开关,产生比例于输入的电流(或电压)。此外,也有为了改善精度而把恒流源放入器件内部的。
一般说来,由于电流开关的切换误差小,大多采用电流开关型电路,电流开关型电路如果直接输出生成的电流,则为电流输出型DA转换器。
参考资料来源:百度百科-AD转换
参考技术A模数转换器即A/D转换器,或简称ADC,通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。
故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。
逐次比较型(如TLC0831)
逐次比较型AD由一个比较器和DA转换器通过逐次比较逻辑构成,从MSB开始,顺序地对每一位将输入电压与内置DA转换器输出进行比较,经n次比较而输出数字值。其电路规模属于中等。其优点是速度较高、功耗低,在低分辨率(12位)时价格很高。
以上内容参考:百度百科-转换器
参考技术B A/D转换器是将模拟量转换为一定进制的数字量。A/D转换器大多是将电压量转换为正比的二进制数字量,乘以转换系数后可获得电压的数值量,也有先将电压量转换为时间或频率,然后再经计数得到电压的数值量。A/D转换器的电路主要由时钟脉冲发生器、逻辑电路、移位寄存器aN-1,...a1,a0、D/A电路及其开关指令数字寄存器BN-1,...B1,B0构成。
CC2530的ADC工作原理与应用
1.A/D转换的基本工作原理
- 数字化: 将时间上连续变化的模拟量转化为脉冲有无的数字量(ADC)
- ADC: 数模转换器,将时间和幅值连续的模拟量转化为时间和幅值离散的数字量
- 过程: 采样、保持、量化、编码
常用ADC: 逐次逼近型、双积分型、∑-△型
A/D转换器的几个技术指标:
- 量程: ADC所能输入模拟信号的类型和电压范围(参考电压),信号类型包括单极性和双极性
- 转换位数: 量化过程中的量化位数n,A/D转换后的输出结果用n位二进制数表示
- 分辨率: ADC能够分辨的模拟信号最小变化量,分辨率 = 量程 / 2^n
- 转换时间: ADC完成一次完整的A/D转换所用时间,包括采样、保持、量化、编码的全过程
ADC的四个基本过程
采样、保持、量化、编码
例: 有一个温度测控系统,已知温度传感器在0到100度之间为线性输出,参考电压为5V,采用8为的A/D转换器,0度的时候,测的电压为1.8伏,100度的时候,测的电压为4.3伏。
问: 系统的分辨率是多少?采集到数据10010001,表示多大电压?温度是多少?
由于采用的是8位ADC,参考电压为5V,所以分辨率为:
5* 1/2^8= 5/256 = 0.0195V= 1.95mV (最小能分辨的电压,分辨率)
0.0195 * 40= 0.78度(最小能分辨的温度)
由于温度是线性变化,先求得斜率k,得到温度和电压的关系表达式:
k= (100- 0)/(4.3-1.8)=40,y = 40*(x-1.8) (x为采样得到的电压)
因为10010001B=91H= 145,所以0.0195* 145= 2.83V
温度: (2.83V- 1.8V)* 40= 41.2℃
2.CC2530的A/D转换模块
此ADC模块的主要特征:
- 可选取的抽取率,设置分辨率(7~12位)
- 8个独立的输入通道,可接收单端或差分信号
- 参考电压可选为内部单端、外部单端、外部差分或AVDD5
- 单通道转换结束可产生中断请求
- 序列转换结束可发出DMA触发
- 可将片内温度传感器作为输入
- 电池电压测量功能
3.ADC模块的信号输入
端口0引脚可以配置为ADC输入端,依次为AINO~AIN7
- 输入端可配置为单端输入或差分输入
- 差分输入对: AIN0~AIN1、AIN2 ~ AIN3、AIN4 ~ AIN5 、AIN6 ~ AIN7
- 片上温度传感器的输出也可以作为ADC的输入用于测量芯片的温度
- 可以将一个对应AVDD5/3的电压作为ADC的输入,实现电池电压检测
- 负电压和大于VDD的电压都不能用于P0这些引脚
- 单端电压输入AINO~ AIN7,以通道号码0~7表示
- 四个差分输入对则以通道号码8~11表示
- 温度传感器的通道号码为14
- AVDD5/3电压输入的通道号码为15
4.ADC相关的几个概念
- 序列ADC转换: 可以按序列进行多通道的ADC转换,并把结果通过DMA传送到存储器,而不需要CPU任何参与。
- 单通道ADC转换: 通过写ADCCON3寄存器触发单通道ADC转换,一旦寄存器被写入,转换立即开始
- 参考电压: 内部生成的电压、AVDD5引脚、适用于AIN7输入引脚的外部电压,或者适用于AIN6~ AIN7输入引脚的差分电压
- 转换结果:
4.1. 数字转换结果以二进制的补码形式表示
4.2. 对于单端,结果总是正的
4.3. 对于差分配置,两个引脚之间的差分被转换,可以是负数
4.4. 当ADCCON1.EOC设置为1时,数字转换结果可以读取
4.5. 转换结果总是驻留在ADCH和ADCL寄存器组合的MSB段中- 中断请求:
5.1. 通过写ADCCON3触发一个单通道转换完成时,将产生一个中断
5.2. 完成一个序列转换时,ADC将产 生一个DMA触发,而不产生中断- 三个控制寄存器: ADCCON1、ADCCON2、ADCCON3,用来配置ADC
- 两个数据寄存器: ADCL和ADCH,用来返回转换结果
5.1.案例——定时采集电压数据发送到上位机
要求:
将光照度传感器接到的Zigbee小模块上,每隔1秒以单通道的式采样一次该传 感器的电压值,并按照指定的格式将数据传送到上位机。上位机与CC2530的 串口0相连,系统时钟为16MHz,波特率为9600BPS, 发送数据采用查询的方式。数据帧有4个字节,格式如下:
0xFA (帧头) ADCH ADCL 0xAF (帧尾)
设计思路:
- 初始化定时器1,实现0.1秒定时
- 在定时中断函数中实现1秒定时
- 按照参数要求初始化串口0
- 设计字节数组发送函数
- 初始化ADC (单通道采集)
- 实现数据采集并发送到上位机
配置APCFG寄存器
- 当使用ADC时,端口0的引脚必须配置为ADC模拟输入
- 要配置一个端口0引脚为一个ADC输入,APCFG寄 存器中相应的位必须设置为1。这个寄存器的默认值是0,选择端口0为非模拟输入,即作为数字I/O端口
- 注意: APCFG寄存器的设置将覆盖POSEL的设置
- APCFG模拟I/O配置寄存器:
配置ADCCON3寄存器
- 单通道的ADC转换,只需要将控制字写入ADCCON3寄存器即可
- ADCCON3控制寄存器(单通道相关):
ADC初始化
- 对端口的功能进行选择
- 设置其传输方向
- 将端口设为模拟输入
ADC数据采集
- 将ADCIF标志位清0
- 配置ADCCON3寄存器,该寄存器一旦被写入,转换立即开始
- 等待ADCIF置1,标示转换完成
- 读取数据
代码:
#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,即PO_2和P0_3
P0SEL = 0x0C; //将PO_ 2和PO_ _3端口设置成外设功能
U0BAUD = 59; //16MHz的 系统时钟产生9600BPS的波特率
U0GCR = 9;
U0UCR |= 0x80; //禁止流控, 8位数据,清除缓冲器
U0CSR |= 0xCe; //选择UART模式,使能接收器
UTX0IF = 0; //清除TX发送中断标志
URX0IF = 0; //清除RX接收中断标志
URX0IE = 1; //使能URAT0的接收中断
EA = 1; //使能总中断
}
/*=============================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/0使用
}
unsigned char dat[4];
/*===========================读取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;
}
/*===========================main函数=========================================*/
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
}
}
}
以上是关于A/D转换的工作原理是啥的主要内容,如果未能解决你的问题,请参考以下文章