当前位置:
文档之家› 第10章 模数-数模转换接口
第10章 模数-数模转换接口
开发板PCF8591原理图
10.2.2 PCF8591芯片器件地址与控制寄存器
PCF8591的通信接口是I2C,在第9章里I2C总线的操作 都适用于它。单片机对PCF8591进行操作,一共发送三个字 节即可,分别是地址字节、控制字节和D/A数据寄存器字节。 ➢ 1. 第一个字节:地址
D7 D6 D5 D4 D3 D2 D1 D0 1 0 0 1 A2 A1 A0 R/W
2.ADC的主要技术指标
4) 精度
主要涉及两个指标积分非线性度INL(Interger NonLiner) 和差分非线性度DNL(Differencial NonLiner)。
➢ INL表示了ADC器件在所有的数值点上对应的模拟值,和真实值 之间误差最大的那一点的误差值,是ADC最重要的一个精度指标 ,单位是LSB。一个基准为2.55V的8位ADC,1LSB就是 0.01V,用它去测量一个电压信号,得到的结果是100,就表示 它测到的电压值是100×0.01V=1V,假定它的INL是 1LSB,就 表示这个电压信号真实的准确值是在0.99V~1.01V之间的,按 理想情况对应得到的数字应该是99~101,测量误差是一个最低 有效位,即1LSB。
91
91
图10-7 PCF8591 A/D转换逻辑操作波形时序图
10.3.1 PCF8591芯片 A/D转换原理
/ * A/ D 转换程序* /
unsi gned char Get ADCVal ue( unsi gned char chn)
{
unsi gned char val ;
I 2cSt ar t ( ) ;
10.3 PCF8591A/D转换原理与实战
PCF8591的A/D转换使用I2C总线的读方式操作来完成 ,其数据操作格式如图10-6所示。其中data0-data n为A/D 转换结果,分别对应于前一个数据读取期间所采样的模拟电压 。A/D转换结束后,先发送一个非应答信号位A,再发送结束 信号位P。其中灰底色对应信号由主机发出,白底色信号由 PCF8591产生。上电复位后控制字节状态为00H,在A/D转 换时必须设置控制字,即在读操作之前进行控制字节的写入操 作。A/D转换逻辑操作波形时序图如图10-7所示。
10.1.1 一个典型的单片机测控系统
➢ 一般来说,传感器的输出信号只有微伏或毫伏级,需要采用 高输入阻抗的运算放大器将这些微弱的信号放大到一定的幅 度,有时候还要进行信号滤波,去掉各种干扰和噪声,保留 所需要的有用信号。送入A/D转换器的信号大小与A/D转换 器的输入范围不一致时,还需进行信号预处理。)
/ / 寻址 PCF8591,若未应答,则停止操作并返回 0
i f ( ! I 2cWr i t eByt e ( 0x48<<1) )
{
I 2cSt op( ) ;
r et ur n 0;
}
I 2cWr i t eByt e( 0x40 | chn) ;
/ / 写控制字节,选择转换通道
I 2cSt ar t ( ) ;
➢ 单电源供电(2.5-6V,典型值为5V) ➢ 8位逐次逼近式A/D转换 ➢ 待机电流低 ➢ 采样速率取决于I2C总线速率 ➢ 模拟输入电压范围:VSS~VDD。
10.2.1 PCF8591芯片内部逻辑部逻辑结构和引脚图
各引脚信号含义说明如下。 ➢ AIN0-AIN3:模拟信号输入线,提供4路模拟信号 。 ➢ A0-A2:引脚(硬件设备)地址线。 ➢ VSS:电源负极。 ➢ SDA:I2C总线数据输入/输出线。 ➢ SCL:I2C总线时钟输入线。 ➢ OSC:外部时钟输入端,内部时钟输出端。 ➢ EXT:内部、外部时钟选择线,使用内部时钟时,EXT接地。 ➢ AGND:模拟信号地。 ➢ VREF:基准电压输入,取值影响D/A转换输出电压。 ➢ AOUT:模拟信号(D/A转换)输出端。 ➢ VDD:电源端(2.5-6V)
第10章 模数与数模转换
51单片机实战指南
本章内容:
1
A/D和D/A接口概述
2
2
PCF8591的硬件接口
3
A/D转换原理与实战
2
4
D/A转换原理与实战
10.1 A/D和D/A接口概述
➢ 当计算机用于数据采集和过程控制的时候,采集对象往往是 连续变化的物理量(如温度、压力、声波等),但计算机处 理的是离散的数字量,因此需要对连续变化的物理量(模拟 量)进行采样、保持,再把模拟量转换为数字量交给计算机 处理、保存等。计算机的数字量有时需要转换为模拟量输出 去控制某些执行元件,模/数转换器(ADC, Analog to Digital Converter)与数/模转换器(DAC, Digital to Analog Converter)用于连接计算机与模拟电路。为了将 计算机与模拟电路连接起来,我们必须了解ADC和DAC的 接口与控制。
2) 转换精度 由于D/A转换器中受电路元件参数误差、基准电压不稳和运算 放大器的零飘等因素的影响,D/A转换器的实际输出模拟量与 理想值之间存在误差。这些误差的最大值定义为转换精度。转 换误差有比例系数误差、失调误差和非线性误差等。
3.DAC的主要技术指标
3) 建立时间(Setting time) 这是D/A的一个重要性能参数,定义为:在数字输入端发生满 量程码的变化以后,D/A的模拟输出稳定到最终值±1/2LSB时 所需要的时间。
10.2.2 PCF8591芯片器件地址与控制寄存器
2. 第2个字节:控制字 发送到PCF8591的第2个字节被存储在控制寄存器,用
于控制器件功能。
D7 D6 D5 D4 D3 D2 D1 D0
0xxx0xx x
D1, D0 A/D通道选择位:00 通道0;01 通道1;10 通道2;11 通道3
➢ DNL表示的是ADC相邻两个刻度之间最大的差异,单位也是LSB 。一把分辨率是1毫米的尺子,相邻的刻度之间并不都刚好是1毫 米,而总是会存在或大或小的误差。同理,一个ADC的两个刻度 线之间也不总是准确的等于分辨率,也是存在误差,这个误差就是 DNL。
3.DAC的主要技术指标
1) 分辨率(Resolution) 分辨率表明DAC对模拟量的分辨能力,它是最低有效位(LSB )所对应的模拟量,它确定了能由D/A产生的最小模拟量的变 化。通常用二进制数的位数表示DAC的分辨率,如分辨率为8 位的D/A能给出满量程电压的1/28的分辨能力,显然DAC的位 数越多,则分辨率越高。
10.3.1 PCF8591芯片 A/D转换原理
S Address A data0 A data1 A data2 A … data n A P
图10-6 PCF8591的A/D转换数据操作格式
S Addressb7-b1 1 A DATA0 A DATA1 A DATA2 A
SCL
12
SDA
891
D2
自动增益选择(若置1,每次A/D转换后通道号将自动加1)
D5, D4
输入模式选择:00为4路单端输入;01为3路差分输入;10为单 端与差分配合输入;11为2路差分输入
D6
模拟输出使能位(使能为1)
10.2.2 PCF8591芯片器件地址与控制寄存器
3. 第3个字节:D/A转换
发送给PCF8591的第三个字节D/A数据寄存器,表示 D/A模拟输出的电压值。D/A转换我们在后面的例子里会介绍 ,大家知道这个字节的作用即可。我们如果仅仅使用A/D功能 的话,就可以不发送第3个字节。
4) 温度灵敏度 它是指数字输入不变的情况下,模拟输出信号随温度的变化。 一般D/A转换器的温度灵敏度为±50PPM/℃。PPM为百万分 之一。
5) 输出电平 不同型号的D/A转换器的输出电平相差较大,一般为5V~10V ,有的高压输出型的输出电平高达24V~30V。。
10.2 PCF8591的硬件接口
/ / 传输方向改变需要重新启动和写地址
I 2cWr i t eByt e( 0x48<<1 | 0x01) ;
/ / 寻址 PCF8591,指定后续为读操作
I 2cReadByt e( 0) ;
/ / 先空读一个字节,提供采样转换时间
val = I 2cReadByt e ( 1) ;
/ / 读取刚刚转换的值
➢ PCF8591是单片集成、单电源供电、低功耗、8位CMOS 模/数、数/模转换器。该器件具有4路A/D转换输入、1路 D/A转换输出和1个串行I2C总线接口。3个地址引脚A0、 A1和A2可用于编程硬件地址,允许将最多8个器件连接至 I2C总线而不需要额外硬件。PCF8591由于其使用简单方 便,在单片机应用系统得到了广泛应用。PCF8591具有以 下主要特性:
10.1.2 A/D和D/A 转换原理及技术指标
➢ A/D转换是将连续的模拟电信号转换成时间和数值上均离散 的数字信号的过程,A/D转换的过程包括采样、量化和编码 ,按工作原理可分为逐次比较型转换器、双积分型转换器和 并行/串行比较型转换器,其中逐次比较型A/D转换器是最常 用的A/D转换器。
➢ D/A转换是将输入的数字量用二进制代码按数位组合起来, 并按照对应比例关系转换成对应模拟量,然后将这些模拟量 相加,得到与数字量成正比的输出模拟量,数模转换有电压 输出与电流输出两种形式,常用的是输出模拟电压。对于电 流输出的D/A转换器,如需要输出模拟电压,可在其输出端 加一个I-V转换电路。
/********PCF8591.c 文件源代码******************/ #include "PCF8591.h" #include "i2c.h" /*A/D转换程序*/ unsigned char GetADCValue(unsigned char chn) {
I 2cSt op( ) ;