【用 途】 串行A/D转换器
【性能 参数】
小型SOT23-6封装;采用6引脚贴片封装。电源电压2.7 V~5.5 V;低电流消耗240 μA。由带有可调增益的△-∑型转换器内核、2.048 V的电压基准、时钟振荡器和I2C总线接口组成。为精密、可连续自校准的串行A/D转换器。带有差分输入和高达16位的分辨率,其串行接口为IIC总线。具有完整的数据采集系统和片内基准电压:精度2.048 V+0.05%;片内含可编程增益放大器PGA;片内振荡器;16位分辨率;可编程的转换速率15次/秒~240次/秒;I2C总线接口(8个有效地址)。
A/D转换器内核是由差分开关电容△-∑调节器和数字滤波器组成。调节器测量正模拟输入和负模拟输入的压差,并将其与基准电压相比较。数字滤波器接收高速数据流并输出代码,该代码是一个与输入电压成比例的数字,即A/D转换后的数据。 ADS1110片内电压基准是2.048 V。ADS1110只能采用内部电压基准该基准,不能测量,也不用于外部电路。ADS1110片内集成时钟振荡器用于驱动△-∑调节器和数字滤波器。ADS1110的信号输入端设有可编程增益放大器PGA,其输入阻抗在差分输入时的典型值为2.8 MΩ。
ADS1110的使用
I2C总线接口 ADS1110通过I2C总线(内部集成电路)接口通信,AT89C51单片机的2个I/O接口最多可挂接8个ADS1110,单片机对ADS1110的识别通过I2C地址实现。ADS1110只能作为从机。 ADS1110的I2C地址是1001aaa,其中aaa是出厂时默认设置。ADS1110有8种不同类型,每种类型都有不同的I2C地址。封装上,ADS1110的每种类型都以EDx为标识,其中x表示地址变量。
寄存器 ADS1110含有输出寄存器和配置寄存器,可通过I2C端口进行访问。输出寄存器存储A/D转换结果,而配置寄存器用于设置ADS1110的工作方式,数据速率和可编程增益放大器,也可用于查询器件状态。
ADS1110的读写 读操作 若从ADS1110中读取输出寄存器和配置寄存器的内容,需对ADS1110寻址。从ADS1110中读取3个字节,前2个字节是输出寄存器的内容,第3个字节是配置寄存器的内容。读操作时,只读前2个字节而不读第3个字节。ADS1110的读操作时序如图3所示。 3.3.2写操作 为了对配置寄存器写操作,要对ADS1110寻址,并向配置寄存器写入1个字节,但不能向输出寄存器写人字节。
ADS1110在AT89C51系统应用 硬件设计 由于AT89C51单片机没有I2C总线接口,可通过软件模拟实现与I2C总线器件的连接。具体方法是将单片机的I/O接口连接至I2C的数据线SDA和时钟线SCL。通过软件控制时钟和数据传输,系统灵活性强。 数据采集显示系统,采集工业现场的4路模拟信号并轮询显示。采用4个ADS1110作为A/D转换器,地址为ED0~ED3。具有I2C总线接口的EEPROM AT24C16作为存储器。本系统有4位LED数码显示管和4个参数设定按键。采集数据经数字滤波、16进制→工程值转换后,送至数码管轮询显示。ADS1110和AT24C16的I2C接口连ADSl110数据线SDA至单片机的P1.0,时钟线SCL连接单片机的P1.1,上拉电阻阻值选10 kΩ。
软件设计 按照硬件电路,编写A/D转换子程序为ADS0,其中嵌套调用了START,为起始命令子程序,FSDZ1为向ADS1110发送单个字节命令的子程序,ADREAD是读取输出寄存器和配置寄存器的子程序,STOP是停止命令子程序。ADS0只对地址为ED0的ADS1110读数,如果要读取其他ADS1110,只需更改地址即可。系统中ADS1110的工作方式选用默认设置,即配置寄存器内容为#8CH,所以程序未向配置寄存器写入数据。程序代码如下:
结束语 ADS1110是一款高性价比具有I2C总线接口的串行A/D转换器。ADS1110已在单片机系统中应用,并用于现场。实践证明,ADS1110和单片机组成的数据采集系统,占用I/O端口少、功耗低,适用无电源场合。
【互换 兼容】
//本程序采用IIC通信方式,4兆PIC16F877
//是ADS1100,ADS1110的通用程序。
刚通过。
# include<pic.h>
# define uch unsigned char
# define unint unsigned int
# define SDA RD1
# define SCL RD0
uch ACK;
unint j;
void delay() //延时
{
for(j=5535;--j;) continue;
}
void start (void) //开始
{
TRISD0=0;
TRISD1=0;
SDA=1;
asm("nop");
SCL=1;
asm("nop");
asm("nop");
asm("nop");
SDA=0;
asm("nop");
asm("nop");
asm("nop");
SCL=0;
asm("nop");
asm("nop");
}
void stop(void) //结束
{
TRISD0=0;
TRISD1=0;
SDA=0;
asm("nop");
SCL=1;
asm("nop");
asm("nop");
asm("nop");
SDA=1;
asm("nop");
asm("nop");
asm("nop");
SCL=0;
asm("nop");
asm("nop");
}
uch check(void) // 检查应答信号
{
TRISD1=1;
SCL=0;
SCL=1;
if (SDA )
{
ACK = 1;
}
else
{
ACK = 0;
}
SCL=0;
return(ACK);
}
void sendBYTE(uch data) // 发送一个字节
{
uch bitcount=8; //发送8位
do
{
TRISD0=0;
TRISD1=0; //置输出
if((data&0x80)==0x80)
{
SDA=1; //写 1
}
else
{
SDA=0; //写 0
}
SCL=0; //在时钟大于4u秒期间写数据
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
data=data<<1;
bitcount--;
} while(bitcount);
TRISD1=1 ; //释放总线等待应答
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
}
uch reciveBYTE(void) //接受一个字节
{
uch temp1=0;
uch bitcount1=8;
TRISD0=0;
TRISD1=1; //置输入
do
{ SCL=0; //在时钟大于4u秒期间读数据
SCL=1;
asm("nop");
asm("nop");
if(SDA) //读 1
{
temp1=temp1|0x01;
}
else //读 0
{
temp1=temp1&0xfe;
}
SCL=0;
if(bitcount1-1)
{
temp1=temp1<<1;
}
bitcount1--;
}while(bitcount1);
return(temp1);
}
void ack(void) // 发送连续读信号
{
TRISD0=0;
TRISD1=0;
SDA=0;
SCL=0;
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
}
void nack(void) // 发送不连续读信号
{
TRISD0=0;
TRISD1=0;
SDA=1;
SCL=0;
SCL=1;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
asm("nop");
SCL=0;
}
void wrtoIIC(uch data) //写器件地址和配置字
{
start(); //开始写
sendBYTE(0x90); //写器件地址(写)
do{
;
}while(check()); //等待应答
sendBYTE(data); //写配置字
do{;
}while(check());
stop(); //结束写
}
void rdfromIIC(void) //从ADS1100中读出数据
{
start(); //开始读
sendBYTE(0x91); //写器件地址(读)
do{
;
}while(check()); //等待应答
TMR1H=reciveBYTE(); // 读高8位
ack(); //连续读
TMR1L=reciveBYTE(); //读低8位
ack(); //连续读
TMR2=reciveBYTE(); //读配置字
nack();
stop(); //结束读
// delay();
}
main()
{
while(1)
{
di();
wrtoIIC( 0x8c);
rdfromIIC();
}
}