2021年電賽?|?手把手帶你玩轉(zhuǎn)DDS
1、電賽清單
其實(shí)國賽年的電賽儀器設(shè)備和主要元器件清單基本都差不多,只有很小的改動。2019年國賽年同樣有DDS模塊,今年照樣有DDS模塊。2、什么是DDS
DDS直接數(shù)字式頻率綜合器 DDS(Direct Digital Synthesizer),實(shí)際上是一種分頻器:通過編程頻率控制字來分頻系統(tǒng)時鐘(SYSTEM CLOCK)以產(chǎn)生所需要的頻率。DDS有兩個突出的特點(diǎn),一方面,DDS工作在數(shù)字域,一旦更新頻率控制字,輸出的頻率就相應(yīng)改變,其跳頻速率高;另一方面,由于頻率控制字的寬度寬(48bit 或者更高),頻率分辨率高。說人話:可以把他理解為一個信號源即信號發(fā)生器。3、DDS工作原理
DDS主要分成3 部分:相位累加器 , 相位幅度轉(zhuǎn)換 , 數(shù)模轉(zhuǎn)換器(DAC)。- 相位累加器
- 相位幅度轉(zhuǎn)換
- DAC輸出
4、怎么做出一個DDS
注意電賽清單說的是:DDS芯片或模塊。也就是意味著你可以買芯片自己設(shè)計(jì)電路板,也可以自己買DDS模塊。如果你有能力當(dāng)然是直接買芯片自己畫板子,這樣你做出來的DDS肯定你那些直接買DDS模塊的同學(xué)更有優(yōu)勢。當(dāng)然如果你覺得難度比較大還是買一個DDS模塊吧!如何選擇DDS
怎么選擇具體的哪一款DDS芯片還是要看你自己的預(yù)算和你的需求。今天主要講的DDS模塊是安富萊家的AD9833這一款DDS模塊。至于為啥選擇一款,因?yàn)?9年電賽購買過這一款,價(jià)格也還便宜,電路和編程相對來說還是比較簡單的。強(qiáng)調(diào)一點(diǎn)這不是打廣告??!5、AD9833簡介
AD9833是ADI公司生產(chǎn)的一款低功耗,可編程波形發(fā)生器,能夠產(chǎn)生正弦波、三角波、方波輸出。波形發(fā)生器廣泛應(yīng)用于各種測量、激勵和時域響應(yīng)領(lǐng)域,AD9833無需外接元件,輸出頻率和相位都可通過軟件編程,易于調(diào)節(jié),頻率寄存器是28位的,主頻時鐘為25MHz時,精度為0.1Hz,主頻時鐘為1MHz時,精度可以達(dá)到0.004Hz。可以通過3個串行接口將數(shù)據(jù)寫入AD983,這3個串口的最高工作頻率可以達(dá)到40MHz,易于與DSP和各種主流微控制器兼容。AD9833的工作電壓范圍為2.3V-5.5V。AD9833還具有休眠功能,可使沒被使用的部分休眠,減少該部分的電流損耗,例如,若利用AD9833輸岀作為時鐘源,就可以讓DAC休眠,以減小功耗,該電路采用10引腳MSOP型表面貼片封裝,體積很小。AD9833特點(diǎn)
- 頻率和相位可數(shù)字編程
- 工作電壓為3V時,功耗僅為20mW
- 輸出頻率范圍為OHz-12.5MHz
- 頻率寄存器為28位(在25Mz的參考時鐘下,精度為0.1Hz)
- 可選擇正弦波、三角波、方波輸出
- 無需外界元件
- 3線SPI接口
- 溫度范圍為-40℃- 105℃
AD9833模塊電路圖
6、AD9833驅(qū)動代碼
一般你在網(wǎng)上買到模塊后,賣家一都會送你實(shí)例代碼,可能實(shí)例代碼與你所用的單片機(jī)型號不同。但是大致的思路框架是一樣的,下面就以安富萊家的AD9833代碼為例。說明:他家的平臺是STM32F407,也許你用的F103系列或者M(jìn)SP430,但是驅(qū)動代碼都是的。你完全可以把驅(qū)動代碼的.c和.h文件導(dǎo)入到你的項(xiàng)目中即可。功能描述
AD9833有3根串行接口線,與SPI、QSPI、DSP接口標(biāo)準(zhǔn)兼容,在串口時鐘SCLK的作用下,數(shù)據(jù)是以16位的方式加載到設(shè)備上,F(xiàn)SYNC引腳是片選使能引腳,電平觸發(fā)方式,低電平有效。進(jìn)行串行數(shù)據(jù)傳輸時,F(xiàn)SYNC引腳必須置低,要注意 FSYNC有效到SCLK下降沿的建立時間的最小值。FSYNC置低后,在16個SCLK的下降沿?cái)?shù)據(jù)被送到AD9833的輸入移位寄存器,在第16個SCLK的下降沿FSYNC可以被置高,但要注意在SCLK下降沿到FSYC上升沿的數(shù)據(jù)保持時間的最小和最大值。當(dāng)然,也可以在 FSYNC為低電平的時候,連續(xù)加載多個16位數(shù)據(jù),僅在最后一個數(shù)據(jù)的第16個SCLK的下降沿的時將 FSYNC置高,最后要注意的是,寫數(shù)據(jù)時SCLK時鐘為高低電平脈沖,但是,在 FSYNC剛開始變?yōu)榈蜁r,(即將開始寫數(shù)據(jù)時),SCLK必須為高電平(注意t11這個參數(shù))。當(dāng)AD9833初始化時,為了避免DAC產(chǎn)生虛假輸出,RESET必須置為1(RESET不會復(fù)位頻率、相位和控制寄存器),直到配置完畢,需要輸出時才將 RESET置為0;RESET為0后的8-9個MCLK時鐘周期可在DAC的輸出端觀察到波形。AD9833寫入數(shù)據(jù)到輸出端得到響應(yīng),中間有一定的響應(yīng)時間,每次給頻率或相位寄存器加載新的數(shù)據(jù),都會有7-8個MCIK時鐘周期的延時之后,輸出端的波形才會產(chǎn)生改變,有1個MCLK時鐘周期的不確定性,因?yàn)閿?shù)據(jù)加載到目的寄存器時,MCLK的上升沿位置不確定。既然模塊要與單片機(jī)相連那肯定首先要確定使用那幾個引腳,因?yàn)樗麄冎g是通過3線的SPI方式通信的。初始化GPIO
*?定義GPIO端口?*/#define?RCC_SCLK??RCC_AHB1Periph_GPIOB
#define?PORT_SCLK?GPIOB
#define?PIN_SCLK?GPIO_Pin_3
#define?RCC_SDATA??RCC_AHB1Periph_GPIOB
#define?PORT_SDATA?GPIOB
#define?PIN_SDATA?GPIO_Pin_5
/*?片選?*/
#define?RCC_FSYNC??RCC_AHB1Periph_GPIOF
#define?PORT_FSYNC?GPIOF
#define?PIN_FSYNC?GPIO_Pin_7
/*?定義口線置0和置1的宏?*/
#define?FSYNC_0()?PORT_FSYNC->BSRRH?=?PIN_FSYNC
#define?FSYNC_1()?PORT_FSYNC->BSRRL?=?PIN_FSYNC
#define?SCLK_0()?PORT_SCLK->BSRRH?=?PIN_SCLK
#define?SCLK_1()?PORT_SCLK->BSRRL?=?PIN_SCLK
#define?SDATA_0()??PORT_SDATA->BSRRH?=?PIN_SDATA
#define?SDATA_1()??PORT_SDATA->BSRRL?=?PIN_SDATA
void?bsp_InitAD9833(void)
{
?GPIO_InitTypeDef?GPIO_InitStructure;
?FSYNC_1();?/*?FSYNC?=?1?*/
?/*?打開GPIO時鐘?*/
?RCC_AHB1PeriphClockCmd(RCC_SCLK?|?RCC_SDATA?|?RCC_FSYNC,?ENABLE);
?/*?配置幾個推挽輸出IO?*/
?GPIO_InitStructure.GPIO_Mode?=?GPIO_Mode_OUT;??/*?設(shè)為輸出口?*/
?GPIO_InitStructure.GPIO_OType?=?GPIO_OType_PP;??/*?設(shè)為推挽模式?*/
?GPIO_InitStructure.GPIO_PuPd?=?GPIO_PuPd_NOPULL;?/*?上下拉電阻不使能?*/
?GPIO_InitStructure.GPIO_Speed?=?GPIO_Speed_25MHz;?/*?IO口最大速度?*/
?GPIO_InitStructure.GPIO_Pin?=?PIN_SCLK;
?GPIO_Init(PORT_SCLK,?