ArduinoとDDS(AD9851)で正弦波発生~周波数可変まで~

以前の記事で、ArduinoとDACを使って正弦波発生する話を書きました。

結局、波形発生器を作ろうとすると、DACの制御では色々うまくいかなそうだったので、より良い策であろうDDS(AD9851)を買って試してみました。

購入したのはAD9851が載っている以下の中華基板です。
http://www.ebay.com/itm/311331205021

秋月なんかで買うより安いですね。

用意したもの

・Arduino UNO
・DDS(AD9851)
・ボリューム(100KΩ Bカーブ)
・抵抗(出力用。ある程度大きければ問題ない。)
・電解コンデンサ(出力のバイアス除去用。)

ボリュームは周波数可変のために使用してます。

接続方法

AD9851をArduinoで扱うためのlibraryがあるようなので、ありがたく使わせていただきました。

以下のサイトで紹介&アップされてます。
http://www.felix.or.jp/MPU/Exp/DDS/AD9851-Arduino.html

libraryそのまま使用するために、ArduinoとDDSは以下に従って接続します。

AD9851 Arduino
————————-
GND GND
VCC 5V
D7 Digital 8
WCLK Digital 9
FQUP Digial 10
RESET Digital 11

ボリュームは以下で紹介した回路図通りに接続します。

出力にはバイアスがかかって出力されるみたいなので、電解コンデンサでバイアスにフィルタかけてます。

回路図外観です。

スケッチ

スケッチは以下です。

ボリュームからの出力は0~5000の間です。

ボリュームからのアナログ値は安定してないこともあり、以下のように100回の平均取ってます。

for(i=0; i<ave; i++) A_in_ave += analogReadVoltage(A0);
A_in_ave /= ave;

周波数を決定する際に、100で割っておくことでさらに安定化させてます。

Freq = (A_in_ave+100)/100;
Freq *= Mult;

A_in_ave+100としてるのは、1~50をアナログ値としてとれるようにするためです。+100しないと0~49になり気持ち悪かったので。

Multを掛けているので、Multの値を変えれば色んな範囲の周波数が生成できます。ファンクションジェネレータでいうレンジに相当するかと思います。

スケッチ例では、Mult=100000としているので、100KHz~5MHzを出力できるようになってます。

Multの値をスイッチ等で切り替えれば、任意の範囲の正弦波出力できます。

あとは、一つ前の周波数(Freq)と異なれば新しい周波数で正弦波出力するようにします。

if(Freq_b != Freq) AD9850.wr_serial(0x01, Freq);

出力結果

100KHz出力の結果(ボリュームを左いっぱいに回す)が以下です。きれいにでますね。

5MHz出力の結果(ボリュームを右いっぱいに回す)が以下です。

シリアルモニタの画面も張っておきます。

ノイズあっても周波数がぶれずに出力できます。

前回検討した方法よりも波形も綺麗だし、高周波も出力できるし、周波数可変簡単にできるしで、良いことずくめですね。

振幅はオペアンプか何かで可変できれば、立派な信号発生器になりそうです。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です