Createdon:2012-9-8Author:zhangbin
本文引用地址:http://dyxdggzs.com/article/201611/322845.htm
學(xué)習筆記
formsp430g2553
redesignedbyzhangbin
2012-09-08
versions:12_09_01
AllRightsReserved
TLC2543具有4線(xiàn)制串行接口,分別為片選端(CS),串行時(shí)鐘輸入端(I/OCLOCK),串行數據輸入端(DATAIN)和串行數據輸出端(DATAOUT)(轉換結束腳EOC可以不接)。它可以直接與SPI器件進(jìn)行連接,不需要其他外部邏輯。同時(shí),它還在高達4MHz的串行速率下與主機進(jìn)行通信。
TLC2543的特點(diǎn)及引腳
TLC2543是TI的12bit串行A/D轉換器,11個(gè)模擬輸入通道。使用開(kāi)關(guān)電容逐次逼近技術(shù)完成,A/D轉換過(guò)程.由于是串行輸入結構,能夠MCU的I/O資源.其特點(diǎn)有:
1)12bit分辨率A/D轉換器;
2)在工作溫度范圍內10us轉換時(shí)間;
3)11個(gè)模擬輸入通道;
4)3路內置自測試方式;
5)采樣率為66kb/s;
6)線(xiàn)性誤差+1LSB(max);
7)有轉換結束(EOC)輸出;
8)具有單、雙極性輸出;
9)可編程的MSB或LSB前導;
10)可編程的輸出數據長(cháng)度.
???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是直插的,引腳圖如下:
![]()
各引腳的詳細說(shuō)明如下:
引腳號 | 名稱(chēng) | I/O | 說(shuō)明 |
1~9,11,12 | AIN0~AIN10 | I | 模擬量輸入端。11路輸入信號由內部多路器選通。對于4.1MHz的I/OCLOCK,驅動(dòng)源阻抗必須小于或等于50Ω,而且用60pF電容來(lái)限制模擬輸入電壓的斜率 |
15 | ![]() | I | 片選端。在 端由高變低時(shí),內部計數器復位。由低變高時(shí),在設定時(shí)間內禁止DATAINPUT和I/OCLOCK |
17 | DATAINPUT | I | 串行數據輸入端。由4位的串行地址輸入來(lái)選擇模擬量輸入通道 |
16 | DATAOUT | O | A/D轉換結果的三態(tài)串行輸出端。 為高時(shí)處于高阻抗狀態(tài), 為低時(shí)處于激活狀態(tài) |
19 | EOC | O | 轉換結束端。在最后的I/OCLOCK下降沿之后,EOC從高電平變?yōu)榈碗娖讲⒈3值睫D換完成和數據準備傳輸為止 |
10 | GND |
| 地。GND是內部電路的地回路端。除另有說(shuō)明外,所有電壓測量都相對GND而言 |
18 | I/OCLOCK | I | 輸入/輸出時(shí)鐘端。I/OCLOCK接收串行輸入信號并完成以下四個(gè)功能:(1)在I/OCLOCK的前8個(gè)上升沿,8位輸入數據存入輸入數據寄存器。(2)在I/OCLOCK的第4個(gè)下降沿,被選通的模擬輸入電壓開(kāi)始向電容器充電,直到I/OCLOCK的最后一個(gè)下降沿為止。(3)將前一次轉換數據的其余11位輸出到DATAOUT端,在I/OCLOCK的下降沿時(shí)數據開(kāi)始變化。(4)I/OCLOCK的最后一個(gè)下降沿,將轉換的控制信號傳送到內部狀態(tài)控制位 |
14 | REF+ | I | 正基準電壓端?;鶞孰妷旱恼耍ㄍǔ閂cc)被加到REF+,最大的輸入電壓范圍由加于本端與REF-端的電壓差決定 |
13 | REF- | I | 負基準電壓端?;鶞孰妷旱牡投耍ㄍǔ榈兀┍患拥絉EF- |
20 | Vcc |
| 電源 |
寫(xiě)程序時(shí),要參考對應的時(shí)序圖,嚴格按照時(shí)序進(jìn)行操作就可以了,我用到的時(shí)序圖如下:
是16時(shí)鐘的,使用CS,MSBfirst:
![]()
對tlc2543進(jìn)行操作的時(shí)候,尤其是要用到它的多通道工作時(shí),要特別注意各個(gè)通道的操作,因為如果操作不當,就有可能讀出的不是想要通道的數據(我就遇到過(guò)類(lèi)似的問(wèn)題)。下面我就這個(gè)問(wèn)題介紹一下我自己的經(jīng)驗和解決辦法。
首先先看一下數據手冊上的輸入寄存器的命令介紹:
![]()
![]()
![]()
在進(jìn)行操作之前,必須要看清楚上面的命令表格。要特別注意,通道選擇的指令的位置在8位輸入指令的高8位D7~D4,清楚了這一點(diǎn),就可以明白程序中對tlc2543進(jìn)行操作的函數中為什么會(huì )有一句port<<=4;//左移4位了。
還要注意一點(diǎn)是:對TLC2543進(jìn)行操作函數的原型是uinttlc_read(ucharport),其中參數port為指定的通道數。調用它的時(shí)候,通道0對應的port為0x00(或十進(jìn)制的0),調用形式應該是tlc_read(0x00);通道1,對應的為tlc_read(0x01)或tlc_read(1);通道6對應的為tlc_read(0x06)或tlc_read(6)??傊厦嫠褂玫膒ort的代表通道數在port八位的低四位,這樣通過(guò)上面的移位指令port<<=4;就可以把這4位通道指令移到高四位了,而這剛好符合上面表格中寄存器對命令的規則。
如果想在調用tlc_read(ucharport)時(shí)用port的高四位代表選擇的通道數,如通道1為0x10,通道3為0x30,通道6為0x60等的話(huà),那么這樣的port8位直接送入,通道選擇的4位數據就直接在高4位了,很容易就知道函數中的移位指令port<<=4;就不應該再要了。
上面是通道選擇的時(shí)候要注意的問(wèn)題。但是還有一個(gè)問(wèn)題是通道選擇正確,注意了上面的問(wèn)題,但是讀出的數據就不是我們想要的通道的數據。這就涉及到下面的問(wèn)題了。
從給2543送入選擇的通道數,到它AD轉換完成了,輸出數據這一過(guò)程需要一段時(shí)間,時(shí)間很短,但是就產(chǎn)生了一個(gè)問(wèn)題。問(wèn)題是這樣的:我上面所寫(xiě)的函數uinttlc_read(ucharport)是有返回值的,返回值是tlc輸出的AD轉換的結果。由于我在實(shí)現該函數的時(shí)候,沒(méi)有讓tlc轉換多次(一般是3次),而是直接轉換一次就輸出了結果(具體程序我下面會(huì )貼出)。值就導致了本次轉換輸出的結果是上一次輸入命令選擇的通道的轉化值。而這一次輸入命令選擇的通道的轉換結果,就在下一次輸出。上面的問(wèn)題不難理解,明白了上面的問(wèn)題,就很容易知道了解決辦法了,有兩個(gè):1,直接在函數uinttlc_read(ucharport)中,控制tlc循環(huán)對這一次選擇的通道port轉換多次(一般為3次,比較保險,速度又比較快);2,函數uinttlc_read(ucharport)不改動(dòng),在調用的時(shí)候控制循環(huán)多次(一般為3次),對這一次選擇的通道進(jìn)行多次轉換,然后在取值。上面的兩種方法都可以保證本次取得的值就是本次選擇的通道的AD轉換值。
有很多人的程序都是使用了上面的第一種方法,我自己實(shí)現的是第二種方法,這兩種方法的本質(zhì)其實(shí)是一樣的,都是用多次采樣的方法來(lái)保證輸出結果和選擇通道是相對應的。
上面我根據自己的理解,對tlc2543進(jìn)行了大概了介紹,著(zhù)重介紹了一些容易出錯,較難理解的地方。我也在網(wǎng)上查了一些資料,但一般都是只有程序,而沒(méi)有較詳細的說(shuō)明,如果自己再慢慢琢磨的話(huà),就比較浪費時(shí)間了,而且比較容易出錯,而上面的值得注意的地方也比較難以理解。我身邊也有同學(xué)在網(wǎng)上找來(lái)了程序就直接用,而不對它進(jìn)行細心的分析研究,這樣的話(huà)肯定是出錯的概率是比較高的,而且也不能真正的掌握它的使用方法。所以我就把我自己的理解寫(xiě)了出來(lái),希望對你有所幫助。
當然更詳細,更權威的資料當然是對應的數據手冊了,所以要經(jīng)常查閱,并且以它為準。
好了下面是我寫(xiě)的程序,比較好用,我一直都在用,沒(méi)有發(fā)現有什么大的問(wèn)題,實(shí)現了控制多通道的轉換。
單片機使用的是TI的msp430g2553
注釋的也比較詳細:
#include
#include"ser_12864.h"
#defineCLR_CLOCKP2OUT&=~BIT0;//時(shí)鐘輸入
#defineSET_CLOCKP2OUT|=BIT0;
#defineCLR_INP2OUT&=~BIT1;//數據輸入
#defineSET_INP2OUT|=BIT1;
#defineCLR_CSP2OUT&=~BIT2;//片選
#defineSET_CSP2OUT|=BIT2;
#defineDATA_OUTP2IN&BIT3;//數據輸出
#defineEOCP1IN&BIT7;//轉換結束端
//這是針對tlc2543進(jìn)行IO口配置的函數
voidtlc_init()//tlc初始化
{
P2DIR|=BIT0+BIT1+BIT2;
P2DIR&=~BIT3;
P1DIR&=~BIT7;
}
//名稱(chēng):read2543
//功能:TLC2543驅動(dòng)模塊
//輸入參數: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);//等待轉換結束此句話(huà)可以不要
while((P1IN&BIT7)==0);//等待轉換結束此句話(huà)可以不要
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;//停止看門(mén)狗定時(shí)器
BCSCTL1=CALBC1_12MHZ;//設定cpu時(shí)鐘DCO頻率為12MHz
DCOCTL=CALDCO_12MHZ;
P2DIR|=BIT4+BIT5;//液晶的兩條線(xiàn)
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
//目前可以實(shí)現控制通道0進(jìn)行轉換,讀取轉換值,檢驗正確,
//但是控制多個(gè)通道一次進(jìn)行轉換,輸出結果,還沒(méi)有實(shí)現,需要進(jìn)一步了解ltc2543,改進(jìn)程序
//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);
//
//}
//如上面的一段程序,我本來(lái)是想讓tlc分別采用通道6和通道8,然后再讀出采樣值,但是實(shí)驗的結果是:我讀出的結果通道6和通道8的剛好相反
//目前還沒(méi)有完全清楚原因。我想有可能是采樣時(shí)序的問(wèn)題沒(méi)有搞清楚,有可能是第一次送入通道6的地址,讓通道6進(jìn)行轉換,但是得等到下一次才能讀出
//結果。而這一次讀的結果是上一次送入的地址轉換的結果。這樣的話(huà)就是這一次轉換的結果,下一次才能讀出,而這一次讀出的結果是上一次
//轉換的值,其對應的轉換通道也是上一次確定的
//如上面源程序中,采用這種方法可以解決這個(gè)問(wèn)題,因為輸入一次新的地址后,讓tlc多轉換幾次,這樣就可以確保是本次的結果和本次的通道
//相對應了,一般循環(huán)3次以上就可以了
評論