单片机与AD1555/AD1556的接口和软件设计
关键词:模数转换 接口电路 AD1555/AD1556
AD1555/AD1556芯片组是高动态、高精度∑-δ模数转换器件。它内部的可编程增益放大器可实现五种放大倍数,从而实现五种不同的输入范围1.6V、636mV、187mV、47mV、12.4mV。调制器工作在采样频率256kHz上,它的输出正比于输入电压。
1 AD1555/AD1556内部构成
AD1555是AD公司24位∑-δ模数转换器件,内部集成有可编程的增益放大器,是为低频、高动态场合而设计的。它输出的串行数据和输入的模拟信号成正比。它和数字滤波器AD1556配合使用,可实现工业上最高性能1kHz的模/数转换。它的连续模拟信号调理器输入结构,可以在设计电路中不使用外部的抗混叠滤波器。它的可编程增益放大器,可减化电路的设计,扩展动态范围,减小电路板的面积。它的低功率和等待模式使它也适合远程电池供电的数据测量系统。
AD1555主要由多路选择器电路、可编程增益放大器电路、模/数转换电路、振荡电路、控制逻辑电路组成。AD1556主要由输入多路选择器电路、数字滤波器电路、数据寄存器、输出多路选择电路、可编程增益放大器控制电路、配置寄存器电路、可编程增益放大器控制电路、配置寄存器电路、数据输入移位寄存器电路、分频电路等组成。图1为AD1555/AD1556连接示意图。
图1 AD1555/AD1556连接示意图 点击放大
2 AD1555引脚功能
AGND:模拟信号地。
PGAOUT:内部可编程增益放大器电路的输出,它和AD1555的MODIN直接相连。
+VA:-VA:模拟正负5V电源。
AIN+、AIN-:模拟信号输入。它是多路选择器电路一个输入信号。
TIN+:TIN-:测试信号输入。它是多路选择器电路一个输入信号。
NC:厂家保留,通常用户不连。
CB0~CB4:调制器控制。它来控制多路选择器,可编程增益设置和输入选择,如表1、2所列(其它模式略)。AD1555和AD1556共同使用时,它和AD1556的CB0~CB4直接相连。
表1 增益选择
CB2 | 0 | 0 | 0 | 0 | 1 |
CB1 | 0 | 0 | 1 | 1 | 0 |
CB0 | 0 | 1 | 0 | 1 | 0 |
增益 | 1 | 2.5 | 8.5 | 34 | 128 |
表2 输入选择
CB4 | 0 | 0 | 1 |
CB3 | 0 | 1 | 0 |
输入 | 内部接地输入 | TIN输入 | AIN输入 |
MFLAG:调制器错误。如果输入信号超出AD1556的量程,它会发出一个高电平脉冲,它和AD1556的MFLAG直接相连。
VL、DGND:数字电源,通常为5V。
DMATA:调制器输出。它是调制器产生模数转换数据输出端,和AD1556的MDATA相连。
MCLK:调制器时钟输入,通常是256kHz,提供给∑-δ模数转换调制器所需的时钟。它和AD1556相连,由AD1556提供时钟。
REFCAP1:模数转换器滤波器。它和AGND3之间可以连接一个22μF的钽电容来实现对模数转换器参考电源输入的滤波。
REFCAP2:参考电压滤波器。
REFIN:参考电压输入,输入3V的电压提供给内部的∑-δ模数转换电路。
AGND2:模拟地。
MODIN:∑-δ模数转换电路输入端,通常直接和PGAOUT相连。
3 AD1556引脚功能
PGA0~PGA4:可编程增益放大器和多路选择器控制输入端。它在复位期间或硬件选择条件下设置AD1556相应的配置寄存器。
BW0~BW2:输出速率控制输入端。它在复位期间或硬件选择条件下设置AD1556相应的配置寄存器,其相应的含义如表3所列。
表3 速率选择
BW2 | BW1 | BW0 | 输出速率/ms |
0 | 0 | 0 | 4 |
0 | 0 | 1 | 2 |
0 | 1 | 0 | 1 |
0 | 1 | 1 | 1/2 |
1 | 0 | 0 | 1/4 |
1 | 0 | 1 | 1/8 |
1 | 1 | 0 | 1/16 |
1 | 1 | 1 | 保留 |
HS:硬件/软件方式选择,当它为高时,配置寄存器由PGA0~PGA4、BW0~BW2来设置相应的位;当它接地时,由软件写入配置寄存器。
VL、DGND:数字电源,3.3V或5V。
SCLK:串行数据时钟,数据写入与读出的时钟信号。
DOUT:串行数据输出。当RSEL为有效时,它输出状态寄存器的内容;否则,它输出模数转换的结果。
DRDY:数据准备好,当输出为高电平时,它指示输出寄存器数据准备好,可以访问。
CS:片选信号,在数据访问期间,必须保持低电平。
R/W:读写信号,读时保持高电平,写时保持低电平,并使DOUT保持高阻状态。
RSEL:寄存器选择信号。当它设为高时,访问数据寄存器;当它设为低时,访问状态寄存器。
DIN:串行数据输入,高位在前,低位在后,SCLK下降沿数据有效。
ERROR:出错信号。当模数转换或数字滤波出错时,输出低电平,并且状态寄存器相应的ERROE会为1(见表5)。
RESET:滤波器复位信号。当它为高电平时,清除状态寄存器的错误位,并且把寄存器配置成相应的硬件引脚设置成的状态。
PWRDN:硬件掉电控制。
CSEL:滤波器输入选择。当把它设为高时,滤波器选择TDATA输入;当把它设为低时,滤波器选择MDATA输入。
TDATA:测试数据,用户输入数据至滤波器来测试滤波器。
SYNC:同步输入信号。当把它置为高电平时,在CLKIN的第一个上升沿,清除AD1556滤波器。
CLKIN:时钟输入,给AD1556提供所需的时钟,并经过四分频后,从MCLK口输入到AD1555。
MCLK:调制器时钟,给AD1555提供时钟信号。
DMATA:调制器数据,接收AD1555提供的位流数据。
MFLAG:调制器错误,当输入模拟信号超出AD1555的量程时,AD1555的MFLG变为高电平,AD1556会在第一个CLKIN上升沿检测到这个信号,并且会使ERROR信号变低,把状态寄存器的BIT24设为高。
CB0~CB4:调制器控制,用来设置AD1555的状态。
4 AD1556的配置寄存器和状态寄存器
配置寄存器,如表4所列,是通过外部控制器写入的。当HS为低时,CB0~CB4用来设置AD1556可编程增益放大器的输入和放大倍数。
表4 配置寄存器
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
CB0 | CB1 | CB2 | CB3 | CB4 | DRDYBUF | BW0 | BW1 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
BW2 | X | CSEL | PWRDN | X | X | X | X |
CB4、CB3:决定可编程增益放大的输入,如表1所列。(当都为1时例外)。
此时,CB2~CB0决定可编程放大器的倍数。
DRDYBUF:决定DRDY输出引脚的方式。当给RDYBUF位写入0时,DRDY为CMOS通常的推拉方式;当给DRDYBUF位写1时,DRDY为漏式的PMOS方式。这种方式在多个AD1556情况下使用。
BW2~BW0:滤波器的带宽选择,如表3所列。
CSEL:TDATA选择输入,当给TDATA位写入1时,选择TDATA输入。
PWRDN:掉电选择,当给PWRDN位写入1时,进入掉电状态。
5 状态寄存器
状态寄存器是一个24位寄存器,当有错误发生时,相应的位就会被置位。它还保存着芯片的配置状态,各个位的相应含义如表5所列。
表5 状态寄存器
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
CB0 | CB1 | CB2 | CB3 | CB4 | X | BW0 | BW1 |
8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
BW2 | X | CSEL | PWRDN | X | X | X | X |
16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 |
DRNG | FLSTL | DRDY | ACC | X | MFLG | OVWR | ERROR |
CB0~CB5含义见表1、2。
BW0~BW2含义见表3。
6 AD1555/AD1556硬件接口电路
传感器的输出接到AD1555的AIN+、AIN-输入端。增益放大器的输出PGAOUT直接连到∑-δ模数转换电路输入引脚MODIN,+3V通过REFIN输入引脚提供给AD1555的参考电压。AD1555的可编程增益放大器的放大倍数和输入选择控制引脚CB0~CB4和AD1556的CB0~CB4直接相连,由AD1556来配置。AD1556的CLKIN外接一个1.024MHz的时钟信号,HS接地,CSEL接地,CS、R/W、RSEL、SCLK、DIN、DOUT、DRDY、ERROR、SYNC分别与单片机AD89C51的P1口相连(AD1556和单片机的电路接口略)。
7 接口软件
下面只介绍AD1556和AD89C51单片机接口软件的读写程序。(以下程序在μVision 2 v2.12调试通过)
(1)AD1555/AD1556的初始化和写入程序
假设AD1555的可编程增益放大器的放大倍数为1,采样频率为250Hz,则AD1556的配置寄存器为80H。
#include<reg51.h>
#define HIGH1
#define LOW0
#define FALSE0
#define TRUE~FALSE
sbit CS=0x80;
sbit RW=0x81;
sbit RSEL=0x82;
sbit SCLK=0x83;
sbit DOUT=0x84;
bit DIN=0x85;
sbit DRDY=0x86;
sbit ERROR=0x87;
/*延时子程序*/
void delay(void){
int i;
for(i=0;i<100;i++);
}
/*模拟向AD1556写入一个数据位*/
void W_bit(bit wbit){
DIN=wbit;
SCLK=HIGH;
delay();
SCLK=LOW; //wbit写入芯片
delay();}
void W_word(unsigned int wdata){
char i;
bit temp; //选通芯片
RW=LOW; //写操作
/*16位数据由高到低写入芯片*/
for(i=1;i<=16;i++){
temp=(bit)(wdata&0x80);
W_bit(temp);
wdata=wdata<<1;}}
在主程序中直接调用上面子程序可实现对配置寄存器的写。
W_word(0x8);
(2)AD1556的读出程序
/*模拟从AD1556读出一个数据位*/
bit R_bit(void){
bit rbit;
SCLK=HIGH;
delay();
SCLK=LOW;
rbit=DOUT;
delay();
return(rbit);
}
unsigned long R_word(bit is){
unsigned long rdata=0;
char j;
bit rtemp;
if(is) //判断是否读配置寄存器
RSEL=HIGH; //是,RSEL设为高电平
Else
RSEL=LOW; //否,读数据,设为低电平
RW=HIGH; //发出读信号
CS=LOW; //选通AD1555
SCLK=HIGH;
while(DRDY){
for(j=1;j<=24;j++){
rdata=rdata *2;
rtemp=R_bit();
rdata=rdata+(int)rtemp;
}
delay();
}
CS=HIGH;
Return rdata;
}
读状态寄存器和数据都是用上面子程序R_word(is)来实现的。要读状态寄存器,则传递给is的值为1;要读数据,则传递给is的值为0。
评论