
写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる
それはさておき、
このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。
変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。
まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。
フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。
半田吸い取り線で、余分な半田を吸い取って、出来上がり。
慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。
このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。
今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。

mbedにMicrochip社の12Bits D/AコンバータMCP4922をつないでサイン波を生成してみました。
MCP4922はA,B 2つの出力がありますが、今回はVoutAのみ使用しています。
mbedとのインターフェースはSPIを使用します。MCP4922のSPIクロックは20MHzまでOKですから、簡易計算ですが1クロックは1/20MHz = 50nSで、12bitsですから 50 x 12 = 0.6uS セッティングタイムが4.5uSですから計5uSくらいで変換できそうです。
5uSつまり200KHzでサンプリングできそうですが、プログラムのオーバーヘッドと、Ticker割込みをきりのよい時間間隔でかけたいので、6usとしました。サンプリング周波数は166.667KHzとなります。(ちなみに試してみたところTickerは最小間隔3uSまで可能のようです。)
サイン波の一周期分のデータはOutData[]にあらかじめ計算しておきます。
それを6uS間隔でD/Aコンバータに送ります。
MCP4922をSPIで制御するライブラリがありましたので、利用させていただきました。これを使えば面倒なSPIの信号制御は要りません。
SPIのクロックは20000000(20MHz)にしています。
SPIのSDIはp5、CLKはp7につなぎ、/CSはp8につなぎました。
/LDACはGNDで常時True、/SHDNはVccで常時Falseとしました。
波形は1K, 5K, 10K, 20KHzを観測しました。
1KHzはWaveSpectraのFFTで高調波を観測したところ第二高調波が-40db以下となっています。
5KHzくらいになると階段状見えてきます。オシロのレンジを拡大して見ると、1サンプリング約5uSとなっていてほぼ予想通りです。
See: http://mbed.org/users/jf1vrr/programs/MCP4922_Sinewave/lr3b6b
//プログラム
#include "mbed.h"
#include "TextLCD.h"
#include "MCP4922.h"
MCP4922 MCP(p5, p7,p8); // MOSI, SCLK, CS //<-SPIの信号ピンを指定
TextLCD lcd(p24, p26, p27, p28, p29, p30);
Ticker sampling;
#define PI 3.141593
#define MaxRes 800
/// Global Variables
unsigned int OutData[MaxRes];
unsigned int Maxindex;
unsigned long Fsample;
unsigned long Freq;
unsigned int index = 0;
void GenWave(void) {
unsigned int i;
Maxindex = (int) (Fsample / Freq);
if(Maxindex > MaxRes) {
Fsample = Freq * MaxRes;
Maxindex = MaxRes;
}
for(i=0; i<Maxindex; i++) { //<-サイン波を計算する
OutData[i] = (int)(0xFFF * (1+ sin((2*PI*Freq*i)/Fsample))/2);
}
}
void timer_int(){ //<-6uS間隔で実行される
/// Output to D/A Converter
MCP.writeA(OutData[index]); //<- データをMCP4922のVoutAに出力
index++;
if(index >= Maxindex) index = 0;
}
/**** Main Function ***/
int main(void) {
MCP.frequency(20000000);
lcd.cls();
lcd.printf("MCP4922 Sinewave" );
Fsample = 166667; //<- サンプリング周波数
Freq = 1000; //<- 周波数指定
GenWave();
sampling.attach_us(&timer_int, 6); //<- 6uS間隔でtimer_int()を実行
while(1){
}
}

回路図

コンパイラ画面

1KHz 約167サンプリング

1KHzをWaveSpectraでFFT 第二高調波は-40db

5KHz 約33サンプリング

10KHz 約16サンプリング

20KHz 約8サンプリング
(JF1VRR)