目前,高分辨率A/D转换器的价格已经较低,采用新出现的高分辨率、性能价格比较优的A/D转换器进行模拟量采集电路设计是新型A/D数据采集系统的基本要求。具有11个输入端的12位模数转换器TLC2543是美国德州仪器公司TI(TEXAS INSTRUMENTS)于近几年推出的一种性价比较优的12位A/D转换芯片,具有多种封装形式,并具有民用级、工业级、军用级产品。在产品型号、规格、封装形式、适用范围等方面,已形成一个系列。从1998年开始在我国推广使用。就12位A/D转换器来说,TLC2543具有转换快、稳定性好、与微处理器接口简捷、编程价格低等优点,在嵌入式测控领域使用较多。
1.TLC2543的引脚说明
TLC2543是12位开关电容逐次逼近模数转换器,有多种封装形式,其中DB、DW或N封装的管脚图见图10-8。TLC2543有20根引脚,其它封装形式、引脚数及引脚功能相同。引脚的简要说明见表10-3。

(1) 控制字的格式
控制字为从DATA INPUT端串行输入TLC2543芯片内部的8位数据,它告诉TLC2543要转换的模拟量通道、转换后的输出数据长度、输出数据的格式。其中高4位(D7~D4)决定通道号,对于0通道至10通道,该4位分别为0000、0001、…、1010,该4位为其它数字时的功能,用于检测校正,这里不作具体介绍。低4位决定输出数据长度及格式,其中D3、D2位决定输出数据长度,TLC2543的输出数据长度有8位、12位、16位,但由于TLC2543为12位A/D转换芯片,经过分析可以看出,8位、16位输出对TLC2543的应用意义不大,宜定在12位输出,D3、D2两位为00即可。但是有时16位输出是为了接口数据传输的需要,必须定义为16位输出格式,此时D3、D2两位为11。D1位决定输出数据是高位先送出,还是低位先送出,若为高位先送出,该位为0,反之为1。D0位决定输出数据是单极性(二进制)还是双极性(2的补码),若为单极性,该位为0,反之为1。
举例说明:设采集第6通道、输出数据为12位、高位先送出、输出数据的格式为二进制,则控制字为:0110 0000,用十六进制表示即为60H,这里基于此格式说明转换过程。

(2) TLC2543的内部寄存器
从编程角度看,TLC2543内部寄存器有输入数据寄存器与输出数据寄存器。输入数据寄存器存放从DATA INPUT端移入的控制字。输出数据寄存器存放转换好的数据,以供从DATA OUT端移出。
(3) 转换过程
上电后,片选 必须从高电平变为低电平,才能开始一次工作周期,此时EOC为高,输入数据寄存器被置为0,输出数据寄存器的内容是随机的。
开始时,片选 为高,I/O CLOCK、DATA INPUT被禁止,DATA OUT呈高阻状态,EOC为高。使 变低,I/O CLOCK、DATA INPUT使能,DATA OUT脱离高阻状态。12个时钟信号从I/O CLOCK端依次加入,随着时钟信号的加入,在时钟信号的上升沿时控制字从DATA INPUT一位一位地被送入TLC2543(高位先送入),同时上一周期转换的A/D数据,即输出数据寄存器中的数据从DATA OUT一位一位地移出。TLC2543收到第4个时钟信号后,通道号也已收到,因此,此时TLC2543开始对选定通道的模拟量进行采样,并保持到第12个时钟的下降沿。在第12个时钟下降沿,EOC变低,开始对本次采样的模拟量进行A/D转换,转换时间约需10µs,转换完成EOC变高,转换的数据在输出数据寄存器中,待下一个工作周期输出。此后,可以进行新的工作周期。
3.TLC2543与MCU的接口方法
TLC2543与微处理器芯片的接口部分有五个引脚,分别是:时钟输入(I/O CLOCK)、串行控制字输入(DATA INPUT)、片选输入( )、A/D转换串行数据输出(DATA OUTPUT) 、转换结束电平输出(EOC)。经分析TLC2543的工作时序,可以通过软件估计转换结束,免去EOC接线。
TLC2543与具有SPI或相同接口能力的MCU可以直接连接,对于没有SPI接口的MCU可以通过软件编程合成SPI操作。
10.6.2 SPI模块与TLC2543的接口扩展
本小节给出基于SPI扩展高位A/D转换实例。
1.扩展电路设计

图10-9给出了利用SPI及MCU的PTC口的PTC0-PTC1扩展两片TLC2543的电路原理。其中第0片TLC2543的片选接MCU的PTC0、第1片TLC2543的片选接MCU的PTC1,每片TLC2543可接11路模拟量输入,这样图10-9电路可外接22路模拟量。当有更多路数模拟量需要输入时,可以按此方法继续扩展。该电路适用于模拟量路数较多、且对实时性要求不是太高的数据采集系统。
2.编程方法
下面给出基于上述电路的A/D采集子程序,程序实例所在的路径:MC08Ex2007\GP32\GP32C\C05_2543。
(1) ADC.h
//[ADC.h]:AD采集驱动头文件--------------------------------------------------
//头文件
#include "GP32C.h" //GP32 MCU映像寄存器名定义
#include "Type.h" //类型别名定义
//宏定义
#define SPICR SPCR //SPI控制寄存器
#define SPIDR SPDR //SPI数据寄存器
#define SPISCR SPSCR //SPI状态和控制寄存器
#define ReFullBit 7 //SPI接收器满标志位
#define SendEmyptBit 3 //SPI发送器空标志位
#define CS_P PTC //C口作为TLC2543的片选信号输出口
#define CS_D DDRC
//函数声明
void SPIinit(void); //SPI初始化
void ADCaverage(INT8U ch, INT8U n, INT16U *value); //2片2543-22路AD采集
void TLC2543(INT16U cs, INT16U channel, INT16U *value); //TLC2543芯片A/D转换
(2) ADC.C
//[ADC.c]AD采集驱动--------------------------------------------------------*
//本文件包含: *
// (1)SPIinit:SPI初始化 *
// (2)ADCaverage:某一路A/D转换平均值子程序 *
// (3)TLC2543:TLC2543芯片A/D转换 *
//硬件连接: *
// (1)TLC2543的I/O LOCK(18)接MC08HC908GP32的SPSCK(18) *
// (2)TLC2543的DATA INPUT(17)接MC08HC908GP32的MOSI(17) *
// (3)TLC2543的DATA OUT (16)接MC08HC908GP32的MISO(16) *
// (4)TLC2543的0-1片的片选CS(15)分别接MC08HC908GP32的PTC0-1 *
//-------------------------------------------------------------------------*
#include "ADC.h"
//SPIinit:SPI初始化子程序--------------------------------------------------*
//功 能:对SPI进行初始化,默认为允许SPI,主机工作方式,时钟空闲低电平,比特率 *
// 8分频,波特率为CGMOUT/2*BD(设CGMOUT=2*fBUS=2*2.4576MHz) *
//参 数:无 *
//返 回:无 *
//-------------------------------------------------------------------------*
void SPIinit(void)
{
SPCR = 0b00100010; //不产生中断、主机方式、时钟空闲低电平
SPSCR = 0b00000001; //8分频
}
//ADCaverage:某一路A/D转换平均值子程序-------------------------------------*
//功 能:对TLC2543(0-1)片的某一通道进行n次A/D转换,平均值放入内存Value *
//参 数: *
// (1)ch:通道号(0-21) *
// (2)n:采集次数(1-255) *
// (3)value:A/D转换平均值(传址) *
//返 回:无 *
//内部调用:TLC2543芯片A/D转换 *
//-------------------------------------------------------------------------*
void ADCaverage(INT8U ch, INT8U n, INT16U *value)
{
INT8U i;
INT8U cs,channel;
INT16U temp;
*value = 0;
temp = 0;
//对第cs片2543的channel通道采集数据,每一路采集n次,总和-->value
for(i = 0;i < n;i++)
{
cs = ch / 11; //片选号
channel = ch % 11; //每一片的通道号
TLC2543(cs, channel, &temp);
*value += temp;
}
*value = *value / n; //求平均值
}
//TLC2543:TLC2543芯片A/D转换子程序-----------------------------------------*
//功 能:用TLC2543芯片实现A/D转换 *
//参 数: *
// (1)cs:片号 *
// (2)channel:每一片的通道号0-10 *
// (3)value:转换后的AD数据 *
//返 回:无 *
//-------------------------------------------------------------------------*
void TLC2543(INT16U cs, INT16U channel, INT16U *value)
{
INT8U temp;
INT8U buf[2];
CS_D = 0xff; //定义PTC为输出
CS_P = 0xff; //C口全为高电平
//TLC2543片选CS = 1
CS_P &= ~(1 << cs); //相应片TLC2543的片选CS = 0,产生高到低的变化
//发送控制字
SPIDR = (channel << 4) | 0x0C; //入口通道、16位格式、MSB先送出、二进制
while ((SPISCR & (1 << SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
//发送完毕
while ((SPISCR & (1 << ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
//取出上次转换结果高字节
*buf = SPIDR; //*buf中存放的是D11-D4位
SPIDR = *buf; //握手信号
while ((SPISCR & (1 << SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
//发送完毕
while ((SPISCR & (1 << ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
//接收到数据
*(buf + 1) = SPIDR; //*(buf+1)中存放D3-D0位
CS_P = 0xff; //TLC2543片选CS=1
//整合后*buf存放高四位(D11-D8),*(buf + 1)中存放低八位(D7-D0)
*(buf + 1) = (*(buf + 1) >> 4) | (*buf << 4);
*buf = *buf >> 4;
*value = (INT16U) *buf;
*value = *value << 8;
*value = *value | *(buf + 1);
}


