模数转换 A/D 与数模转换 D/A介绍


A/D 和 D/A 的基本概念

A/D 是模拟量到数字量的转换,依靠的是模数转换器(Analog to Digital Converter),简称ADCD/A 是数字量到模拟量的转换,依靠的是数模转换器(Digital to Analog Converter),简称 DAC。它们的道理是完全一样的,只是转换方向不同,

A/D 的主要指标

  1. ADC 的位数

一个 n 位的 ADC 表示这个 ADC 共有 2 的 n 次方个刻度。8 位的 ADC,输出的是从 0~255 一共 256 个数字量,也就是 2 的 8 次方个数据刻度。

  1. 基准源

基准源,也叫基准电压,是 ADC 的一个重要指标,要想把输入 ADC 的信号测量准确,那么基准源首先要准,基准源的偏差会直接导致转换结果的偏差。比如一根米尺,总长度本应该是 1 米,假定这根米尺被火烤了一下,实际变成了 1.2 米,再用这根米尺测物体长度的话自然就有了较大的偏差。假如我们的基准源应该是 5.10V,但是实际上提供的却是 4.5V,这样误把 4.5V 当成了 5.10V 来处理的话,偏差也会比较大。

  1. 分辨率

分辨率是数字量变化一个最小刻度时,模拟信号的变化量,定义为满刻度量程与 2n-1 的比值。假定 5.10V 的电压系统,使用 8 位的 ADC 进行测量,那么相当于 0~255 一共 256 个刻度把 5.10V 平均分成了 255 份,那么分辨率就是 5.10/255 = 0.02V。

  1. INL(积分非线性度)和 DNL(差分非线性度)

初学者最容易混淆的两个概念就是“分辨率”和“精度”,认为分辨率越高,则精度越高,而实际上,两者之间是没有必然联系的。分辨率是用来描述刻度划分的,而精度是用来描述准确程度的。同样一根米尺,刻度数相同,分辨率就相当,但是精度却可以相差很大,和 ADC 精度关系重大的两个指标是 INL(Integral NonLiner)和 DNL(Differencial NonLiner)。INL 指的是 ADC 器件在所有的数值上对应的模拟值,和真实值之间误差最大的那一个点的误差值,是 ADC 最重要的一个精度指标,单位是 LSB。LSB(Least Significant Bit)是最低有效位的意思,那么它实际上对应的就是 ADC 的分辨率。一个基准为 5.10V 的 8 位 ADC,它的分辨率就是 0.02V,用它去测量一个电压信号,得到的结果是 100,就表示它测到的电压值是 100*0.02V=2V,假定它的 INL 是 1LSB,就表示这个电压信号真实的准确值是在1.98V~2.02V 之间的,按理想情况对应得到的数字应该是 99~101,测量误差是一个最低有效位,即 1LSB。DNL 表示的是 ADC 相邻两个刻度之间最大的差异,单位也是 LSB。一把分辨率是 1 毫米的尺子,相邻的刻度之间并不都刚好是 1 毫米,而总是会存在或大或小的误差。同理,一个 ADC 的两个刻度线之间也不总是准确的等于分辨率,也是存在误差,这个误差就是 DNL。一个基准为 5.10V 的 8 位 ADC,假定它的 DNL 是 0.5LSB,那么当它的转换结果从 100 增加到 101 时,理想情况下实际电压应该增加 0.02V,但 DNL 为 0.5LSB 的情况下实际电压的增加值是在 0.01~0.03V 之间。值得一提的是 DNL 并非一定小于 1LSB,很多时候它会等于或大于 1LSB,这就相当于是一定程度上的刻度紊乱,当实际电压保持不变时,ADC 得出的结果可能会在几个数值之间跳动,很大程度上就是由于这个原因(但并不完全是,因为还有无时无处不在的干扰的影响)。

  1. 转换速率

转换速率,是指 ADC 每秒能进行采样转换的最大次数,单位是 sps(或 s/s、sa/s,即 samples per second),它与 ADC 完成一次从模拟到数字的转换所需要的时间互为倒数关系。ADC 的种类比较多,其中积分型的 ADC 转换时间是毫秒级的,属于低速 ADC;逐次逼近型 ADC转换时间是微秒级的,属于中速 ADC;并行/串行的 ADC 的转换时间可达到纳秒级,属于高速 ADC。

ADC 的这几个主要指标大家先熟悉一下,对于其它的,作为一个入门级别的选手来说,
先不着急深入理解。以后使用过程中遇到了,再查找相关资料深入学习,当前重点是在头脑
中建立一个 ADC 的基本概念。

转换芯片介绍

PCF8591 的硬件接口

PCF8591 是一个单电源低功耗的 8 位 CMOS 数据采集器件,具有 4 路模拟输入,1 路模拟输出和一个串行 I2C 总线接口用来与单片机通信。与前面讲过的 24C02 类似,3 个地址引脚 A0、A1、A2 用于编程硬件地址,允许最多 8 个器件连接到 I2C 总线而不需要额外的片选电路。器件的地址、控制以及数据都是通过 I2C 总线来传输,我们先看一下 PCF8591 的原理图,如图 17-3 所示。

其中引脚 1、2、3、4 是 4 路模拟输入,引脚 5、6、7 是 I2C 总线的硬件地址,8 脚是数字地 GND,9 脚和 10 脚是 I2C 总线的 SDA 和 SCL。12 脚是时钟选择引脚,如果接高电平表示用外部时钟输入,接低电平则用内部时钟,我们这套电路用的是内部时钟,因此 12 脚直接接 GND,同时 11 脚悬空。13 脚是模拟地 AGND,在实际开发中,如果有比较复杂的模拟电路,那么 AGND 部分在布局布线上要特别处理,而且和 GND 的连接也有多种方式,14 脚是基准源,15 脚是 DAC 的模拟输出,16 脚是供电电源 VCC。

  • PCF8591 的 ADC 是逐次逼近型的,转换速率算是中速,但是它的速度瓶颈在 I2C 通信上。由于 I2C 通信速度较慢,所以最终的 PCF8591 的转换速度,直接取决于 I2C 的通信速率。由于 I2C 速度的限制,所以 PCF8591 得算是个低速的 AD 和 DA 的集成,主要应用在一些转换速度要求不高,希望成本较低的场合,比如电池供电设备,测量电池的供电电压,电压低于某一个值,报警提示更换电池等类似场合。Vref 基准电压的提供有两种方法。一是采用简易的原则,直接接到 VCC 上去,但是由于 VCC 会受到整个线路的用电功耗情况影响,一来不是准确的 5V,实测大多在 4.8V 左右,二来随着整个系统负载情况的变化会产生波动,所以只能用在简易的、对精度要求不高的场合。方法二是使用专门的基准电压器件,比如 TL431,它可以提供一个精度很高的 2.5V 的电压基准,这是我们通常采用的方法。如图 17-4 所示。

    图中 J17 是双排插针,大家可以根据自己的需求选择跳线帽短接还是使用杜邦线连接其它外部电路,二者都是可以的。在这个地方,我们直接把 J17 的 3 脚和 4 脚用跳线帽短路起来,那么现在 Vref 的基准源就是 2.5V 了。分别把 5 和 6、7 和 8、9 和 10、11 和 12 用跳线帽短接起来的话,那么我们的 AIN0 实测的就是电位器的分压值,AIN1 和 AIN2 测的是 GND
    的值,AIN3 测的是+5V 的值。这里需要注意的是,AIN3 虽然测的是+5V 的值,但是对于AD 来说,只要输入信号超过 Vref 基准源,它得到的始终都是最大值,即 255,也就是说它实际上无法测量超过其 Vref 的电压信号的。需要注意的是,所有输入信号的电压值都不能超过 VCC,即+5V,否则可能会损坏 ADC 芯片。

PCF8591通讯

PCF8591 的通信接口是 I2C,那么编程肯定是要符合这个协议的。单片机对 PCF8591 进行初始化,一共发送三个字节即可。第一个字节,和 EEPROM 类似,是器件地址字节,其中 7 位代表地址,1 位代表读写方向。地址高 4 位固定是 0b1001,低三位是 A2,A1,A0,这三位电路上都接了 GND,因此也就是 0b000,如图 17-5 所示。

  • 写地址为:0x90,读地址为:0x91

发送到 PCF8591 的第二个字节将被存储在控制寄存器,用于控制 PCF8591 的功能。其中第 3 位和第 7 位是固定的 0,另外 6 位各自有各自的作用,如图 17-6 所示,

控制字节的第 6 位是 DA 使能位,这一位置 1 表示 DA 输出引脚使能,会产生模拟电压输出功能。第 4 位和第 5 位可以实现把 PCF8591 的 4 路模拟输入配置成单端模式和差分模式,单端模式和差分模式的区别,我们在 17.5 节有介绍,这里大家只需要知道这两位是配置 AD输入方式的控制位即可,如图 17-7 所示。

控制字节的第 2 位是自动增量控制位,自动增量的意思就是,比如我们一共有 4 个通道,
当我们全部使用的时候,读完了通道 0,下一次再读,会自动进入通道 1 进行读取,不需要我们指定下一个通道,由于 A/D 每次读到的数据,都是上一次的转换结果,所以同学们在使用自动增量功能的时候,要特别注意,当前读到的是上一个通道的值。为了保持程序的通用性,我们的代码没有使用这个功能,直接做了一个通用的程序。
控制字节的第 0 位和第 1 位就是通道选择位了,00、01、10、11 代表了从 0 到 3 的一共4 个通道选择。
发送给 PCF8591 的第三个字节 D/A 数据寄存器,表示 D/A 模拟输出的电压值。D/A 模拟我们一会介绍,大家知道这个字节的作用即可。我们如果仅仅使用 A/D 功能的话,就可以不发送第三个字节。

D/A 输出

D/A 是和 A/D 刚好反方向的,一个 8 位的 D/A,从 0~255,代表了 0~2.55V 的话,那么我们用单片机给第三个字节发送 100,D/A 引脚就会输出一个 1V 的电压,发送 200 就输出一个 2V 的电压,很简单,我们用一个简单的程序实现出来,并且通过上、下按键可以增大或减小输出幅度值,每次增加或减小 0.1V。如果有万用表的话,可以直接测试一下板子上
AOUT 点的输出电压,观察它的变化。由于 PCF8591 的 DA 输出偏置误差最大是 50mv(由数据手册提供),所以我们用万用表测到的电压值和理论值之间的误差就应该在 50mV 以内。

示例代码

/*
*******************************************************************************
*                     《手把手教你学51单片机(C语言版)》
*                    配套 KST-51 单片机开发板 示例源代码
* 描  述:第17章 DA转换例程
*         由按键控制DA输出可调电压值
*******************************************************************************
*/#include <reg52.h>unsigned char T0RH = 0;  //T0重载值的高字节
unsigned char T0RL = 0;  //T0重载值的低字节void ConfigTimer0(unsigned int ms);
extern void KeyScan();
extern void KeyDriver();
extern void I2CStart();
extern void I2CStop();
extern bit I2CWrite(unsigned char dat);void main()
{    EA = 1;           //开总中断ConfigTimer0(1);  //配置T0定时1mswhile (1){KeyDriver();  //调用按键驱动}
}
/* 设置DAC输出值,val-设定值 */
void SetDACOut(unsigned char val)
{I2CStart();if (!I2CWrite(0x48<<1)) //寻址PCF8591,如未应答,则停止操作并返回{I2CStop();return;}I2CWrite(0x40);         //写入控制字节I2CWrite(val);          //写入DA值  I2CStop();
}
/* 按键动作函数,根据键码执行相应的操作,keycode-按键键码 */
void KeyAction(unsigned char keycode)
{static unsigned char volt = 0;  //输出电压值,隐含了一位十进制小数位if (keycode == 0x26)  //向上键,增加0.1V电压值{if (volt < 25){volt++;SetDACOut(volt*255/25); //转换为AD输出值}}else if (keycode == 0x28)  //向下键,减小0.1V电压值{if (volt > 0){volt--;SetDACOut(volt*255/25); //转换为AD输出值}}
}
/* 配置并启动T0,ms-T0定时时间 */
void ConfigTimer0(unsigned int ms)
{unsigned long tmp;  //临时变量tmp = 11059200 / 12;      //定时器计数频率tmp = (tmp * ms) / 1000;  //计算所需的计数值tmp = 65536 - tmp;        //计算定时器重载值tmp = tmp + 28;           //补偿中断响应延时造成的误差T0RH = (unsigned char)(tmp>>8);  //定时器重载值拆分为高低字节T0RL = (unsigned char)tmp;TMOD &= 0xF0;   //清零T0的控制位TMOD |= 0x01;   //配置T0为模式1TH0 = T0RH;     //加载T0重载值TL0 = T0RL;ET0 = 1;        //使能T0中断TR0 = 1;        //启动T0
}
/* T0中断服务函数,执行按键扫描 */
void InterruptTimer0() interrupt 1
{TH0 = T0RH;  //重新加载重载值TL0 = T0RL;KeyScan();   //按键扫描
}
  • 示例以及源码来源于:http://www.qdkingst.com/cn/disc51,提供了视频和资料下载,想离线学习的朋友可以去哪里将资源下载到本地进行学习。

模数转换 A/D 与数模转换 D/A介绍相关推荐

  1. 蓝桥杯之单片机设计与开发(18)——模数转换A/D与数模转换D/A

    A/D的主要指标 1.ADC的位数 一个n位的ADC表示这个ADC共有2的n次方个刻度.8位的ADC输出的是从0~255一共256个数字值,也就是个数据刻度.. 2.基准源 基准源也叫基准电压,是AD ...

  2. 模数转换A/D与数模转换D/A

    基本概念 模拟量:任何两个数字之间都有无限个中间值,所以称之为连续变化的量,也就是模拟量. 数字量:数字间有一定的间隔,不是连续的,即离散的量称之为数字量. A/D:Analog to Digital ...

  3. 模数转换(A/D)和数模转换(D/A) 图示

    (从书中截图) 在时间域和频率域中示意图: 1.A/D转换 2.D/A转换 转载于:https://www.cnblogs.com/ky027wh-sx/p/6087773.html

  4. 51单片机模数转换A/D与数模转换D/A

    1.(概念)A/D 是模拟量到数字量的转换,依靠的是模数转换器(Analog to Digital Converter),简称ADC.D/A 是数字量到模拟量的转换,依靠的是数模转换器(Digital ...

  5. MCU-51:单片机之AD模数转换与DA数模转换

    目录 一.AD/DA介绍 二.硬件电路模型 2.1 模型 2.2 硬件电路 三.运算放大器 3.1 运算放大器介绍 3.2 运放电路 四.DA原理 4.1 T型电阻网络DA转换器: 4.2 PWM型D ...

  6. PVT法碳化硅SIC单晶生长工艺真空压力控制装置的国产化替代解决方案

    摘要:本文针对目前PVT法SiC单晶生长过程中真空压力控制存在的问题,进行了详细的技术分析,提出了相应的解放方案.解决方案的核心方法是采用上游和下游同时控制方式来大幅提高全压力范围内的控制精度和稳定性 ...

  7. Linux/Android 音频驱动从概念到 APP

    这里写自定义目录标题 前言 硬件介绍 Codec 通用结构 ADC 框图 DAC 框图 常用数字接口 其他相关术语 Codec 实际结构 硬件原理图 芯片手册框图 软硬件对应示例 Codec 硬件逻辑 ...

  8. php读取西门子plc_简单说一些PLC中模拟量的相关概念

    引言: 有些刚刚接触PLC的小伙伴对PLC中的模拟量编程不理解甚至有点摸不着方向,让他用PLC读取一个压力值模拟量,他会感到有点为难.就是因为PLC中的一些基本概念没有搞清楚,我今天简单来给大家说一些 ...

  9. 嵌入式学习笔记——ADC模数转换器

    ADC模数转换器 前言 ADC介绍 ADC概述 ADC的数量 ADC的特性 ADC框图 芯片外部框图 芯片内部框图 转换部分框图 状态输出部分 条件触发框图 寄存器介绍 编程思路 模式选择 规则通道的 ...

  10. FPGA 30 综合数字ADC /DAC 信号发送采集系统设计(综合项目设计)

    FPGA 30 综合数字ADC /DAC 信号发送采集系统设计(综合项目设计) 模块名称 : 综合数字ADC /DAC 信号发送采集系统设计 主要功能 :本实验设计了一个信号发送和采集系统的设计,在整 ...

最新文章

  1. 原创 | R的基础及进阶数据可视化功能包介绍
  2. 16个很有用的在线工具
  3. Smali语法简单介绍
  4. java监视器_监视和管理备份系统
  5. mysql basedal_spring与MyBatis结合
  6. 不只是用于研究:使用Nvivo获取各种定性数据
  7. 针对eclipse调式代码时打断点出现斜杠的解决方法
  8. 逍遥安卓模拟器android,逍遥安卓模拟器
  9. CSRF跨站请求伪造漏洞
  10. 数据服务化——打通企业数据应用的最后一公里
  11. Windows自带截屏-快捷键截图区域至剪切板
  12. 苹果终端date命令_mac终端常用命令
  13. 【word 2016】保存太慢解决办法
  14. 哈哈...汗汗...
  15. 属性的遍历:for...in 循环
  16. QtCreator 忽略指定警告
  17. 短信验证码接收网页版常见问题解答
  18. 《以道御术》荣耀上市,高管书评
  19. Keil5打开工程时,弹窗提示not found device
  20. 如何使用ABBYY FineReader 14标记文本

热门文章

  1. d3.js之中国地图
  2. chrome主页被修改(Google Chrome主页被hao123劫持解决办法)
  3. 同事换签名,心有猛虎细嗅蔷薇
  4. FPGA 串口通信(补)——通用模块
  5. 西湖论剑2021 MISC部分(LSB,取证)
  6. centos安装phpstudy(小皮)
  7. 苹果手机怎么验证app_苹果序列号查询 未验证怎么办?
  8. 腾讯的用Flash调用图片轮显
  9. Jenkins 插件中心国内镜像源发布
  10. vue组件中ctrl键和shift键操作多选