chenxin861019 发表于 2009-8-25 15:33:24

AD7705双通道的应用程序奉献给大家

奉献给大家AD7705的双通道应用程序~~~~~
#include<reg52.h>

#define CH1 1 /*AD7705输入通道IN1*/
#define CH2 2 /*AD7705输入通道IN2*/
#define BIPOLAR 0 /*AD7705双极性输入*/
#define UNIPOLAR 1 /*AD7705单极性输入*/
#define AD_CLK_WIDTH 1 /*AD7705串口时钟脉冲宽度*/

sbit AdClk=P1^0; /*AD7705时钟脉冲*/
sbit AdDin=P1^1; /*AD7705数据输入脉冲*/
sbit AdDout=P1^2; /*AD7705数据输出的反相脉冲*/
sbit AdDrdy=P1^3; /*指定转换标志位*/
sbit AdReset=P1^4;/*复位*/


void Wait7705(unsigned int t);/* AD7705软件延时 */
void WriteByte7705(unsigned char x);/* 向AD7705写入一个字节 */
unsigned int ReadWord7705(void);/* 从AD7705读一个字节 */

void Reset7705(void);/* AD7705通信端口复位 */

void Init7705_1();
void Init7705_2();

unsigned int GetData7705_ch1();/* 读AD7705转换数据 输入通道channel ----1=IN1,2=IN2;*/
unsigned int GetData7705_ch2();/* 读AD7705转换数据 输入通道channe2 ----1=IN1,2=IN2;*/   

void main()
{

   
              
    _nop_();
    _nop_();
    _nop_();       
   
    AdClk=1;//AD7705时钟脉冲
    AdDin=1; //AD7705数据输入脉冲
    AdDout=1; //AD7705数据输出的反相脉冲

    AdReset=1;                       
    Wait7705(100);//软件延时
    AdReset=0;//复位      
    Wait7705(100);
    AdReset=1;                       
    Wait7705(100);
                           
        while(1)
        {   
          get_ad();                           
        }
}


void Wait7705(unsigned int t)/* AD7705软件延时 */
{
    for( ;t>0 ;t-- );
}

/* 向AD7705写入一个字节 */
void WriteByte7705(unsigned char x)
{
    unsigned char i;
    for (i=0;i<8;i++)
    {
      AdClk=0;
      Wait7705(AD_CLK_WIDTH);
      AdDin=(bit)(x&0x80);
      Wait7705(AD_CLK_WIDTH);
      AdClk=1;
      Wait7705(AD_CLK_WIDTH);
      x<<=1;
    }
}

/* 从AD7705读一个字 */
unsigned int ReadWord7705(void)
{
    unsigned char i;
    unsigned int x ;
        AdClk=1;
    for(i=0,x=0;i<16;i++)
    {
      AdClk=0;
      Wait7705(AD_CLK_WIDTH);
      x<<=1;
      if(AdDout)
      x|=0x01;
      AdClk=1;
      Wait7705(AD_CLK_WIDTH);
    }
    return x;
}
/* AD7705通信端口复位 */
void Reset7705(void)
{
    unsigned char i;
    for(i=0;i<64;i++)
    { /* 多于连续32个 DIN=1 使串口复位 */
      AdClk=0;
      Wait7705(AD_CLK_WIDTH);
      AdDin =1;
      Wait7705(AD_CLK_WIDTH);
      AdClk=1;
      Wait7705(AD_CLK_WIDTH);
    }
}
void Init7705_1()
{
    unsigned char i;
           for(i=10;i>0;i--)
    {WriteByte7705(0xff);}//持续DIN高电平写操作,恢复AD7705接口

    Reset7705();         /* 防止串口失步 */
    WriteByte7705(0x20); /* 写ch0 clock register */
    WriteByte7705(0x00); /* 2.4576MHz时钟,20Hz数据更新速率 */
    WriteByte7705(0x10); /*选择设置寄存器,使用chnanel 1*/
    WriteByte7705(0x44);
   
}
void Init7705_2()
{
    unsigned char i;
           for(i=10;i>0;i--)
    {WriteByte7705(0xff);}//持续DIN高电平写操作,恢复AD7705接口
    Reset7705();         /* 防止串口失步 */
    WriteByte7705(0x21); /* 写ch1 clock register */
    WriteByte7705(0x00); /* 2.4576MHz时钟,20Hz数据更新速率 */
    WriteByte7705(0x11); /*选择设置寄存器,使用chnanel 2*/
    WriteByte7705(0x44);
         
}               

/* 读AD7705转换数据 输入通道channel ----1=IN1,2=IN2;*/
unsigned int GetData7705_ch1()
{
    unsigned int temp1=0;
    Init7705_1();
    Wait7705(10);   
    while(AdDrdy==1);   //数据准备好           
    WriteByte7705(0x38);   
        temp1=ReadWord7705();//读取                
    return temp1;
}
/* 读AD7705转换数据 输入通道channe2 ----1=IN1,2=IN2;*/
unsigned int GetData7705_ch2()
{
    unsigned int temp2=0;
    Init7705_2();
    Wait7705(10);
   
    while(AdDrdy==1)   //数据准备好
    WriteByte7705(0x39);      
        temp2=ReadWord7705();//读取                   
    return temp2;
}

wear778899 发表于 2009-8-25 15:43:24

记号

zxq6 发表于 2009-8-25 15:44:32

谢谢楼主。

huwuzhao 发表于 2009-8-25 15:51:14

好人呀!

unclewolf 发表于 2009-8-25 21:58:13

正需要。

sfq2008 发表于 2009-8-25 22:02:45

好样的

07550755 发表于 2009-9-4 20:55:25

这东东不好买哦,一个就要50大洋,听说,在电子城找了几天

dongni 发表于 2009-9-4 21:49:43

好样的

portx 发表于 2009-9-5 00:33:47

AD7705 这款芯片的转化精度比较高,可靠位可以达到15位。但是需要注意以下两点
1:转换过程中需要注意切换通道的时候需要在切换后延时一段时间然后启动AD转换,频繁的切换会导致精度下降,一般采用双通道同时输入的方案,都是低功耗低速考虑的。
2:数据传输过程中要考虑AD7705的“端口迷失”问题,需要加入硬件定时器定时检测AD7705的“就绪”状态,如果超时需要进行硬件复位从新初始化。在设计过程中遇到过因外部干扰导致的这种问题。

lcmdw 发表于 2011-10-10 09:19:27

mark

zwei99999999 发表于 2011-10-10 10:13:33

mark         好

swustlx86 发表于 2011-11-24 15:13:32

mark

lange188 发表于 2012-4-24 16:32:44

{:smile:}{:smile:}{:smile:}{:smile:}

512561411 发表于 2012-4-24 17:27:15

正打算使用!收藏!!{:sad:}

ithinkok 发表于 2012-6-18 17:33:11

怎么找回我的id号呢?楼主这个id就是我的啊!

mkliop 发表于 2012-6-18 21:49:41

马克正用到谢谢

marshallemon 发表于 2012-6-18 21:53:03

不知道LZ是否测试通道切换后第一个数据是否可用?

boyiee 发表于 2012-6-26 09:16:45

mark hhahaha

icexiong 发表于 2012-7-4 08:20:59

portx 发表于 2009-9-5 00:33 static/image/common/back.gif
AD7705 这款芯片的转化精度比较高,可靠位可以达到15位。但是需要注意以下两点
1:转换过程中需要注意切换通 ...

我也遇到过这种问题

portx 发表于 2012-7-5 15:07:24

marshallemon 发表于 2012-6-18 21:53 static/image/common/back.gif
不知道LZ是否测试通道切换后第一个数据是否可用?

切换通道后第一个数据可以使用,要注意AD7705这个芯片只适合测量相对静态的信号“内部采样速度很低”,要把握好这个尺度否则每次输出的结果会相差很大。

hesperusiris 发表于 2012-7-6 13:17:59

学习了~ 谢谢分享~

yy945 发表于 2012-8-6 14:52:38

LZ,请教一下,没读一次AD值都要复位一下,重写寄存器????

zhaoweizhang 发表于 2012-8-26 17:46:45

多谢楼主啊,解决大问题了!{:biggrin:}

linbaoluo3 发表于 2013-12-27 13:20:26

参考一下,等调通了再回来赞一个。

linbaoluo3 发表于 2013-12-27 14:15:16

调试成功,谢谢楼主了。

闪客 发表于 2013-12-31 13:57:43

学习了,正用到这个芯片

xinjihua 发表于 2013-12-31 14:36:21

学习了,正用到这个芯片

fiaanull 发表于 2014-3-14 16:07:08

顶一个,楼主威武!

qinshiysb 发表于 2014-5-20 13:36:58

Mark一下,现在在用这个呢

CandD 发表于 2014-5-24 09:19:59

正在学习   顶一个

xiaokiss_c51 发表于 2014-7-21 17:21:37

好东西   学习了正好用到调试一下

century11 发表于 2014-8-6 20:25:17

正好要用到,做个记号

lxjmcuahz 发表于 2015-3-7 21:36:01

谢谢,正准备使用这个芯片。

zhangzif 发表于 2019-1-7 13:08:07

谢谢分享!!!!
页: [1]
查看完整版本: AD7705双通道的应用程序奉献给大家