写真1 AD9833 DDS MSOP 0.5ピッチ 変換基板に乗せる

 

それはさておき、

 

このチップは10ピンのMSOPで、写真にようにピンセットの先ほどの大きさです。

 

変換基板に取り付けましたが、ピンのピッチは0.5なので、半田付けにはちょっと技術が必要です。

 

まずチップをゲルタイプの瞬間接着剤で正確な位置に仮止めしておきます。

 

フラックスをほんのわずか塗って、すべてのピンにわざとまたがるくらい半田を盛ります。

 

半田吸い取り線で、余分な半田を吸い取って、出来上がり。

 

慣れれば簡単ですが、最初は数個パーにする覚悟がいります(笑)。

 

このDDSは、マスタクロック(MCLK)周波数は最高25MHzで、その場合最高発振周波数(ナイキスト周波数)は12.5MHzとなり、分解能は0.1Hzです。

 

今回は手持ち部品の関係で、20MHzのクリスタルを使用したので、10MHzまでのプログラマブルオシレータとして、実験してみました。この場合の分解能は約0.075Hzです。

mbed AD9834 DDS

投稿日 2011/07/15

アナログデバイセズ(AD)のDDS AD9834BRUZを動かしてみました。

mbed_AD9834_dds_.jpg

DDSはPLLに並んで任意周波数を得るために便利な方法です。

 

ADのDDSにはいくつか種類がありますが、以前からおもちゃにしていたAD9851やAD9835はことごとく昇天させてしまい、手持ちが無くなってしまいました。そこで久しぶりにAD9834を入手し、波形発生を試みてみました。AD9834の通販は何店かありますが、今回はRSオンラインを利用しました。RSオンラインは企業対応と言いながらも個人の少量注文にも親切に対応してくれます。送料も安く良心的です。今回入手したのはAD9834BRUZですが、注文手配になりますがCRUZ(マスタクロック75MHz)も入手可能のようです。

mbed_AD9834_dds_chip.jpg

AD9834の実験は、多くサイトに散見されますので、目新しいことは何もありませんが、

 

mbedからコントロールし、0Hzから16MHzまでを1Hz間隔でスイープさせて、その実行時間を測定してみました。

 

AD9834は比較的省電力で、周波数レジスタが2つ用意されているため、アマチュア無線のトランシーバを作成する場合、送信側と受信側の必要発振周波数を瞬時に切り替えることができるため、自作トランシーバに利用する方も多いようです。

 

今回は単なるスイーパーということで、マスタクロック48MHz(50MHzまで使えるが手持ちが無かった)とし、その1/3である16MHzまでを発振させました。

 

AD9834の場合、周波数を指定するレジスタは28ビット長なので、1Hz当たりの設定値は2^28/48000000 = 5.592405となります。これに目的の周波数を掛けた値を設定すれば、その周波数の出力が得られることになります。

mbed_AD9834_dds_1MHz.jpg

1MHzの波形

 

Fout = 5.592405 x f

 

f = 1MHzの場合は、5592405を設定することになりますが、レジスタが上位14ビットと下位14ビットにわかれています。

 

5592405は16進で555555Hですから、2進では0101010101010101010101010101B
下位14ビット01010101010101
上位14ビット01010101010101

 

これの先頭に2ビット制御ビットを加えて16ビットにして設定します。

 

mbedとの接続は3本の制御線(FSYNC, SCLK, SDATA)で行います。SPIを使用するまでもないので、簡単に各制御信号をmbedのDigitalOutに対応付けて、レベルとタイミングをソフトウェアで制御しています。

 

プログラムはだれが作っても同じようなものになりますが、なるべく速度優先でコーディングしてありますので、多少冗長です。(アセンブラで組むのが一番ですが)

 

出力には18MHzのローパスフィルタを入れてあります。

 

計測の結果は、

 

0 - 1MHzスイープ 約11714698uS  12秒くらい
0 - 16MHzスイープ 約188468653uS 3分8秒くらい

mbed_AD9834_dds_kairozu.jpg

回路図 ベースボードにStarBoard Orengeを使用



 

/*AD9834 DDS Test 2011/07/14 MLabo*/
#include "mbed.h"
#include "TextLCD.h"

 

TextLCD lcd(p24, p26, p27, p28, p29, p30);
DigitalOut FSYNC(p18);
DigitalOut SCLK(p19);
DigitalOut SDATA(p20);

 

Timer timer;

 

void serial_out(uint16_t data) {

 

FSYNC = 0;
data & 0x8000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x4000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x2000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x1000? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0800? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0400? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0200? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0100? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0080? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0040? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0020? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0010? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0008? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0004? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0002? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
data & 0x0001? SDATA = 1 : SDATA = 0; SCLK = 0; SCLK = 1;
FSYNC = 1;

}

 

int main() {
float SetFreq;
uint32_t temp, freqdata;
uint16_t Uptemp, Lowtemp;
int begin, end;

SCLK = 1;
SDATA = 0;
FSYNC = 1;

lcd.cls();
lcd.locate(0,0);
lcd.printf("AD9834 test" );

timer.start();
begin = timer.read_us();
for ( freqdata = 0; freqdata < 16000000; freqdata++) {

 

SetFreq = 5.592405 * (uint32_t)freqdata;
temp = (uint32_t)SetFreq;
Lowtemp = (uint16_t)(temp & 0x3FFF);
Uptemp = (uint16_t)((temp/16384) & 0x3FFF);
serial_out(0x2028);
serial_out(Lowtemp + 0x4000);
serial_out(Uptemp + 0x4000);

}
end = timer.read_us();
lcd.locate(0,1);
lcd.printf("%duS", end - begin);
while (1) {}

}

 

参考: 後閑 哲也著 PICで楽しむ USB機器自作のすすめ 
     AD9834を使ったスイープジェネレータの実験



 

(JF1VRR)