我的TLC2543学习笔记——基于msp430g2553单片机
学习笔记
for
redesigned
2012-09-08
versions:12_09_01
All
TLC2543是TI的12
1)12
2)在工作温度范围内10us转换时间;
3)11个模拟输入通道;
4)3路内置自测试方式;
5)采样率为66
6)线性误差+1LSB(max);
7)有转换结束(EOC)输出;
8)具有单、双极性输出;
9)可编程的MSB或LSB前导;
10)可编程的输出数据长度.
���
���
Temperature
���
���
���
���
���
���
���
(Signed
Applied
���
���
���
���
���
我用的tlc2543是直插的,引脚图如下:
各引脚的详细说明如下:
引脚号 |
名称 |
I/O |
说明 |
1~9,11,12 |
AIN0~AIN10 |
I |
模拟量输入端。11路输入信号由内部多路器选通。对于4.1MHz的I/OCLOCK,驱动源阻抗必须小于或等于50Ω,而且用60pF电容来限制模拟输入电压的斜率 |
15 |
I |
片选端。在 |
|
17 |
DATAINPUT |
I |
串行数据输入端。由4位的串行地址输入来选择模拟量输入通道 |
16 |
DATA |
O |
A/D转换结果的三态串行输出端。 |
19 |
EOC |
O |
转换结束端。在最后的I/OCLOCK下降沿之后,EOC从高电平变为低电平并保持到转换完成和数据准备传输为止 |
10 |
GND |
地。GND是内部电路的地回路端。除另有说明外,所有电压测量都相对GND而言 |
|
18 |
I/O |
I |
输入/输出时钟端。I/OCLOCK接收串行输入信号并完成以下四个功能:(1)在I/O |
14 |
REF+ |
I |
正基准电压端。基准电压的正端(通常为Vcc)被加到REF+,最大的输入电压范围由加于本端与REF-端的电压差决定 |
13 |
REF- |
I |
负基准电压端。基准电压的低端(通常为地)被加到REF- |
20 |
Vcc |
电源 |
写程序时,要参考对应的时序图,严格按照时序进行操作就可以了,我用到的时序图如下:
是16时钟的,使用CS,MSB
对tlc2543进行操作的时候,尤其是要用到它的多通道工作时,要特别注意各个通道的操作,因为如果操作不当,就有可能读出的不是想要通道的数据(我就遇到过类似的问题)。下面我就这个问题介绍一下我自己的经验和解决办法。
首先先看一下数据手册上的输入寄存器的命令介绍:
在进行操作之前,必须要看清楚上面的命令表格。要特别注意,通道选择的指令的位置在8位输入指令的高8位D7~D4,清楚了这一点,就可以明白程序中对tlc2543进行操作的函数中为什么会有一句port<<=4;
还要注意一点是:对TLC2543进行操作函数的原型是uint
如果想在调用tlc_read(uchar
上面是通道选择的时候要注意的问题。但是还有一个问题是通道选择正确,注意了上面的问题,但是读出的数据就不是我们想要的通道的数据。这就涉及到下面的问题了。
从给2543送入选择的通道数,到它AD转换完成了,输出数据这一过程需要一段时间,时间很短,但是就产生了一个问题。问题是这样的:我上面所写的函数uint
有很多人的程序都是使用了上面的第一种方法,我自己实现的是第二种方法,这两种方法的本质其实是一样的,都是用多次采样的方法来保证输出结果和选择通道是相对应的。
上面我根据自己的理解,对tlc2543进行了大概了介绍,着重介绍了一些容易出错,较难理解的地方。我也在网上查了一些资料,但一般都是只有程序,而没有较详细的说明,如果自己再慢慢琢磨的话,就比较浪费时间了,而且比较容易出错,而上面的值得注意的地方也比较难以理解。我身边也有同学在网上找来了程序就直接用,而不对它进行细心的分析研究,这样的话肯定是出错的概率是比较高的,而且也不能真正的掌握它的使用方法。所以我就把我自己的理解写了出来,希望对你有所帮助。
当然更详细,更权威的资料当然是对应的数据手册了,所以要经常查阅,并且以它为准。
好了下面是我写的程序,比较好用,我一直都在用,没有发现有什么大的问题,实现了控制多通道的转换。
单片机使用的是TI的msp430g2553
注释的也比较详细:
#include
#include
#define
#define
#define
#define
#define
#define
#define
#define
//这是针对tlc2543进行IO口配置的函数
void
{
P2DIR
P2DIR
P1DIR
}
//名称:read2543
//功能:TLC2543驱动模块
//输入参数:port通道号
//输出参数:ad转换值
uint
{
uint
uchar
CLR_CLOCK;
CLR_CS;
port<<=4;
for(i=0;i<12;i++)
{
{
}
//
//
}
SET_CS;
//while(P1IN&BIT7);
while((P1IN&BIT7)==0);
ad>>=1;
return(ad);
}
void
{
uint
uint
uchar
//
//
//
}
//本程序是用msp430控制12位的串行AD
//目前可以实现控制通道0进行转换,读取转换值,检验正确,
//但是控制多个通道一次进行转换,输出结果,还没有实现,需要进一步了解ltc2543,改进程序
//for(;;)
//
//
//
//
//
//
//
//
////
//
//
//
//
////
////
//
//
//
//
//如上面的一段程序,我本来是想让tlc分别采用通道6和通道8,然后再读出采样值,但是实验的结果是:我读出的结果通道6和通道8的刚好相反
//目前还没有完全清楚原因。我想有可能是采样时序的问题没有搞清楚,有可能是第一次送入通道6的地址,让通道6进行转换,但是得等到下一次才能读出
//结果。而这一次读的结果是上一次送入的地址转换的结果。这样的话就是这一次转换的结果,下一次才能读出,而这一次读出的结果是上一次
//转换的值,其对应的转换通道也是上一次确定的
//如上面源程序中,采用这种方法可以解决这个问题,因为输入一次新的地址后,让tlc多转换几次,这样就可以确保是本次的结果和本次的通道
//相对应了,一般循环3次以上就可以了
评论