stc89c52读取ad7705数值稳定性

[复制链接]
7136|19
 楼主| zhaohualiang 发表于 2010-12-14 15:49 | 显示全部楼层 |阅读模式
本帖最后由 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 | 显示全部楼层
过段时间初始化一次,问题基本解决???

评论

@微信13267226716 :[em:3:][em:3:][em:3:]  发表于 2023-3-3 21:36
十二年前的帖子给哥们激活了  发表于 2022-12-6 09:10
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

219

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部