一,TLC549簡介
TLC549是美國德州儀器公司生產(chǎn)的8位串行A/D轉(zhuǎn)換器芯片,可與通用微處理器、控制器通過CLK、CS、DATAOUT三條口線進(jìn)行串行接口。具有4MHz片內(nèi)系統(tǒng)時(shí)鐘和軟、硬件控制電路,轉(zhuǎn)換時(shí)間最長17μs,TLC549為40000次/s。總失調(diào)誤差最大為±0.5LSB,典型功耗值為6mW。采用差分參考電壓高阻輸入,抗干擾,可按比例量程校準(zhǔn)轉(zhuǎn)換范圍,VREF-接地,VREF+-VREF-≥1V,可用于較小信號的采樣。
引腳定義:
- REF+:正基準(zhǔn)信號輸入端
- ANALOG IN:模擬信號輸入端
- REF-:負(fù)基準(zhǔn)電壓輸入端
- GND:接地端
- #CS:片選信號,低電平有效
- DATA OUT:轉(zhuǎn)換結(jié)果串行輸出端
- I/O CLOCK:外接時(shí)鐘輸入端
- VCC:電源輸入端
通信協(xié)議:
TLC549均有片內(nèi)系統(tǒng)時(shí)鐘,該時(shí)鐘與I/O CLOCK是獨(dú)立工作的,無需特殊的速度或相位匹配。其工作時(shí)序如圖2所示。當(dāng)CS為高時(shí),數(shù)據(jù)輸出(DATA OUT)端處于高阻狀態(tài),此時(shí)I/O CLOCK不起作用。當(dāng)CS為低時(shí),AD前一次轉(zhuǎn)換的數(shù)據(jù)A的最高位A7立馬出現(xiàn)在數(shù)據(jù)線DATA OUT上,其余七位在I/O CLOCK的下降沿依次由時(shí)鐘同步輸出,,因此可在I/O CLOCK的上升沿讀取數(shù)據(jù),其中值得注意的是:1.圖中他tsu(cs)至少要1.4us;2.I/O CLOCK不能超過1.1MHz。讀完8位數(shù)據(jù)后,AD開始轉(zhuǎn)換這一次轉(zhuǎn)換的采樣數(shù)據(jù)B,以便下一次讀取轉(zhuǎn)換時(shí),片選信號CS置高,每次轉(zhuǎn)換不超過17us,開始于CS拉低后的第八個(gè)I/O CLOCK的下降沿,沒有轉(zhuǎn)換完成標(biāo)志,沒有啟動(dòng)控制端,只要讀取前一次數(shù)據(jù)后就馬上可以開始新的AD轉(zhuǎn)換,轉(zhuǎn)換完成進(jìn)入保持狀態(tài)。
(翻譯-摘自TLC549官方芯片參考手冊)
二,Proteus仿真圖
Proteus連線圖
三,程序源代碼
/*
*@brief: 51系列單片機(jī)+TLC549制作簡單的電壓采集系統(tǒng)
*@author: 逗比小憨憨
*@website: https://space.bilibili.com/314404732
*/
#include < reg52.h >
#include < intrins.h >
#define uchar unsigned char
#define uint unsigned int
sbit dout=P1^0;//數(shù)據(jù)輸出端
sbit clock=P1^2;//時(shí)鐘線
sbit cs=P1^1;//片選(低電平有效)
uchar TLC549_Obtain(void);
uchar TLC549_Read(void);
void Display_Data(uchar dat);
void Uart_Init(void);
void delay_xms(uint t);
void delay_xms(uint xms)
{
uint i,j;
for(i = 0; i < xms; i++)
for(j = 0; j < 115; j++);
}
void main(void)
{
uchar TLC549_Data;
Uart_Init();
while(1)
{
TLC549_Data = TLC549_Obtain();
Display_Data(TLC549_Data);
delay_xms(500);
}
}
void Uart_Init(void)
{
TMOD |= 0X20;
TL1 = 0XFD;
TH1 = 0XFD;
SCON = 0x50;
PCON = 0;
EA = 1;
PS = 1;
TR1 = 1;
}
uchar TLC549_Read(void)
{
uchar n=0, tmp;
cs = 1; //CS置高,片選無效
clock = 0;
cs = 0; //CS置低,片選有效,同時(shí)DO輸出高位
_nop_();
_nop_(); //適當(dāng)延遲時(shí)間1.4us Setup Time
for(n = 0; n < 8; n++) //串行數(shù)據(jù)移位輸入
{
tmp < <= 1;
tmp |= dout;
clock = 1; //0.4us
_nop_(); //延遲0.1us
clock = 0; //0.4us
}
cs = 1; //CS置高,片選無效
for(n = 17; n != 0; n--)
_nop_(); //下一次轉(zhuǎn)換需要延遲17us
return tmp;
}
/*
* TLC549數(shù)據(jù)獲取
*/
uchar TLC549_Obtain(void)
{
uchar dat;
dat=TLC549_Read();
return dat;
}
void Display_Data(uchar dat)
{
int disdat;
uchar dis[4];
uchar i = 0;
disdat = (int)(5.0*dat / 256 * 100);
dis[0] = disdat/100+'0';
dis[1] = 0x2e;
dis[2