一、AD9954模塊簡介
AD9954是一款直接數(shù)字頻率合成器(DDS),采用先進(jìn)技術(shù)內(nèi)置一個(gè)高速高性能DAC,構(gòu)成完整的數(shù)字可編程、高頻合成器能夠產(chǎn)生高達(dá)150MHz的頻率捷變模擬輸出正弦波。它能夠?qū)崿F(xiàn)快速跳頻,同時(shí)還具有精密頻率調(diào)諧(0.01Hz或更高分辨率)和相位諧波(0.022°間隔)默認(rèn)程序1hz可調(diào)用戶如需更高精度需自行修改程序通過一個(gè)高速串行I/0端口可以進(jìn)行編程。該器件內(nèi)置靜態(tài)RAM支持多種模式下的靈活掃頻功能,并且支持用戶定義的線性掃描工作模式同時(shí)內(nèi)置一個(gè)片內(nèi)高速比較器,適合要求方波輸出的應(yīng)用。借助片內(nèi)振蕩器和PLL電路,用戶可以用多種方法產(chǎn)生器件的系統(tǒng)時(shí)鐘AD9954的額定工作溫度范圍為擴(kuò)展工業(yè)溫度范圍。
特性
- 模塊供電:DC 5V
- 通訊協(xié)議:SPI串行
- 系統(tǒng)主頻:400MHz(MAX)
- DAC分辨率位數(shù):14位
- 相位累加器位數(shù):32位
- 輸出信號(hào):正弦波,方波;正弦波帶150MHz低通濾波器,方波耦合輸出
- 輸出通道:2通道差分,相位差180°,高頻輸出由于有濾波器,相位會(huì)偏移
- 信號(hào)特點(diǎn):正弦波無耦合輸出;輸出自帶直流分量,接入射頻設(shè)備請加隔直流器,也可直接使用示波器測量
- 正弦波,方波最高主頻輸出:1Hz-140MHz(正弦波),1Hz-120MHz(方波),10MHz以上需要示波器輸入阻抗為50歐
- 輸出幅度:正弦波200mVpp,方波1.8Vpp,正弦波隨著頻率增加幅度減小,方波隨著頻率增加波 形變化
- 輸出阻抗:75歐
模塊應(yīng)用
- 頻率信號(hào)發(fā)生,正弦波、方波信號(hào)發(fā)生,傳感器激勵(lì)

二、模塊接口說明

| UPD | 上升沿將內(nèi)部緩沖存儲(chǔ)器的內(nèi)容傳輸?shù)?I/O 寄存器 |
|---|---|
| PS0,PS1 | 輸入引腳用于選擇內(nèi)部相位/頻率配置文件之一。這些引腳上的變化會(huì)觸發(fā)將所選內(nèi)部緩沖存儲(chǔ)器的內(nèi)容傳輸?shù)?I/O 寄存器 |
| OSK | 輸入引腳用于控制編程后形狀關(guān)鍵控 (OSK) 功能的方向 |
| SDIO | 串行數(shù)據(jù) I/O |
| SCK | 串行時(shí)鐘 |
| CS | 片選 |
| SDO | 串行數(shù)據(jù)輸出 |
| IOSY | 串行端口控制器異步高電平有效復(fù)位。當(dāng)此引腳為高電平時(shí),當(dāng)前 I/O 操作立即終止,一旦 IOSYNC 返回低電平,即可開始新的 I/O 操作。 |
| RST | 硬件復(fù)位 |
| PWR | 輸入引腳用作外部掉電控制 |
三、功能框圖和時(shí)序圖說明

功能框圖說明
REFCLK輸入
AD9954 支持多種方式生成內(nèi)部系統(tǒng)時(shí)鐘。芯片內(nèi)部集成了振蕩器電路,可通過在 REFCLK 引腳外接晶體來產(chǎn)生低頻參考時(shí)鐘;同時(shí)也支持直接由外部時(shí)鐘源驅(qū)動(dòng) REFCLK 引腳。為了在低頻參考時(shí)鐘條件下仍獲得較高的 DDS 運(yùn)算速率和 DAC 采樣率,AD9954 內(nèi)部集成了基于 PLL 的參考時(shí)鐘倍頻器,可對 REFCLK 進(jìn)行倍頻后作為系統(tǒng)時(shí)鐘使用。
在對相位噪聲要求較高的應(yīng)用中,建議使用轉(zhuǎn)換速率高、抖動(dòng)低、穩(wěn)定性好的外部時(shí)鐘直接驅(qū)動(dòng) REFCLK,并旁路內(nèi)部倍頻器,以獲得最佳頻譜性能。
倍頻器
板載鎖相環(huán) (PLL) 允許對參考時(shí)鐘 (REFCLK) 頻率進(jìn)行倍頻。倍頻系數(shù)通過 CFR2<7:3> 設(shè)置。當(dāng)編程值為 0x04 至 0x14(十進(jìn)制 4 至 20)范圍內(nèi)的值時(shí),PLL 會(huì)將 REFCLK 輸入頻率乘以編程值。用戶在編程時(shí)必須考慮 PLL 的指定最大頻率。如果更改倍頻系數(shù),用戶必須預(yù)留時(shí)間讓 PLL 鎖定(約 1 毫秒)。當(dāng)該字段編程為其他值時(shí),PLL 被旁路并關(guān)閉,REFCLK 直接作為系統(tǒng)時(shí)鐘輸入。
頻率累加器
用于線性掃描模式;從起始頻率 (F0) 到終止頻率 (F1) 的轉(zhuǎn)換并非瞬時(shí)完成,而是以掃描或斜坡方式實(shí)現(xiàn)。這種頻率斜坡是通過步進(jìn) F0 和 F1 之間的中間頻率來實(shí)現(xiàn)的。線性掃描模塊使用下降和上升增量頻率調(diào)諧字、下降和上升增量頻率斜坡速率以及頻率累加器。線性掃描使能位 CFR1<21> 用于使能線性掃描模塊。線性掃描無停留位用于設(shè)置掃描過程中達(dá)到終止頻率時(shí)要執(zhí)行的操作。
DDS核心
DDS 的輸出頻率 (fO) 是系統(tǒng)時(shí)鐘頻率 (SYSCLK)、頻率調(diào)諧字 (FTW) 的值以及相位累加器容量(本例中為 232)的函數(shù)。具體關(guān)系如下,其中 fs 定義為 SYSCLK 的頻率。
fO = (FTW)(fS)/232,其中 0 ≤ FTW ≤ 231
每個(gè)系統(tǒng)時(shí)鐘周期,F(xiàn)TW 的值都會(huì)加到相位累加器中先前存儲(chǔ)的值上。然后,將相位累加器的輸出值與用戶定義的 14 位相位偏移值 (POW) 相加。最后,通過 cos(x) 功能模塊將該和的最高 19 位轉(zhuǎn)換為幅度值。為了降低 DDS 內(nèi)核的功耗,會(huì)截?cái)嘧畹陀行?(LSB)。這種截?cái)嗖粫?huì)降低頻率分辨率。在某些應(yīng)用中,需要能夠強(qiáng)制輸出信號(hào)為零相位。簡單地將 FTW 設(shè)置為 0 并不能實(shí)現(xiàn)這一點(diǎn);它只會(huì)使內(nèi)核停留在其當(dāng)前的相位值。系統(tǒng)提供了一個(gè)控制位,用于強(qiáng)制相位累加器輸出為零。上電復(fù)位后,相位累加器清零功能默認(rèn)處于使能狀態(tài),但該控制位需通過第一次 I/O UPDATE 才會(huì)真正生效。因此,在上電后未執(zhí)行 I/O UPDATE 之前,相位累加器保持在零相位狀態(tài)。
DAC輸出
與許多DAC不同,AD9954的DAC輸出參考的是AVDD,而非AGND。兩個(gè)互補(bǔ)輸出提供組合的滿量程輸出電流(IOUT)。差分輸出可降低DAC輸出端可能存在的共模噪聲,從而提高信噪比。滿量程電流由連接在DAC_RSET引腳和DAC接地引腳(引腳49,裸露的電極片)之間的外部電阻(RSET)控制。滿量程電流與電阻值成正比,公式為:
RSET = (39.19 / Iout) Ω
組合DAC輸出的最大滿量程輸出電流為15 mA。將輸出限制在最大10 mA可獲得最佳的無雜散動(dòng)態(tài)范圍(SFDR)性能。DAC 輸出必須保持在 AVDD ±0.5 V 的合規(guī)范圍內(nèi),超出該范圍將導(dǎo)致失真顯著增加,甚至可能損壞輸出級。實(shí)際應(yīng)用中應(yīng)通過合理的負(fù)載與偏置設(shè)計(jì),確保 DAC 輸出始終工作在該合規(guī)范圍之內(nèi)。
時(shí)序與串行接口說明
AD9954 提供一個(gè)靈活的同步串行接口,可方便地與多種微控制器或微處理器連接。該接口兼容常見同步串行協(xié)議,包括 Motorola 6905/11 SPI? 和 Intel? 8051 SSR。
串行接口支持:
- MSB 優(yōu)先或 LSB 優(yōu)先數(shù)據(jù)格式
- 單引腳雙向 SDIO(2 線接口)
- SDIO + SDO 分離(3 線接口)
接口配置由 CFR1 中的相關(guān)位控制??蛇x的 IOSYNC 與 CS 引腳進(jìn)一步提升了系統(tǒng)集成的靈活性。
AD9954 的串行通信以 寄存器為單位,而非字節(jié)為單位。串口控制器在接收到指令字節(jié)后,會(huì)自動(dòng)解析目標(biāo)寄存器地址并完成整個(gè)寄存器寬度的數(shù)據(jù)傳輸。一個(gè)完整的通信周期分為兩個(gè)階段:
指令階段:在前 8 個(gè) SCLK 上升沿寫入指令字節(jié),用于指定讀/寫方向及寄存器地址。
數(shù)據(jù)階段:隨后的 SCLK 周期用于傳輸寄存器數(shù)據(jù),傳輸位數(shù)由目標(biāo)寄存器的位寬決定。
所有輸入數(shù)據(jù)在 SCLK 上升沿采樣,輸出數(shù)據(jù)在 SCLK 下降沿更新。相關(guān)時(shí)序如圖 25~圖 28 所示。
MSB/LSB 數(shù)據(jù)傳輸
AD9954 串口支持 MSB 優(yōu)先或 LSB 優(yōu)先的數(shù)據(jù)格式。此功能由 LSB 優(yōu)先位 CFR1<8> 控制。對于 MSB 優(yōu)先操作,串口控制器首先生成(指定寄存器的)最高有效字節(jié)地址,然后生成下一個(gè)較低有效字節(jié)地址,直到 I/O 操作完成。所有寫入(讀?。〢D9954 的數(shù)據(jù)都必須采用 MSB 優(yōu)先順序。如果 LSB 模式處于活動(dòng)狀態(tài),則串口控制器首先生成最低有效字節(jié)地址,然后生成下一個(gè)較高有效字節(jié)地址,直到 I/O 操作完成。所有寫入(讀?。〢D9954 的數(shù)據(jù)都必須采用 LSB 優(yōu)先的格式。
示例操作
例如,考慮將幅度比例因子 (ASF) 寄存器的值寫入滿量程的 0.5。首先,計(jì)算 0.5 的二進(jìn)制等效值。由于 ASF 為 16 位寬,其十六進(jìn)制等效值為 0x80。接下來,對于 MSB 優(yōu)先的格式,發(fā)送指令字節(jié) 0x02(ASF 的串口地址為 00010(b))。根據(jù)該指令,內(nèi)部控制器輪詢此內(nèi)存位置的寄存器,并注意到 ASF 為 2 字節(jié)寬。串口控制器的狀態(tài)機(jī)設(shè)置為 16,并等待 SCLK 上的 16 個(gè)上升沿和 SDIO 線上的 16 位數(shù)據(jù)。發(fā)送 SCLK 上的 16 個(gè)上升沿,以及 SDIO 線上的二進(jìn)制數(shù)據(jù) 10000000 00000000。要以 LSB 優(yōu)先格式寫入幅度比例因子寄存器,其過程與 MSB 優(yōu)先格式相同;但是,數(shù)據(jù)需要逐字進(jìn)行按位反轉(zhuǎn)。指令字節(jié)為 0x40。幅度比例因子寄存器的二進(jìn)制數(shù)據(jù)為 00000000 00000001。
四、主要寄存器說明
指令字節(jié)
指令字節(jié)包含以下信息。
R/W——指令字節(jié)的第 7 位定義在寫入指令字節(jié)后發(fā)生的是讀取還是寫入數(shù)據(jù)傳輸。邏輯高電平表示讀取操作,邏輯 0 表示寫入操作。
X, X——指令字節(jié)的第 6 位和第 5 位無關(guān)緊要。
A4, A3, A2, A1, A0——指令字節(jié)的第 4 位、第 3 位、第 2 位、第 1 位和第 0 位確定在通信周期的數(shù)據(jù)傳輸階段訪問哪個(gè)寄存器。寄存器的地址可以在寄存器映射表的第一列中找到(參見下表)。
寄存器映射表及說明
寄存器映射表列于表 12 和表 13 中。當(dāng)前活動(dòng)的寄存器映射表取決于線性掃描使能位的狀態(tài);根據(jù)器件的工作模式,某些寄存器會(huì)被重新映射。具體來說,寄存器 0x??07、寄存器 0x??08、寄存器 0x??09 和寄存器 0x??0A 會(huì)受到影響。由于線性掃描操作的優(yōu)先級高于 RAM 操作,Analog Devices 公司建議,當(dāng)使用位 CFR1<21> 啟用線性掃描時(shí),應(yīng)使用位 CFR1<31> 禁用 RAM,以節(jié)省功耗。每個(gè)寄存器的序列地址采用十六進(jìn)制格式。尖括號(hào) <> 用于引用特定位或位范圍。例如,<3> 表示位 3,<7:3> 表示從位 7 到位 3(含位 7 和位 3)的位范圍。注意,RAM使能位CFR1<31>僅激活RAM本身,并不激活RAM段控制字。
前7個(gè)寄存器為固定映射(與模式無關(guān))

寄存器映射 - 當(dāng)線性掃描使能位為False時(shí)(CFR1<21> = 0)

寄存器映射 - 當(dāng)線性掃描使能位為True時(shí) (CFR1<21> = 1)
功能控制寄存器1 (CFR1) (0X00):用于控制 AD9954 的各種功能、特性和模式。其中:
CFR1<31>:0(默認(rèn)):關(guān)閉 RAM,進(jìn)入單頻/線性掃頻模式。1:開啟 RAM,可用于 FSK/PSK 或非線性調(diào)制模式。用于多頻調(diào)制場景。
CFR1<30>:0(默認(rèn)):如果 CFR1<31> 被置位,則 RAM 輸出驅(qū)動(dòng)相位累加器(提供 FTW)。1:如果 CFR1<31> 被置位,則 RAM 輸出驅(qū)動(dòng)相位偏移加法器(POW)。
CFR1<21>:0:不進(jìn)行線性掃頻 → 直接用 FTW0 單頻輸出。1:進(jìn)入線性掃頻模式,需要配合 FTW0、FTW1、NLSCW、PLSCW 使用。線性掃頻是在頻率之間做連續(xù)過渡的功能。
功能控制寄存器2 (CFR2) (0X01):用于控制 AD9954 的各種功能、特性和模式,主要與芯片的模擬部分相關(guān)。其中:
CFR2<11>:0(默認(rèn)):高速同步增強(qiáng)功能關(guān)閉。1:高速同步增強(qiáng)功能開啟。當(dāng) SYNC_CLK > 50 MHz (SYSCLK > 200 MSPS) 時(shí),若使用自動(dòng)同步功能,則應(yīng)設(shè)置此位。
CFR2<7:3>:參考時(shí)鐘倍頻器控制位。此 5 位字控制時(shí)鐘倍頻器 (PLL) 模塊的輸出倍頻值。
CFR2<2>:0(默認(rèn)):VCO 工作頻率范圍為 100 MHz 至 250 MHz。1:VCO 工作頻率范圍為 250 MHz 至 400 MHz。
幅度比例因子寄存器 (ASF) (0X02)
ASF 寄存器存儲(chǔ) 2 位自動(dòng)斜坡速率值和 14 位幅度比例因子,用于輸出整形鍵控 (OSK) 操作。在自動(dòng) OSK 操作中,ASF<15:14> 指示 OSK 模塊每次增量或減量需要執(zhí)行多少個(gè)幅度步長。ASF<13:0> 設(shè)置 OSK 內(nèi)部乘法器可達(dá)到的最大值。在手動(dòng) OSK 模式下,ASF<15:14> 無效。ASF<13:0> 直接提供輸出比例因子。如果使用CFR1<25> 禁用 OSK,則此寄存器對設(shè)備操作沒有影響。
幅度斜坡速率寄存器 (ARR)(0x03):ARR 寄存器存儲(chǔ)自動(dòng) OSK 模式下使用的 8 位幅度斜坡速率。
頻率調(diào)諧字 0寄存器 (FTW0)(0x04):頻率調(diào)諧字是一個(gè) 32 位寄存器,用于控制 DDS 內(nèi)核相位累加器的累加速率。
相位偏移字寄存器 (POW)(0x05):相位偏移字是一個(gè) 14 位寄存器,用于存儲(chǔ)相位偏移值。
頻率調(diào)諧字 1寄存器 (FTW1)(0x06):頻率調(diào)諧字是一個(gè) 32 位寄存器,用于設(shè)置線性掃描操作中的上限頻率。
正負(fù)線性掃描控制字寄存器 (PLSCW / NLSCW)(0x07~0x08)
當(dāng)啟用線性掃頻位時(shí),寄存器0x07提供負(fù)線性掃頻控制字(NLSCW),而寄存器0x08提供正線性掃頻控制字(PLSCW)。每個(gè)線性掃頻控制字包含一個(gè)32位的增量頻率調(diào)諧字(FDFTW和RDFTW)和一個(gè)8位的掃頻斜率字(FSRRW和RSRRW)。
負(fù)線性掃頻控制字(NLSCW):用于控制負(fù)向線性掃頻操作的相關(guān)參數(shù),包括起始頻率和終止頻率之間的頻率差(增量頻率調(diào)諧字)以及掃頻的斜率(掃頻斜率字)。這些參數(shù)決定了掃頻的速率和方向。
正線性掃頻控制字(PLSCW):用于控制正向線性掃頻操作的參數(shù),包括起始頻率和終止頻率之間的頻率差和掃頻的斜率。
NLSCW 和 PLSCW 本身并不定義起始頻率或終止頻率,而是用于定義線性掃頻過程中每一步的頻率增量(ΔFTW)以及頻率更新的時(shí)間間隔。線性掃頻的起始頻率由 FTW0 指定,終止頻率由 FTW1 指定。
五、STM32F103驅(qū)動(dòng)AD9954發(fā)生器模塊
準(zhǔn)備工作
STM32F103C8T6最小系統(tǒng)板,AD9954發(fā)生器模塊,OLED屏幕,EC11旋轉(zhuǎn)編碼器,按鍵和導(dǎo)線若干。
接線說明
| STM32F103C8T6 | AD9954 |
|---|---|
| 3V3 | 3V3 |
| GND | GND |
| PA3 | UPD |
| PA4 | PS1 |
| PA5 | PS0 |
| PA6 | OSK |
| PA7 | SDIO |
| PA11 | PWR |
| PA12 | IOSY |
| PA15 | SDO |
| PB0 | SCLK |
| PB1 | CS |
| PB10 | RES |
| PB8 | OLED -> SCL |
| PB9 | OLED -> SDA |
| PA0 | EC11旋轉(zhuǎn)編碼器 -> A,調(diào)節(jié)頻率增加 |
| PA1 | EC11旋轉(zhuǎn)編碼器 -> B,調(diào)節(jié)頻率減少 |
| PA2 | EC11旋轉(zhuǎn)編碼器 -> S,移位調(diào)節(jié) |
| PB14 | 按鍵1,切換幅值或相位調(diào)節(jié) |
| PB13,15 | 按鍵2,3,調(diào)節(jié)幅值或相位逐步加減 |
| PA8,PB12 | 按鍵4,5,調(diào)節(jié)幅值或相位快速加減 |

代碼示例
AD9954.c
#include "AD9954.h"
#include "delay.h"
//系統(tǒng)頻率fosc(外部晶振頻率),系統(tǒng)頻率=fs
#define fosc 20 //晶振頻率 20Mhz
#define PLL_MULTIPLIER 20 //PLL倍頻數(shù)(4--20)
#define fs (fosc*PLL_MULTIPLIER) //系統(tǒng)時(shí)鐘頻率
double fH_Num=10.73741824;
//double fH_Num=11.2204;
//double fH_Num=11.3671588397205;//
//double fH_Num = 11.3025455157895;//頻率轉(zhuǎn)換系數(shù):2^32/系統(tǒng)時(shí)鐘頻率
/************************************************************
** 函數(shù)名稱 :void AD9954_GPIO_Init(void)
** 函數(shù)功能 :初始化控制AD9954需要用到的IO口
** 入口參數(shù) :無
** 出口參數(shù) :無
** 函數(shù)說明 :無
**************************************************************/
void AD9954_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_11|GPIO_Pin_12;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度為50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //設(shè)置成上拉輸入
GPIO_Init(GPIOA, &GPIO_InitStructure);
AD9954_RES=0;
AD9954_CS =0;
AD9954_SCLK =0;
AD9954_SDIO=0;
AD9954_OSK=0;
PS0=0;
PS1=0;
IOUPDATE=0;
AD9954_IOSY=0;
AD9954_PWR=0;
delay_ms(10);
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_RESET(void)
** 函數(shù)功能 :復(fù)位AD9954
** 入口參數(shù) :無
** 出口參數(shù) :無
** 函數(shù)說明 :不復(fù)位也可以
*********************************************************************************************************/
void AD9954_RESET(void)
{
AD9954_RES = 1;
delay_ms(10);
AD9954_RES = 0;
AD9954_CS = 0;
AD9954_SCLK = 0;
AD9954_CS = 1;
}
/*********************************************************************************************************
** 函數(shù)名稱 :void UPDATE(void)
** 函數(shù)功能 :產(chǎn)生一個(gè)更新信號(hào),更新AD9954內(nèi)部寄存器,
** 入口參數(shù) :無
** 出口參數(shù) :無
** 函數(shù)說明 :可以不加任何延時(shí)
*********************************************************************************************************/
void UPDATE(void)
{
IOUPDATE = 1;
delay_us(10);
IOUPDATE = 0;
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_Send_Byte(uint8_t dat)
** 函數(shù)功能 :向AD9954發(fā)送一個(gè)字節(jié)的內(nèi)容
** 入口參數(shù) :待發(fā)送字節(jié)
** 出口參數(shù) :無
** 函數(shù)說明 :AD9954的傳輸速度最大為25M,所以不加延時(shí)也可以
*********************************************************************************************************/
void AD9954_Send_Byte(uint8_t dat)
{
uint8_t i;
for (i = 0;i< 8;i++)
{
AD9954_SCLK = 0;
delay_us(10);
if (dat & 0x80)
{
AD9954_SDIO = 1;
}
else
{
AD9954_SDIO = 0;
}
AD9954_SCLK = 1;
delay_us(10);
dat < <= 1;
}
}
/*********************************************************************************************************
** 函數(shù)名稱 :uint8_t AD9954_Read_Byte(void)
** 函數(shù)功能 :讀AD9954一個(gè)字節(jié)的內(nèi)容
** 入口參數(shù) :無
** 出口參數(shù) :讀出的一個(gè)字節(jié)數(shù)據(jù)
** 函數(shù)說明 :
*********************************************************************************************************/
uint8_t AD9954_Read_Byte(void)
{
uint8_t i,dat=0;
for (i = 0;i< 8;i++)
{
AD9954_SCLK = 0;
delay_us(2);
dat|=AD9954_SDO;
AD9954_SCLK = 1;
delay_us(2);
dat < <= 1;
}
return dat;
}
/************************************************************
** 函數(shù)名稱 :void AD9954_Write_nByte(uint8_t RegAddr,uint8_t *Data,uint8_t Len)
** 函數(shù)功能 :向AD9954指定的寄存器寫數(shù)據(jù)
** 入口參數(shù) :RegAddr: 寄存器地址
*Data: 數(shù)據(jù)起始地址
Len: 要寫入的字節(jié)數(shù)
** 出口參數(shù) :無
** 函數(shù)說明 :無
**************************************************************/
void AD9954_Write_nByte(uint8_t RegAddr,uint8_t *Data,uint8_t Len)
{
uint8_t t=0;
AD9954_Send_Byte(RegAddr);
for(t=0;t< Len;t++)
{
AD9954_Send_Byte(Data[t]);
}
}
/*********************************************************************************************************
** 函數(shù)名稱 :uint32_t AD9954_Read_nByte(uint8_t ReadAddr,uint8_t Len)
** 函數(shù)功能 :讀AD9954寄存器數(shù)據(jù)
** 入口參數(shù) :ReadAddr:要讀出的寄存器地址
Len:要讀出數(shù)據(jù)的長度1-4
** 出口參數(shù) :讀出的數(shù)據(jù)
** 函數(shù)說明 :
*********************************************************************************************************/
uint32_t AD9954_Read_nByte(uint8_t ReadAddr,uint8_t Len)
{
uint8_t t=0;
uint32_t temp=0;
AD9954_CS=1;
AD9954_Send_Byte(ReadAddr);
for(t=0;t< Len;t++)
{
temp< <=8;
temp+=AD9954_Read_Byte();
}
AD9954_CS=1;
return temp;
}
/************************************************************
** 函數(shù)名稱 :uint32_t Get_FTW(double Real_fH)
** 函數(shù)功能 :頻率數(shù)據(jù)轉(zhuǎn)換
** 入口參數(shù) :Freq,需要轉(zhuǎn)換的頻率,0-140000000hz
** 出口參數(shù) :頻率數(shù)據(jù)值
** 函數(shù)說明 :
**************************************************************/
uint32_t Get_FTW(double Real_fH)
{
return (uint32_t)(fH_Num*Real_fH);
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_Init(void))
** 函數(shù)功能 :初始化AD9954的管腳和最簡單的內(nèi)部寄存器的配置,
** 入口參數(shù) :無
** 出口參數(shù) :無
** 函數(shù)說明 :板上的晶振為20MHz,最大采用了20倍頻,為400M
*********************************************************************************************************/
void AD9954_Init(void)
{
uint8_t CFR1_data[4]={0,0,0,0};
uint8_t CFR2_data[3]={0,0,0};
AD9954_GPIO_Init();
AD9954_RESET();
delay_ms(300);
AD9954_CS = 0;
CFR1_data[0]=0X02;//此處:0x02- >OSK使能;0X00- >OSK關(guān)閉。在OSK模式使能的前提下,幅度寄存器(0X02)生效
//見英文數(shù)據(jù)手冊,page 31 :Amplitude Scale Factor (ASF)部分
//In manual OSK
//mode, ASF< 15:14 > has no effect. ASF< 13:0 > provide the output
//scale factor directly. If the OSK is disabled using CFR1< 25 >,
//this register has no effect on device operation.
CFR1_data[1]=0X00;
CFR1_data[2]=0X00;
CFR1_data[3]=0x00;//比較器啟用,方波輸出;0x40,比較器禁用方波無輸出
AD9954_Write_nByte(CFR1,CFR1_data,4);//數(shù)據(jù)寫入控制功能寄存器1
CFR2_data[0]=0X00;
CFR2_data[1]=0X00;
if(fs >400)
;//系統(tǒng)頻率超過芯片最大值
else if(fs >=250)
CFR2_data[2]=PLL_MULTIPLIER< 3|0x04|0X03;
else CFR2_data[2]=PLL_MULTIPLIER< 3;
AD9954_Write_nByte(CFR2,CFR2_data,3);//數(shù)據(jù)寫入控制功能寄存器2
AD9954_CS=1;
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_Set_Fre(double fre)
** 函數(shù)功能 :設(shè)置AD9954當(dāng)前的頻率輸出,采用的是單一頻率輸出
** 入口參數(shù) :fre:欲設(shè)置的頻率值 0-140000000hz
** 出口參數(shù) :無
** 函數(shù)說明 :因?yàn)椴捎玫母↑c(diǎn)數(shù)進(jìn)行計(jì)算,轉(zhuǎn)換過程中會(huì)出現(xiàn)誤差,通過調(diào)整可以精確到0.1Hz以內(nèi)
*********************************************************************************************************/
void AD9954_Set_Fre(double fre)//single tone
{
uint8_t date[4] ={0x00,0x00,0x00,0x00}; //中間變量
uint32_t Temp=0;
Temp=Get_FTW(fre);
date[0] =(uint8_t)(Temp > > 24);
date[1] =(uint8_t)(Temp > > 16);
date[2] =(uint8_t)(Temp > > 8);
date[3] =(uint8_t)Temp;
AD9954_CS = 0;
AD9954_Write_nByte(FTW0,date,4);//寫頻率控制字
AD9954_CS=1;
UPDATE();
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_Set_Amp(uint16_t Ampli)
** 函數(shù)功能 :設(shè)置AD9954輸出幅度
** 入口參數(shù) :Ampli:0-16383,最大峰峰值約500mv
** 出口參數(shù) :無
** 函數(shù)說明 :
*********************************************************************************************************/
void AD9954_Set_Amp(uint16_t Ampli)
{
uint8_t date[2] ={0x00,0x00};
AD9954_CS = 0;
date[0]=(uint8_t)(Ampli > > 8);
date[1]=(uint8_t)Ampli;
AD9954_Write_nByte(ASF,date,2);
AD9954_CS = 1;
UPDATE();
}
/************************************************************
** 函數(shù)名稱 :void AD9954_Set_Phase(uint8_t Channel,uint16_t Phase)
** 函數(shù)功能 :設(shè)置通道的輸出相位
** 入口參數(shù) :Phase: 輸出相位,范圍:0~16383(對應(yīng)角度:0°~360°)
** 出口參數(shù) :無
** 函數(shù)說明 :無
**************************************************************/
void AD9954_Set_Phase(uint16_t Phase)//寫相位
{
uint8_t date[2] ={0x00,0x00};
AD9954_CS = 0;
date[0]=(uint8_t)(Phase > > 8);
date[1]=(uint8_t)Phase;
AD9954_Write_nByte(POW0,date,2);
AD9954_CS = 1;
UPDATE();
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_SetFSK(double f1,double f2,double f3,double f4,uint16_t Ampli)
** 函數(shù)功能 :四相FSK信號(hào)輸出參數(shù)設(shè)置
** 入口參數(shù) :f1:頻率1 0-140000000hz
** f2:頻率2
** f3:頻率3
** f4:頻率4
** Ampli幅度:0-16383,最大峰峰值約500mv
** 出口參數(shù) :無
** 隱含控制 PS0: 0 1 0 1
** 管腳參數(shù): PS1: 0 0 1 1
** 對應(yīng)控制 RAM段: 0 1 2 3
** 函數(shù)說明 :在四個(gè)RAM區(qū)各設(shè)置了一個(gè)頻率值,通過改變PS0和PS1的電平選擇對應(yīng)的RAM端輸出相應(yīng)的頻率值來實(shí)現(xiàn)FSK,也可以實(shí)現(xiàn)二項(xiàng)的FSK;
** 通過設(shè)置控制PS0,PS1管腳的電平就可以將二進(jìn)制的編碼轉(zhuǎn)化為FSK信號(hào)輸出
*********************************************************************************************************/
void AD9954_SetFSK(double f1,double f2,double f3,double f4,uint16_t Ampli)
{
uint32_t FTW_Vau=0;
uint8_t fdata[4]={0,0,0,0};
uint8_t CFR1_data[4]={0,0,0,0};
uint8_t data[5]={0,0,0,0,0};
AD9954_CS = 0;
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x00; //終止地址:0x0000 低8位
data[3]=0x00; //0:1終止地址:高2位,2:7起始地址低6位:0x000;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM0工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW0,data,5);
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x01; //終止地址:0x0001 低8位
data[3]=0x04; //0:1終止地址:高2位,2:7起始地址低6位:0x0001;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM1工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW1,data,5);
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x02; //終止地址:0x0002 低8位
data[3]=0x08; //0:1終止地址:高2位,2:7起始地址低6位:0x0002;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM2工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW2,data,5);
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x03; //終止地址:0x0003 低8位
data[3]=0x0c; //0:1終止地址:高2位,2:7起始地址低6位:0x0003;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM3工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW3,data,5);
AD9954_CS = 1;
UPDATE();
AD9954_CS = 0;
PS1=0;PS0=0;
FTW_Vau=Get_FTW(f1);
fdata[0]=FTW_Vau >>24;
fdata[1]=FTW_Vau >>16;
fdata[2]=FTW_Vau >>8;
fdata[3]=FTW_Vau;
AD9954_Write_nByte(RAM,fdata,4);
PS1=0;PS0=1;
FTW_Vau=Get_FTW(f2);
fdata[0]=FTW_Vau >>24;
fdata[1]=FTW_Vau >>16;
fdata[2]=FTW_Vau >>8;
fdata[3]=FTW_Vau;
AD9954_Write_nByte(RAM,fdata,4);
PS1=1;PS0=0;
FTW_Vau=Get_FTW(f3);
fdata[0]=FTW_Vau >>24;
fdata[1]=FTW_Vau >>16;
fdata[2]=FTW_Vau >>8;
fdata[3]=FTW_Vau;
AD9954_Write_nByte(RAM,fdata,4);
PS1=1;PS0=1;
FTW_Vau=Get_FTW(f4);
fdata[0]=FTW_Vau >>24;
fdata[1]=FTW_Vau >>16;
fdata[2]=FTW_Vau >>8;
fdata[3]=FTW_Vau;
AD9954_Write_nByte(RAM,fdata,4);
AD9954_CS = 1;
UPDATE();
AD9954_CS = 0;
CFR1_data[0]=0X82;//打開RAM控制位驅(qū)動(dòng)FTW
CFR1_data[1]=0X00;
CFR1_data[2]=0X00;
CFR1_data[3]=0x00;//比較器啟用,方波輸出;0x40,比較器禁用方波無輸出
AD9954_Write_nByte(CFR1,CFR1_data,4);//數(shù)據(jù)寫入控制功能寄存器1
AD9954_CS = 1;
UPDATE();
AD9954_Set_Amp(Ampli);//設(shè)置幅度
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_SetPSK(uint16_t Phase1,uint16_t Phase2,uint16_t Phase3,uint16_t Phase4,double fre,uint16_t Ampli)
** 函數(shù)功能 :四相PSK信號(hào)輸出參數(shù)設(shè)置
** 入口參數(shù) :Phase1:相位1 范圍:0-16383 對應(yīng)0-360度
** Phase2:相位2
** Phase3:相位3
** Phase4:相位4
** fre:頻率 0-140000000hz
** Ampli幅度:0-16383,最大峰峰值約500mv
** 出口參數(shù) :無
** 隱含控制 PS0: 0 1 0 1
** 管腳參數(shù): PS1: 0 0 1 1
** 對應(yīng)控制 RAM段: 0 1 2 3
** 函數(shù)說明 :在四個(gè)RAM區(qū)各設(shè)置了一個(gè)頻率值,通過改變PS0和PS1的電平選擇對應(yīng)的RAM端輸出相應(yīng)的頻率值來實(shí)現(xiàn)PSK,也可以實(shí)現(xiàn)二項(xiàng)的PSK;
** 通過設(shè)置控制PS0,PS1管腳的電平就可以將二進(jìn)制的編碼轉(zhuǎn)化為PSK信號(hào)輸出
*********************************************************************************************************/
void AD9954_SetPSK(uint16_t Phase1,uint16_t Phase2,uint16_t Phase3,uint16_t Phase4,double fre,uint16_t Ampli)
{
uint8_t pdata[4]={0,0,0,0};
uint8_t CFR1_data[4]={0,0,0,0};
uint8_t data[5]={0,0,0,0,0};
AD9954_CS = 0;
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x00; //終止地址:0x0000 低8位
data[3]=0x00; //0:1終止地址:高2位,2:7起始地址低6位:0x000;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM0工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW0,data,5);
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x01; //終止地址:0x0001 低8位
data[3]=0x04; //0:1終止地址:高2位,2:7起始地址低6位:0x0001;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM1工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW1,data,5);
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x02; //終止地址:0x0002 低8位
data[3]=0x08; //0:1終止地址:高2位,2:7起始地址低6位:0x0002;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM2工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW2,data,5);
data[0]=0x00; //低8位 斜率=0x0000
data[1]=0x00; //高8位 斜率=0x0000
data[2]=0x03; //終止地址:0x0003 低8位
data[3]=0x0c; //0:1終止地址:高2位,2:7起始地址低6位:0x0003;
data[4]=0x00; //0:3起始地址高4位 5:7,RAM3工作于模式0; 4:不停留位沒有激活
AD9954_Write_nByte(RSCW3,data,5);
AD9954_CS = 1;
UPDATE();
Phase1< <=2;
Phase2< <=2;
Phase3< <=2;
Phase4< <=2;
AD9954_CS = 0;
PS1=0;PS0=0;
pdata[0]=(uint8_t)(Phase1 >>8);
pdata[1]=(uint8_t)Phase1;
pdata[2]=0x00;
pdata[3]=0x00;
AD9954_Write_nByte(RAM,pdata,4);
PS1=0;PS0=1;
pdata[0]=(uint8_t)(Phase2 >>8);
pdata[1]=(uint8_t)Phase2;
pdata[2]=0x00;
pdata[3]=0x00;
AD9954_Write_nByte(RAM,pdata,4);
PS1=1;PS0=0;
pdata[0]=(uint8_t)(Phase3 >>8);
pdata[1]=(uint8_t)Phase3;
pdata[2]=0x00;
pdata[3]=0x00;
AD9954_Write_nByte(RAM,pdata,4);
PS1=1;PS0=1;
pdata[0]=(uint8_t)(Phase4 >>8);
pdata[1]=(uint8_t)Phase4;
pdata[2]=0x00;
pdata[3]=0x00;
AD9954_Write_nByte(RAM,pdata,4);
AD9954_CS = 1;
UPDATE();
AD9954_CS = 0;
CFR1_data[0]=0Xc2;//打開RAM控制位驅(qū)動(dòng)POW相位
CFR1_data[1]=0X00;
CFR1_data[2]=0X00;
CFR1_data[3]=0x00;//比較器啟用,方波輸出;0x40,比較器禁用方波無輸出
AD9954_Write_nByte(CFR1,CFR1_data,4);//數(shù)據(jù)寫入控制功能寄存器1
AD9954_CS = 1;
UPDATE();
AD9954_Set_Amp(Ampli);//設(shè)置幅度
AD9954_Set_Fre(fre);
}
/*********************************************************************************************************
** 函數(shù)名稱 :void AD9954_Set_LinearSweep(double Freq_Low,double Freq_High,double UpStepFreq,
** uint8_t UpStepTime,double DownStepFreq, uint8_t DownStepTime,uint8_t mode)
** 函數(shù)功能 :線性掃描輸出模式
** 函數(shù)說明 :使頻率按預(yù)置的模式線性掃描上去,詳細(xì)參見官方PDF
** 入口參數(shù) :Freq_Low:起始頻率 0-140000000hz
** Freq_High:終止頻率; 0-140000000hz
** UpStepFreq:向上掃頻步進(jìn), 0-140000000hz
** UpStepTime:向上掃頻的步進(jìn)間隔時(shí)間;1-255
** DownStepFreq:向下掃頻步進(jìn), 0-140000000hz
** DownStepTime:向下掃頻的步進(jìn)間隔時(shí)間;1-255
** mode:線性掃描無停留功能,No_Dwell不停留,輸出掃頻到終止頻率回到起始頻率;Dwell停留,輸出掃頻到終止頻率后保持在終止頻率。
** 出口參數(shù) :無
** 函數(shù)說明 :需要保證,F(xiàn)req_Low< Freq_High
** 步進(jìn)間隔時(shí)間 T = StepTime*10 ;例:UpStepTime=100,則向上掃頻的步進(jìn)間隔時(shí)間T=1000nS=1us
** 掃頻總時(shí)間=總掃描頻點(diǎn)數(shù)*T
** PS0腳控制掃頻方向,PS0=1向上掃頻,PS0=0向下掃頻
*********************************************************************************************************/
void AD9954_Set_LinearSweep(double Freq_Low,double Freq_High,double UpStepFreq, uint8_t UpStepTime,double DownStepFreq, uint8_t DownStepTime,uint8_t mode)//linear sweep mode
{
uint8_t date[5] ={0x00,0x00,0x00,0x00,0x00}; //中間變量
uint8_t CFR1_data[4] ={0x00,0x00,0x00,0x00};
uint32_t Temp=0;
PS1=0;PS0=0;
AD9954_CS=0;
CFR1_data[0]=0x00;//31-24
CFR1_data[1]=0x20;//23-16
CFR1_data[2]=0x00;
CFR1_data[3]=0x00|mode;//比較器啟用,方波輸出;0x40,比較器禁用方波無輸出
AD9954_Write_nByte(CFR1,CFR1_data,4);//數(shù)據(jù)寫入控制功能寄存器1
Temp=Get_FTW(Freq_Low);
date[0] =(uint8_t)(Temp > > 24);
date[1] =(uint8_t)(Temp > > 16);
date[2] =(uint8_t)(Temp > > 8);
date[3] =(uint8_t)Temp;
AD9954_Write_nByte(FTW0,date,4);//寫頻率控制字
Temp=Get_FTW(Freq_High);
date[0] =(uint8_t)(Temp > > 24);
date[1] =(uint8_t)(Temp > > 16);
date[2] =(uint8_t)(Temp > > 8);
date[3] =(uint8_t)Temp;
AD9954_Write_nByte(FTW1,date,4);//寫頻率控制字
Temp=Get_FTW(DownStepFreq);
date[0] =DownStepTime;//下降的掃描斜率
date[1] =(uint8_t)(Temp > > 24);
date[2] =(uint8_t)(Temp > > 16);
date[3] =(uint8_t)(Temp > > 8);
date[4] =(uint8_t)Temp;//下降的頻率增量
AD9954_Write_nByte(NLSCW,date,5);
Temp=Get_FTW(UpStepFreq);
date[0] =UpStepTime;//上升的掃描斜率
date[1] =(uint8_t)(Temp > > 24);
date[2] =(uint8_t)(Temp > > 16);
date[3] =(uint8_t)(Temp > > 8);
date[4] =(uint8_t)Temp;//上升的頻率增量
AD9954_Write_nByte(PLSCW,date,5);
AD9954_CS=1;
UPDATE();
}
main.c
#include "stm32_config.h"
#include "stdio.h"
#include "key.h"
#include "Encoder.h"
#include "OLED.h"
#include "ad9954.h"
#include "timer.h"
uint8_t KeyNum, key;
uint32_t last_value = 140000000;
uint32_t Fre = 1000;
uint32_t Amp = 16383;
uint32_t Phase = 0;
int main(void)
{
MY_NVIC_PriorityGroup_Config(NVIC_PriorityGroup_2); //設(shè)置中斷分組
delay_init(72); //初始化延時(shí)函數(shù)
Key_Init();
Timer_Init();
OLED_Init();
Encoder_Init();
AD9954_Init(); //初始化控制AD9954需要用到的IO口,及寄存器
delay_ms(100);
OLED_ShowString(0,5,"AD9954",16,1);
// OLED_ShowChinese(70,5,0,16,1);
// OLED_ShowChinese(86,5,1,16,1);
OLED_ShowString(95,150,"Hz",16,1);
OLED_Refresh();
// AD9954_Set_LinearSweep(100000,500000,1,200,1,200,Dwell); //掃頻,Dwell停留,輸出掃頻到終止頻率后保持在終止頻率。No_Dwell不停留,輸出掃頻到終止頻率后回到起始頻率;
//起始100000Hz,終止500000Hz,上掃頻步進(jìn)1hz,上掃頻時(shí)間約800ms;下掃頻步進(jìn)1hz,下掃頻時(shí)間約800ms;掃頻時(shí)間計(jì)算參考函數(shù)注解
while(1)
{
Encoder_Value_Update();
Encoder_Display();
Fre = Encoder_GetValue();
if (Fre >= last_value)
{
Fre = last_value;
}
KeyNum += Key_GetNum();
if(KeyNum > 2) KeyNum = 1;
switch (KeyNum)
{
case 1: // 調(diào)節(jié)幅值
if(Amp >= 16383) Amp = 16383;
OLED_ShowChinese(70,5,0,16,1);
OLED_ShowChinese(86,5,1,16,1);
Amp += Key_GetValue();
break;
case 2: // 調(diào)節(jié)相位
if(Phase >= 16383) Phase = 16383;
OLED_ShowChinese(70,5,2,16,1);
OLED_ShowChinese(86,5,3,16,1);
Phase += Key_GetValue();
break;
}
AD9954_Set_Fre(Fre);//設(shè)置輸出頻率1000Hz
AD9954_Set_Amp(Amp);//設(shè)置幅度,范圍0~16383 (對應(yīng)幅度約:0~500mv)
AD9954_Set_Phase(Phase);//設(shè)置相位,范圍0~16383(對應(yīng)角度:0°~360°)
OLED_ShowNum(20, 150, Fre, 9, 16, 1);
OLED_ShowNum(10, 175, Amp, 5, 16, 1);
OLED_ShowNum(70, 175, Phase, 5, 16, 1);
OLED_Refresh();
delay_ms(10);
//掃頻
// PS0=1;//PS0控制掃頻方向;高電平:從起始值掃到結(jié)束值
// delay_ms(500);
// PS0=0;//低電平:從結(jié)束值掃到起始值
// delay_ms(500);
}
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2, TIM_IT_Update) == SET)
{
key++;
if(key > 20)
{
Key_Loop();
key = 0;
}
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
}
}
效果展示

雙向線性掃頻模式
六、注意事項(xiàng)與常見問題
注意事項(xiàng)
(1)模塊為低功耗模塊,供電電源不超過5.5V。
(2)由于模塊是高精度器件,為了避免不必要的干擾,建議使用線性電源供電。
(3)輸出信號(hào)建議使用SMA轉(zhuǎn)BNC的線直接示波器觀測效果,接觸不良或劣質(zhì)的線材可能導(dǎo)致信號(hào)衰減或者噪聲過大。
(4)如需簡單測試模塊功能,建議搭配本店控制板使用,先給DDS模塊供電,再給控制板供電即可產(chǎn)生波形,長按中間鍵切換功能。
常見問題
Q:模塊的主頻和輸出幅度可以調(diào)節(jié)嗎?
A:模塊的主頻是輸入時(shí)鐘和程序一起決定的,模塊可以外部輸入時(shí)鐘,板載默認(rèn)時(shí)鐘為20MHz,程序控制倍頻為20倍,即默認(rèn)主頻為 400MHz,可以通過修改輸入時(shí)鐘和倍頻數(shù)改變主頻,輸出幅度可以通過修改14位幅度寄存器控制輸出幅度。
Q:模塊可以實(shí)現(xiàn)掃頻么?方波占空比可調(diào)嗎?
A:模塊可以實(shí)現(xiàn)掃頻。提供的例程可支持掃頻。模塊方波幅度和占空比都不能調(diào)節(jié),正弦波頻率、幅度可以調(diào)節(jié)。
Q:可以做AM等調(diào)制嗎?
A:可以通過改變幅度寄存器實(shí)現(xiàn)低速的AM調(diào)制,并且具有多種掃頻模式,默認(rèn)代碼是軟件單音掃頻,其他模式需要自行編程。
審核編輯 黃宇
-
DDS
+關(guān)注
關(guān)注
22文章
687瀏覽量
156789 -
信號(hào)發(fā)生器
+關(guān)注
關(guān)注
28文章
1717瀏覽量
113594 -
STM32F103
+關(guān)注
關(guān)注
34文章
497瀏覽量
68029
發(fā)布評論請先 登錄
多個(gè)AD9954同步:怎么使得這兩個(gè)信號(hào)同時(shí)起震也就是同向
AD9954調(diào)制基帶板和DDS不同源頻譜很差
基于AD9954的多模式調(diào)制器的設(shè)計(jì)
基于AD9954的正弦信號(hào)發(fā)生器
信號(hào)發(fā)生器原理_DDS芯片及應(yīng)用_DDS信號(hào)發(fā)生器設(shè)計(jì)
dds信號(hào)發(fā)生器功能及原理
基于FPGA的DDS信號(hào)發(fā)生器設(shè)計(jì)方案解析
DDS函數(shù)信號(hào)發(fā)生器是什么_DDS函數(shù)信號(hào)發(fā)生器原理及使用方法
高集成度DDS器件AD9954的特點(diǎn)及在數(shù)字調(diào)制系統(tǒng)設(shè)計(jì)中的應(yīng)用
基于STM32的DDS信號(hào)發(fā)生器
DDS信號(hào)發(fā)生器的理解與實(shí)現(xiàn)
任意波發(fā)生器如何輸出波形、帶調(diào)制的信號(hào)?
基于STM32F103驅(qū)動(dòng)AD9833模塊 DDS信號(hào)發(fā)生器輸出正弦波/三角波/方波可編程信號(hào)
基于STM32F103驅(qū)動(dòng)AD9954 高速DDS信號(hào)發(fā)生器模塊輸出波形信號(hào)
評論