AD9850 DDSモジュールをArduinoでコントロールする実験

2015年2月 JH7UBC


サインスマートのAD9850 DDSモジュールを購入しました。(Amazonで1980円でした)
クロック125MHzで正弦波0〜40MHzを発生させることができます。
このモジュールを選んだのは、安価なのとArduinoにはAD9850のライブラリがあるからです。
このモジュールをArduinoでコントロールする実験を行いました。

表面

裏面

AD9850 DDSをコントロールする方法は2つあります。
一つは、データを1バイト(8ビット)ずつパラレルに5回送る方法です。
もう一つは、8バイト(40ビット)のデータをシリアルに送る方法です。
今回は、シリアルで送ることにします。
この場合、下の図のようにArduinoとAD9850 DDSモジュールを接続します。
Arduinoのどのピンを割り当てるかは任意で、スケッチ上で指定します。
正弦波の出力はZOUT2です。

実際の配線の様子です。実験ですので、ブレッドボードを使い、ジャンパーワイヤで接続しています。

1MHzを発生させています。(最小桁は、誤差の範囲)

発生させた1MHzの波形です。

では、どのようにプログラムするのでしょうか。
EF_AD9850というライブラリを利用することにより、簡単に制御することができます。
まず、EF_AD9850ライブラリを、ArduinoのWeb PageのForumのここからダウンロードします。
次にダウンロードしたライブラリをArduino IDEのライブラリに追加します。
追加する具体的な方法は次のとおりです。。

Arduino IDEを起動し、 「スケッチ」→「ライブラリを使用」→「Add Library」で、EF_AD9850をライブラリに追加します。
追加したライブラリが保存される場所は、ドキュメントの「Arduino」というフォルダの中の「libraries」というフォルダの中です。
これで準備OKです。さっそく、サンプルプログラムをコンパイルしてみまると、、「WProgram.h: No such file or directry」というエラーが出ました。
この問題の解決法をWebで探すと「SDRでBCL」というブログに解決法がありました。(オーナーさん Thanks)

 ドキュメント Arduino librariesの中にある「EF_AD9850.h」を開きます。
(テキストファイルですから、メモ帳で開けます) ここに記載されているスクリプトの
#include "WProgram.h" を #include "Arduino.h"に書き換えます。これでOKです。
AD9850 DDSを動かすスケッチの例です。
#include <EF_AD9850.h>
EF_AD9850 AD9850(9,10,11,8) //CLK ,FQ_UP,RESET,DATAの順にArduinoのピン番号を記載

void setup()
{
 AD9850.init();//AD9850の初期化
 AD9850.reset();//AD9850リセット
}

void loop()
{
 AD9850.wr_serial(0x00,7000000); //周波数(7000000Hz)をセット
 

 一応希望の周波数を発生させることができましたので、7MHzのVFOを作ってみました。
周波数は、A0の電圧で変わります。A0は0から5Vの電圧を0〜1023の数値で読みとります。
この数値を100倍して、7MHz(7000000Hz)に加えた周波数を発生させることで、
7.000000Hz〜7.102300まで可変できるVFOが出来ます。

回路図です。周波数は、LCDに表示します。DDSの出力に簡単なバッファをつけました。

実験したブレッドボードです。一番下が周波数を変えるボリュームです。

参考までにスケッチです。

7MHz ダイレクトコンバージョン受信機にVFOの代わりにDDSを接続してみました。
アナログVFOと同じように受信できました。
ただ、LCDからのノイズでしょうか、若干ノイズが増えたような気がします。
また、100Hzステップではチューニングがやや荒く感じられます。

inserted by FC2 system