模数转换器TLC549的应用1.概述TLC549是8位串行A/D转换器芯片,可与通用微处理器、控制器通过CLK、CS、DATAOUT三条口线进行串行接口。具有4MHz片内系统时钟和软、硬件控制电路,转换时间最长17μs,TLC549为40000次/s。总失调误差最大为±0.5LSB,典型功耗值为6mW。采用差分参考电压高阻输入,抗干扰,可按比例量程校准转换范围,VREF-接地,VREF+-VREF-≥1V,可用于较小信号的采样。2.芯片简介2.1TLC549的内部框图和管脚名称TLC549的内部框图如图1。2.2极限参数TLC549的极限参数如下:●电源电压:6.5V;●输入,出电压范围:0.3V~VCC+0.3V;●峰值输入电流(任一输入端):±10mA;●总峰值输入电流(所有输入端):±30mA;●工作温度:TLC549C:0℃~70℃TLC549I:-40℃~85℃TLC549M:-55℃~125℃3.工作原理TLC549均有片内系统时钟,该时钟与I/OCLOCK是独立工作的,无须特殊的速度或相位匹配。其工作时序如图2所示。当CS为高时,数据输出(DATAOUT)端处于高阻状态,此时I/OCLOCK不起作用。这种CS控制作用允许在同时使用多片TLC549时,共用I/OCLOCK,以减少多路(片)A/D并用时的I/O控制端口。一组通常的控制时序为:(1)将CS置低。内部电路在测得CS下降沿后,再等待两个内部时钟上升沿和一个下降沿后,然后确认这一变化,最后自动将前一次转换结果的最高位(D7)位输出到DATAOUT端上。(2)前四个I/OCLOCK周期的下降沿依次移出第2、3、4和第5个位(D6、D5、D4、D3),片上采样保持电路在第4个I/OCLOCK下降沿开始采样模拟输入。(3)接下来的3个I/OCLOCK周期的下降沿移出第6、7、8(D2、D1、D0)个转换位,(4)片上采样保持电路在第8个I/OCLOCK周期的下降沿将移出第6、7、8(D2、D1、D0)个转换位。保持功能将持续4个内部时钟周期,然后开始进行32个内部时钟周期的A/D转换。第8个I/OCLOCK后,CS必须为高,或I/OCLOCK保持低电平,这种状态需要维持36个内部系统时钟周期以等待保持和转换工作的完成。如果CS为低时I/OCLOCK上出现一个有效干扰脉冲,则微处理器/控制器将与器件的I/O时序失去同步;若CS为高时出现一次有效低电平,若要在特定的时刻采样模拟信号,应使第8个I/OCLOCK时钟的下降沿与该时刻对应,因为芯片虽在第4个I/OCLOCK时钟下降沿开始采样,却在第8个I/OCLOCK的下降沿开始保存。4.应用接口及采样程序TLC549可方便地与具有串行外围接口(SPI)的单片机或微处理器配合使用,也可与51系列通用单片机连接使用。与51系列单片机的接口如图3所示。其采样程序框图如图4所示参考程序#includeTLC549.h#includeMydefine.h#defineN8unsignedcharcount;//滤波函数的计数值/*unsignedcharbdatadat;//dat是可位寻址的变量sbitdat7=dat^7;sbitdat6=dat^6;sbitdat5=dat^5;sbitdat4=dat^4;sbitdat3=dat^3;sbitdat2=dat^2;sbitdat1=dat^1;sbitdat0=dat^0;//取出dat的各个位*///------------------------------------------------------------------------unsignedcharTLC549_ReadByte(void){//读一个字节函数unsignedcharvalue=0,i=0;TLC549_DOUT=1;//51单片机读数据时得先把管脚置1for(i=0;i8;i++){if(TLC549_DOUT==1)value|=(0x80i);//获取数据线的位放到相应位上//(有1时写1,无1时保持0)TLC549_CLK=1;TLC549_CLK=0;delayus(50);//根据datasheet,下降沿产生后,//400ns后新的位被写到数据线上,所以这里进行延时}returnvalue;}unsignedcharTLC549_GetValue(void){unsignedcharConvertValue;TLC549_CS=0;//打开片选ConvertValue=TLC549_ReadByte();//读取转换后的8位AD值TLC549_CS=1;//关闭片选delayus(50);//等待转换结束最长17usreturnConvertValue;//返回转换结果}unsignedcharTLC549_Filter()//滤波函数{charcount,i,j;unsignedcharvalue_buf[N],temp;intsum=0;for(count=0;countN;count++){value_buf[count]=TLC549_GetValue();delayus(300);}for(j=0;jN-1;j++){for(i=0;iN-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;countN-1;count++)sum+=value_buf[count];return(unsignedchar)(sum/(N-2));}unsignedcharAD_Convert(void){unsignedcharAD_Value;AD_Value=TLC549_Filter();returnAD_Value;}/*unsignedcharTLC549_Filter(void){unsignedintsum=0;for(count=0;countN;count++){//连续采8个数据,相加,放到sum中sum+=TLC549_GetValue();delayus(300);}return(unsignedchar)(sum3);//求平均值,左移三位相当于除以8}*/