zhaohualiang 发表于 2010-12-14 15:49

stc89c52读取ad7705数值稳定性

本帖最后由 zhaohualiang 于 2010-12-15 12:03 编辑

我是用stc89c52控制ad7705,读取压力传感去信号,刚上电时读数正常但一分钟左右后变为65535,再怎么压传感器读数也不再变化。各位朋友能够指点一下吗

coody 发表于 2010-12-14 15:55

程序原因,或7705硬件原因。

zhaohualiang 发表于 2010-12-14 16:06

这是读取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();

      }

chunyang 发表于 2010-12-14 22:08

先测量一下满量程时的AD输入,如果输入没有问题,可以肯定是程序编制的问题。

zhaohualiang 发表于 2010-12-15 11:14

满量程时AD输入Vin+为1.7V左右,Vin-为0V,变为65535失灵后输入还是正常的,压动传感器输入电压也随着变化。看来是软件的问题

wangyy608 发表于 2010-12-15 11:34

1.7V*4=6.8V

zhaohualiang 发表于 2010-12-15 11:56

乘以4是什么意思啊?我ad7705前面加了个ad623,调节ad623的REF端电位器,7705满量程时AD输入Vin+的值不一定是1.7。

zhaohualiang 发表于 2010-12-15 12:24

我理解错了,调节ad623的REF端电位器只是改变传感器受压为零时Vin+的大小,现在测量7705满量程时AD输入Vin+的值是2.5V左右,不知开始为何是1.7V。

wangyy608 发表于 2010-12-15 14:09

看你的程序是发倍4 倍   (VIN+ -VIN-)*GAIN
7705的参考电压是多少V

zhaohualiang 发表于 2010-12-15 14:15

2.5v参考电压,增益GAIN是1。

wangyy608 发表于 2010-12-15 14:19

..。。。我看错了看成4倍了

zhaohualiang 发表于 2010-12-15 14:23

呵呵输入电压应该没问题吧,7705是不是有死机这么一说

wangyy608 发表于 2010-12-15 15:08

好像是有点问题,,俺们用的是国产的。。。。。。不知道什么问题,最后只有过段时间初始化一次
蛮久了忘了

zhaohualiang 发表于 2010-12-15 15:46

您说的过段时间初始化一次,是指的在DIN输入持续32个脉冲周期(DCLK)以上的高电平使其复位吗,那么每次初始化还用重新设置各个寄存器吗

wangyy608 发表于 2010-12-15 16:19

是的都做一遍

zhaohualiang 发表于 2010-12-15 16:30

现在问题基本解决了,非常感谢,但是非常不好意思, wangyy608大哥,给分时点错了,没有给您分望见谅

wangyy608 发表于 2010-12-15 16:42

问题解决了就好

sjh-7366 发表于 2022-12-5 23:48

过段时间初始化一次,问题基本解决???
页: [1]
查看完整版本: stc89c52读取ad7705数值稳定性