AD9834を使ったスイープジェネレータの実験その2
※DDSを使ったスイープジェネレーターの製作で完結しました。(2010-05-09)
アナログ・デバイセズ社のDDS-IC AD9834を使ったスイープジェネレータの実験の続編です。前回はAD9834をコントロールするマイコンとしてPIC18Fを使用しましたが、技量不足でシリアル通信に十分な速度が出ずに納得するスイープ時間が得られませんでした。今回は、より高速なAVRを使用してAD9834を制御してみます。
AVRは、ATmega168を最高クロックの20MHzで使用します。PIC18Fは、外部12MHzを内部PLL4倍で48MHz動作でしたが、最小インストラクション時間は、クロックの1/4となり、12MHzの速度しか出ません。AVRは、供給クロックがそのまま最小インストラクション時間となるため、単純に考えても1.6倍は高速です。
ほぼ同じソースプログラムで実験します。PIC18Fでは、周波数設定に必要な48ビットを転送するのに456μsもかかりましたが、AVRでは、約150μsと期待を上回る速度が得られました。下のキャプチャは、スイープ動作させた時のものですが、今度は、周波数設定間の処理時間(周波数から28ビットのレジスタ値を算出し、14ビットのLSBとMSBの分解)が目立ちます。100μsのインターバルを挿入して279μsなので計算処理に179μsもかかっています。
周波数レジスタの28ビットを求めるには、周波数を最小周波数ステップで除算しています。最小周波数ステップは、 AD9834のクロックは50MHzなので
50*10^6 ÷ 2^28 =0.18626・・・・
と中途半端な数字です。この浮動小数点計算に時間が消費されていると思われます。
FRMSで使用されている秋月のDDSが中途半端な高速クロックで動作していることはWeb等から情報を得ていました。このクロックモジュールは、単品でも秋月電子で扱っています。今回、秋月のWebサイトで、この中途半端な周波数は2の26乗ということが分かりました。・・・ということは、つまり2の乗数で周波数設定するときに計算が単純になるということです。
AD9834は2の28乗なのでこのクロックモジュールを使用すると
2^26 ÷ 2^28 = 0.25
と切りのいい数字になります。0.25での除算は、4倍の乗算と同じなので2進数であれば2ビットの左シフトで計算できます。浮動小数点計算より処理時間が大幅に削れそうです。
ということで、秋月電子から67.10886MHzのクロックモジュールを調達して試してみました。
28ビットの周波数レジスタを求めるプログラムソースも、
data = (double)(freq / 0.186264514);
から
data = freq << 2;
と単純になります。計測すると100μsのインターバルを挿入しても125μsと大幅に高速化することができました。実質計算時間は25μsと約7倍も早くなった計算です。この部分については、試してはいませんが、PIC18Fでも同じように高速化できると思います。
スイープのインターバルを短くすると今度は、周波数設定のシリアル通信150μsが長く感じます。AD9834のシリアルは、最小25nsのクロックで動作するので単純計算でも48ビットのデータ転送に1.2μsしかかからないことになります。つまり、まだまだ時間がかかりすぎています。
C言語のままではこれ以上の高速化は難しいので、シリアル制御部分のみをアセンブラで外部関数として作成して試してみました。・・結果、約42μsと処理を高速化することができました。
また、スイープ時のインターバルをタイマー1の割り込みで処理することで正確で安定したスイープができるようにしました。周波数から28ビットのレジスタ値を計算する25μsとデータ転送の42μsを考慮して最小インターバルを100μsとしました。1秒間に10000回の周波数変更ができることになります。100KHzを1Hz単位でスイープすると10秒かかる計算になります。前回の実験より6倍程度高速化できました。
実験の回路図です。回路図ではATmega88Pとなっていますが、8KのフラッシュをオーバーしたのでATmega168に変更しています。
スペアナでAMラジオ用のクリスタルフィルターを測定してみました。上の直線は、スルーでスイープしたものです。なお、当然ながらスペアナのスイープとは同期していないので肝心な測定時間は大して短縮できません。^^;
DDSのクロックが上がったので最高出力周波数を約1/3の22MHzとしました。20MHz出力時のスプリアスです。ブレッドボードの環境のせいか、DDSクロックのフィードスルーがあります。このクロックのフィードスルーと出力信号のイメージがスプリアスとしてたくさん出ています。ブレッドボード外部にローパスフィルタを接続すればバッサリとカットできることは確認しました。
今回もあまり参考にならないソースプログラムです。基本的に前回のPIC18Fと同じです。単純な信号発生器として使用するシングルモードとスイープジェネレータとして使用するモードを切り替えとしました。スイープのためのインターフェースを多少変更しましたが実験レベルでの使用を想定したものなので、行き当たりばったりで適当な作りとなっています。
*AD9834スイープジェネレーターソースプログラム
シリアル通信部分のあやしいアセンブラも参考までに・・・・・。ループで回さずに単純にずらずらシリアルに書いたほうが早いかもしれません。(ステップ計算してみればわかりますが・・・)
*AD9834シリアル通信アセンブラソース
※アセンブラを一部見直しました。処理内容に変更はありません。(2010-04-06)
2件のピンバック
AD9834を使ったスイープジェネレータの実験 | henteko.org
DDSを使ったスイープジェネレーターの製作 | henteko.org
コメントは現在停止中です。