<meta name="keywords" content="必胜时时彩开户,keywords" /> AD7798,AD7799调试法式模范电路及pdf中文质料下载 联系我们

AD7798,AD7799调试法式模范模范电路及pdf中文质料下载

     AD7798/AD7799均为合适高精度丈量应用的低功耗、低噪声、完全模拟前端,内置一个低噪声16位/24位Σ-Δ型ADC,其中含有3个差分模拟输入,还集成了片内低噪声仪表镌汰年夜器,是以可直接输入小旌旗暗记。当增益设置为64、更新速率为4.17 Hz时,AD7799的均方根(RMS)噪声为27 nV,AD7798的均方根(RMS)噪声为40 nV。AD7798/AD7799片内特点网罗一个低端电源开关、基准电压检测、可编程数字输入引脚、熔断电流控制和一个外部时钟振荡器。输入数据速率可经由历程软件编程设置,可在4.17 Hz至470 Hz的规模内变换。AD7798/AD7799接纳2.7 V至5.25 V电源供电,AD7798的尺度功耗为300 µA,而AD7799的尺度功耗为380 µA,两款器件均接纳16引脚TSSOP封装。


              AD7798,AD7799芯片的特点




    AD7798,AD7799芯片的概述



       AD7798,AD7799引脚图,接纳16引脚TSSOP封装。接纳2.7V至5.25V电源供电,AD7799的尺度功耗为380μA。



           AD7798,AD7799管脚功效简介

AD7798,AD7799 pdf中文质料下载:http://mamjap.com/f/AD7799_ad7798中文质料.pdf

履历了四天的挣扎,AD7799事实调试告成啦!!!!!!!

   说说我遇到的效果

   一、不判忙的状态下,读出数据是ffffff

    处置赏罚赏罚措施:

    设置CONFIGURATION REGISTER 的con5为1,然后检测STATUS REGISTER 的NOREF位能否为1,假定为1诠释外部基准低于0.5v,也就是说没有基准。我检测到NOREF位为1,用万用表检测ref+为2.5,不是虚焊。检测来检测去没有用果,泉源嫌疑芯片,网上恰恰也有说这个效果的,他说是芯片基准坏啦。我没措施重新焊了一块板子,效果照旧。没法硬着头皮看datasheet,最后发现照样设置的事。在我的硬件上ref-是直接接在管脚psw上的,如图示:


 
AD7798,AD7799电路

 

效果就出在这,psw是个可以装备的开关,如图示

 

手册中MODE REGISTER的MR12是控制psw的,形貌以下:电源开关控制位。当此位为1时器件的PSW管脚和GND导通,可以允许 30MA 的电流通过;当此为为0时,psw管脚悬空。我在写MODE REGISTER时未将MR12职位1,招致psw悬空,ref-靠近2.5V,以是检测不到基准,读出数一切为ffffff。

   纠正措施有两个

   1、置位MODE REGISTER的MR12

   2、把ref-直接接到GND

2、不加判忙读出的数据一直是000000,加上判忙后,一直检测不到RDY变低,法式模范模范一直推行在判忙函数中

    遇到这个效果我就直接瓦解了,这时间间辰我曾经不信托芯片是坏的了,没措施就嫌疑时序,就拿中文手册加英文手册去看,看看错过了哪一点。看了一天多没啥发现。厥后拉个同事一块看,没发现甚么效果,这时间直靠近瓦解中,用逻辑剖析仪也剖析了,跟法式模范模范写的时序一样的,不是法式模范模范的事。一定照样时序的事。插个年夜事,我给ADI亚太地域手艺支持打德律风啦,这个效果拖了三天,直到明后天给我打德律风,然则给我的感应就是这个手艺支持对这个芯片不是很明确,没给我太年夜的赞助,不外还要谢谢明天手艺支持的耐心解说和指导。我就接着看法式模范模范,今天下战书又把外部零刻度校准和片内满度校准都加了上去,照样不行。然后接着和同事议论辩说,他提议直接把CSGND,尝尝就尝尝,最后发现法式模范模范正常啦,赶忙看读出的数据,发现很准确。调治电位器,重新搜集,电压照样准确。其时就有跳起来的激动,事实告成啦!!!这样一定是CS的时序纰谬。然后较量手册发现单次转换形式下的时序中,CS一直是低电平,如图示

然后追念起21IC上的一篇日志上也是没有设置CS,这时间间辰才恍然年夜悟,原来官方给的例程里都每次读写都改变了CS的值,移植官方的读写法式模范模范,如图

官方的读时序

官方的写时序

效果就出在法式模范模范上画红线的语句上

准确的ad7799法式模范模范如图示:






说说官方的法式模范模范吧,第一,官要领式模范没有断定RDY变低,以是可以说这个法式模范模范基本读不出数据纵然在时序正常时;第二,官方给的读写函数里改变了cs的值,然则手册上没有改变,验证注解这个读写函数里不应该操作cs

 

须要重视的是在主法式模范模范里,在操作AD7799之前,一定先把CS拉低,一切操作完成后,再把CS拉高。

好了不知道形貌的足够清晰不,欲望对以后应用AD7799的同胞有赞助吧!

 

下面供应一个完全版本的ad7799法式模范模范,Keil C写的ADI的24位A/DAD7799应用SPI接口法式模范模范:(VRS51L3074单片机 是一颗基于8051内核集成了多种模块并可多 规模的在嵌入式设计中应用的芯片,完全的工程文件及hex下载地址:http://mamjap.com/f/Keil_C_AD7799.rar
 

#pragma CODE DEBUG SYMBOLS OBJECTEXTEND     //SRC 当与汇编混淆编译时须要
#include"VRS51L3074_keil.h"
#include<intrins.h>
#define uchar   unsigned char
#define uint    unsigned int
#define ulong   unsigned long
typedef union{     //无符号字符型,整形,长整形数据联络体
              uchar uc[2];
              uint  ui;
             }UCI;
typedef union{     //无符号字符型,整形,长整形数据联络体
              uchar uc[4];
              uint  ui[2];
              ulong ul;
             }UCIL;
                             

#define DELAY5  delay()   //_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_()
sbit    P1_5    =   P1^5;      //1
sbit    P1_6    =   P1^6;      //2
sbit    P1_7    =   P1^7;      //3
sbit    P4_5    =   P4^5;     //6  pin
sbit    P5_0    =   P5^0;     //7
sbit    P5_1    =   P5^1;     //8
sbit    P5_2    =   P5^2;     //9
sbit    P5_3    =   P5^3;     //10
sbit    P5_4    =   P5^4;     //20
sbit    P5_5    =   P5^5;     //21
sbit    P5_6    =   P5^6;     //22
sbit    P5_7    =   P5^7;     //23

#define AD7799_CS    P4_5           //输入   6pin
#define AD7799_SCLK  P5_1           //输入   8pin
#define AD7799_DOUT  P5_2           //输入   9pin
#define AD7799_RDY   P5_2           //输入   9pin  同上是一个引脚
#define AD7799_DIN   P5_0           //输入   7pin

UCIL MainData,demoul;
ulong xdata XMainData,xdemoul;
void Ad7799_Ini();

#define DELAYS10    _nop_();_nop_();_nop_();_nop_()
void delay(char i)
{uchar j;
 for(;i>0;i--); for(j=0;j<10;j++)_nop_();
}

void CPUInit(void)
{
  /*I/O口装备:输入装备为1(装备为1后,外部自动上拉到2.5V,输入装备为0;空脚要装备为0*/   
  PERIPHEN1=0x18;  //BIT7:SPICSEN 6:SPIEN 5:I2CEN 4:U1EN 3:U0EN 2:T2EN 1;T1EN 0:T0EN  //TIMER2和TIMER0使能
  P0PINCFG=0x00; 
  P1PINCFG=0x04; 
  P2PINCFG=0x00;   //00100100
  P3PINCFG=0x01; 
  P4PINCFG=0x00; 
  P5PINCFG=0x04;  //00000100
  P6PINCFG=0x00; 
  PORTINEN=0xff; //0xff一切I/O口均不应用
  P0=P1=P2=P3=P6=0x00;  P4=0x00;P5=0x04;
  PERIPHEN2=0x28;//BIN7:PWC1EN 6:PWC0EN 5:AUEN 4:XRAM2CODE 3:IOPORTEN 2:WDTEN 1:PWMSFREN 0:FPIEN  算术单元、IO口使能*/
  P0=P1=P2=P3=P6=0x00; P4=0x00; P5=0x04;
  AD7799_CS=1;
    UART0CFG=0x90;  // 0x09:38400 BRADJ=0x02(19200)/波特率发生器应用外部晶振/9th不应用/1位阻拦位
    UART0INT=0x00;  //使能吸收中止,使能发送完成中止,允许吸收 Enable RX AV + RXOVint + Enable Reception
    UART0EXT=0x00;  //Not using UART0 Extensions
    UART0BRL=0x1f;   //0040=19200  001f=38400
    UART0BRH=0x00;  //波特率19200
    U0IEN=1;
   GENINTEN = 0x01;      //Enable Global interrupt
   UART0BUF=0xff;
   while(!(UART0INT & 0x01));
   UART0BUF=0xff;
   while(!(UART0INT & 0x01));
   UART0BUF=0xff;
   while(!(UART0INT & 0x01));
   UART0BUF=0xff;
   while(!(UART0INT & 0x01));
   UART0BUF=0x0d;
   while(!(UART0INT & 0x01));
}

/*  AD7799写存放器函数
    WriteData:要写的数据*/
void WriteByteToAd7799(unsigned char WriteData)
{
    unsigned char i ;
    AD7799_CS=0;
    for(i=0;i<8;i++)
    {
        DELAYS10;
        AD7799_SCLK=0 ;
        DELAYS10;
        if(WriteData&0x80)AD7799_DIN=1 ;
        else AD7799_DIN=0 ;
        WriteData=WriteData<<1 ;
        DELAYS10;
        AD7799_SCLK=1 ;
        DELAYS10;
    }
    AD7799_CS=1;
}

/*AD7799读存放器函数*/
unsigned char ReadByteFromAd7799(void)
{
    unsigned char i ;
    unsigned char ReadData ;
    AD7799_CS=0;
    ReadData=0 ;
    for(i=0;i<8;i++)
    {
        DELAYS10;
        AD7799_SCLK=0 ;
        DELAYS10;
        ReadData=ReadData<<1 ;
        if(AD7799_DOUT)ReadData+=1 ;
        DELAYS10;
        AD7799_SCLK=1 ;
        DELAYS10;
    }
    AD7799_DOUT=1 ;
    AD7799_CS=1;
    return(ReadData);
}
void WaiteRDY(void)
{
    unsigned int iint ;
    iint=0 ;
    while(AD7799_RDY)
    {
        iint++;
        if(iint>65530)
        {
            //reset ad7799
            WriteByteToAd7799(0xff);
            WriteByteToAd7799(0xff);
            WriteByteToAd7799(0xff);
            WriteByteToAd7799(0xff);
            Ad7799_Ini();
            break ;
        }
    }
}
void Ad7799_Ini()
{
    WriteByteToAd7799(0x10);
    //b0001 0000
    /* Writes to Communications Register Setting Next Operation as Write to CONFIGURATION Register*/
    //写通讯存放器为:下一操作写装备存放器 WriteByteToAd7799(0x10)b0001 0000    0写通讯0下操作写010装备存放器0关一连读00留用
    WriteByteToAd7799(0x37);//增益为128  B0011 0111   00留用1开电流源1单端  0留用111是128倍增益 
    WriteByteToAd7799(0x00);  //通道号 0 B0011 0000   00留用1基准默许1开缓冲 0留用000通道0
    //1通道
    /*CONFIGURATION REGISTER[00,BO(0),U/B(0),0(0),G2(1),G1(1),G0(1),0,0,REF_DET(0),BUF(1),0(0),CH2(0),CH1(0),CH0(0)]*/
    //WriteByteToAd7799(0x08);
    //b0000 1000
    /* Writes to Communications Register Setting Next Operation as Write to Mode Register*/
    //WriteByteToAd7799(0x80);
    //WriteByteToAd7799(0x0a);
    /* Writes to Mode Register Initiating Internal Zero-Scale Calibration*/
    //WaiteRDY();
    /* Wait for RDY pin to go low to indicate end of calibration cycle*/
    //WriteByteToAd7799(0x08);
    /* Writes to Communications Register Setting Next Operation as Write to
        Mode Register*/
    //WriteByteToAd7799(0xa0);
    //WriteByteToAd7799(0x0a);
    /* Writes to Mode Register Initiating Internal Full-Scale Calibration*/
    //WaiteRDY();
    /* Wait for RDY pin to go low to indicate end of calibration cycle*/
    WriteByteToAd7799(0x08);//b0000 1000
    /* Writes to Communications Register Setting Next Operation as Write to Mode Register*/
    WriteByteToAd7799(0x00);   //000一连形式0断PSW0000留用
    WriteByteToAd7799(0x09);   //0000留用0011(123Hz)1010(16.7HZ65dB)
    /* Mode Register[MD2(0),MD1(0),MD0(0),PSW(0),0(0),0(0),0(0),0(0),(0),(0),0(0),0(0),FS3(1),FS2(0),FS1(1),FS0(0)]*/
    /*形式0 Continuous-Conversion Mode.,Fadc=16.7HZ;*/

}
ulong ReadAd7799ConversionData(void)
{
    ulong ConverData ;
    unsigned char ADSAT ;
    unsigned char ErrNUM=0;
    WaiteRDY();              //期待数据READY
    WriteByteToAd7799(0x40);  //0100 0000 装备下一操作为:读状态存放器
    ADSAT=ReadByteFromAd7799();   //读出状态 8位
    while((ADSAT&0x40)||(!(ADSAT&0x08)))    //掉落足或许读写异常
    {
        WriteByteToAd7799(0xff);         //复位
        WriteByteToAd7799(0xff);
        WriteByteToAd7799(0xff);
        WriteByteToAd7799(0xff);
        Ad7799_Ini();                   //初始化
        WaiteRDY();                     //读状态
        WriteByteToAd7799(0x40);        //下一操作:读状态
        ADSAT=ReadByteFromAd7799();     //读状态
        
        ErrNUM++;
        if(ErrNUM>5)return(0xffffff);//if(ErrNUM>5)break;              //一连5次都读掉落足
    }
    
    WriteByteToAd7799(0x58);  //0101 1000 装备下一操作:读数据存放器,000
    /* Writes to Communications Register Setting Next Operation as Continuous Read From Data Register*/
    WaiteRDY();
    /* Wait for RDY pin to go low to indicate end of calibration cycle*/
    if(!AD7799_RDY)
    {
        ConverData=0 ;
        ConverData=ReadByteFromAd7799();
        ConverData=ConverData<<8 ;
        ConverData=ReadByteFromAd7799()+ConverData;
        ConverData=ConverData<<8 ;
        ConverData=ReadByteFromAd7799()+ConverData;
    }
    /* Read Conversion Result from AD7799's Data Register*/
    return(ConverData);
}
UCIL temp;
void main(void)
{
   uint code *adtpoint;   //
   uchar    i=0,j=0;


 delay(100);
 CPUInit();
 //AD7799_CS=0;
 delay(10);
        WriteByteToAd7799(0xff);       //写入32个高电平,复位ADC
        WriteByteToAd7799(0xff);
        WriteByteToAd7799(0xff);
        WriteByteToAd7799(0xff);
        Ad7799_Ini();
 while(1)
 {
   temp.ul=ReadAd7799ConversionData();
   UART0BUF=temp.uc[0];
   while(!(UART0INT & 0x01));
   UART0BUF=temp.uc[1];
   while(!(UART0INT & 0x01));
   UART0BUF=temp.uc[2];
   while(!(UART0INT & 0x01));
   UART0BUF=temp.uc[3];
   while(!(UART0INT & 0x01));
 }
}