本帖最后由 dita1983 于 2013-2-23 17:22 编辑
小弟最近在利用ATmega16L和TLC2543做模拟量数据采集问题。遇到TLC2543读数(dataout,以下简写SDO)不稳定的问题,在最近一周想尽了各种办法,问题仍是存在。初步断定是时序问题,可以就是无法解决,我把示波器的波形截图及代码粘贴如下,还望各位高人不吝指教。 1. 硬件连接 除SDO引脚外,TLC2543各引脚直接接单片机,中间没有任何电路。单片机电源和2543电源接12VDC经过7805转换后的5V。tlc2543的REF+、REF-与单片机电源接在一次(暂时没有基准电源芯片,个人觉得这个应该不会是影响后面数据不准的原因,因为数据不是不稳定,而且有点诡异,具体怎么诡异详见第3条) 2. 时序 小弟示波器只有两路,所以分别接入观察,SDI为1011,读取测试Vref/2的值。下图为片选信号。2543最大4Mhz,测试时特意降低clk频率。 3. 数据SDO问题。 问题描述: 【测试方法】我在AI0和AI1通道上分别接了1.6V和3.3V的电压监测点(通过电阻分压,即5V通过3个电阻,这两个监测点取电阻上的信号)。然后我程序首先读取通道0的数据三次(第一次读出的抛弃,是上一个通道的值),每次间隔约500ms。然后延迟1S左右同样读取通道1的数据三次,每次间隔约500ms。全部读取完后发送给串口(串口程序已经在产品上应用过,没有任何问题),串口发送完毕后再开始循环读取这两个通道的值一次,读完后再通过串口发送,如此循环。 【诡异现象】 通过串口监测发现,有时通道0和1的值基本相同,通过其他电压测试发现,目前得出如下结论: AI测试电压在0~2.5V之间时SDO读数为0x000~FFF之间变换,电压在2.5V~5V之间读数又从0x000~FFF之间变换。但并不是每次都这样,偶尔有几次又会正常,即2.5V以下为0~0x800之间,2.5V以上为0x800到0xFFF。 我把TLC的datasheet(英文)和时序图看了多几遍,也没有发现问题。在网上搜下,发现也有人出现这种情况,说是时序问题,不过没有说解决方法。还恳请高人不吝指点,我都快疯了,这一个星期就在不停的试试试试试试试试试试~~下图为3某次1.6V的测试电压时SDO波形图。
程序部分代码如下: unsigned intread2543(unsigned char ch) { unsigned int ad; unsigned char i; unsigned char j; unsigned char port;
port=ch; //ch为10进制通道号 ad=0; //Tlc_clk_low;//clk置为低电平 //delay(3); Tlc_cs_low;//cs置为低电平
port<<=4; for(i=0;i<12;i++) { delay(3); If(Tlc_sdo==0) { } else { ad|=0x01; }
if((port&0x80)==0)//load SDI {Tlc_sdi_low;} else {Tlc_sdi_hi;} delay(10);
Tlc_clk_hi; delay(30); Tlc_clk_low; port<<=1; ad<<=1; delay(30); } delay(1); Tlc_cs_hi;
delay(3); // Tlc_cs_hi; ad>>=1; return(ad); } |