打印

stc89c52读取ad7705数值稳定性

[复制链接]
5722|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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输入,如果输入没有问题,可以肯定是程序编制的问题。

使用特权

评论回复
5
zhaohualiang|  楼主 | 2010-12-15 11:14 | 只看该作者
满量程时AD输入Vin+为1.7V左右,Vin-为0V,变为65535失灵后输入还是正常的,压动传感器输入电压也随着变化。看来是软件的问题

使用特权

评论回复
6
wangyy608| | 2010-12-15 11:34 | 只看该作者
1.7V*4=6.8V

使用特权

评论回复
7
zhaohualiang|  楼主 | 2010-12-15 11:56 | 只看该作者
乘以4是什么意思啊?我ad7705前面加了个ad623,调节ad623的REF端电位器,7705满量程时AD输入Vin+的值不一定是1.7。

使用特权

评论回复
8
zhaohualiang|  楼主 | 2010-12-15 12:24 | 只看该作者
我理解错了,调节ad623的REF端电位器只是改变传感器受压为零时Vin+的大小,现在测量7705满量程时AD输入Vin+的值是2.5V左右,不知开始为何是1.7V。

使用特权

评论回复
9
wangyy608| | 2010-12-15 14:09 | 只看该作者
看你的程序是发倍4 倍   (VIN+ -  VIN-)*GAIN
7705的参考电压是多少V

使用特权

评论回复
10
zhaohualiang|  楼主 | 2010-12-15 14:15 | 只看该作者
2.5v参考电压,增益GAIN是1。

使用特权

评论回复
11
wangyy608| | 2010-12-15 14:19 | 只看该作者
..。。。我看错了看成4倍了

使用特权

评论回复
12
zhaohualiang|  楼主 | 2010-12-15 14:23 | 只看该作者
呵呵输入电压应该没问题吧,7705是不是有死机这么一说

使用特权

评论回复
13
wangyy608| | 2010-12-15 15:08 | 只看该作者
好像是有点问题,,俺们用的是国产的。。。。。。不知道什么问题,最后只有过段时间初始化一次
蛮久了  忘了

使用特权

评论回复
14
zhaohualiang|  楼主 | 2010-12-15 15:46 | 只看该作者
您说的过段时间初始化一次,是指的在DIN输入持续32个脉冲周期(DCLK)以上的高电平使其复位吗,那么每次初始化还用重新设置各个寄存器吗

使用特权

评论回复
15
wangyy608| | 2010-12-15 16:19 | 只看该作者
是的  都做一遍

使用特权

评论回复
16
zhaohualiang|  楼主 | 2010-12-15 16:30 | 只看该作者
现在问题基本解决了,非常感谢,但是非常不好意思, wangyy608大哥,给分时点错了,没有给您分望见谅

使用特权

评论回复
17
wangyy608| | 2010-12-15 16:42 | 只看该作者
问题解决了就好

使用特权

评论回复
18
sjh-7366| | 2022-12-5 23:48 | 只看该作者
过段时间初始化一次,问题基本解决???

使用特权

评论回复
评论
sjh-7366 2023-3-3 21:36 回复TA
@微信13267226716 :[em:3:][em:3:][em:3:] 
微信13267226716 2022-12-6 09:10 回复TA
十二年前的帖子给哥们激活了 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

52

主题

218

帖子

1

粉丝