電賽總結(四)——波形發生芯片總結之AD9834


一、特性參數

1、2.3V~5.5V供電

2、輸出頻率高達37.5MHz

3、正弦波、三角波輸出

4、提供相位調制和頻率調制功能

5、除非另有說明,VDD = 2.3 V至5.5 V,AGND = DGND = 0 V,TA = TMIN至TMAX,RSET = 6.8 k,RLOAD = 200 (對於IOUT和IOUTB)。

 

二、芯片管腳圖

image

 

三、管腳功能說明

管腳名稱 功能
FS ADJUST

此引腳和AGND之間連接一個電阻(RSET),從而決定滿量程DAC電流的幅度。RSET與滿量程電流之間的關系如下:

IOUT FULL SCALE = 18 × FSADJUST/RSET
FSADJUST = 1.15 V(標稱值),RSET = 6.8 k(典型值)。

REFOUT 基准電壓輸出。AD9834通過此引腳提供1.20 V內部基准電壓源。
COMP DAC偏置引腳。此引腳用於對DAC偏置電壓進行去耦。
VIN

比較器輸入。可利用比較器從正弦DAC輸出產生方波。DAC輸出應經過適當濾波,然后再施加於比較器,以改善抖動性能。當控制寄存器中的Bit OPBITEN和Bit SIGN/PIB置1時,比較器輸入端連接到VIN。

IOUT,
IOUTB

電流輸出。這是高阻抗電流源。應在IOUT和AGND之間連接一個標稱值為200 的負載電阻。IOUTB最好應通過一個大小為200 的外部負載電阻連接到AGND,但也可直接與AGND相連。此外還建議通過一個20 pF電容連接到AGND,以防止出現時鍾饋通。

AVDD 模擬部分的正電源。AVDD的值范圍為2.3 V至5.5 V。應在AVDD和AGND之間連接一個0.1uF去耦電容。
DVDD 數字部分的正電源。DVDD的值范圍為2.3 V至5.5 V。應在DVDD和DGND之間連接一個0.1uF去耦電容。
CAP/2.5V

數字電路采用2.5 V電源供電。當DVDD超過2.7 V時,此2.5 V利用片內調節器從DVDD產生。該調節器需要在CAP/2.5 V至DGND之間連接一個典型值為100 nF的去耦電容。如果DVDD小於或等於2.7 V,則CAP/2.5 V應與DVDD直接相連。

DGND 數字地。
AGND 模擬地。
MCLK

數字時鍾輸入。DDS輸出頻率是MCLK頻率的一個分數,分數的分子是二進制數。輸出頻率精度和相位噪聲均由此時鍾決定。

FSELECT

頻率選擇輸入。FSELECT控制相位累加器中使用的具體頻率寄存器(FREQ0或FREQ1)。可使用引腳FSELECT或BitFSEL來選擇要使用的頻率寄存器。使用Bit FSEL來選擇頻率寄存器時,FSELECT引腳應與CMOS高電平或低電平相連。

PSELECT

相位選擇輸入。PSELECT控制將增加到相位累加器輸出的具體相位寄存器(PHASE0或PHASE1)。可使用引腳PSELECT或Bit PSEL來選擇要使用的相位寄存器。當相位寄存器由Bit PSEL控制時,PSELECT引腳應與CMOS高電平或低電平相連

RESET

高電平有效數字輸入。RESET可使相應的內部寄存器復位至0,以提供中間電平的模擬輸出。RESET不影響任何可尋址寄存器。

SLEEP 高電平有效數字輸入。當此引腳處於高電平時,DAC關斷。此引腳功能與控制位SLEEP12相同。
SDATA 串行數據輸入。16位串行數據字施加於此輸入。
SCLK 串行時鍾輸入。數據在每個SCLK下降沿逐個輸入AD9834。
FSYNC

低電平有效控制輸入。這是輸入數據的幀同步信號。當FSYNC變為低電平時,即告知內部邏輯,正在向器件
中載入新數據

SIGN BIT
OUT

邏輯輸出。比較器輸出通過此引腳提供,或者可通過此引腳輸出NCO的MSB。通過將控制寄存器中的Bit
OPBITEN置1,可使能此輸出引腳。Bit SIGN/PIB確定通過該引腳輸出的是比較器輸出還是NCO的MSB。

 

四、寄存器image

       一個16位的控制寄存器。設置好之后即可產生對應的波形

Bit

名稱

功能

DB13 B28

      B28 = 1可將一個完整字通過兩次連續寫入載入頻率寄存器。第一次寫入包含頻率字的14個LSB,下次寫入則包含14個MSB。每個16位字的前兩位都是定義將載入該字的頻率寄存器,因此對於兩次連續寫入是完全相同的。有關相應的地址,請參見表10。

image

      在兩個字均已載入后,即會寫入頻率寄存器。表11給出了一個完整28位寫操作的示例。

image

不過,請注意,不允許向同一頻率寄存器連續寫入28位數據,而應在頻率寄存器之間切換來執行此類功能。當B28 = 0時,28位頻率寄存器用作兩個14位寄存器,其中一個包含14個MSB,另一個則包含14個LSB。這意味着,可單獨更新頻率字的14個MSB而不影響14個LSB,反之亦然。要更新14個MSB或14個LSB,只需向相應的頻率地址執行一次寫入即可。控制位DB12 (HLB)告知AD9834要更新的位是14個MSB還是14個LSB。

DB12 HLB

此控制位使用戶可以連續載入頻率寄存器的MSB或LSB而忽略余下的14位。如果無需完整的28位分辨率,這點將很有用。HLB應與DB13 (B28)一起使用。此控制位指示載入的14位是傳輸至所尋址頻率寄存器的14個MSB還是14個LSB。DB13 (B28)必須設為0,以便能夠單獨地更改頻率字的MSB和LSB。當DB13 (B28) = 1時,此控制位會被忽略。

HLB = 1允許寫入所尋址頻率寄存器的14個MSB。
HLB = 0允許寫入所尋址頻率寄存器的14個LSB。

DB11 FSEL FSEL bit定義相位累加器中使用的是FREQ0寄存器還是FREQ1寄存器。請參見表8來選擇頻率寄存器。
image
DB10 PSEL

PSEL bit定義是將PHASE0寄存器還是PHASE1寄存器的數據增加到相位累加器的輸出。請參見表9來選擇相位寄存器。

image

DB9 PIN/SW

可利用軟件或硬件實現選擇頻率和相位寄存器、復位內部寄存器和關斷DAC等功能。PIN/SW選擇這些功能的控制源。

PIN/SW = 1表示將使用相應的控制引腳來控制此類功能。
PIN/SW = 0表示將使用相應的控制位來控制此類功能。

DB8 RESET

RESET = 1時可將內部寄存器復位至0,這對應於中間電平的模擬輸出。
RESET = 0時則禁用RESET。

DB7 SLEEP1

當SLEEP1 = 1時,內部MCLK被禁用。由於NCO不再執行累加,因此DAC輸出仍保持其預設值。
當SLEEP1 = 0時,MCLK使能。

DB6 SLEEP12

SLEEP12 = 1關斷片內DAC。當AD9834用於輸出DAC數據的MSB時,這點很有用。
SLEEP12 = 0表示DAC處於活動狀態。

DB5 OPBITEN

此bit的功能是控制是否通過SIGN BIT OUT引腳提供輸出。如果用戶不使用SIGN BIT OUT引腳,此bit應保持為0。
OPBITEN = 1時使能SIGN BIT OUT引腳。
OPBITEN = 0時,SIGN BIT OUT輸出緩沖器置於高阻抗狀態,因此SIGN BIT OUT引腳不提供任何輸出。

DB4 SIGN/PIB 此bit的功能是控制將通過SIGN BIT OUT引腳提供的具體輸出。
SIGN/PIB = 1時,片內比較器與SIGN BIT OUT相連。DAC的正弦波輸出經過濾波后,便可將該波形施加於比較器來產生方波波形。見表17。
imageSIGN/PIB = 0時,DAC數據的MSB(或MSB/2)與SIGN BIT OUT引腳相連。Bit DIV2控制輸出的是MSB還是MSB/2。
DB3 DIV2

DIV2應與SIGN/PIB和OPBITEN一起使用。見表17。
DIV2 = 1時,數字輸出被直接送至SIGN BIT OUT引腳。
DIV2 = 0時,數字輸出2被直接送至SIGN BIT OUT引腳。

DB2 保留 此位總是清0。
DB1 MODE

此bit的功能是控制將通過IOUT引腳/IOUTB引腳提供的具體輸出。如果控制位OPBITEN = 1,此位應清0。
當MODE = 1時,SIN ROM被旁路,因而得到來自DAC的三角波輸出。
當MODE = 0時,SIN ROM用於將相位信息轉換成幅度信息,進而在輸出端提供正弦信號。參見表18。

image

DB0 保留 此位總是清0。

 

五、STM32F103驅動代碼

#ifndef __AD9834_H
#define    __AD9834_H


#include "stm32f10x.h"
#include "pbdata.h"
#include "gpio.h"

#define FSYNC Pin9
#define SDATA Pin10
#define SCLK  Pin11
#define RESET  Pin12



#define FCLK 50

enum Phase
{
    Sine,
    Triangle,
    Square
};

void Ad9834_init(enum Phase ph,u32 freq);
void Send_Phase(void);
void Ad9834_Send_Freq(u16 Freq_word);
void Ad9834_Send_Con(u16 Con_word);

#endif /* __DAC_H */

 

#include "ad9834.h"
#include "math.h"

void Ad9834_init(enum Phase ph,u32 freq)
{
    u32 fre= (u32)freq / 20000.0 * pow(2,28) - 1;
    
    u16 fre_high = fre / 0x4000 + 0x4000;
    u16 fre_low = fre % 0x4000 + 0x4000;
    
    set_out(GPIOG, FSYNC | SDATA | SCLK |  RESET); 
  
    set_outH(GPIOG,FSYNC);
    set_outH(GPIOG,SCLK);
    
    set_outH(GPIOG,RESET);
    delay_us(10);
    set_outH(GPIOG,RESET);
    delay_us(10);
    set_outL(GPIOG,RESET);
    delay_ms(10);
    
    if(ph==Sine)
    {
        Ad9834_Send_Con(0x2038);    
    }
    else if(ph==Triangle)
    {
        Ad9834_Send_Con(0x2002);
    }
    else
    {
        Ad9834_Send_Con(0x2020);
    }
      delay_us(10);
      Ad9834_Send_Freq(fre_low);
        delay_us(10);
        Ad9834_Send_Freq(fre_high);
    
//    Send_Phase();
}

void Ad9834_Send_Con(u16 Con_word)
{
    u8 i;

    set_outL(GPIOG,FSYNC);
    set_outH(GPIOG,SCLK);
    
    for(i=0;i<16;i++)
    {
        if(Con_word & 0x8000)
        {
            set_outH(GPIOG,SDATA);
        }
        else
        {
            set_outL(GPIOG,SDATA);
        }
        Con_word<<=1;

        set_outL(GPIOG,SCLK);
        delay_us(10);
        set_outH(GPIOG,SCLK);
    }
    
    set_outH(GPIOG,FSYNC);
    
}


void Ad9834_Send_Freq(u16 Freq_word)
{
    u8 i;
    set_outL(GPIOG,FSYNC);
    set_outH(GPIOG,SCLK);    
    
    for(i=0;i<16;i++)
    {
        if((Freq_word & 0x8000) == 0x8000)
        {
            set_outH(GPIOG,SDATA);
        }
        else
        {
            set_outL(GPIOG,SDATA);
        }
        
        Freq_word<<=1;
    
        set_outL(GPIOG,SCLK);
        delay_us(10);
        set_outH(GPIOG,SCLK);
    }
    
    set_outH(GPIOG,FSYNC);
    
}

void Send_Phase(void)
{
    Ad9834_Send_Con(0xC000);
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM