刚开学的那两天,刚接触到ad7705的时候我的第一感觉就是,把调试出来应该很是件很容易的事,但是在接下来的时间内,我发现我先前的想法是错的,断断续续用了来个两天的时间,数码管上始终显示5.000V,很是郁闷。。。。这才慢慢的静下心来第一次认真的研读datasheet,之后认为是时序出了问题,又断断续续调了两天,结果还是一个样,没办法。。。只好再一次认真研读datasheet和网上的前辈们的调试经验,在这里我特别感谢深圳亿佳电子的罗老师写的ad7705调试经验,很据他的文章和datasheet我从头到尾把我的程序修改了一下,最后成功了,误差在3mv以内呵呵还不是很理想,总共断断续续调了8天,可把我郁闷的 哎!!!
ad7705的工作原理
工作原理: AD7705/06以及AD7707是比较典型的一种16位A/D转换芯片。 AD7705/06芯片是带有自校正功能的Σ-Δ于A/D转换器。其内部由多路模拟开关、缓冲器、可编程增益放大器(PGA)、Σ-Δ调制器、数字滤波器、基准电压输入、时钟电路及串行接口组成。其中串行接口包括寄存器组,它由通讯寄存器、设置寄存器、时钟寄存器、数据输出寄存器、零点校正寄存器和满程校正寄存器等组成。该芯片还包括2通道差分输入(AD7705)和3种伪差分通道输入(AD7706)。
AD7705/06的PGA可通过指令设定,对不同幅度的输入信号实现1、2、4、8、16、32、64和128倍的放大,因此AD7705/06芯片既可接受从传感器送来的低电平输入信号,亦可接受高电平(10V)信号,它运用Σ―Δ技术实现16位无误码性能;它的输出速度同样可由指令设定,范围由 20Hz到500Hz;它能够通过指令设定对零点和满程进行校正;AD7705/06与微处理器的数据传送通过串行方式进行,采用了节省端口线的通讯方式,最少只占用控制机的两条端口线。
再说一下ad7705很便宜相对max公司的16位ad转换我买的一片只有20几块钱呵呵!!!
#define uchar unsigned char
#define uint unsigned int
uchar code df[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值01234567
uchar code daf[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
uchar code sg[]={0,1,2,3,4,5,6,7};//分别对应相应的数码管点亮
uchar shu[5];
sbit DRDY=P1^3;
sbit CS=P1^4;
sbit SO=P1^5;
sbit SCK=P1^6;
sbit SI=P1^7;
sbit dian=P0^7;
void delay(uint z) //延时
{
uchar p;
while(z-->0)
{for(p=0;p<20;p++);}
}
void write(uchar x) //写一个字节子程序
{
uchar i;
CS=0;
SCK=1;
for (i=0;i<8;i++)
{
SCK=0;
// delay(1);
SI=(bit)(x&0x80);
// delay(1);
SCK=1;
// delay(1);
x<<=1;
}
SI=1;
// SO=1;
CS=1;
}
uint read(void) //读转换数据子程序
{
uchar i;
uint w ;
w=0;
CS=0;
SCK=1 ;
for(i=0;i<16;i++)
{
SCK=0;
// delay(1);
w<<=1;
if(SO==1)
w|=0x01;
SCK=1;
// delay(1);
}
//SI=1;
CS=1;
//SO=1;
return w;
}
void zhua(float m)
{ uint n;
n=(uint)(m*10000);
shu[0]=(uchar)m;
shu[1]=n%10000/1000;
shu[2]=n%10000%1000/100;
shu[3]=n%10000%1000%100/10;
shu[4]=n%10;
}
void xianshi()
{
uchar i;
for(i=0;i<5;i++)
{
if(i==0)
{ P0=daf[shu[i]];
P2=sg[i];
}
else
{
P0=df[shu[i]];
P2=sg[i];
}
delay(1);
}
}
void init()
{
write(0x20); //AD7705初始化-读第1通道A/D转换值下写时钟寄存器
write(0x05);//改刷新频率为20 不分频
write(0x10);//下写setup寄存器
write(0x44);
//delay(3);
}
void main() //主程序
{
float a,b;
/* for(i=0;i<100;i++)
{reset=0;}
reset=1;*/
init();
while(1)
{
if(DRDY==0) //等待DRDY变低
{
write(0x38);
if(DRDY==0)
{
a=read();
b=5*(a/65536);
zhua(b);
}
}
xianshi();
}
}