DDS(AD9832)を使った信号発生器(2008年1月)
数年前にアナログデバイセス社からDDS(AD9832)のサンプル貰いましたが、
HPのSGをオークションで入手して以来、ケースに保存していました。
最近、そのSGを処分したのをきっかけに簡単な試験用のSGが欲しくなり、今回の作品を作るに至りました。
    

中写真のピッチ変換基板はGAIA株式会社の製品で以下写真のように、比較的コンパクトに出来ています。
今回の目的には使いませんが、マイコンやメモリーなどでプログラムする場合、
DIP対応の書込器でSMDデバイスに書き込む場合に便利です。
 

出力信号の種類は正弦波、方形波の2種類です。
正弦波出力はOPアンプで10倍のゲインを持たせ、更にトランジスタでバッファを付加して出力しています。
1KHzで約8.7[V]となりました。(右写真)
AD9832からは正弦波しか出ませんが、外付けのコンパレータで方形波を生成しています。
その方形波をHC14でTTLレベルにして出力しています。(写真中)
AD9832は25Mのクロックで12.5Mまでの正弦波を出力できますが、
波形の歪みがあって実用上比較的綺麗な周波数として3M[Hz]までを上限にしています。(写真右)
  

上の左写真にあるパネルは右上のツマミが周波数を上げたり下げたりするエンコーダです。
上げ下げのステップはエンコーダの下にあるタクトスイッチの←→キーで1、10、100、1K、
10K、100Kを選択します。
下の3個のつまみは10KのVRで左から出力ボリューム、オフセット、デューティとなっています。
デューティは方形波の為のパラメータで正弦波には影響ありません。


回路の構成
電源:
12V0.2A×2のトランスから3端子レギュレータで±12Vと+5VのDC電源を構成しています。

マイコンの選択:
周波数からDDSの周波数レジスタへの変換に浮動小数計算をする必要があるため、
少し容量の多いAT90S4433を使いました。作者の手元に在庫が2個しかない貴重なAVRです。
秋月電子でAtmega8を扱って欲しい限りです。
2008年6月現在、mega88が購入できます。

DDSとのインターフェース:
DDSとマイコンの通信は3本の信号線で、マイコンから一方的に送るだけです。
AVRのPC0〜PC2をインターフェースに割り当てています。

LCDとのインターフェース:
周波数の表示や設定ステップの表示をLCDに表示します。
PC3〜PC5を制御線、PB0〜PB3を4ビットデータに割り当てています。

パソコンとのインターフェース:
RS232Cでパソコンからの指令でも周波数を設定できます。
シリアルポートはAVRのPD0(RxD)、PD1(TxD)を割り当てています。
レベル変換にはTIのMAX202を使っています。

エンコーダ入力:
秋月電子で200円売っているEC16Bというインクリメントエンコーダを周波数の上げ下げに使います。
このエンコーダの波形にはチャタリングがあるので、10Kと0.1uでフィルタを通します。
A相の波形の立ち上がりエッジをAVRの外部割り込みにして、その割り込処理内でB相の値を読み取ります。
その値がHまたはLによってCWかCCWかを判断します。
割込処理の中でA相の信号(割込源そのもの)の値が、一定時間程度安定していることを確認するルーチンを入れると、
更にノイズによる誤動作が防げます。

DDS出力の増幅とオフセット:
DDSデバイスからの出力は1V程度なので、作者の用途では振幅が足りないケースが多く、
10倍程度のゲインは欲しいところです。
あまり高い周波数は必要ないので、OPアンプによる減衰はさほど気にならないので、
秋月で入手できる高速OPアンプということでLM6361を使いました。
このOPアンプを使った結果、先の写真にもありますが3M[Hz]程度まではあまり減衰もせず、
そこそこ綺麗な波形が出ています。
出力電圧のDCオフセットも調整したいので、OPアンプの+入力側に±12VをVRで分圧した値を入れます。


方形波の出力:
DDSからは正弦波しか出ないので、ソフトデバッグによく使う方形波に変換する回路を加えました。
正弦波から方形波に変換するのに一番簡単に思いつくのはコンパレータと思いますが、
LM6365という超高速OPアンプのサンプルがあったので、これを使うことにしました。
コンパレータなので、オープンループで使うため発振しにくくブレッドボードなどでも問題なく動作しています。
このLM6365の出力を5Vのツェナーダイオードで電圧を制限し、
HC14でTTLレベルにして出力しています。


開発ソフト
今回の作品も前回の時限タイマー同様WinAVRで作りました。


ソフト構成
キー及びエンコーダ入力:
タイマーカウンタ1のコンペア割込を10mS周期にし、操作ボタンのキーチャタリング除去をします。
最初の変化検出後、20mS変化がなければ安定したキー入力とします。
エンコーダもこの10mSでチャタリグ除去したかったのですが、
素早くつまみをまわすと案外パルスが速いのでA相のHエッジ割込としました。
A相のHエッジ割込でB相の値を読み取り、CWまたはCCWを検出すると、
ステップ値を現在の周波数に加算または減算し、その値をDDSに設定し同時にLCDに表示します。
ステップ値は操作キーの←で桁が上がり、→で桁が下がります。
ステップの種類は1、10、100、1K、10K、100Kです。

DDSへの周波数設定:
AD9832へはSCLK、SDATA、FSYNCという3本の信号線を通して周波数値を設定します。
詳細はアナログデバイセスにあるドキュメントに詳しく出ています。
あるいは、そこからアプリケーションノートに行き、AN−621の「Programming the AD9832/AD9835」
が参考になります。

パソコンから周波数設定:
以下のような手順でRS232Cを通してDDSに周波数値を設定します。
通信フォーマットは8ビットデータ、1ストップビット、パリティ無し、38400BPSです。
周波数セット PC−>DDS 'F' D0 D1 D2 D3 D4 D5 D6
応答 PC<−DDS 'A'

D6〜D0は周波数値のBCDで'F'と'A'はアスキーコードです。


PC側ソフト
簡単なPC側アプリケーションを作りました。
周波数の手動設定、オーディオ帯域の主なプリセット周波数設定、スイープなどが出来ます。



ダウンロード
ファイルの種類 ファイルの形式 コメント
回路図 PDF
プロジェクトファイル WIN−ZIP WinAVR
PC側プロジェクトファイル WIN−ZIP VC2005ネイティブコード
PC側プロジェクトファイル修正版 WIN−ZIP 周波数設定にスピンを追加