久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> 常用芯片 >> 瀏覽文章

AD7798,AD7799調試程序電路及pdf中文資料下載

作者:huqin   來源:本站原創   點擊數:  更新時間:2014年08月15日   【字體:

     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://www.zg4o1577.cn/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

二、不加判忙讀出的數據一直是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://www.zg4o1577.cn/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));
 }
}
 
關閉窗口
主站蜘蛛池模板: 毛片久久久 | 成人一区精品 | 亚洲成人av在线播放 | 久久国产精品精品 | 国产性色视频 | 亚洲精品视频一区 | 欧美性猛片aaaaaaa做受 | 中文字幕视频网 | 欧美一级欧美一级在线播放 | 亚洲精品成人av久久 | 91视频网址 | h视频免费看 | 中文一区二区 | 久久久免费电影 | 日本a级大片 | 国产高清免费 | 国产精品一区二区日韩 | 中文字幕高清 | 中文字幕在线一区 | 成人av网站在线观看 | 欧美亚洲在线 | 91av国产在线视频 | 日日操夜夜摸 | 亚洲一二三区在线观看 | 免费的av网站| 国产精品污www一区二区三区 | 国产亚洲一级 | 国产精品完整版 | 国产精品国产三级国产a | 国产精品日韩 | 亚洲欧美第一视频 | 一级a性色生活片久久毛片 一级特黄a大片 | 婷婷综合在线 | 久久91 | 91视视频在线观看入口直接观看 | 97人人干| 日韩综合网| 伊人久久综合 | 午夜视频在线观看网站 | 亚洲品质自拍视频网站 | 一区二区三区av |