搜索
bottom↓
回复: 55

AD7705 应用补充说明 附完整程序

  [复制链接]

出0入0汤圆

发表于 2009-11-18 12:35:47 | 显示全部楼层 |阅读模式
AD7705 性价比比较高的 16位 ad 使用比较简单
用做单通道的时候 基本不怎么需要设置  
做双通道的时候,发现的点问题 ,而这几点问题在网上的前辈那也没有特别说明
这里提出来供用的着 AD7705 的参考下

1. 关于时钟寄存器 AD7705 只有一个时钟寄存器 而不是两个。 2.4576MHZ 是标准频率 ,如果用 4.9152MHZ的时候,要将 CLKDIV位置位
   也就是 2 分频到 2.4576 具体设置看手册
2. 关于数据寄存器 AD7705 也只有一个数据寄存器 ,一段时间内只能对一路 AD输入做数据转换 。数据转换范围
   单极性 0 -- Vref/Gain 对应 0 -- 0xffff(65535)
   双极性 -Vref/Gain -- 0 对应 0 -- 0x8000(32768) 0 - Vref/Gain 对应 0x8000(32768) -- 0xffff(65535)
3. 关于设置寄存器 同样也只有一个 ,要用哪个通道 就要先设置这个通道对应的寄存器值
4. 校准寄存器 虽然有 4对 但只是对应外部校准的 所以在用自校准,通道切换的时候也要重新自校准一下,校准的时候 DRDY 为高电平,校准完后 为低电平
   校准完后 第一次读的数据 不怎么准 应该读第二次转换出来的数据。

下边是我单通道切换转换的程序:
#include <iom16v.h>

//SPI 引脚定义 PB 口
#define CS_DRDY           3
#define CS_CS        4
#define CS_MOSI      5
#define CS_MISO          6
#define CS_SCK       7

extern void SpiInit(void);                     // SPI 初始化 M16
extern void InitAD7705(void);                  // AD7705 初始化   
extern unsigned int ReadDataCH1(void);         //读取转换数据   
extern unsigned int ReadDataCH2(void);         //读取转换数据   


#include "AD7705.H"

//定义位操作
#define SET_BIT(x,y)   ((x) |= (0x0001 << (y)))
#define CLR_BIT(x,y)   ((x) &= ~(0x0001 <<(y)))
#define CPL_BIT(x,y)   ((x) ^= (0x0001 << (y)))
#define GET_BIT(x,y)   (((x) & (1 << (y))) == 0? 0:1)
#define LET_BIT(x,y,z) ((x) = (x) & (~(1 << (y))) | ((z) << (y)))

//**********************短延时程序50us**************************//
void delay50us(unsigned int t)
{
    unsigned int  j;
    for(;t>0;t--)
        for(j=0;j<70;j++);
}

// SPI 初始化 M16
void SpiInit(void)
{   
  //cs 置为输出 方可不影响 SPI 总线     
  DDRB|=(1<<CS_MOSI)|(1<<CS_SCK)|(1<<CS_CS);
  //使能 spi 设置为主机 时钟极性为空闲时高平 上升沿采样下降沿设置  分频系数为128分频   
  SPCR|=(1<<SPE)|(1<<MSTR)|(1<<SPR0);  
  SPSR = 0x00; //setup SPI
  SET_BIT(PORTB,CS_DRDY);     //设置 REDY 信号输入端口上拉电阻使能   
  SET_BIT(PORTB,CS_MISO);     //设置 MISO 信号输入端口上拉电阻使能   
}

// SPI 发送接收数据
unsigned char TransmitterSpi(unsigned char cData)
{   
    SPDR = cData;
    while(!(SPSR&(1<<SPIF)));
    return SPDR;   
}

//复位 AD7705
void ResetAD(void)
{
  unsigned char i ;
  for(i = 10;i>0;i--)         //持续DIN高电平写操作,恢复AD7705接口  
     {
           TransmitterSpi(0xff);
         }  
}

// AD7705 初始化   
void InitAD7705(void)
{
  CLR_BIT(PORTB,CS_CS);       //CS置为输出低电平,使能 AD7705
  ResetAD() ;
  TransmitterSpi(0x20);       //通讯寄存器 //通道 1,下一个写时钟寄存器 自校准
  TransmitterSpi(0x00);       //时钟寄存器 //写时钟寄存器设置 2.459Mhz更新速率为20hz
  TransmitterSpi(0x10);       //通讯寄存器 //通道 1,下一个写设置寄存器
  TransmitterSpi(0x48);       //设置寄存器 //自校准,增益 1,双极 ,缓冲
  delay50us(100);             //延时  
  TransmitterSpi(0x21);       //通讯寄存器 //通道 2,下一个写时钟寄存器 自校准
  TransmitterSpi(0x00);       //时钟寄存器 //写时钟寄存器设置 2.459Mhz更新速率为20hz
  TransmitterSpi(0x11);       //通讯寄存器 //通道 2,下一个写设置寄存器
  TransmitterSpi(0x48);       //设置寄存器 //自校准,增益 1,双极,缓冲
  delay50us(100);                          
}


//*************************** 按照通道 1 读取 ****************************//
unsigned int  ReadDataCH1(void)
{
  unsigned int  getData = 0;
  unsigned char bufR[5];

  TransmitterSpi(0x10);          //通讯寄存器 //通道 1,下一个写设置寄存器
  TransmitterSpi(0x48);          //设置寄存器 //自校准,增益 1,双极 ,缓冲  
  while(PINB&(1<<CS_DRDY));      //等待校准完成  READY 信号变为低电平  
  TransmitterSpi(0x38);          //发送 0x38 读取 CH1 数据寄存器
  while(PINB&(1<<CS_DRDY));      //等待 READY 信号变为低电平  
  bufR[0]=TransmitterSpi(0xff);  //转换结果高位  
  bufR[1]=TransmitterSpi(0xff);  //转换结果低位
  getData=(bufR[0]<<8)|bufR[1];  //获得数据 16 位

  return getData ;                     //返回数据
}

//***************************按照通道 2 读取****************************//
unsigned int  ReadDataCH2(void)
{
  unsigned int  getData = 0;
  unsigned char bufR[5];
  
  TransmitterSpi(0x11);          //通讯寄存器 //通道 1,下一个写设置寄存器
  TransmitterSpi(0x48);          //设置寄存器 //自校准,增益 1,双极 ,缓冲  
  while(PINB&(1<<CS_DRDY));      //等待校准完成 READY 信号变为低电平   
  TransmitterSpi(0x39);          //发送 0x01 读取 AD7705 数据寄存器
  while(PINB&(1<<CS_DRDY));      //等待 READY 信号变为低电平  
  bufR[0]=TransmitterSpi(0xff);  //转换结果高位  
  bufR[1]=TransmitterSpi(0xff);  //转换结果低位
  
  getData=(bufR[0]<<8)|bufR[1]; //读取数据前 16 位

  return getData ;               
}

void main(void)
{
unsigned char adi ;
unsigned int getData,getData2;
SpiInit();
InitAD7705();
while(1)
      {
           if(adi++ >=1) adi = 0;
           if(adi == 0) getData = ReadDataCH1();
       if(adi == 1) getData2 = ReadDataCH2();
           }

}
                                                                    天涯过客

程序文件ourdev_504515.rar(文件大小:18K) (原文件名:AD7705.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

发表于 2009-12-7 10:46:21 | 显示全部楼层

出0入0汤圆

发表于 2009-12-8 23:14:51 | 显示全部楼层
谢啦!

出0入0汤圆

发表于 2009-12-11 23:36:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-20 13:57:19 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2010-7-29 09:54:06 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-7-29 09:58:12 | 显示全部楼层
mark!~~

出0入0汤圆

发表于 2010-7-30 13:50:38 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-7-30 17:37:39 | 显示全部楼层
楼主无私。顶一下

出0入0汤圆

发表于 2010-8-2 10:30:02 | 显示全部楼层

出0入20汤圆

发表于 2010-8-2 10:42:08 | 显示全部楼层
程序不错

出0入0汤圆

发表于 2010-8-2 12:58:37 | 显示全部楼层
AD7705单通道用得很好.但第二个通道从来没正常过,一般是正常值的一半.
原因也一直没找到.不知是芯片不行还是我不行.
按楼主的方法试试看行不行.
另外楼主的AD7705多少钱买的.我买的好像30左右.
TM7708 24位的10元左右,以前买的,感觉还可以,现在应该有新型号了.

出0入0汤圆

发表于 2011-5-6 09:21:53 | 显示全部楼层
谢谢

出0入0汤圆

发表于 2011-5-11 08:13:39 | 显示全部楼层
好贵的东东啊

出0入0汤圆

发表于 2011-5-11 09:24:07 | 显示全部楼层
不错

出0入0汤圆

发表于 2011-10-19 09:55:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-10-19 11:46:02 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-11-2 16:01:14 | 显示全部楼层
MARK

出0入0汤圆

发表于 2012-9-19 16:10:18 | 显示全部楼层
HYLG 发表于 2010-8-2 12:58
AD7705单通道用得很好.但第二个通道从来没正常过,一般是正常值的一半.
原因也一直没找到.不知是芯片不行还 ...

请问你的正常了吗?我的老喜欢死机......

出0入0汤圆

发表于 2012-9-19 16:13:52 | 显示全部楼层
死机跟时序有关系。

出0入0汤圆

发表于 2012-9-21 10:20:52 | 显示全部楼层

出0入0汤圆

发表于 2012-9-22 12:25:45 | 显示全部楼层
HYLG 发表于 2012-9-19 16:13
死机跟时序有关系。

恩 找到原因了!是换通道是初始化没弄好!

出0入0汤圆

发表于 2012-10-8 15:33:27 | 显示全部楼层

出0入0汤圆

发表于 2012-11-6 15:19:49 | 显示全部楼层
记号,最近准备用7705,谢谢楼主

出0入0汤圆

发表于 2013-8-12 14:52:24 | 显示全部楼层

出0入0汤圆

发表于 2013-8-12 15:00:54 | 显示全部楼层
建议不用这个吧,抗干扰性太差

出0入0汤圆

发表于 2013-8-12 20:10:16 | 显示全部楼层
正需要啊,谢谢分享

出0入0汤圆

发表于 2014-5-15 23:58:57 | 显示全部楼层
谢谢楼主慷慨分享

出0入0汤圆

发表于 2014-5-17 18:11:37 | 显示全部楼层
mark                  

出0入0汤圆

发表于 2014-5-24 09:22:28 | 显示全部楼层
感谢楼主

出0入0汤圆

发表于 2015-3-7 21:40:50 | 显示全部楼层
谢谢楼主。

出0入0汤圆

发表于 2015-3-8 10:27:45 | 显示全部楼层
马克,留有后续运用。谢谢楼主

出0入0汤圆

发表于 2015-3-8 10:39:38 | 显示全部楼层
gzhmcu 发表于 2013-8-12 15:00
建议不用这个吧,抗干扰性太差

请教一下有没有能可靠分辨100uv的AD,一开始也准备有AD7705.

出140入158汤圆

发表于 2015-3-8 10:59:31 | 显示全部楼层
我可以直白一点吗?将这个程序用在工业环境,绝对死翘翘。AD7705虽然简单,但要工业环境下365x7x24小时不间断工作,是有一番学问的。

出140入158汤圆

发表于 2015-3-8 11:01:05 | 显示全部楼层
另外,通道切换,无需自校准,只是需要一些时间等sin5滤波器稳定。

出0入0汤圆

发表于 2015-3-8 12:09:45 | 显示全部楼层
原来弄过7715
就是觉得这ad的片子好贵的说

出0入0汤圆

发表于 2015-3-12 21:13:11 | 显示全部楼层
看看   还是可以  备份

出0入0汤圆

发表于 2017-5-13 16:55:51 | 显示全部楼层
amigenius 发表于 2015-3-8 10:59
我可以直白一点吗?将这个程序用在工业环境,绝对死翘翘。AD7705虽然简单,但要工业环境下365x7x24小时不间 ...

前辈,请教您一下:AD7705在工业或者电磁干扰比较严重的情况下运行,要注意哪些细节?谢谢!!

出0入4汤圆

发表于 2017-6-23 09:14:28 | 显示全部楼层
原来也想用AD7705,有时间研究一下,谢谢!

出0入0汤圆

发表于 2017-6-25 11:02:13 | 显示全部楼层
价格¥太高,就用 Tm7705凑合一下

出0入0汤圆

发表于 2017-6-26 09:46:18 | 显示全部楼层
谢谢坛友,看了部分代码,突然有灵感修正一个令我恼怒的bug

出0入0汤圆

发表于 2017-12-17 08:34:14 | 显示全部楼层
  TransmitterSpi(0x11);          //通讯寄存器 //通道 1,下一个写设置寄存器
  TransmitterSpi(0x48);          //设置寄存器 //自校准,增益 1,双极 ,缓冲  
  while(PINB&(1<<CS_DRDY));      //等待校准完成 READY 信号变为低电平   
  TransmitterSpi(0x39);          //发送 0x01 读取 AD7705 数据寄存器
while(PINB&(1<<CS_DRDY));      //等待 READY 信号变为低电平  ---->不能在这里再判断DRDY,否则异常。
  bufR[0]=TransmitterSpi(0xff);  //转换结果高位  
  bufR[1]=TransmitterSpi(0xff);  //转换结果低位

出0入0汤圆

发表于 2018-3-13 22:30:02 | 显示全部楼层
好东西,谢谢楼主的分享!!!!!!!!

出0入0汤圆

发表于 2018-4-8 09:43:40 | 显示全部楼层
留下了     性价比高的芯片

出0入0汤圆

发表于 2018-4-8 10:36:57 来自手机 | 显示全部楼层
我都不敢用7705了,端口容易迷失。

出0入4汤圆

发表于 2018-6-22 09:54:25 | 显示全部楼层
zxd0225 发表于 2018-4-8 10:36
我都不敢用7705了,端口容易迷失。

你好,请问一下端口迷失是什么意思?有什么现象。最近我也用到这个片子也出现莫名其妙的问题。

出140入158汤圆

发表于 2018-6-22 10:05:27 | 显示全部楼层
zxd0225 发表于 2018-4-8 10:36
我都不敢用7705了,端口容易迷失。

这个才是含金量的东西

出140入158汤圆

发表于 2018-6-22 10:07:01 | 显示全部楼层
zxd0225 发表于 2018-4-8 10:36
我都不敢用7705了,端口容易迷失。

我可以告诉您AD7705(不是TM),可以做到在5Kv EFT环境下,24*7*365一直不间断稳定工作吗?

出0入4汤圆

发表于 2018-6-27 09:02:16 | 显示全部楼层
amigenius 发表于 2018-6-22 10:07
我可以告诉您AD7705(不是TM),可以做到在5Kv EFT环境下,24*7*365一直不间断稳定工作吗?
...

请问一下采取什么措施能避免端口迷失?或者端口迷失不可避免的话,在端口迷失后怎样操作,我现在做的是每次读取之前先发送56个脉冲,但这样还不敢确定不出问题。谢谢

出0入0汤圆

发表于 2018-6-30 21:19:22 | 显示全部楼层
感谢楼主, 收藏了。

出0入0汤圆

发表于 2018-8-8 06:32:43 | 显示全部楼层
天微的TM7705  TM7708 怎么样? 价格降成了白菜 不知道稳定性如何

出0入0汤圆

发表于 2018-8-8 07:43:48 | 显示全部楼层
mark一下,留着学习

出0入0汤圆

发表于 2018-8-8 07:49:05 | 显示全部楼层
7705抗干扰比较差,我用接触器打打里面的寄存器的数据就乱掉了

出0入0汤圆

发表于 2018-8-14 10:26:05 | 显示全部楼层
又长见识了

出0入0汤圆

发表于 2018-8-15 08:45:14 | 显示全部楼层
经典款adc

出0入0汤圆

发表于 2018-8-17 14:50:18 | 显示全部楼层
正正在用这个芯片
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 19:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表