2021年電賽 | 手把手帶你玩轉DDS
1、電賽清單
其實國賽年的電賽儀器設備和主要元器件清單基本都差不多,只有很小的改動。2019年國賽年同樣有DDS模塊,今年照樣有DDS模塊。2、什么是DDS
DDS直接數(shù)字式頻率綜合器 DDS(Direct Digital Synthesizer),實際上是一種分頻器:通過編程頻率控制字來分頻系統(tǒng)時鐘(SYSTEM CLOCK)以產生所需要的頻率。DDS有兩個突出的特點,一方面,DDS工作在數(shù)字域,一旦更新頻率控制字,輸出的頻率就相應改變,其跳頻速率高;另一方面,由于頻率控制字的寬度寬(48bit 或者更高),頻率分辨率高。說人話:可以把他理解為一個信號源即信號發(fā)生器。電賽肯定不會讓你自己搞這樣的儀器做信號源,用你的DDS代替它。3、DDS工作原理
DDS主要分成3 部分:相位累加器 , 相位幅度轉換 , 數(shù)模轉換器(DAC)。- 相位累加器
- 相位幅度轉換
- DAC輸出
4、怎么做出一個DDS
注意電賽清單說的是:DDS芯片或模塊。也就是意味著你可以買芯片自己設計電路板,也可以自己買DDS模塊。如果你有能力當然是直接買芯片自己畫板子,這樣你做出來的DDS肯定你那些直接買DDS模塊的同學更有優(yōu)勢。當然如果你覺得難度比較大還是買一個DDS模塊吧!如何選擇DDS
怎么選擇具體的哪一款DDS芯片還是要看你自己的預算和你的需求。今天主要講的DDS模塊是安富萊家的AD9833這一款DDS模塊。至于為啥選擇一款,因為19年電賽購買過這一款,價格也還便宜,電路和編程相對來說還是比較簡單的。強調一點這不是打廣告?。?/strong>5、AD9833簡介
AD9833是ADI公司生產的一款低功耗,可編程波形發(fā)生器,能夠產生正弦波、三角波、方波輸出。波形發(fā)生器廣泛應用于各種測量、激勵和時域響應領域,AD9833無需外接元件,輸出頻率和相位都可通過軟件編程,易于調節(jié),頻率寄存器是28位的,主頻時鐘為25MHz時,精度為0.1Hz,主頻時鐘為1MHz時,精度可以達到0.004Hz。可以通過3個串行接口將數(shù)據(jù)寫入AD983,這3個串口的最高工作頻率可以達到40MHz,易于與DSP和各種主流微控制器兼容。AD9833的工作電壓范圍為2.3V-5.5V。AD9833還具有休眠功能,可使沒被使用的部分休眠,減少該部分的電流損耗,例如,若利用AD9833輸岀作為時鐘源,就可以讓DAC休眠,以減小功耗,該電路采用10引腳MSOP型表面貼片封裝,體積很小。AD9833特點
- 頻率和相位可數(shù)字編程
- 工作電壓為3V時,功耗僅為20mW
- 輸出頻率范圍為OHz-12.5MHz
- 頻率寄存器為28位(在25Mz的參考時鐘下,精度為0.1Hz)
- 可選擇正弦波、三角波、方波輸出
- 無需外界元件
- 3線SPI接口
- 溫度范圍為-40℃- 105℃
AD9833模塊電路圖
為了使大家比較好理解,我直接截取的成品模塊原理圖??梢钥吹紸D9833是一塊完全集成的DDS,僅需要1個外部參考時鐘、1個低精度電阻器和一個解耦電容器就能產生高達12.5Mz的正弦波。AD933的核心是28位的相位累加器,它由加法器和相位寄存器組成,每來1個時鐘,相位寄存器以步長增加,相位寄存器的輸岀與相位控制字相加后輸入到正弦査詢表地址中。正弦査詢表包含1個周期正弦波的數(shù)字幅度信息,每個地址對應正弦波中0°-360°范圍內的1個相位點。下面這張圖來自AD9833的數(shù)據(jù)手冊,可以看到每個引腳的功能說明都非常詳細,再配合上圖的電路原理圖就可以一目了然了!接下來就是單片機如何與芯片的引腳相連,以及如何寫驅動代碼了。6、AD9833驅動代碼
一般你在網(wǎng)上買到模塊后,賣家一都會送你實例代碼,可能實例代碼與你所用的單片機型號不同。但是大致的思路框架是一樣的,下面就以安富萊家的AD9833代碼為例。說明:他家的平臺是STM32F407,也許你用的F103系列或者MSP430,但是驅動代碼都是的。你完全可以把驅動代碼的.c和.h文件導入到你的項目中即可。功能描述
AD9833有3根串行接口線,與SPI、QSPI、DSP接口標準兼容,在串口時鐘SCLK的作用下,數(shù)據(jù)是以16位的方式加載到設備上,F(xiàn)SYNC引腳是片選使能引腳,電平觸發(fā)方式,低電平有效。進行串行數(shù)據(jù)傳輸時,F(xiàn)SYNC引腳必須置低,要注意 FSYNC有效到SCLK下降沿的建立時間的最小值。FSYNC置低后,在16個SCLK的下降沿數(shù)據(jù)被送到AD9833的輸入移位寄存器,在第16個SCLK的下降沿FSYNC可以被置高,但要注意在SCLK下降沿到FSYC上升沿的數(shù)據(jù)保持時間的最小和最大值。當然,也可以在 FSYNC為低電平的時候,連續(xù)加載多個16位數(shù)據(jù),僅在最后一個數(shù)據(jù)的第16個SCLK的下降沿的時將 FSYNC置高,最后要注意的是,寫數(shù)據(jù)時SCLK時鐘為高低電平脈沖,但是,在 FSYNC剛開始變?yōu)榈蜁r,(即將開始寫數(shù)據(jù)時),SCLK必須為高電平(注意t11這個參數(shù))。當AD9833初始化時,為了避免DAC產生虛假輸出,RESET必須置為1(RESET不會復位頻率、相位和控制寄存器),直到配置完畢,需要輸出時才將 RESET置為0;RESET為0后的8-9個MCLK時鐘周期可在DAC的輸出端觀察到波形。AD9833寫入數(shù)據(jù)到輸出端得到響應,中間有一定的響應時間,每次給頻率或相位寄存器加載新的數(shù)據(jù),都會有7-8個MCIK時鐘周期的延時之后,輸出端的波形才會產生改變,有1個MCLK時鐘周期的不確定性,因為數(shù)據(jù)加載到目的寄存器時,MCLK的上升沿位置不確定。既然模塊要與單片機相連那肯定首先要確定使用那幾個引腳,因為他們之間是通過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;??/*?設為輸出口?*/
?GPIO_InitStructure.GPIO_OType?=?GPIO_OType_PP;??/*?設為推挽模式?*/
?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,?