寫在前面 --Fraay
大家好我又來了,本次帶來的是AD9910模塊的資料手冊、使用方法詳解,以及如何根據AD9910的原理進行編程,實作DDS的功能,這次文章可以說是對資料手冊的一個整理,也是對我自己這一階段學習的一個記錄,
其實網上有現成的例程供各位參考,甚至只需要修改引腳便可使用,但是本著學習的態度,還是很有必要深入了解資料手冊,并且對應著資料手冊來看別人代碼的底層,是如何控制相應暫存器來完成功能的,這也是可編程芯片的魅力所在吧!
硬體/軟體準備
使用的是康威電子的AD9910模塊,淘寶店有賣的,如圖

這個板子300+的價格,工藝是十分精良的,有條件的可以入手一塊;條件不夠可以不買,僅僅來學習也是非常好的一個平臺,
(千萬不要試圖自己用覆銅板做,因為會出現很多pcb布局布線的問題,導致失敗,畢竟單獨的AD9910芯片價格也在100+)
單片機我選擇的是STM32ZET6,不過這個并不是必須的,只是因為我開發板恰好是這個型號的,控制這個模塊只需要13個(大約)管腳就夠了用萬能的C8T6也可以實作,
軟體我使用的是CUBEMX,我沒有工程模板并且很懶CUBEMX有強大的代碼自動配置功能,并且十分穩定不會出錯,代碼系統化,可維護性高,使用十分方便,
硬體介紹

如圖
資料手冊詳述(部分功能)
AD9910的資料手冊英文版一共65頁,我學習的時候是硬啃的,現在好在有中文翻譯版,我就按照中文版進行再次翻譯成人話(我認為能被更好的理解的并表達方式)不過大家有時間還是應該多多訓練閱讀英文資料手冊的能力,
總體概述

如圖,說白了就是最多400M的模擬輸出;串行/并行資料通信;掃頻/掃幅等;應用領域:本振產生;雷達的線性調頻chrip的生成等,
管腳
先跳過管腳的含義,因為管腳配置跟完成的功能息息相關,100+個管教很多都是可以固定配置死的,而且若詳細描述各個管腳篇幅過長,所以在應用中講配置管腳,
作業模式

重點來了,AD9910的四種作業模式由于篇幅的考慮,這次文章只記錄最AD9910模塊最實用的單頻調制功能,
單頻調制
說白了就是我直接通過32給他傳資料,規定他的振幅/頻率/相位,他按照我給的引數來輸出相應的正弦波
原理
那我32把資料傳給誰?
答案是8個內部編程暫存器Profile 0-7,
如何選擇我要往那個暫存器里面讀和寫?
答案是利用外部引腳PROFILE[2:0]進行選擇(這就是我之前說的在應用中講管腳)
32在PROFILE輸出000那就是選擇profile0,001->profile1......
并且在下一個時鐘上升沿自動更新profile0-7的資料
AD9910怎么計算輸出的振幅/頻率/相位?

如圖,說白了就是f_sysclk平均分成2^32份,輸出頻率等于FTW *(f_sysclk / 2^32)
此處需要注意的是,FTW是32位的,但是他最多只能表示0-2^31-1這么多的數,因為奈奎斯特采樣頻率的限制,最多取1/2的f_sysclk才能還原信號,

如圖,幅度和相位跟頻率類似,這里的POW就相當于FTW,而ASF表示相對于滿量程的比例因子,輸出的幅度(14位ADC)即
(ASF/2^14)* 滿量程輸出的幅度
寫到這基本單頻調制模式的基礎已經明了了具體步驟如下
配置管腳資訊(32發控制字給dds)使模塊為單頻調制模式->給確定的profile0-7(任意一個即可,不過要和你FROFILE引腳配置的相符)暫存器寫值->發送ioupdate信號更新資料->輸出
通信協議
可以看出32必須要與dds通信才可以實作功能,因此就要涉及串行資料的傳遞(先不考慮并行介面的使用)

這一段話我們知道了通信包含寫指令+寫資料,指令包括地址+讀寫位,并且完成同i性能之后要更新ioupdate

上圖👆是指令的具體格式


上圖👆是相關的通信管腳
說白了就是先要復位ioreset,拉低cs,然后32模擬一個時鐘,MSB/LSB傳輸,每當輸出完成之后要ioupdate
這樣看起來一點都不直觀,那就說一點人話,貼底層發送代碼
//======================八位發送程式================================
void txd_8bit(uchar txdat)
{
uchar i,sbt;
sbt=0x80;
SCLK=0;
for (i=0;i<8;i++)
{
if ((txdat & sbt)==0)
AD9910_SDIO=0;
else
AD9910_SDIO=1;
SCLK=1;
sbt=sbt>>1;
SCLK=0;
}
}
代碼+時序圖可以看到:首先sclk=0(空閑),0x80=1000_0000,8個回圈內,把發送陣列跟sbt相與看是否最高位是0(其他位肯定都為0)是的話就操作SDIO=0,否則SDIO=1,然后sclk拉高,資料成功發送,緊接著把sbt右移一位變成0100_0000判斷tsdat第二位,進行發送,以此類推完成8位陣列的發送,可見完全符合上圖的通信協議
給誰通信?
搞明白傳資料的流程之后,下面就要涉及到給誰傳資料?
下面介紹一系列需要通信的暫存器
3個CRF暫存器


上圖三張位于PDF的第50頁,有興趣的話可以看看
CRF我自己的理解就是先對AD9910進行一個模式的配置,不給引數,主要是決定他的初始化設定,具體每一位怎么配置,有什么功能,都在PDF的55頁,這個表格太長了而且很詳細,就不描述了.
但是我們通過這個表格可以知道,我要往0x00/01/02這三個地址依次寫資料,回答了給誰通信的問題,
還是貼底層代碼來看通信程序
//======================ad9910發送cfr控制字=======================
//crf1/2/3的值所代表的含義,在PDF55頁有詳細描述,根據配置需求來
//我這里用的值適應于單頻調制功能
//uchar cfr1[]={0x00,0x40,0x00,0x00}; //cfr1
//uchar cfr2[]={0x01,0x00,0x00,0x00}; //cfr2
//const uchar cfr3[]={0x05,0x0F,0x41,0x32}; //cfr3 40M 輸入時鐘 25倍頻 VC0=101
//ICP=001;
void Txcfr(void)
{
uchar m,k;
CS=0;
txd_8bit(0x00); //cfr1地址
for (m=0;m<4;m++)
txd_8bit(cfr1[m]);
CS=1;
for (k=0;k<10;k++);
CS=0;
txd_8bit(0x01); //cfr2地址
for (m=0;m<4;m++)
txd_8bit(cfr2[m]);
CS=1;
for (k=0;k<10;k++);
CS=0;
txd_8bit(0x02); //cfr3地址
for (m=0;m<4;m++)
txd_8bit(cfr3[m]);
CS=1;
for (k=0;k<10;k++);
UP_DAT=1;
for(k=0;k<10;k++);
UP_DAT=0;
delay_ms(1);
}
上圖👆根據前面的內容不難理解,分別經歷了片選cs,寫命令,寫資料,ioupdate操作,
Profile 0暫存器
把CRF配置好了之后,AD9910初始化也就成功了,已經進入單頻調制功能了
接下來由于總體程式里面寫了PROFILE1/2/3=0,即選中了profile0這個暫存器,所以就要往這個暫存器里面寫資料

上圖👆位profile0的描述,可以看到地址是0x0E,一共64個位,不同的位代表不同的意思,這個就是單頻調制的引數選擇,然后AD9910就會自動按照這個引數產生正弦波,
同樣,貼底層
//===================設定頻率===================//
void Freq_convert(ulong Freq)
{
ulong Temp;
if(Freq > 400000000)
Freq = 400000000;
Temp=(ulong)Freq*4.294967296; // 4.294967296=(2^32)/1000000000
// 把1G的內部時鐘分為2^32份
profile0[7]=(uchar)Temp; //可以看到profile0在頻率控制字一共有4個位元組
profile0[6]=(uchar)(Temp>>8);//所以分四次發送
profile0[5]=(uchar)(Temp>>16);
profile0[4]=(uchar)(Temp>>24);
Txprofile();
}
//===================ad9910·發送profile0控制字======================
void Txprofile(void)
{
uchar m,k;
CS=0;
txd_8bit(0x0e); //profile0地址
for (m=0;m<8;m++)
txd_8bit(profile0[m]); //分8次把所有的profile0資料全發送出去
CS=1;
for(k=0;k<10;k++);//等待
UP_DAT=1;
for(k=0;k<10;k++);//等待
UP_DAT=0;
delay_ms(1);
}
上圖👆只是寫了設定頻率的部分,設定幅度和相位同理,
把這些部分完成之后,AD9910就會以單頻調制的模式輸出固定引數的正弦波,也就達到了dds的基本功能,后面再接混頻電路或者其他的設計都可以,
總結一下,單頻調制的步驟發送cfr1/2/3->發送profile0
結尾
以上內容介紹了單頻調制如何實作,并且講解了底層最重要的代碼的原理,希望大家看了之后會對代碼完成的作業有個具體的認識,后面的RAM、DRG等功能可以參考資料手冊的相關章節,放出我自己的單頻調制程式+資料手冊,如果無法上傳的話,,需要的可以留言,我挨個發,
最后希望能給小丁同學帶來幫助,腳踏實地的學習,
2020.9.20于湖北工業大學
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/108698.html
標籤:其他
