发新帖我要提问
12
返回列表
打印

用STC89C52控制ad7705,读数一直为65535

[复制链接]
楼主: zhaohualiang
手机看帖
扫描二维码
随时随地手机跟帖
21
arao| | 2010-11-26 12:42 | 只看该作者 回帖奖励 |倒序浏览
顶上去

使用特权

评论回复
22
zhaohualiang|  楼主 | 2010-11-26 14:45 | 只看该作者
恩,又学习了,多谢各位!

使用特权

评论回复
23
qyihan| | 2013-6-28 12:56 | 只看该作者
我用的24位AD,ADS1242,输出数据也是65535,纠结

使用特权

评论回复
24
sdwys| | 2013-6-28 16:04 | 只看该作者
我用ADR421B做基准,独立线性电源供电,加一固定直流信号,采集数据慢慢往上飘,暂时还没找到原因。

使用特权

评论回复
25
marshallemon| | 2013-6-28 19:37 | 只看该作者
先测试读写函数是否正常

使用特权

评论回复
26
popeye021| | 2013-8-22 10:41 | 只看该作者
留名,以后参考

使用特权

评论回复
27
dawei360| | 2015-5-8 12:52 | 只看该作者
你看看输入电压是否超过了测量范围。 我有个问题是DRDY一直为高?大神解释

使用特权

评论回复
28
jacklee8| | 2015-5-8 16:52 | 只看该作者
现在都用TM7705了,AD7705太贵了,程序一样的,Pin 对Pin 兼容的,直接替换即可,有需要样品资料可以联系QQ3247925842

下面是控制参考代码

设置TM7705的程序代码
表 16 给出了TM7705 和微控制器接口的用C 代码写成的一组读、写程序。   
此程序的几个步骤是:   
      1. 向通信寄存器写数据,选择通道1作为有效通道,将下一个操作设为对时钟寄存器进行写操作。   
      2.  对时钟寄存器写操作,设臵 CLK DIV位,将外部时钟除二,假定外部时钟频率为4.9512MHz  ,
更新率选为50Hz。   
      3. 向通信寄存器写数据。选择通道1作为有效通道。将下一个操作设为对设臵寄存器的写操作。   
      4. 向设臵寄存器写数据,将增益设为 1,设臵为双极性、非缓冲模式,清除滤波器同步,开始自校准。   
       5. 查询DRDY 输出。   
      6. 从数据寄存器上读数据。   
      7. 跳回第5、第6 步,直到从选定的通道中取出指定数量的采样。

表 16    TM7705与68HC11 微处理器接口的C 语言代码   
/* This program has read and write routines for the 68HC11 to interface to the TM7705  and the sample program
sets the various registers and then reads1000 samples from one channel.*/   
#include <math.h>   
#include <io6811.h>   
#define NUM_SAMPLES 1000 /* change the number of data samples*/   
#define MAX_REG_LENGTH 2 /* this says that the max length of a register is 2 bytes*/   
Writetoreg (int);   
Read(int,char);   
char *datapointer = store;
char store[NUM_SAMPLES*MAX_REG_LENGTH + 30];   
void main()   
{   /* the only pin that is programmed herefrom the 68HC11  is the /CS and this is why the PC2 bit of PORTC  is
made as an output */   
char a;   
DDRC  = 0x04;    /*    PC2 is an output the restof the port bits are inputs */   
PORTC | = 0x04;  /*  make the /CS line high */   
Writetoreg(0x20); /* Active Channel is Ain1(+)/Ain1(-),next operation aswrite to the clock register*/   
Writetoreg(0x0C);  /*  master clock enabled,4.9512MHz  Clock, set output  rate to 50Hz*/   
Writetoreg(0x10); /* Active Channel is Ain1(+)/Ain1(-),next operation aswrite to the setup register*/   
Writetoreg(0x40); /* gain = 1, bipolar mode, buffer off, clear FSYNC and perform a Self Calibration*/   
while(PORTC & 0x10); /* wait for /DRDY to go low */   
for(a=0;a<NUM_SAMPLES;a++)
{   
              Writetoreg(0x38); /*set the next operation for 16 bit read from the data register*/   
              Read(NUM_SAMPES,2);   
              }   
}   
Writetoreg(int    byteword);   
{  
int q;   
SPCR = 0x3f;   
SPCR = 0X7f; /* this setsthe WiredOR mode(DWOM=1), Master mode(MSTR=1),          SCK idles high(CPOL=1),  
/SS can be low always(CPHA=1), lowest clock speed(slowestspeedwhich is masterclock /32 */   
DDRD= 0x18; /*    SCK,  MOSI  outputs */   
q = SPSR;   
q = SPDR;  /* the read of the stausregister and of the data register is needed to clear the interrupt which tells the
user that the data transfer is complete */   
PORTC &=  0xfb; /* /CS is low */   
SPDR = byteword;  /*  put the byte into data register*/   
while(!(SPSR & 0x80));       /* wait for /DRDY  to go low */   
PORTC |=  0x4;  /* /CS high */
}   
Read(int amount, int reglength)   
{   
int q;   
SPCR = 0x3f;   
SPCR = 0x7f;  /*  clear the interupt */   
DDRD  = 0x10;  /*  MOSI  output,  MISO  input, SCK output */   
while(PORTC & 0x10);        /* wait for /DRDY  to go low */   
PORTC & 0xfb ; /* /CS is low */   
for(b=0;b<reglength;b++)   
              {   
              SPDR = 0;   
              while(!(SPSR & 0x80)); /* wait until  port ready before reading*/   
              *datapointer++=SPDR; /* read SPDR into store array via datapointer */   
              }   
PORTC|=4; /* /CS is high */   
}

使用特权

评论回复
29
liu1004010308| | 2015-9-16 10:14 | 只看该作者
大神,问一下,最后你调通了吗?读取的时候不是高电平的时候读取吗?
应该是连续的16个CLK
uint d
        for(i=0;i<16;i++) // 读数据,高位在前
                {
                d<<= 1;
                AD7705_SCLK =0;
                if(AD7705_DOUT)
                        d++;
                AD7705_SCLK =1;
                }你这样跟数据手册不相符合啊。能借鉴下你的程序吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则