TLC1543 AD转换
1. TLC1543介绍
TLC1543美国TI司生产的多通道、低价格的模数转换器。采用串行通信接口,具有输入通道多、性价比高、易于和单片机接口的特点,可广泛应用于各种数据采集系统。 TLC1543为20脚DIP装的CMOS 10位开关电容逐次A/D逼近模数转换器,引脚排列如图1 所示。其中A0~A10(1~9 、11、12脚)为11 个模拟输入端,REF+(14脚,通常为VCC)和REF-(13脚,通常为地)为基准电压正负端,CS(15脚)为片选端,在CS端的一个下降沿变化将复位内部计数器并控制和使能ADDRESS、I/O CLOCK (18脚)和DATA OUT(16脚)。ADDRESS(17脚)为串行数据输入端,是一个1的串行地址用来选择下一个即将被转换的模拟输入或测试电压。DATA OUT 为A/D转换结束3态串行输出端,它与微处理器或外围的串行口通信,可对数据长度和格式灵活编程。I/O CLOCK数据输入/输出提供同步时钟,系统时钟由片内产生。芯片内部有一个14通道多路选择器,可选择11个模拟输入通道或3个内部自测电压中的任意一个进行测试。片内设有采样-保持电路,在转换结束时,EOC(19脚)输出端变高表明转换完成。内部转换器具有高速(10µS转换时间),高精度(10分辨率,最大±1LSB不可调整误差)和低噪声的特点。
图1 引脚排列
2. TLC1543工作时序
TLC1543工作时序如图2示,其工作过程分为两个周期:访问周期和采样周期。工作状态由CS使能或禁止,工作时CS必须置低电平。CS为高电平时,I/O CLOCK、ADDRESS被禁止,同时DATA OUT为高阻状态。当CPU使CS变低时,TLC1543开始数据转换,I/O CLOCK、ADDRESS使能,DATA OUT脱离高阻状态。随后,CPU向ADDRESS提供4位通道地址,控制14个模拟通道选择器从11个外部模拟输入和3个内部自测电压中选通1 路送到采样保持电路。同时,I/O CLOCK输入时钟时序,CPU从DATA OUT 端接收前一次A/D转换结果。I/O CLOCK从CPU 接收10时钟长度的时钟序列。前4个时钟用4位地址从ADDRESS端装载地址寄存器,选择所需的模拟通道,后6个时钟对模拟输入的采样提供控制时序。模拟输入的采样起始于第4个I/O CLOCK下降沿,而采样一直持续6个I/O CLOCK周期,并一直保持到第10个I/O CLOCK下降沿。转换过程中,CS的下降沿使DATA OUT引脚脱离高阻状态并起动一次I/O CLOCK工作过程。CS上升沿终止这个过程并在规定的延迟时间内使DATA OUT引脚返回到高阻状态,经过两个系统时钟周期后禁止I/O CLOCK和ADDRESS端。
图2 工作时序
3. TLC1543采样程序
//TLC1543,AD采样程序
#include "TLC1543.h"
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
//AD,TLC1543 端口定义
sbit AD_CLK = P0^7; //AD时钟
sbit AD_ADD = P0^6; //AD地址口
sbit AD_DATA = P0^5; //AD数据口
sbit AD_CS = P0^4; //AD片选
//TLC1543,AD模块,采样端口定义
#define AD_A0 0x00 //采样端口A0
#define AD_A1 0x01 //采样端口A1
#define AD_A2 0x02 //采样端口A2
#define AD_A3 0x03 //采样端口A3
#define AD_A4 0x04 //采样端口A4
#define AD_A5 0x05 //采样端口A5
#define AD_A6 0x06 //采样端口A6
#define AD_A7 0x07 //采样端口A7
#define AD_A8 0x08 //采样端口A8
#define AD_A9 0x09 //采样端口A9
#define AD_A10 0x0a //采样端口A10
#define AD_A11 0x0b //测试端口2.45V,(Vref+ - Vref-)/2 = 200H
#define AD_A12 0x0c //测试端口0.00V, Vref- = 000H
#define AD_A13 0x0d //测试端口4.91V, Vref+ = 3FFH
//==================================================
//函数:uint ReadPort(uchar port)
//描述:采样端口并转换
//参数:uchar port //采样端口A0-A10
//返回:uint //转换结果(十位)
//作者:geoff 日期:2010/11/02
//修改: 日期:
//版本:V1.1
//==================================================
uint ReadPort(uchar port) //采样端口并转换
{
uchar i;
uint outData = 0; //转换结果
AD_CLK = 0;
AD_CS = 0;
port <<= 4; //左移四位,取高四位地址
for(i=0; i<4; i++) //发送四位地址
{
AD_ADD = (bit)(port&0x80);
AD_CLK = 1;
AD_CLK = 0;
port <<= 1;
}
for(i=0; i<6; i++) //补全十个时钟
{
AD_CLK = 1;
AD_CLK = 0;
}
AD_CS = 1; //
_nop_();
_nop_(); //等待AD转换
AD_CS = 0; //准备接受转换数据
for(i=0; i<10; i++)
{
AD_CLK = 1;
outData <<= 1;
if(AD_DATA)
outData |= 0x01;
AD_CLK = 0;
}
AD_CS = 1;
return outData;
}
4个时钟的访问周期,紧接着是6个时钟的采样周期,等待2个时钟后,10个时钟输出转换结果。