Createdon:2012-9-8
Author:zhangbin
学习笔记
formsp430g2553
redesignedbyzhangbin
2012-09-08
versions:12_09_01
AllRightsReserved
TLC2543具有4线制串行接口,别离为片选端(CS),串行时钟输入端(I/OCLOCK),串行数据输入端(DATAIN)和串行数据输出端(DATAOUT)(转化完毕脚EOC能够不接)。它能够直接与SPI器材进行衔接,不需求其他外部逻辑。一起,它还在高达4MHz的串行速率下与主机进行通讯。
TLC2543的特色及引脚
TLC2543是TI的12bit串行A/D转化器,11个模仿输入通道。运用开关电容逐次迫临技能完结,A/D转化进程.由所以串行输入结构,能够MCU的I/O资源.其特色有:
1)12bit分辨率A/D转化器;
2)在作业温度规模内10us转化时刻;
3)11个模仿输入通道;
4)3路内置自测试办法;
5)采样率为66kb/s;
6)线性差错+1LSB(max);
7)有转化完毕(EOC)输出;
8)具有单、双极性输出;
9)可编程的MSB或LSB前导;
10)可编程的输出数据长度.
���12-Bit-ResolutionA/DConverter
���10-μsConversionTimeOverOperating
Temperature
���11AnalogInputChannels
���3Built-InSelf-TestModes
���InherentSample-and-HoldFunction
���LinearityError...±1LSBMax
���On-ChipSystemClock
���End-of-ConversionOutput
���UnipolarorBipolarOutputOperation
(SignedBinaryWithRespectto1/2the
AppliedVoltageReference)
���ProgrammableMSBorLSBFirst
���ProgrammablePowerDown
���ProgrammableOutputDataLength
���CMOSTechnology
���ApplicationReportAvailable
我用的tlc2543是直插的,引脚图如下:
![]()
各引脚的具体阐明如下:
引脚号
|
称号
|
I/O
|
阐明
|
1~9,11,12
|
AIN0~AIN10
|
I
|
模仿量输入端。11路输入信号由内部多路器选通。关于4.1MHz的I/OCLOCK,驱动源阻抗有必要小于或等于50Ω,而且用60pF电容来约束模仿输入电压的斜率
|
15
|
![]()
|
I
|
片选端。在 端由高变低时,内部计数器复位。由低变高时,在设定时刻内制止DATAINPUT和I/OCLOCK
|
17
|
DATAINPUT
|
I
|
串行数据输入端。由4位的串行地址输入来挑选模仿量输入通道
|
16
|
DATAOUT
|
O
|
A/D转化成果的三态串行输出端。 为高时处于高阻抗状况, 为低时处于激活状况
|
19
|
EOC
|
O
|
转化完毕端。在最终的I/OCLOCK下降沿之后,EOC从高电平变为低电平并坚持到转化完结和数据预备传输中止
|
10
|
GND
|
|
地。GND是内部电路的地回路端。除还有阐明外,一切电压丈量都相对GND而言
|
18
|
I/OCLOCK
|
I
|
输入/输出时钟端。I/OCLOCK接纳串行输入信号并完结以下四个功用:(1)在I/OCLOCK的前8个上升沿,8位输入数据存入输入数据寄存器。(2)在I/OCLOCK的第4个下降沿,被选通的模仿输入电压开端向%&&&&&%器充电,直到I/OCLOCK的最终一个下降沿中止。(3)将前一次转化数据的其他11位输出到DATAOUT端,在I/OCLOCK的下降沿时数据开端改变。(4)I/OCLOCK的最终一个下降沿,将转化的操控信号传送到内部状况操控位
|
14
|
REF+
|
I
|
正基准电压端。基准电压的正端(一般为Vcc)被加到REF+,最大的输入电压规模由加于本端与REF-端的电压差决议
|
13
|
REF-
|
I
|
负基准电压端。基准电压的低端(一般为地)被加到REF-
|
20
|
Vcc
|
|
电源
|
写程序时,要参阅对应的时序图,严厉依照时序进行操作就能够了,我用到的时序图如下:
是16时钟的,运用CS,MSBfirst:
![]()
对tlc2543进行操作的时分,尤其是要用到它的多通道作业时,要特别留意各个通道的操作,由于假如操作不妥,就有或许读出的不是想要通道的数据(我就遇到过相似的问题)。下面我就这个问题介绍一下我自己的经历和处理办法。
首要先看一下数据手册上的输入寄存器的指令介绍:
![]()
![]()
![]()
在进行操作之前,有必要要看清楚上面的指令表格。要特别留意,通道挑选的指令的方位在8位输入指令的高8位D7~D4,清楚了这一点,就能够了解程序中对tlc2543进行操作的函数中为什么会有一句port<<=4;//左移4位了。
还要留意一点是:对TLC2543进行操作函数的原型是uinttlc_read(ucharport),其间参数port为指定的通道数。调用它的时分,通道0对应的port为0x00(或十进制的0),调用方式应该是tlc_read(0x00);通道1,对应的为tlc_read(0x01)或tlc_read(1);通道6对应的为tlc_read(0x06)或tlc_read(6)。总归上面所运用的port的代表通道数在port八位的低四位,这样经过上面的移位指令port<<=4;就能够把这4位通道指令移到高四位了,而这刚好契合上面表格中寄存器对指令的规矩。
假如想在调用tlc_read(ucharport)时用port的高四位代表挑选的通道数,如通道1为0x10,通道3为0x30,通道6为0x60等的话,那么这样的port8位直接送入,通道挑选的4位数据就直接在高4位了,很简单就知道函数中的移位指令port<<=4;就不应该再要了。
上面是通道挑选的时分要留意的问题。可是还有一个问题是通道挑选正确,留意了上面的问题,可是读出的数据就不是咱们想要的通道的数据。这就涉及到下面的问题了。
从给2543送入挑选的通道数,到它AD转化完结了,输出数据这一进程需求一段时刻,时刻很短,可是就产生了一个问题。问题是这样的:我上面所写的函数uinttlc_read(ucharport)是有返回值的,返回值是tlc输出的AD转化的成果。由于我在完成该函数的时分,没有让tlc转化屡次(一般是3次),而是直接转化一次就输出了成果(具体程序我下面会贴出)。值就导致了本次转化输出的成果是上一次输入指令挑选的通道的转化值。而这一次输入指令挑选的通道的转化成果,就在下一次输出。上面的问题不难了解,了解了上面的问题,就很简单知道了处理办法了,有两个:1,直接在函数uinttlc_read(ucharport)中,操控tlc循环对这一次挑选的通道port转化屡次(一般为3次,比较稳妥,速度又比较快);2,函数uinttlc_read(ucharport)不改动,在调用的时分操控循环屡次(一般为3次),对这一次挑选的通道进行屡次转化,然后在取值。上面的两种办法都能够保证本次获得的值便是本次挑选的通道的AD转化值。
有很多人的程序都是运用了上面的榜首种办法,我自己完成的是第二种办法,这两种办法的实质其实是相同的,都是用屡次采样的办法来保证输出成果和挑选通道是相对应的。
上面我依据自己的了解,对tlc2543进行了大约了介绍,侧重介绍了一些简单犯错,较难了解的当地。我也在网上查了一些材料,但一般都是只要程序,而没有较具体的阐明,假如自己再渐渐揣摩的话,就比较浪费时刻了,而且比较简单犯错,而上面的值得留意的当地也比较难以了解。我身边也有同学在网上找来了程序就直接用,而不对它进行仔细的分析研究,这样的话肯定是犯错的概率是比较高的,而且也不能真实的把握它的运用办法。所以我就把我自己的了解写了出来,期望对你有所协助。
当然更具体,更威望的材料当然是对应的数据手册了,所以要常常查阅,而且以它为准。
好了下面是我写的程序,比较好用,我一直都在用,没有发现有什么大的问题,完成了操控多通道的转化。
单片机运用的是TI的msp430g2553
注释的也比较具体:
#include
#include“ser_12864.h”
#defineCLR_CLOCKP2OUT&=~BIT0;//时钟输入
#defineSET_CLOCKP2OUT|=BIT0;
#defineCLR_INP2OUT&=~BIT1;//数据输入
#defineSET_INP2OUT|=BIT1;
#defineCLR_CSP2OUT&=~BIT2;//片选
#defineSET_CSP2OUT|=BIT2;
#defineDATA_OUTP2IN&BIT3;//数据输出
#defineEOCP1IN&BIT7;//转化完毕端
//这是针对tlc2543进行IO口装备的函数
voidtlc_init()//tlc初始化
{
P2DIR|=BIT0+BIT1+BIT2;
P2DIR&=~BIT3;
P1DIR&=~BIT7;
}
//称号:read2543
//功用:TLC2543驱动模块
//输入参数:port通道号
//输出参数:ad转化值
uinttlc_read(ucharport)
{
uintad=0;
uchari=0;
CLR_CLOCK;
CLR_CS;
port<<=4;//左移4位
for(i=0;i<12;i++)
{
if(P2IN&BIT3)
ad|=0x01;
if(port&0x80)
{
SET_IN;
}
elseif((port&0x80)==0)
{
CLR_IN;
}
SET_CLOCK;
//delay(3);
CLR_CLOCK;
//delay(3);
port<<=1;
ad<<=1;
}
SET_CS;
//while(P1IN&BIT7);//等候转化完毕此句话能够不要
while((P1IN&BIT7)==0);//等候转化完毕此句话能够不要
ad>>=1;
return(ad);
}
voidmain(void)
{
uintad_data_0=0;//tlc的采样值
uintad_data_5=0;
uchari=0;
unsignedchars1[]={“Tlc2543“};
unsignedchars2[]={“ch_6:”};
unsignedchars3[]={“ch_8:”};
//unsignedchars4[]={“2012-06-24-78-55”};
WDTCTL=WDTPW+WDTHOLD;//中止看门狗定时器
BCSCTL1=CALBC1_12MHZ;//设定cpu时钟DCO频率为12MHz
DCOCTL=CALDCO_12MHZ;
P2DIR|=BIT4+BIT5;//液晶的两条线
init_lcd();
tlc_init();
wr_string(0,0,s1);
P1DIR|=BIT6;//调试指示灯
for(;;)
{
ad_data_0=0;
ad_data_5=0;
P1OUT^=BIT6;
for(i=0;i<3;i++)
{
ad_data_0=tlc_read(0x06);//挑选通道6
delay_ms(1);//恰当推迟,等候转化有必要的
}
wr_string(0,1,s2);
wr_int(3,1,ad_data_0);
for(i=0;i<3;i++)
{
ad_data_5=tlc_read(0x08);//挑选通道8
delay_ms(1);
}
wr_string(0,2,s3);
wr_int(4,2,ad_data_5);
//ad_data=tlc_read(7);
//wr_int(0,3,ad_data);
delay_ms(500);
}
}
//本程序是用msp430操控12位的串行ADltc2543
//现在能够完成操控通道0进行转化,读取转化值,查验正确,
//可是操控多个通道一次进行转化,输出成果,还没有完成,需求进一步了解ltc2543,改善程序
//for(;;)
//{
//ad_data_0=0;
//ad_data_5=0;
//P1OUT^=BIT6;
//ad_data_0=tlc_read(0x06);//挑选通道6
//wr_string(0,1,s2);
//wr_int(3,1,ad_data_0);
//
////delay_ms(100);
//
//ad_data_5=tlc_read(0x08);//挑选通道8
//wr_string(0,2,s3);
//wr_int(4,2,ad_data_5);
////ad_data=tlc_read(7);
////wr_int(0,3,ad_data);
//
//delay_ms(400);
//
//}
//如上面的一段程序,我本来是想让tlc别离选用通道6和通道8,然后再读出采样值,可是试验的成果是:我读出的成果通道6和通道8的刚好相反
//现在还没有彻底清楚原因。我想有或许是采样时序的问题没有搞清楚,有或许是榜首次送入通道6的地址,让通道6进行转化,可是得比及下一次才干读出
//成果。而这一次读的成果是上一次送入的地址转化的成果。这样的话便是这一次转化的成果,下一次才干读出,而这一次读出的成果是上一次
//转化的值,其对应的转化通道也是上一次确认的
//如上面源程序中,选用这种办法能够处理这个问题,由于输入一次新的地址后,让tlc多转化几回,这样就能够保证是本次的成果和本次的通道
//相对应了,一般循环3次以上就能够了
声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/256250.html