锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

调试AD7799遇到的问题

时间:2024-05-11 20:37:10

经历了四天的挣扎,AD7799终于调试成功啦!!!!!!!

说说我遇到的问题

一、不判忙的状态下,读出数据是ffffff

解决办法:

设置CFIGURATIONREGIR的con5为1,然后检测REGIER的NOREF位是否为1,如果为1说明内部基准低于0.5v,也就是说没有基准。我检测到NOREF位为 1,用万用表检测ref+为2.5,不是虚焊。检测来检测去没有问题,开始怀疑芯片,网上刚好也有说这个问题的,他说是芯片基准坏啦。我没办法重新焊了一块板子,问题依旧。没法硬着头皮看datasheet,最后发现还是设置的事。在我的硬件上ref-是直接接在管脚psw上的,如图示:

问题就出在这,psw是个可以配置的开关,如图示

手册中MODEREGISTER的MR12是控制psw的,描述如下:电源开关控制位。当此位为1时器件的PSW管脚和GND导通,可以允许30MA的电流通过;当此为为0时,psw管脚悬空。我在写MODEREGISTER时没有将MR12位置1,导致psw悬空,ref-接近2.5V,所以检测不到基准,读出数全部为ffffff。

改正方法有两个

1、置位MODEREGISTER的MR12

2、把ref-直接接到GND

二、不加判忙读出的数据一直是000000,加上判忙后,一直检测不到RDY变低,程序一直执行在判忙函数中

遇到这个问题我就直接崩溃了,这时候我已经不相信芯片是坏的了,没办法就怀疑时序,就拿中文手册加英文手册去看,看看错过了哪一点。看了一天多没啥发现。后来拉个同事一块看,没发现什么问题,这时接近崩溃中,用也分析了,跟程序写的时序一样的,不是程序的事。肯定还是时序的事。插个小事,我给 ADI亚太地区技术支持打电话啦,这个问题拖了三天,直到今天才给我打电话,但是给我的感觉就是这个技术支持对这个芯片不是很了解,没给我太大的帮助,不过还要谢谢今天技术支持的耐心讲解和指导。我就接着看程序,今天下午又把内部零刻度校准和片内满度校准都加了上去,还是不行。然后接着和同事讨论,他提议直接把CS接GND,试试就试试,最后发现程序正常啦,赶紧看读出的数据,发现很准确。调节电位器,重新采集,电压还是准确。当时就有跳起来的冲动,终于成功啦!!!这样肯定是CS的时序不对。然后对照手册发现单次转换模式下的时序中,CS一直是低电平,如图示

然后回想起21IC上的一篇日志上也是没有设置CS,这时候才恍然大悟,原来官方给的例程里都每次读写都改变了CS的值,移植官方的读写程序,如图

官方的读时序

官方的写时序

问题就出在程序上画红线的语句上

正确的程序如图示:

说说官方的程序吧,第一,官方程序没有判断RDY变低,所以可以说这个程序根本读不出数据即使在时序正常时;第二,官方给的读写函数里改变了cs的值,但是手册上没有改变,验证表明这个读写函数里不应该操作cs

需要注意的是在主程序里,在操作AD7799之前,一定先把CS拉低,所有操作完成后,再把CS拉高。

好了不知道描述的足够清楚不,希望对以后使用AD7799的同胞有帮助吧!

AD5439是双路10bit电流输出型DAC,由于没有搞过I的DAC,所以先在网上下载了一个该DAC的底层函数,如下

#include"macros.h"
#include"math.h"
#include"dac.h"

//向AD5439写命令字以及待转换的数据
voidWriteAD5439(unsignedintControlBits,unsignedintdata)
{
unsignedchari;

data=(data<<2);
data=(ControlBits|data);

SCLK_SET;
SYNC_CLR;

for(i=0;i<16;i++)
{
SCLK_SET;
if((data&0x8000)!=0)
{
SDIN_SET;
}
else
{
SDIN_CLR;
}
SCLK_CLR;
data=(data<<1);
}
SYNC_SET;
LDAC_CLR;
SCLK_CLR;
LDAC_SET;
delay_ms(1);

}

//初始化AD5439,
voidInitAD5439(void)
{
ACL_CLR;//AD5439.CLR=LOW,清零
delay_ms(5);
ADCCL_SET;//AD5439.CLR=High,准备工作
WriteAD5439_CMD(0x9000);
}

//读出SDO的值
unsignedintreadSDO(unsignedintchannal)
{
unsignedchari=0;
unsignedintreadData=0;

//写入控制字,选择读回的通道
if(channal==ReadBack_I)
{
WriteAD5439_CMD(ReadBack_I);
}
if(channal==ReadBack_V)
{
WriteAD5439_CMD(ReadBack_V);
}

//准备接收数据
SYNC_CLR;
SCLK_CLR;

//读数据,并处理
for(i=0;i<16;i++)
{
SCLK_SET;//上升沿,读一位
readData|=(PINB&0x01)<<(15-i);
SCLK_CLR;//准备下一回读出数据
//delay_ms(1);
}
SYNC_SET;

readData=((readData>>2)&0x3ff);//根据5439的命令字格式进行调整

//返回数据
returnreadData;
}

//针对Init5439(),readSDO(),只写命令字,不写数据
voidWriteAD5439_CMD(unsignedintControlBits)
{
unsignedchari;
unsignedintdata=ControlBits;

SCLK_SET;
SYNC_CLR;
for(i=0;i<16;i++)
{
SCLK_SET;
if((data&0x8000)!=0)
{
SDIN_SET;
}
else
{
SDIN_CLR;
}
SCLK_CLR;
data=(data<<1);
}
SYNC_SET;
LDAC_CLR;
SCLK_CLR;
LDAC_SET;
delay_ms(20);
}


voidWriteVoltage(unsignedintControlBits,unsignedintdata)
{
unsignedintchannal,i;//选择通道
unsignedintdataInUse=data;//用以重新调用write5439(),防止data受到破坏
unsignedintdataReadBack=0;



if(ControlBits==Load_I)
{
channal=ReadBack_I;
}
if(ControlBits==Load_V)
{
channal=ReadBack_V;
}

i=0;
for(;;)
{

WriteAD5439(ControlBits,dataInUse);

dataReadBack=readSDO(channal);
if(dataInUse==dataReadBack)
{
WriteAD5439(Updata_AB,dataInUse);
break;
}
else
{
i++;
}
if(i>10)//连续10次写不正确,则关机退出
{
SoftStartOff;
}
}

}

voidmain(void)
{
init_();//初始化MCU

WriteVoltage(Load_V,1024);

while(1)
{
process();
}

}

我首先看的是中文的pdf,我结合着这个程序去看该DAC的读写时序图,没发现程序有什么问题!那就开工吧,我用的是STC89C52RC作为主控,用io 口模拟SPI,没多久程序一个简单的测试程序就出来啦,编译没错误没警告。下载,调试,上显示出一个-5v的电压,哦,忘了说我用的是哪个电路啦,上图

我是用的双极性输出电路,我采用5v的基准,那么输出电压范围为-5到+5v。

下面需要解决的问题就是,为何DAC一直输出-5v

我所采用解决方法如下:

第一:采用逻辑分析仪看我程序输出的时序是否正确,经观察时序和pdf上的时序一样。找不到问题,我没办法只好硬着头皮去看英文pdf,勉强可以看懂,看一遍后没发现问题所在。。。。。。这消耗了两天多的时间,最后确实没辙啦,好吧找技术支持,第二天技术支持给我

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章