智能化多路串行数据采集/传输模块的设计
引言
随着电子技术的不断发展,目前对各种物理量的检测和控制都可得以实现。微机检测控制系统不仅运用到航天航空、机器人技术、纺织机械、食品加工等工业过程控制,而且已经成为日常各种家用电器当中的主要组成部分。其中,a/d(模拟数字转换)设备起着十分重要的作用。这样,一个系统中就会需要更多的a/d设备。一般是用扩展一块或多块a/d采集卡的方法去实现。当模拟量较少或是温度、压力等缓变信号场合,采用总线型a/d卡并不是最合适、最经济的方案。这里介绍一种以at89c2051单片机为核心,采用tlc2543l
12位串行a/d转换器构成的采样模块,该模块的采样数据由单片机串口经电平转换后送到上位机(pc机)的串口com1或com2,形成一种串行数据采集串行数据传输的方式。
主要元件功能介绍
at89c2051单片机
at89c2051是atmel公司推出的一种性能价格比极高的 8位单片机,其指令系统与mcs-51系列完全兼容。引脚排列如图1所示。

tlc2543l 采用spi串行接口总线,spi串行接口总线由motorola公司提出,它是一种三线同步接口,分别为同步信号、输入信号和输出信号。另外芯片还有一根片选线,单片机通过片选线选通tlc2543l。其中,clk为同步时钟脉冲,cs为片选线,din为单片机的数据输出和tlc2543l的数据输入线,dout为单片机的数据输入线和tlc2543l的数据输出线。图2为tlc2543l时序图。tlc2543l 是全双工的,即数据的发送和接收可同时进行。如果只是对tlc2543l写数据,单片机可以丢弃同时读入的数据;反之,如果只读数据,可以在命令字节后,写入任意数据。数据传送以字节为单位,并采用高位在前的格式。

(1) 11个模拟输入通道;
(2) 转换时间10 s;
(3) 12位分辨率a/d转换器;
(4) 3路内置自测试方式;
(5) 采样率为66kbps;
(6) 线性误差+1lsb(max)
(7) 有转换结束(eoc)输出;
(8) 具有单、双极性输出;
(9) 可编程的msb或lsb前导;
(10)可编程的输出数据长度。 tlc2543l的引脚排列如图3所示。图3中ain0~ain10为模拟输入端; 为片选端;din
为串行数据输入端;dout为a/d转换结果的三态串行输出端;eoc为转换结束端;clk为i/o时钟;ref+为正基准电压端;ref-为负基准电压端;vcc为电源;gnd为地。

max232c为rs-232收发器,简单易用,单+5v电源供电,仅需外接几个电容即可完成从ttl电平到rs-232电平的转换,引脚排列如图4所示。

硬件电路如图5所示。

单片机软件设计
单片机程序主要包括串行数据采集/传输模块的系统信息、通道数、采集周期和通讯协议定义,以及数据采集和传输的标准子程序。
tlc2543l的通道选择和方式数据为8位,其功能为:d7、d6、d5和d4用来选择要求转换的通道,d7d6d5d4=0000时选择0通道,d7d6d5d4=0001时选择1通道,依次类推;d3和d2用来选择输出数据长度,本程序选择输出数据长度为12位,即d3d2=00或d3d2=10;d1,d0选择输入数据的导前位,d1d0=00选择高位导前。
tlc2543l在每次i/o周期读取的数据都是上次转换的结果,当前的转换结果在下一个i/o周期中被串行移出。第一次读数由于内部调整,读取的转换结果可能不准确,应丢弃。
数据采集程序如下:
sbit datain=p1^1;
sbit clock=p1^0;
sbit dataout=p1^2;
sbit cs=p1^3;
bit datain_a_bit0()
{ bit m=0;
dataout=1;
m=dataout;
datain=0;
nop();
clock=1;
nop();
clock=0;
return(m);
}
bit datain_a_bit1()
{ bit m=0;
dataout=1;
m=dataout;
datain=1;
nop();
clock=1;
nop();
clock=0;
return(m);
}
单片机通过编程产生串行时钟,并按时序发送与接收数据位,完成通道方式/通道数据的写入和转换结果的读出,程序如下:
unsigned int tlc2543l(unsigned char ch)
{unsigned char i,chch=0;
unsigned int xdata xxx=0;
unsigned int xdata y=0;
cs=0;
chch=ch<<4;
y=chch;
y<<=8;
i=0;
while(i<12)
{if((y&0x8000)==0)
{if(datain_a_bit0()==0) xxx&=0xfffe;
else xxx|=0x0001;
if(i!=11) xxx<<=1;
}
else
{if(datain_a_bit1()==0) xxx&=0xfffe;
else xxx|=0x0001;
if(i!=11) xxx<<=1;
}
y<<=1;
i+=1;
}
cs=1;
return(xxx);
}
串行数据传输模块包括串行口初始化子程序和数据传输子程序,各子程序分别如下。其中数据传输采用查询方式,也可以方便地改为中断方式。
void rs232init()
{tmod=0x20;
th1=0xfd;
tr1=1;
scon=0x50;
}
void receandtran()
{unsigned char da;
while(!ri)
ri=0;
da=sbuf;
sbuf==da;
while(!ti);
ti=0;
}
上位机接收数据所用c语言程序包括初始化子程序和接收子程序。各子程序分别如下:
void cominit(void)
{
outportb(0x3fb,0x80);
outportb(0x3f8,0x18); /与单片机波特率一致为9600bps*/
outportb(0x3f9,0x00);
outportb(0x3fb,0x03); /8位数据位,1位停止位,无奇偶校验*/
outportb(0x3fc,0x03); /*modem控制寄存器设置,使dtr和rts输出有效*/
outportb(0x3f9,0x00); /*设置中断允许寄存器,禁止一切中断*/
}
void data_rece(void) /*查询方式接收数据子程序*/
{
while(!kbhit())
{
while(!(inportb(0x3fd)&0x01));/*若接收寄存器为空,则等待*/
printf("%x ",inportb(0x3f8)); /*读取结果并显示*/
}
getch();
}
智能化串行采集/传输模块在pcr仪中的应用
在pcr仪的电路设计中,因需要检测的信号很多,包括热盖的温度检测,散热器的温度检测,腔体内部的温度检测,气流的温度检测,光信号的检测等等,为了简化电路,节约成本,减小体积,在选择a/d转换电路时选用了spi总线的tlc2543,该芯片有多达11路的模拟信号输入端,完全满足pcr仪电路设计的需要,一个芯片既能完成检测多个信号的功能,又能节约单片机的资源,图6是其硬件原理图。

本文所述的智能化串行数据模块,可直接用于任何微机控制和检测系统中以取代原来的模数转换设计。经过实践检验,该模块功耗低、采样精度高、可靠性好、接口简便,有很高的实用价值。该智能模块的软件和硬件成功应用于生命科学仪器“热循环仪”的设计和实践中,使用方便,简单可行,节约成本,能够满足大多数数据采样的应用场合。
评论