TLC549是 TI公司生產的一種低價位、高性能的8位 A/D轉換器,采用了CMOS工藝,它以8位開關電容逐次逼近的方法實現 A/D轉換,其轉換速度小于 17us,最大轉換速率為 40000HZ,4MHZ典型內部系統時鐘,電源為 3V至 6V。它能方便地采用三線串行接口方式與各種微處理器連接,構成各種廉價的測控應用系統。
TLC549均有片內系統時鐘,該時鐘與I/O CLOCK是獨立工作的,無須特殊的速度或相位匹配。其工作時序如圖2所示。 當CS為高時,數據輸出(DATA OUT)端處于高阻狀態,此時I/O CLOCK不起作用。這種CS控制作用允許在同時使用多片TLC549時,共用I/O CLOCK,以減少多路(片)A/D并用時的I/O控制端口。
TLC549 單片機程序
#include 《TLC549.h》
#include 《Mydefine.h》
//------------------------------------------------------------------------
#define N 8
unsigned char count;//濾波函數的計數值
/*unsigned char bdata dat; //dat是可位尋址的變量
sbit dat7=dat^7;
sbit dat6=dat^6;
sbit dat5=dat^5;
sbit dat4=dat^4;
sbit dat3=dat^3;
sbit dat2=dat^2;
sbit dat1=dat^1;
sbit dat0=dat^0; //取出dat的各個位*/
//------------------------------------------------------------------------
unsigned char TLC549_ReadByte(void)
{ //讀一個字節函數
unsigned char value=0,i=0;
TLC549_DOUT=1;//51單片機讀數據時得先把管腳置1
for(i=0;i《8;i++)
{
if(TLC549_DOUT==1)
value|=(0x80》》i);//獲取數據線的位放到相應位上
//(有1時寫1,無1時保持0)
TLC549_CLK=1;
TLC549_CLK=0;
delayus(50);//根據datasheet,下降沿產生后,
//400ns后新的位被寫到數據線上,所以這里進行延時
}
return value;
}
unsigned char TLC549_GetValue(void)
{
unsigned char ConvertValue;
TLC549_CS=0; //打開片選
ConvertValue=TLC549_ReadByte(); //讀取轉換后的8位AD值
TLC549_CS=1; //關閉片選
delayus(50); //等待轉換結束 最長17us
return ConvertValue; //返回轉換結果
}
unsigned char TLC549_Filter() //濾波函數
{
char count,i,j;
unsigned char value_buf[N],temp;
int sum=0;
for (count=0;count《N;count++)
{
value_buf[count] = TLC549_GetValue();
delayus(300);
}
for (j=0;j《N-1;j++)
{
for (i=0;i《N-j;i++)
{
if ( value_buf[j]》value_buf[i+j] )
{
temp = value_buf[j];
value_buf[j] = value_buf[i+j];
value_buf[i+j] = temp;
}
}
}
for(count=1;count《N-1;count++)
sum += value_buf[count];
return (unsigned char)(sum/(N-2));
}
unsigned char AD_Convert(void)
{
unsigned char AD_Value;
AD_Value=TLC549_Filter();
return AD_Value;
}
/*
//濾波函數:算數平均濾波
/* A、方法:
連續取N個采樣值進行算術平均運算
N值較大時:信號平滑度較高,但靈敏度較低
N值較小時:信號平滑度較低,但靈敏度較高
N值的選?。阂话懔髁浚琋=12;壓力:N=4
B、優點:
適用于對一般具有隨機干擾的信號進行濾波
這樣信號的特點是有一個平均值,信號在某一數值范圍附近上下波動
C、缺點:
對于測量速度較慢或要求數據計算速度較快的實時控制不適用
比較浪費RAM
unsigned char TLC549_Filter(void)
{
unsigned int sum=0;
for(count=0;count《N;count++)
{ //連續采8個數據,相加,放到sum中
sum+=TLC549_GetValue();
delayus(300);
}
return (unsigned char)(sum》》3);//求平均值,左移三位相當于除以8
} */
評論
查看更多