一、特性參數
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)。
二、芯片管腳圖
三、管腳功能說明
| 管腳名稱 | 功能 |
| FS ADJUST | 此引腳和AGND之間連接一個電阻(RSET),從而決定滿量程DAC電流的幅度。RSET與滿量程電流之間的關系如下: IOUT FULL SCALE = 18 × FSADJUST/RSET |
| REFOUT | 基准電壓輸出。AD9834通過此引腳提供1.20 V內部基准電壓源。 |
| COMP | DAC偏置引腳。此引腳用於對DAC偏置電壓進行去耦。 |
| VIN | 比較器輸入。可利用比較器從正弦DAC輸出產生方波。DAC輸出應經過適當濾波,然后再施加於比較器,以改善抖動性能。當控制寄存器中的Bit OPBITEN和Bit SIGN/PIB置1時,比較器輸入端連接到VIN。 |
| IOUT, |
電流輸出。這是高阻抗電流源。應在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 |
邏輯輸出。比較器輸出通過此引腳提供,或者可通過此引腳輸出NCO的MSB。通過將控制寄存器中的Bit |
四、寄存器
一個16位的控制寄存器。設置好之后即可產生對應的波形
五、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); }







