搜索
bottom↓
回复: 7

请帮忙查看AD7705如此接法是否可行

[复制链接]

出0入0汤圆

发表于 2008-5-11 03:33:59 | 显示全部楼层 |阅读模式
1.参考电压大致2.5V
2.输入电压0-2.5V
3.自校准,增益1,单极,无缓冲


(原文件名:ad7705.gif)

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

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2008-5-11 09:44:33 | 显示全部楼层
参考电压不太稳定吧。AIN2不要悬空。

出0入0汤圆

发表于 2008-5-11 10:15:10 | 显示全部楼层
参考电源精度太低了吧

出0入0汤圆

 楼主| 发表于 2008-5-11 11:56:53 | 显示全部楼层
参考电压对于每个板子来说确实不相同,也无法保证能精确到2.5V,比如我目前的板子上电后测量该参考电压上2.376V(我假设该值应该波动不大),因为AIN1+输入是经过一级放大,所以可以调整满量程输入时AIN1+的电压能调整到参考电压(2.376V)差不多,不知道我这样的思路是否合理。

现在我的问题是通过ATmega64(外部时钟16M)的SPI无法正确读取到AD7705通道1的AD转换值,以下代码均来自ouravr网站。




PORTB = 0x08;   //PORTB初始化 MISO输入加上拉电阻
DDRB = 0x17;    // SS 输出,SCK输出,MOSI 输出,MISO输入 7705 ret 输出         
        
//SPI初始化
SPCR = 0x5F;        //使能SPI,MSB先发送,主机,SCK空闲高,模式三,128分频

//SPI写寄存器函数
void WriteToReg_ADC(UINT8 Data)
{
    AD7705_CS = 0;              //使能SPI器件  
    SPDR = Data;                //发送数据
    while(!(SPSR & (1<<SPIF))); //等待发送完毕   
    AD7705_CS = 1;              //禁止SPI器件
}
//SPI读函数
UINT8 Read_Byte_SPI(void)
{   
    SPDR = 0x00;                  //启动SPI,SPDR给任意值
    while (!(SPSR &( 1 << SPIF)));
    return SPDR;
}


//SPI读数据寄存器函数
UINT16 Read_ADC16BitValue(void)
{   
    UINT16  DataL = 0;
    UINT16  DataH = 0;
    UINT16  Ret = 0;
   
    AD7705_CS = 0;    //使能SPI器件
    DataH = Read_Byte_SPI();
    DataH = DataH << 8;
    DataL = Read_Byte_SPI();
    Ret = DataH | DataL;  
    AD7705_CS = 1;    //禁止SPI器件   
   
    return Ret;
   
}
  
/*********** SPI 相关 ***************************************/

void AD7705Init(void)
{  
    UINT8 i = 0;
   
    AD7705_RET = 0;
    delay_us(500);
    AD7705_RET = 1;
  
    for(i = 0; i < 30; i++)
    {
        WriteToReg_ADC(0xFF);       //持续DIN高电平写操作,恢复AD7705接口
    }
  
    WriteToReg_ADC(0x20);       //通道1,下一个写时钟寄存器
    WriteToReg_ADC(0x04);       //写时钟寄存器设置更新速率为50hz   

   
    WriteToReg_ADC(0x10);       //通道1,下一个写设置寄存器
    WriteToReg_ADC(0x44);       //自校准,增益1,单极,无缓冲
   
    delay_us(500);              //延时   
   
}
                     
//读取AD7705第一通道数据
UINT16 ReadAD7705(void)
{
    UINT16  Ret = 0;
   
    WriteToReg_ADC(0x38);       //下一操作为读数据寄存器1   
    Ret = Read_ADC16BitValue();
   
    return Ret;
}


=========================================================================================
===================================以下是问题具体描述====================================


AD7705中断DRDY后调用函数ReadAD7705读取AD转换值,请看下表

编号      AIN1+电压值          ReadAD7705返回值        
1         0.048V               1399      <-- 65535*0.048/2.376 = 1323 与1399接近
2         0.288V               8010      <-- 65535*0.288/2.376 = 7943 与8010接近
3         0.528V               6419      <-- 不正常
4         0.768V               4831      <-- 不正常

第1,2次的数据看似正确,因为AIN1+满量程调整有可能不准确,但是第3,4次数据怎么越来越小呢?

所以我不确定以上原理图是否有问题。

出0入0汤圆

 楼主| 发表于 2008-5-11 17:00:28 | 显示全部楼层
问题解决,发现不是硬件问题,是软件上面变量溢出导致,我是取10次 ReadAD7705返回值平均,而累加这10值的变量为int型,导致溢出。

出0入0汤圆

发表于 2011-1-20 18:13:13 | 显示全部楼层
AD7705是伪差分,AIN1-接地,效果可能不好

出0入0汤圆

发表于 2011-10-14 15:41:16 | 显示全部楼层
mark

出0入85汤圆

发表于 2012-9-28 15:56:50 | 显示全部楼层
skywym 发表于 2011-1-20 18:13
AD7705是伪差分,AIN1-接地,效果可能不好

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

本版积分规则

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

GMT+8, 2024-8-27 09:31

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

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