12位串行AD转换器TLC2543与单片机的接口设计与编程

来源:互联网 发布:js中的window.onload 编辑:程序博客网 时间:2024/04/30 07:23

第一次做光学仪器的小项目中的一部分是数据采集后经过模数转换,把采集到的电压用数字量输入到单片机中进行处理。此处总结下TLC2543的相关资料和与单片机接口方面的编程。主要的参考资料是TLC2543的datasheet,其中的电路是自己做的项目中的接口电路,部分程序是参考网上和自己的实际情况改的。

先介绍下TLC2543芯片的一些基本资料。(1)12位分辨率,10us转换时间 (2)11路模拟输入通道,3路内置自测模式 (3)固有取样和保持功能,线性误差最大为1LSB(4)片上系统时钟,转换结束(EOC)输出(5)单级或双极输出操作 (6)可设计的输出数据最高位或最低位在前,可设计的电源中断,可设计输出数据长度。TLC2543的引脚如下图所示


其中(1)AIN0~AIN10:11路模拟输入引脚(2)CS:片选引脚(3)DATA INPUT:串行数据输入引脚(4)DATA OUT:串行输出引脚(5)EOC:为转换结束引脚(6)I/O CLOCK:时钟引脚(7)REF+:基准电压正引脚,通常为VCC(8)REF-:基准电压负引脚,通常为GND (9)VCC:正电源引脚(10)GND:地信号引脚。

TLC2543的转换操作分为I/O周期和实际转换周期两个步骤。

(1)I/O周期:

I/O周期由外部提供的I/O CLOCK来定义,延续8,12或16个时钟周期,主要取决于被选择的数据长度。在I/O周期内,下列两种操作同时进行。

在CLK时钟的前8个脉冲的上升沿,以MSB前导方式从串行数据输入引脚读取8位数据到输入寄存器,其中前4位为模拟通道地址,控制14路模拟多路器从11个模拟输入通道和3个内部自测通道中选通一路连接到采样保持器,该电路从第4个CLK时钟脉冲的下降沿开始,对所选通路的信号进行采样,知道最后一个CLK脉冲下降沿。I/O周期的时钟脉冲个数与输出数据长度(位数)有关,输出数据长度由D3,D2位选择为8,12,16位,当TLC2543处于12或16位工作状态时,在前8个时钟脉冲之后,DATA INPUT引脚的电平无效。

在DATA OUT引脚上串行输出8,12,16位数据,当CS引脚保持低电平时,第一位数据出现在EOC的上升沿;若转换由CS引脚控制,则第一个输出数据发生在CS引脚电平的下降沿,此数据为前一次转换的结果(很重要,值得注意)。在第一个输出数据位后每一位均由后续的CLK脉冲下降沿输出。

(2)实际转换周期:

TLC2543进入转换周期工作方式之后在I/O周期最后一个CLK脉冲的下降沿来到之后EOC变为低电平,采样值保持不变,转换周期开始;片内的转换模块对采样值进行逐次逼近式A/D转换,其工作由与CLK同步的内部时钟控制。当转换结束之后EOC引脚变高,转换结果被锁存在输出数据寄存器中,等待在下一个I/O周期输出(此处注意)。

TLC2543的I/O周期和转换周期交替进行,从而可以减少外部的数字噪声对转换精度的影响。其工作时序如下图所示:


每次进行A/D转换时都必须向TLC2543写入命令字以便确定其工作状态,命令字格式:D7~D4:输入通道地址选择,D3~D2:输出数据长度选择,D1:输出数据顺序选择,D0:输出数据格式选择。

(1)输入通道地址选择位:用于选择TLC2543的输入通道,二进制数0000~1010是11个模拟量AIN0-AIN10的通道地址,1011~1101分别是自测试电压和掉电的通道地址。地址1011,1100和1101所选择的的自测电压分别是(VREF(+)-VREF(-))/2、VREF(-)、VREF(+)。当选择掉电后TLC2543处于休眠状态,此时耗电电流小于20uA。

(2)输出数据长度选择位:用于选择A/D转换结果的位数,当D3~D2为“x0”,A/D转换的结果为12位输出;当D3~D2为“01”,A/D转换的结果为8位输出;当D3~D2为“11”,A/D转换的结果为16位输出。

(3)输出数据顺序选择位:用于选择数据输出的顺序,如果D1=0,则高位在前;否则低位在前。

(4)输出数据格式选择位:用于选择输出数据的属性,如果D0=0,采样数据是无符号数,否则是有符号数。

编写的程序如下:

各引脚的定义:

sbit ADEOC = P0^6;    //AD转换芯片的引脚
sbit ADCLK = P0^5;
sbit ADDATAIN = P0^4;
sbit ADDATAOUT = P0^3;
sbit ADCS = P0^2;

读TLC2543数据的程序:

uint Get_ADData(uchar CHN)//读取AD值
{
uchar i, temp;
uint read_ad_data = 0;
ADDATAOUT = 1;
CHN = CHN<<4;   //12位格式,选择高位在前,单极性. 注:CHN为通道数,并非DATAIN控制字。0~13:0x00~0x0d。所以前四位舍弃,左移的后四位表示通道数
ADCLK = 0;
ADCS = 1;
ADCS = 0;


temp = CHN;


for(i = 0; i<12; i++)
{
read_ad_data = read_ad_data <<1;
if((temp&0x80) != 0)
{
ADDATAIN = 1;
}
else 
{
ADDATAIN = 0;
}
if(ADDATAOUT)
{
read_ad_data = read_ad_data + 1;
}
_nop_();
_nop_();
ADCLK = 1;
_nop_();
_nop_();
ADCLK = 0;
_nop_();
_nop_();
temp = temp <<1;
}
ADCS = 1;
_nop_();
_nop_();
read_ad_data = read_ad_data & 0X0FFF;
return (read_ad_data);

}