我的TLC2543學(xué)習(xí)筆記——基于msp430g2553單片機(jī)
學(xué)習(xí)筆記
for
redesigned
2012-09-08
versions:12_09_01
All
TLC2543是TI的12
1)12
2)在工作溫度范圍內(nèi)10us轉(zhuǎn)換時(shí)間;
3)11個(gè)模擬輸入通道;
4)3路內(nèi)置自測試方式;
5)采樣率為66
6)線性誤差+1LSB(max);
7)有轉(zhuǎn)換結(jié)束(EOC)輸出;
8)具有單、雙極性輸出;
9)可編程的MSB或LSB前導(dǎo);
10)可編程的輸出數(shù)據(jù)長度.
???
???
Temperature
???
???
???
???
???
???
???
(Signed
Applied
???
???
???
???
???
我用的tlc2543是直插的,引腳圖如下:
各引腳的詳細(xì)說明如下:
引腳號 | 名稱 | I/O | 說明 |
1~9,11,12 | AIN0~AIN10 | I | 模擬量輸入端。11路輸入信號由內(nèi)部多路器選通。對于4.1MHz的I/OCLOCK,驅(qū)動(dòng)源阻抗必須小于或等于50Ω,而且用60pF電容來限制模擬輸入電壓的斜率 |
15 |
| I | 片選端。在端由高變低時(shí),內(nèi)部計(jì)數(shù)器復(fù)位。由低變高時(shí),在設(shè)定時(shí)間內(nèi)禁止DATAINPUT和I/O |
17 | DATAINPUT | I | 串行數(shù)據(jù)輸入端。由4位的串行地址輸入來選擇模擬量輸入通道 |
16 | DATA | O | A/D轉(zhuǎn)換結(jié)果的三態(tài)串行輸出端。為高時(shí)處于高阻抗?fàn)顟B(tài),為低時(shí)處于激活狀態(tài) |
19 | EOC | O | 轉(zhuǎn)換結(jié)束端。在最后的I/OCLOCK下降沿之后,EOC從高電平變?yōu)榈碗娖讲⒈3值睫D(zhuǎn)換完成和數(shù)據(jù)準(zhǔn)備傳輸為止 |
10 | GND | 地。GND是內(nèi)部電路的地回路端。除另有說明外,所有電壓測量都相對GND而言 | |
18 | I/O | I | 輸入/輸出時(shí)鐘端。I/OCLOCK接收串行輸入信號并完成以下四個(gè)功能:(1)在I/O |
14 | REF+ | I | 正基準(zhǔn)電壓端。基準(zhǔn)電壓的正端(通常為Vcc)被加到REF+,最大的輸入電壓范圍由加于本端與REF-端的電壓差決定 |
13 | REF- | I | 負(fù)基準(zhǔn)電壓端?;鶞?zhǔn)電壓的低端(通常為地)被加到REF- |
20 | Vcc | 電源 |
寫程序時(shí),要參考對應(yīng)的時(shí)序圖,嚴(yán)格按照時(shí)序進(jìn)行操作就可以了,我用到的時(shí)序圖如下:
是16時(shí)鐘的,使用CS,MSB
對tlc2543進(jìn)行操作的時(shí)候,尤其是要用到它的多通道工作時(shí),要特別注意各個(gè)通道的操作,因?yàn)槿绻僮鞑划?dāng),就有可能讀出的不是想要通道的數(shù)據(jù)(我就遇到過類似的問題)。下面我就這個(gè)問題介紹一下我自己的經(jīng)驗(yàn)和解決辦法。
首先先看一下數(shù)據(jù)手冊上的輸入寄存器的命令介紹:
在進(jìn)行操作之前,必須要看清楚上面的命令表格。要特別注意,通道選擇的指令的位置在8位輸入指令的高8位D7~D4,清楚了這一點(diǎn),就可以明白程序中對tlc2543進(jìn)行操作的函數(shù)中為什么會(huì)有一句port<<=4;
還要注意一點(diǎn)是:對TLC2543進(jìn)行操作函數(shù)的原型是uint
如果想在調(diào)用tlc_read(uchar
上面是通道選擇的時(shí)候要注意的問題。但是還有一個(gè)問題是通道選擇正確,注意了上面的問題,但是讀出的數(shù)據(jù)就不是我們想要的通道的數(shù)據(jù)。這就涉及到下面的問題了。
從給2543送入選擇的通道數(shù),到它AD轉(zhuǎn)換完成了,輸出數(shù)據(jù)這一過程需要一段時(shí)間,時(shí)間很短,但是就產(chǎn)生了一個(gè)問題。問題是這樣的:我上面所寫的函數(shù)uint
有很多人的程序都是使用了上面的第一種方法,我自己實(shí)現(xiàn)的是第二種方法,這兩種方法的本質(zhì)其實(shí)是一樣的,都是用多次采樣的方法來保證輸出結(jié)果和選擇通道是相對應(yīng)的。
上面我根據(jù)自己的理解,對tlc2543進(jìn)行了大概了介紹,著重介紹了一些容易出錯(cuò),較難理解的地方。我也在網(wǎng)上查了一些資料,但一般都是只有程序,而沒有較詳細(xì)的說明,如果自己再慢慢琢磨的話,就比較浪費(fèi)時(shí)間了,而且比較容易出錯(cuò),而上面的值得注意的地方也比較難以理解。我身邊也有同學(xué)在網(wǎng)上找來了程序就直接用,而不對它進(jìn)行細(xì)心的分析研究,這樣的話肯定是出錯(cuò)的概率是比較高的,而且也不能真正的掌握它的使用方法。所以我就把我自己的理解寫了出來,希望對你有所幫助。
當(dāng)然更詳細(xì),更權(quán)威的資料當(dāng)然是對應(yīng)的數(shù)據(jù)手冊了,所以要經(jīng)常查閱,并且以它為準(zhǔn)。
好了下面是我寫的程序,比較好用,我一直都在用,沒有發(fā)現(xiàn)有什么大的問題,實(shí)現(xiàn)了控制多通道的轉(zhuǎn)換。
單片機(jī)使用的是TI的msp430g2553
注釋的也比較詳細(xì):
#include
#include
#define
#define
#define
#define
#define
#define
#define
#define
//這是針對tlc2543進(jìn)行IO口配置的函數(shù)
void
{
P2DIR
P2DIR
P1DIR
}
//名稱:read2543
//功能:TLC2543驅(qū)動(dòng)模塊
//輸入?yún)?shù):port通道號
//輸出參數(shù):ad轉(zhuǎn)換值
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
//目前可以實(shí)現(xiàn)控制通道0進(jìn)行轉(zhuǎn)換,讀取轉(zhuǎn)換值,檢驗(yàn)正確,
//但是控制多個(gè)通道一次進(jìn)行轉(zhuǎn)換,輸出結(jié)果,還沒有實(shí)現(xiàn),需要進(jìn)一步了解ltc2543,改進(jìn)程序
//for(;;)
//
//
//
//
//
//
//
//
////
//
//
//
//
////
////
//
//
//
//
//如上面的一段程序,我本來是想讓tlc分別采用通道6和通道8,然后再讀出采樣值,但是實(shí)驗(yàn)的結(jié)果是:我讀出的結(jié)果通道6和通道8的剛好相反
//目前還沒有完全清楚原因。我想有可能是采樣時(shí)序的問題沒有搞清楚,有可能是第一次送入通道6的地址,讓通道6進(jìn)行轉(zhuǎn)換,但是得等到下一次才能讀出
//結(jié)果。而這一次讀的結(jié)果是上一次送入的地址轉(zhuǎn)換的結(jié)果。這樣的話就是這一次轉(zhuǎn)換的結(jié)果,下一次才能讀出,而這一次讀出的結(jié)果是上一次
//轉(zhuǎn)換的值,其對應(yīng)的轉(zhuǎn)換通道也是上一次確定的
//如上面源程序中,采用這種方法可以解決這個(gè)問題,因?yàn)檩斎胍淮涡碌牡刂泛螅宼lc多轉(zhuǎn)換幾次,這樣就可以確保是本次的結(jié)果和本次的通道
//相對應(yīng)了,一般循環(huán)3次以上就可以了
評論