硬汉嵌入式论坛

 找回密码
 立即注册
查看: 38594|回复: 24
收起左侧

AD7705 TM7705 双通道16位ADC 应用经验汇总

  [复制链接]

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
发表于 2013-9-29 16:27:05 | 显示全部楼层 |阅读模式
以下内容为安富莱电子原创:【转载时请保留引用的网址】
TM7705_中文数据手册.pdf (1.27 MB, 下载次数: 3043)
【安富莱】AD7705双通道16位ADC模块_尺寸图.pdf (19 KB, 下载次数: 1133)

AD7705成品模块购买链接:https://item.taobao.com/item.htm ... amp;id=586140701023
TM7705_宝贝.jpg
TM7705_背面.jpg



TM7705 是应用于低频测量的2/3 通道的模拟前端。该器件可以接受直接来自传感器的低电平的输入信号,然后产生串行的数字输出。利用Σ -∆ 转换技术实现了16位无丢失代码性能。选定的输入信号被送到一个基于模拟调制器的增益可编程专用前端(PGA)。片内数字滤波器处理调制器的输出信号。通过片内控制寄存器可调节滤波器的截止点和输出更新速率,从而对数字滤波器的第一个陷波进行编程。

特点:
1、2 个全差分输入通道的ADC
2、16位无丢失代码
3、0.003%非线性
4、  可编程增益前端 增益:1~128 ,共8档
5、  三线串行接口 SPI
6、  可选择模拟输入缓冲器
7、 2.7~3.3V或4.75 ~5.25V 工作电压
8、 3V电压时,最大功耗为1mW
9、 等待电流的最大值为8μ

AD7705是美国模拟器件公司生产的。15元左右。
TM7705 是深圳天微生产的,引脚和功能和AD7705完全兼容。可以替代AD7705。价格比进口的便宜几倍。5元左右。
AD7705和TM7705功能区别:
(1)TM7705多一个内部2.48V参考电压,可以通过写测试寄存器开启(默认不开启)
(2)TM7705多一种时钟设置方法,可以提高电子称的精度。时钟寄存器的ZERO 3个bit位中最高位=1来启用。这种模式下,数据刷新率变低(每秒10个样本),精度变高。

FAQ:
问题1:将AD7705设置自校准,需要设置延时等待自校准结束吗?
答复:AD7705的自校准属于内部操作,系统自动校准完后会回到正常的工作状态。程序根据DRDY引脚的电平状态判断校准结束即可。

问题2:复位接口迷失,需要每次读AD前,执行一遍吗?
答复:一般上电复位一次,如果希望程序健壮,就需要采取一定方法检测芯片是否失步。如果失步,则按上电复位后的初始化流程进行处理。
时序复位可以使接口同步,但是不能是寄存器内容变为复位缺省值。硬件RESET口线复位会使内部寄存器复位到缺省值。

问题3:CLK:时钟位。时钟频率为2. 4576MHz 时,该位设置为“0”, 时钟频率为        1MHz     时,该位设置为“1”。对吗?选最快的更新率行吗?
答复:手册上有推荐的时钟设置方法。一般按照手册来设置即可。如果不按推荐值来也可以,可能ADC性能到不到手册标称的指标。说白了
芯片的设计和验证就是按照手册推荐的工作条件进行了,按推荐值用比较保险。

问题4:ad7705通道切换时,每次都进行自校准吗?
答复:上电做一次自校准即可,自校准分别对2个通道上执行,也就做2次。 读取ADC结果时,通道切换后不需要重复自校准。

问题5:设置为双极性输入模式时,能够输入负电压吗?
答复:不可以。双极性的意思是:AIN+ 可以比 AIN-电压高,但是AIN+和AIN-必须在芯片的供电电压范围之内。

问题6:自校准和系统校准的区别?
答复:自校准是芯片内部自动短接输入端校准0位,自动连接到vref校准满位。一般应用这种方式即可。
      系统校准是指对包含芯片外部输入电路(比如用户自己的放大器或分压电阻)在内的模拟通达进行校准。系统校准需要要用户参与的,比如在你的电路板
     输入端接地(校准0位)或接最高电压(校准满位)。校准完后,需要用户程序自己保存校准参数到flash或EEPROM,以后每次上电时,可以读取这些参数并写入AD7705芯片。
      满位校准时,芯片输入电压到达4/5 基准电压才能获得最大ADC字(单极性就是65535)。  

问题7:什么时候需要用到AD7705的系统校准功能?
答复:启用AD7705芯片的系统校准功能,可以使ADC采样数据尽可能覆盖整个16位数字空间,从而提高分辨率。不过需要应用程序增加校准代码。
    在很多分辨率要求不高的应用场合,可以不用系统校准。比如最低输入电压和最高输入电压时,ADC值范围是 2000-5000, 如果3000个点已经足够了,就可以不用系统校准了。
   当然,如果用了芯片的系统校准,可以扩大ADC值的范围,有可能做到1000-6000,有5000个点。
   
购买安富莱电子生产的TM7705模块,可以提供给完整的源代码(c语言) STM32F4。包含单通道转换,双通道切换转换,自校准、系统校准、系统标定的参考代码。
回复

使用道具 举报

747

主题

1049

回帖

3295

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3295
 楼主| 发表于 2013-9-29 16:39:34 | 显示全部楼层
转载自: http://bbs.eeworld.com.cn/thread-66467-1-1.html
这是我调试AD7705总结的经验,希望对大家有帮助,不正确的地方大家提出指正,跟帖发表,让大家一起提高,帮助大家方便快捷的使用AD系列带校准功能的芯片

AD7705应用总结:
    YW2314R12项目中用到了AD7705,先将AD7705的应用经验以及注意要点总结如下,这些经验同样适用于AD7799、AD7706等AD公司的拥有校准功能的AD芯片。
    1.时序注意要点:数字接口迷失的时候可以通过ADIN输入持续32个脉冲周期(DCLK)以上的高电平将复位AD7705的数字接口,复位之后要等待500us以上才能访问AD7705芯片,这种复位方式不会影响AD7705内部的任何寄存器,所有的寄存器将保持复位之前的内容,但所有的寄存器在数字接口迷失的状态下内容是不确定的,因此强烈建议在复位之后重新设置AD7705内部所有的寄存器,防止错误。而芯片管脚RESET的复位将使片内所有的寄存器恢复到上电的默认值。时钟输入信号DCLK是一种施密特出发信号,能够适应光耦合器的慢速边沿,其他数字输入信号的上升和下降时间不应超过1us。

    2.AD7705时钟大于2M时,时钟设置寄存器的CLK位应置1,小于2M时应置0。DCLK的脉冲宽度要满足最小的脉宽要求。在时钟DCLK下降之后的低电平期间读取数据ADOUT。在时钟DCLK的低电平期间设置要写入数据ADIN,然后在DCLK的上升沿写入到7705。写入数据以及读取数据的时钟DCLK的数目要与(被写入或被读取的寄存器)的位数长度一致,多于或少于(寄存器位长度)的时钟DCLK数目都将导致操作错误。在两次写操作之间,ADIN应最好保持在高电平:因为任何(读或写)操作都必须从写通信寄存器开始,而且写入通信寄存器的8个位中的第1位必须为0,后续的位才能被写入到通信寄存器。所以当ADIN为0的时候,万一时钟DCLK受到干扰导致0写入通信寄存器,AD7705会误认为是写通信寄存器的操作开始而等待后续的7位位串,发生这种干扰之后会导致AD7705的数字接口迷失,从而导致内部寄存器的内容也许会变得未知状态。此外,时钟信号DCLK在两次操作AD7705之间要保持高电平。即:在不访问AD7705的空闲时刻,或者两次操作之间的空闲时刻,ADIN、DCLK都最好保持高电平为最可靠。

    3.DRDY信号为数据AD转换完成的指示信号,低电平期间表示AD转换完成,可以读取数据寄存器的内容,高电平期间表示AD转换正在进行,这时不能访问数据寄存器。对于系统校准和内部校准也一样,低电平期间表示校准完成,可以读取校准寄存器的内容,高电平期间表示校准正在进行,这时不能访问校准寄存器。违反这些规定的操作,结果时未知的。此外程序中千万不能把DRDY的逻辑搞反,否则结果不可预料。

    4.不管是校准还是数据AD转换,数字滤波器同步位FSYNC都要置为0,这样AD7705的校准或者数据AD转换工作才能进行,否则校准和AD转换不会进行,DRDY信号也不会变低。当FSYNC=0时,在校准或AD转换结束后DRDY信号将变低,此时可以读取校准系数或者数据寄存器。

    5.采用非缓冲模式时,AD7705模拟输入前端的电阻电容的变化对AD转换精度影响很大。若系统工作时的信号源、温度环境、器件参数变化很大,导致AD7705模拟输入前端电路的参数跟系统校准时的参数不一致,误差会非常大。缓冲模式能解决这种问题,当使能缓冲模式时,AD7705会在模拟输入端和AD转换器之间接入一个缓冲器Buffer,这样AD7705就能适应模拟输入前端信号源的大阻抗、器件参数(电阻电容)的变化、温度环境的变化等各种与系统校准时的不一致情况(即器件工作条件的变化)。所以,AD7705的校准和正常工作最好都要在缓冲模式下进行。

    6.电压输入范围:对于非缓冲模式,模拟输入信号范围是【GND-30mV】至【VDD+30mV】之间。对于缓冲模式,模拟输入信号范围是【GND+50mV】至【VDD-1.5V】之间。

    7.非缓冲模式、单极性、增益为GAIN:此时AD7705的反相输入端VIN-的范围是【GND-30mV】至【VDD+30mV-VREF/GAIN】之间,其中VREF为AD7705的参考电压。正相输入端VIN+的范围是【V-】至【V-+VREF/GAIN】。如右图,即V+和V-都必须大于GND小于VDD,同时还要考虑单极性的输入范围,即V-还必须小于VDD+30mV-VREF/GAIN,才不至于模拟输入为V+max=【V-+VREF/GAIN】时大于VDD+30mV。

    8.非缓冲、双极性、增益为GAIN:此时V+和V-都必须大于GAN小于VDD,V-还必须小于VDD+30mV-VREF/GAIN,这样输入V+max=【V-+VREF/GAIN】不至于大于VDD+30mV。V-还必须大于GND-30mV +VREF/GAIN,才不至于输入V+min=【V――VREF/GAIN】时小于GND-30mV。正相输入端VIN+的正信号输入范围是【V-】至【V-+VREF/GAIN】,正相输入端VIN+的负信号输入范围是【V-】至【V--REF/GAIN】。如右图:其中V+max为正的最大输入,V+min为负的最大输入。


    9.缓冲模式、单极性、增益为GAIN:此时AD7705的反相输入端VIN-的范围是【GND+50mV】至【VDD-1.5V-VREF/GAIN】之间,其中VREF为AD7705的参考电压。正相输入端VIN+的范围是【V-】至【V-+VREF/GAIN】。如右图,即V+和V-都必须大于GND+50mV小于VDD-1.5V,同时还要考虑单极性的输入范围,即V-还必须小于VDD-1.5V-VREF/GAIN,才不至于输入V+max=【V-+VREF/GAIN】时大于VDD-1.5V。

    10.缓冲模式、双极性、增益为GAIN:此时AD7705的反相输入端VIN-的范围是【GND+50mV+VREF/GAIN】至【VDD-1.5V-VREF/GAIN】之间,这样才不至于输入VIN+max=【V-+VREF/GAIN】时导致VIN+大于VDD-1.5V、输入VIN+min=【V――VREF/GAIN】时导致VIN+小于GND+50mV。其中VREF为AD7705的参考电压。正相输入端VIN+的正信号输入范围是【V-】至【V-+VREF/GAIN】,正相输入端VIN+的负信号输入范围是【V-】至【V--REF/GAIN】。如右图:其中V+max为正的最大输入,V+min为负的最大输入。
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2015-4-24 16:32:26 | 显示全部楼层
楼主好!
          我正在用STC89C52单片机调试你们的AD7705模块。调试环境是这样:单片机晶振12MHZ  ; 和模块的接口用的是P2口;P2口全部用1K排阻接5V上拉了。目前调试的情况是这样,如果只在单片机上电时对TM7705初始化一次,那AD转换读出的数据不能随输入变化,固定为一个值。如果在程序中改成每读一次AD结果后进行一次初始化,并等待约750MS后再读AD结果,那AD转换的数据能随输入变大变小,但数据极不稳定。但大多数转换结果能反映输入电压的变化。能否给一些指导意见?另我怀疑还是接口迷失原因,曾试图在初始化芯片后,读出初始化写入时钟寄存器和设置寄存器里的值,但读出的值要不发生了二进制的移位,就是缺位。综合以上分析,如果是接口迷失,或时序错误,那要从那方面检查和解决?另附上程序,请有空帮我看看有无问题,十分感谢!
#include <at89x52.h>
    #include <INTRINS.h>
     /* 定义GPIO端口 */
    sbit CS    = P2^7;
    sbit DOUT  = P2^6;//接模块的DIN
    sbit SCLK  = P2^5;
    sbit DRDY  = P2^4;
    sbit DIN   = P2^3;//接模块的DOUT
    //sbit RST   = P2^2;
   

    sbit DATA=P0^0;    //HD7279A 数据线
    sbit CLK=P0^1;    //HD7279A 时钟线
    sbit CSP=P0^2;    //HD7279A 片选信号
    unsigned char Data_MSB,Data_LSB;
    unsigned char dbuffer[3][5];//HD7279A 显示缓存

    unsigned int AD_result,T_voltage;

enum
{
    /* 寄存器选择  RS2 RS1 RS0  */
    REG_COMM    = 0x00,    /* 通信寄存器 */
    REG_SETUP    = 0x10,    /* 设置寄存器 */
    REG_CLOCK    = 0x20,    /* 时钟寄存器 */
    REG_DATA    = 0x30,    /* 数据寄存器 */
    REG_ZERO_CH1    = 0x60,    /* CH1 偏移寄存器 */
    REG_FULL_CH1    = 0x70,    /* CH1 满量程寄存器 */
    REG_ZERO_CH2    = 0x61,    /* CH2 偏移寄存器 */
    REG_FULL_CH2    = 0x71,    /* CH2 满量程寄存器 */

    /* 读写操作 */
    WRITE         = 0x00,    /* 写操作 */
    READ         = 0x08,    /* 读操作 */

    /* 通道 */
    CH_1        = 0,    /* AIN1+  AIN1- */
    CH_2        = 1,    /* AIN2+  AIN2- */
    CH_3        = 2,    /* AIN1-  AIN1- */
    CH_4        = 3        /* AIN1-  AIN2- */
};

/* 设置寄存器bit定义 */
enum
{
    MD_NORMAL        = (0 << 6),    /* 正常模式 */
    MD_CAL_SELF        = (1 << 6),    /* 自校准模式 */
    MD_CAL_ZERO        = (2 << 6),    /* 校准0刻度模式 */
    MD_CAL_FULL        = (3 << 6),    /* 校准满刻度模式 */

    GAIN_1            = (0 << 3),    /* 增益 */
    GAIN_2            = (1 << 3),    /* 增益 */
    GAIN_4            = (2 << 3),    /* 增益 */
    GAIN_8            = (3 << 3),    /* 增益 */
    GAIN_16            = (4 << 3),    /* 增益 */
    GAIN_32            = (5 << 3),    /* 增益 */
    GAIN_64            = (6 << 3),    /* 增益 */
    GAIN_128        = (7 << 3),    /* 增益 */

    /* 无论双极性还是单极性都不改变任何输入信号的状态,它只改变输出数据的代码和转换函数上的校准点 */
    BIPOLAR            = (0 << 2),    /* 双极性输入 */
    UNIPOLAR        = (1 << 2),    /* 单极性输入 */

    BUF_NO            = (0 << 1),    /* 输入无缓冲(内部缓冲器不启用) */
    BUF_EN            = (1 << 1),    /* 输入有缓冲 (启用内部缓冲器) */

    FSYNC_0            = 0,
    FSYNC_1            = 1        /* 不启用 */
};

/* 时钟寄存器bit定义 */
enum
{
    CLKDIS_0    = 0x00,        /* 时钟输出使能 (当外接晶振时,必须使能才能振荡) */
    CLKDIS_1    = 0x10,        /* 时钟禁止 (当外部提供时钟时,设置该位可以禁止MCK_OUT引脚输出时钟以省电 */

    /*
        2.4576MHz(CLKDIV=0 )或为 4.9152MHz (CLKDIV=1 ),CLK 应置 "0"。
        1MHz (CLKDIV=0 )或 2MHz   (CLKDIV=1 ),CLK 该位应置  "1"
    */
    CLK_4_9152M = 0x08,
    CLK_2_4576M = 0x00,
    CLK_1M         = 0x04,
    CLK_2M         = 0x0C,

    FS_50HZ        = 0x00,
    FS_60HZ        = 0x01,
    FS_250HZ    = 0x02,
    FS_500HZ    = 0x04,

    /*
        四十九、电子秤应用中提高TM7705 精度的方法
            当使用主时钟为 2.4576MHz 时,强烈建议将时钟寄存器设为 84H,此时数据输出更新率为10Hz,即每0.1S 输出一个新数据。
            当使用主时钟为 1MHz 时,强烈建议将时钟寄存器设为80H, 此时数据输出更新率为4Hz, 即每0.25S 输出一个新数据
    */
    ZERO_0        = 0x00,
    ZERO_1        = 0x80
};
/*
*********************************************************************************************************
*    函 数 名: bsp_DelayMS
*    功能说明: 延时函数。按照89C52调试, 12T指令周期, 11.0592晶振
*    形    参:无
*    返 回 值: 无
*********************************************************************************************************
*/
void bsp_DelayMS(unsigned int n)
{
    /*bsp_DelayMS(500) 时,实际延迟498ms   */
    unsigned char k;

    while(n--)
    {
        for (k = 0; k < 150; k++);
    }
}
/******根据写周期时序,向输入移位寄存器写入指令函数******/
void AD7705_write_Reg(unsigned char data_byte)
{
    unsigned char i;
    CS=0;
    for(i=0;i<8;i++)
        {
            
            
            SCLK=0;
            DOUT=data_byte&0x80;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            
            SCLK=1;
            data_byte<<=1;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
    DRDY=1;
    CS=1;   
}
/******根据写周期时序,向输入移位寄存器写入指令函数******/
unsigned char AD7705_read_Reg()
{
    unsigned char i;
    unsigned char DATA_OUT;
    while(DRDY);//等待完成数据更新
    CS=0;
    _nop_();
    _nop_();

    SCLK=1;
    _nop_();
    _nop_();

    for(i=0;i<8;i++)
        {
            SCLK=0;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            DATA_OUT=DATA_OUT|(unsigned char)DIN;
            DATA_OUT=DATA_OUT<<1;
            SCLK=1;
            _nop_();
            _nop_();
            _nop_();
            _nop_();
            _nop_();
        }
    CS=1;
    _nop_();
    DRDY=1;
    return (DATA_OUT);
}
/******配置AD7705函数******/
void AD7705_init()//根据具体情况,初始化AD7705
{
    //RST = 1; /*模块里将此脚上拉至VCC,不需操作*/
    bsp_DelayMS(1);
    //RST = 0;
    bsp_DelayMS(2);
    //RST = 1;
    bsp_DelayMS(1);      /* 硬件复位 */
    bsp_DelayMS(5);
    /* AD7705串行接口失步后将其复位。复位后要延时500us再访问 */
    CS=0;
    AD7705_write_Reg(0xFF);
    AD7705_write_Reg(0xFF);
    AD7705_write_Reg(0xFF);
    AD7705_write_Reg(0xFF);
    CS=1;
    bsp_DelayMS(5);

    AD7705_write_Reg(REG_CLOCK | WRITE | CH_1);//写入通信寄存器;设置为写时钟寄存器
                            /*时钟寄存器设置*/
    AD7705_write_Reg(CLKDIS_0 | CLK_4_9152M | FS_50HZ);//* 刷新速率50Hz */
    AD7705_write_Reg(REG_SETUP | WRITE | CH_1);//写入通信寄存器,设置为写设置寄存器
                               /*设置寄存器设置*/
    AD7705_write_Reg(MD_CAL_SELF |GAIN_1 | UNIPOLAR | BUF_EN| FSYNC_0);//* 启动自校准 */
    while(DRDY);    //等待完成
}
void delay(unsigned int k)
{
    unsigned int j,i;
    for(j=k;j>0;j--)
        for(i=100;i>0;i--);
}

/******读出结果函数******/
void AD7705_read_result()
{
    AD7705_write_Reg(0x38);//通信寄存器中,设置为读数据寄存器
    /*数据寄存器为16位的只读寄存器,其包含了来自AD7705的最新转换结果*/
    Data_MSB=AD7705_read_Reg();//读出高8位数据
    Data_LSB=AD7705_read_Reg();//读出低8位数据
    AD_result=(unsigned int)Data_MSB;
    AD_result<<=8;
    AD_result=AD_result | (unsigned int)Data_LSB;////位转换为数
    /*转换为电压*/
    T_voltage=AD_result;//*2500/65535;
}
/***************************************************以下是HD7279的操作程序****************************************/

void write7279(unsigned char hb,unsigned char lb)
{
    unsigned char i;
    unsigned char j;
   
    CSP=0;
    for(i=1;i<=8;i++)
    {
        if (hb&0x80) DATA=1;
        else DATA=0;
        hb=hb<<1;
        CLK=1;
         for(j=1;j<=128;j++);
         CLK=0;
         for(j=1;j<=128;j++);
    }
    for(i=1;i<=8;i++)
    {
        if (lb&0x80) DATA=1;
        else DATA=0;
        lb=lb<<1;
        CLK=1;
         for(j=1;j<=128;j++);
         CLK=0;
         for(j=1;j<=128;j++);
    }
    CSP=1;
    DATA=0;
}
void display(unsigned char rls,unsigned int disdata)
{   
    unsigned char g;
    unsigned char s;
    unsigned char kb;
    unsigned char q;
    unsigned int d2;
    d2=disdata;
    q=d2/1000;
    d2=d2-q*1000;
    kb=d2/100;
    d2=d2-kb*100;
    s=d2/10;
    d2=d2-s*10;
    g=d2;
    if(rls==1)
    {
        if(g!=dbuffer[1][1])
        {
            dbuffer[1][1]=g;
            write7279(0x80,g);
        }
           if(s!=dbuffer[1][2])
        {
            dbuffer[1][2]=s;
            write7279(0x81,s);
        }
        if(kb!=dbuffer[1][3])
        {
            dbuffer[1][3]=kb;
            write7279(0x82,kb);
        }
        if(q!=dbuffer[1][4])
        {
            dbuffer[1][4]=q;
            write7279(0x83,q);
        }   

    }
    if(rls==2)
    {
        if(g!=dbuffer[2][1])
        {
            dbuffer[2][1]=g;
            write7279(0x84,g);
        }
           if(s!=dbuffer[2][2])
        {
            dbuffer[2][2]=s;
            write7279(0x85,s);
        }
        if(kb!=dbuffer[2][3])
        {
            dbuffer[2][3]=kb;
            write7279(0x86,kb);
        }
        if(q!=dbuffer[2][4])
        {
            dbuffer[2][4]=q;
            write7279(0x87,q);
        }
    }
        
}
void ms750(void)
{
    unsigned char i=250;
    unsigned int j;
    for(j=0;j<=2000;j++)
    while(--i);
}
/******主函数******/
void main()
{
        
        SCON=0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
        TMOD=0x20; //TMOD: timer 1, mode 2, 8-bit reload
        PCON=0x80; //SMOD=1;
        TH1=0xF3; //Baud:4800 fosc=12MHz
        TL1=0XF3;
        TR1=1; // timer 1 run
        AD7705_init();
        while(1)
        {
            /*选择通道1*/
            AD7705_write_Reg(0x10);
            AD7705_write_Reg(0x3c);//通道初始化*/
            /*选择通道2*/
            //AD7705_write_Reg(0x11);
            //AD7705_write_Reg(0x44);//通道初始化
            delay(50);//等待完成数据更新
            while(DRDY);//检测DRDY输出线引脚是否为低
            AD7705_read_result();
            /*显示转换结果*/
            /*AD7705_write_Reg(REG_SETUP | READ | CH_1);//写入通信寄存器;设置为读时钟寄存器
            T_voltage=AD7705_read_Reg(); */
            display(1,T_voltage);
            if(T_voltage==0) display(1,8888);  
            
            SBUF=Data_MSB;
            while(TI==0);
            TI=0;
            delay(50);
            SBUF=Data_LSB;
            while(TI==0);
            TI=0;
        
            AD7705_init();
            ms750();
        }
}
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2015-5-3 10:06:31 | 显示全部楼层
[s:151]
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2015-8-8 10:26:50 | 显示全部楼层
你好,我买的7705 在调试的时候 通道1的数据老是显示在通道2上,请问是什么原因
回复

使用道具 举报

0

主题

1

回帖

0

积分

新手上路

积分
0
发表于 2016-6-25 14:49:12 | 显示全部楼层
FS_500HZ    = 0x04,
这句话有误,应为FS_500HZ    = 0x03,
另外,对于TM7706和AD7706,两者的数据手册对于CLK bit的使用是反的
这是我调试的结果,供参考。
回复

使用道具 举报

20

主题

56

回帖

116

积分

初级会员

积分
116
发表于 2016-11-3 18:24:17 | 显示全部楼层
我也遇到问题,信号小于50mV的情况下,AD7705的线性很差,提高放大倍数情况仍然很差。
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
发表于 2018-5-6 17:30:13 | 显示全部楼层
zxd620 发表于 2016-6-25 14:49
FS_500HZ    = 0x04,
这句话有误,应为FS_500HZ    = 0x03,
另外,对于TM7706和AD7706,两者的数据手册对于 ...

我也被这个问题搞了半天,才刚刚发现这一个问题。。。
原来这个问题这么早就有人发现了,楼主还没有参考例程改过来。。。
呼喊楼主啊。。。
回复

使用道具 举报

5

主题

31

回帖

46

积分

新手上路

积分
46
发表于 2018-5-6 17:34:01 | 显示全部楼层
请问楼主,AD7705怎么控制它的采样起始时刻呢?我想采某时刻的电压值。 读取到的ADC的值是不是就是从设置channel后开始到ready输出低之间的电压?谢谢。
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
发表于 2018-5-7 02:11:48 | 显示全部楼层
darkness 发表于 2018-5-6 17:34
请问楼主,AD7705怎么控制它的采样起始时刻呢?我想采某时刻的电压值。 读取到的ADC的值是不是就是从设置ch ...

不是,是DRDY为第电平才可以操作通道,否则不可操作。没法控制时刻,因为采样率很低,控制定时采集即可。
回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2018-11-14 17:28:06 | 显示全部楼层
项目中有个测温模块,硬件搭配是STM32F1+ad7705+pt100,程序参考了安富莱的例程,调试时出现一个很让人费解的问题,在此记录一下
正常情况下转换是可以顺利进行的,DRDY引脚有节奏的拉高拉低,但是只要对AD7705的的GND引脚干扰一下,比如用示波器的地探针戳一下,甚至用万用表碰一下,就会出问题,DRDR再也不会拉低了。
尝试过初始化AD7705之后,切断AD7705所有与单片机通信的引脚,只留DRDY给单片机读,问题依旧。猜测是干扰使寄存器的FSYNC位置位了(原因至今不明,希望大神指点),从而使转换终止,DRDY不再拉低。
临时的解决方案是,当检测DRDY为高超过一定时限时,再次对AD7705进行一次自校准操作,可使AD7705恢复正常。需要注意的地方是,因为这次校准是在主函数中进行的,而AD7705进行一次自校准需要时间约为180ms,时间太长,
当校准命令发出后就完事了,不能让单片机傻等DRDR拉低,应该跳过这次的ADC读取。我的项目是200ms读一次温度,200m回来后刚好校准也完成了,不耽误别的任务的处理。
还有一个注意点,如二楼所言,空闲时ADIN应最好保持在高电平,否则SPI接口真的会迷失,不是开玩笑。。。。我就迷失了。
另外,附上我的初始化代码,求大神鉴定一下是否有问题。
void TM7705_Init(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = SCK_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                   
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(SCK_PORT, &GPIO_InitStructure);//SCK
        GPIO_InitStructure.GPIO_Pin = DIN_PIN;
        GPIO_Init(DIN_PORT, &GPIO_InitStructure);//DIN
        GPIO_InitStructure.GPIO_Pin = CS_PIN;
        GPIO_Init(CS_PORT, &GPIO_InitStructure);//CS
        GPIO_InitStructure.GPIO_Pin = RST_PIN;
        GPIO_Init(RST_PORT, &GPIO_InitStructure);//RST
        GPIO_InitStructure.GPIO_Pin = DOUT_PIN;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
        GPIO_Init(DOUT_PORT, &GPIO_InitStructure);//DOUT
        GPIO_InitStructure.GPIO_Pin = DRDY_PIN;
        GPIO_Init(DRDY_PORT, &GPIO_InitStructure);//DRDY
        CS_1;
        SCK_1;
        DI_1;       
       
        delay_ms(5);
        TM7705_ResetHard();                //ó2¼t¸′λ
       
        //Ôú½ó¿úDòáD¶aê§μÄÇé¿öÏ£¬èç1ûÔúDIN ¸ßμçƽμÄD′2ù×÷3ÖDøáË×ã1»3¤μÄ걼䣨Öáéù 32¸ö′®DDê±ÖóÖüÆú£©£¬
        //TM7705 ½«»á»Øμ½Ä¬èÏ×′쬡£
        delay_ms(5);
        TM7705_SyncSPI();                //í¬2½SPI½ó¿úê±Dò
        delay_ms(5);

        //ÅäÖÃê±Öó¼Ä′æÆ÷
        TM7705_WriteByte(REG_CLOCK | WRITE | CH_1);                        //ÏèD′í¨DżÄ′æÆ÷£¬ÏÂò»2½êÇD′ê±Öó¼Ä′æÆ÷
        TM7705_WriteByte(CLKDIS_0 | CLK_2_4576M | FS_50HZ);        //Ë¢DÂËùÂê50Hz
        TM7705_CalibSelf();        //Äú2¿×ÔD£×¼ CH1
        delay_ms(5);
}

//×ÔD£×¼CH1: Äú2¿×Ô¶ˉ¶ì½óAIN+ AIN-D£×¼0룬Äú2¿¶ì½óμ½Vref D£×¼Âúλ
static void TM7705_CalibSelf(void)
{
        TM7705_WriteByte(REG_SETUP | WRITE | CH_1);         //D′í¨DżÄ′æÆ÷£¬ÏÂò»2½êÇD′éèÖüÄ′æÆ÷£¬í¨μà1                
        TM7705_WriteByte(MD_CAL_SELF | GAIN_64 | UNIPOLAR | BUF_EN | FSYNC_0); //Æô¶ˉ×ÔD£×¼
        TM7705_WaitDRDY();         //μè′yÄú2¿2ù×÷íê3é --- ê±¼ä½Ï3¤£¬Ô¼180ms
}
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2019-4-15 19:41:40 | 显示全部楼层
勃发仪表 发表于 2015-4-24 16:32
楼主好!
          我正在用STC89C52单片机调试你们的AD7705模块。调试环境是这样:单片机晶振12MHZ  ;  ...

老哥, 你是怎么调试的?
回复

使用道具 举报

1

主题

2

回帖

5

积分

新手上路

积分
5
发表于 2019-4-15 19:49:20 | 显示全部楼层
勃发仪表 发表于 2015-4-24 16:32
楼主好!
          我正在用STC89C52单片机调试你们的AD7705模块。调试环境是这样:单片机晶振12MHZ  ;  ...

老哥,我现在也在用STC89C52单片机调试程序,可以教教我吗?我不会
回复

使用道具 举报

41

主题

214

回帖

337

积分

高级会员

积分
337
发表于 2021-9-28 19:31:58 | 显示全部楼层
AD7705非常娇气,抗干扰差。证据是,芯片提供了复位接口,抗干扰好会提供这种借口吗? 逐次逼近的ADC有这种复位接口吗?

回复

使用道具 举报

0

主题

1

回帖

1

积分

新手上路

积分
1
发表于 2021-10-14 20:53:47 | 显示全部楼层
我最近也在使用TM7705,使用过程中采用的时安富莱的原理图自己重新和STM32F103C8T6画在一块板上,但是在调试过程中出现DSDY一直为高电平,导致程序跑不动,但是使用安富莱的模块搭配最小系统模块是可以实现需要的功能的,想请教一下大家
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
发表于 2021-10-15 08:54:13 | 显示全部楼层
bababab 发表于 2021-10-14 20:53
我最近也在使用TM7705,使用过程中采用的时安富莱的原理图自己重新和STM32F103C8T6画在一块板上,但是在调 ...

那应该是硬件设计有点问题了。这个原理图比较简单,考虑示波器测试下。
回复

使用道具 举报

10

主题

130

回帖

160

积分

初级会员

积分
160
发表于 2022-3-21 12:17:27 | 显示全部楼层
本帖最后由 oneV 于 2022-3-21 14:51 编辑
eric2013 发表于 2021-10-15 08:54
那应该是硬件设计有点问题了。这个原理图比较简单,考虑示波器测试下。

TM7705的代码 1.bmp
上面这个定义是不是有点问题   
比如60Hz不应该是0x05吗
2.bmp 3.bmp


回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2023-6-9 17:17:48 | 显示全部楼层
天微原厂 17841108642
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-6-29 10:35:26 | 显示全部楼层
方远 发表于 2018-11-14 17:28
项目中有个测温模块,硬件搭配是STM32F1+ad7705+pt100,程序参考了安富莱的例程,调试时出现一个很让人费解 ...

我也是这样的问题,先开始好好的读着读着就DRDY不变化了
回复

使用道具 举报

0

主题

4

回帖

4

积分

新手上路

积分
4
发表于 2023-6-29 10:39:48 | 显示全部楼层
eric2013 发表于 2018-5-7 02:11
不是,是DRDY为第电平才可以操作通道,否则不可操作。没法控制时刻,因为采样率很低,控制定时采集即可。 ...

您好,我使用AD7705,正常情况下转换是可以顺利进行的,DRDY引脚有节奏的拉高拉低,可以出发外部中断,但是运行一段时间DRDY就不变化了,这是什么原因呢
回复

使用道具 举报

11

主题

135

回帖

168

积分

初级会员

积分
168
发表于 2023-10-16 10:36:59 | 显示全部楼层
我刚试过CS1238,在增益放大器不开的时候,效果可以。但是想要使用前端增益放大器,需要给信号提供至少0.75V的共模电压,然后就夭折了,本身信号就0-20mV。 我看AD7705  在缓冲模式下也要提供50mV 的共模电压。个人理解就是这类AD无法采集0-20mV(没有经过阻抗变换), 使用PGA放大到1250mV。想用就得额外加运放加共模电压。还有就是DRDY,CS1238也是用着就不变了,还没去找问题
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2023-12-13 17:12:36 | 显示全部楼层
黑色眼睛 发表于 2015-8-8 10:26
你好,我买的7705 在调试的时候 通道1的数据老是显示在通道2上,请问是什么原因

您好,我也遇到了这个问题,请问是什么原因呢
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2023-12-13 18:02:38 | 显示全部楼层
请问我用TM7705采集电压,时而采集正常,过一会之后就变成了通道2显示通道1的电压而通道1是错误结果,再过一会又变成通道1和通道2都变成了通道1的电压……感觉好奇怪,请问有没有大佬知道是什么原因呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106553
QQ
发表于 2023-12-14 08:19:45 | 显示全部楼层
啸月cxy 发表于 2023-12-13 18:02
请问我用TM7705采集电压,时而采集正常,过一会之后就变成了通道2显示通道1的电压而通道1是错误结果,再过 ...

这个有可能是通信移植问题。
回复

使用道具 举报

1

主题

3

回帖

6

积分

新手上路

积分
6
发表于 2023-12-18 20:01:26 | 显示全部楼层
eric2013 发表于 2023-12-14 08:19
这个有可能是通信移植问题。

您好,请问可以说得具体一点吗,我没太理解您的意思
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-24 16:39 , Processed in 0.367459 second(s), 34 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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