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值的选取:一般流量,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
} */
评论
查看更多