stc89c52读取ad7705数值稳定性
本帖最后由 zhaohualiang 于 2010-12-15 12:03 编辑我是用stc89c52控制ad7705,读取压力传感去信号,刚上电时读数正常但一分钟左右后变为65535,再怎么压传感器读数也不再变化。各位朋友能够指点一下吗
程序原因,或7705硬件原因。 这是读取ad程序
/******************************************************************/
sbit AD7705_DATE=P1^0;
sbit AD7705_SCLK=P1^1;
sbit AD7705_DRDY=P3^2;
/*************************************************/
//延时
/*************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=128;y>0;y--);
}
//****************************************************************************
//功能: DIN端口连续写40个周期的高电平,保证复位
//参数:
//返回:无
//备注:无
//****************************************************************************
void AD7705_Reset(void)
{
uchar i;
AD7705_SCLK =1;
AD7705_DATE =1;
for(i=0;i<40;i++)
{
AD7705_SCLK =0;
AD7705_DATE =1;
AD7705_SCLK =1;
}
delay(1000);
}
//****************************************************************************
//功能:往AD7705写1个字节数据
//参数:要写入AD7705的数据
//返回:无
//备注:无
//****************************************************************************
void AD7705_WriteByte(uchar d)
{
uchar i;
AD7705_SCLK =1;
for(i=0;i<8;i++)
{
AD7705_SCLK =0;
if(d&0x80)
AD7705_DATE=1;
else
AD7705_DATE=0;
AD7705_SCLK =1;
d<<=1;
}
AD7705_SCLK =1;
AD7705_DATE=1;
}
//****************************************************************************
//功能:从AD7705读一个字
//参数:无
//返回:读到的一字
//备注:无
//****************************************************************************
uint AD7705_Read()
{
uchar i;
uint d;
AD7705_WriteByte(0x38);
AD7705_SCLK =1;
for(i=0;i<16;i++) // 读16位数据,高位在前
{
d<<=1;
AD7705_SCLK=0;
if(AD7705_DATE)
d++;
AD7705_SCLK =1;
}
AD7705_SCLK =1;
AD7705_DATE =1;
return d;
}
//****************************************************************************
//功能:AD7705初始化
//参数:无
//返回:无
//备注:无
//****************************************************************************
void AD7705_Init()
{
AD7705_Reset();// 复位,防止接口迷失
delay(1000);
AD7705_WriteByte(0x20);
AD7705_WriteByte(0x04);
AD7705_WriteByte(0x10);
AD7705_WriteByte(0x46);
delay(1000);
}
/*************************************************/
//主函数
/*************************************************/
void main(void)
{
IT1=1;//外部中断1
EX1=1;
EA=1;
P1=0xff;
AD7705_Init();
while(1)
{
f=k*out1;
temp1=f/10000;
temp2=f%10000/1000;
temp3=f%10000%1000/100;
temp4=f%10000%1000%100/10;
temp5=f%10000%1000%100%10;
display(temp1+146,1,3,19);//液晶显示读数
display(temp2+146,1,3,21);
display(temp3+146,1,3,23);
display(temp4+146,1,3,25);
display(temp5+146,1,3,27);
}
}
void int1() interrupt 2
{
out1=AD7705_Read();
} 先测量一下满量程时的AD输入,如果输入没有问题,可以肯定是程序编制的问题。 满量程时AD输入Vin+为1.7V左右,Vin-为0V,变为65535失灵后输入还是正常的,压动传感器输入电压也随着变化。看来是软件的问题 1.7V*4=6.8V 乘以4是什么意思啊?我ad7705前面加了个ad623,调节ad623的REF端电位器,7705满量程时AD输入Vin+的值不一定是1.7。 我理解错了,调节ad623的REF端电位器只是改变传感器受压为零时Vin+的大小,现在测量7705满量程时AD输入Vin+的值是2.5V左右,不知开始为何是1.7V。 看你的程序是发倍4 倍 (VIN+ -VIN-)*GAIN
7705的参考电压是多少V 2.5v参考电压,增益GAIN是1。 ..。。。我看错了看成4倍了 呵呵输入电压应该没问题吧,7705是不是有死机这么一说 好像是有点问题,,俺们用的是国产的。。。。。。不知道什么问题,最后只有过段时间初始化一次
蛮久了忘了 您说的过段时间初始化一次,是指的在DIN输入持续32个脉冲周期(DCLK)以上的高电平使其复位吗,那么每次初始化还用重新设置各个寄存器吗 是的都做一遍 现在问题基本解决了,非常感谢,但是非常不好意思, wangyy608大哥,给分时点错了,没有给您分望见谅 问题解决了就好 过段时间初始化一次,问题基本解决???
页:
[1]