高性能DDSチップを使った正弦波発振器


【概要】

 アナログデバイス社が開発した高性能DDSチップである、「AD9851」が入手
できたので、試作も兼ねてPIC18F2320と組み合わせた正弦波発振器を作成
してみました。
ボードレベルの試作ですが、クロック120MHzで30MHz程度までは、実用に
なりそうな正弦波が出力されることが確認できました。
クロックを最高の180MHzにすれば45MHz程度まで実用可能になることになります。
また、100kHz以上まで10ビット分解能で正弦波を出力できますので、オーディオ
帯域での発振器としても、十分実用になるものができそうです。


【全体の構成】

 この正弦波発振器のボードレベルの内部構成は、下図のようになっています。
PIC18F2320を中心にして、パソコンとRS232Cで接続してパソコンからコマンド
を送受信できるようにしています。
さらにDDSを1ビットシリアルでPICと接続して、40ビットのシリアル接続でDDSを
制御しています。
またDDS用クロックとしては20MHzの小型IC組み込みの水晶発振器を使いました
ので、最大120MHzの動作ということになります。ここには30MHzまで使用可能です。
あとは、ロータリースイッチを接続予定のスイッチコネクタと、液晶表示器を接続
できるコネクタを用意しました。
電源には5Vの3端子レギュレータを使いますが、電流が100mA近く流れますので
1A用の7805タイプで、ケースに納めるときは放熱器を付けた方が良いでしょう。
PICのプログラム書き込み用ICSPには、モジュラージャックを使いましたが、
小型にするときには、コネクタを小型のものに変更した方が良いでしょう。






【AD9851の概要】

このAD9851はクロックが180MHzという高い周波数で動作しますので、単純に
考えても、1/4の周波数である45MHz程度までは正弦波が出力できると考え
られます。
 また、180MHz/1024=175kHz以下の周波数までは、10ビット分解能の正弦波
になりますから、非常にきれいな歪の少ない正弦波の信号が期待できます。

 チップは下記写真と図のような小型のSSOPパッケージですので、基板への
はんだ付けにちょっとテクニックが必要ですが、フラックスを使うことで意外に
簡単にはんだ付けができました。
 これから多ピンの小型フラットパッケージのものが多くなりますが、この方法
ではんだ付けできることが判ったので、自信を持って電子工作が進められます。
詳しくは、「フラットパッケージのはんだ付け」のページにテクニックをまとめて
おきましたので参考にして下さい。






 アナログデバイス社の高性能DDSデバイスである「AD9851」の仕様は、
下記のようになっています。
この仕様から判るように、D/A変換後のアナログ出力のスプリアスが
非常に小さいので、低い周波数で使う分には後段のローパスフィルタが
無くても問題無いレベルです。

・クロック     最高180MHz@電源5V  125MHz@電源3.3V
           (内部で6倍にできるので、外付けクロックは30MHz)
・D/A変換    分解能10ビットで70MHzまで動作
           (最大出力電流10mA)
・スプリアス   アナログ出力で20MHz以下のとき 50dB以上
 (SFDR)     (狭帯域(±200kHz)では80dB以上)
・コンパレータ内蔵
          正弦波から矩形波に変換するためのコンパレータ
・周波数設定  設定分解能32ビット
           (180MHzのとき0.04Hzの分解能で設定可)
・外部I/F     8ビット×5ワードパラレルまたは40ビットシリアル

・位相制御    360度を32等分した位相差を設定可能

・電源       2.7V〜5.25Vで動作  消費電力は最大555mW


内部構成は下図のようになっています。まず基本となるDDSブロックがあり
ここで作成された10ビットの正弦波データが10ビットD/A変換器でアナログ
データに変換されて出力されます。

 外部からの周波数設定は、8ビットパラレル×5ワードの構成で行うか、
40ビットシリアルで行う2通りの方法ができます。
この他に、高速アナログコンパレータが内蔵されていて、出力されるアナログ
正弦波から、CMOSレベルの矩形波に変換する機能を持っています。
クロックジェネレータとして使う場合に重宝します。





【インターフェース仕様】 

 今回はAD9851とはシリアル接続としましたが、このシリアル接続で送信
する信号フォーマットは下記のようになっています。
つまり、1ビット毎にデータを出力したらW_CLK信号をパルス出力するという
ことを40ビット分繰り返した最後に、FQ_UD信号をパルス出力して周波数を
更新するというようにします。
W_CLKとFQ_UDの最小パルス幅はそれぞれ3.5nsec、7nsecと非常に高速で
も受け付けますので、命令でパルスを連続して出力しても何ら問題無く動作
します。
このときのDATA信号はデータバスの最上位ビットであるD7に入力します。





 しかし、このシリアルインターフェースで接続するためには、モード変更をする
必要があります。というのは、マスタリセット後は、AD9851はデフォルトでは
パラレルインターフェースになっているためです。
そこで、このシリアルモードにするために、下記の手順でモード変更を行います。

(1) マスタRESETでAD9851を初期化する
  これでどのような状態の時でも初期化されてパラレルモードになる。
(2) パラレルモードでコマンドを送信してシリアルモードにする
  1バイトのデータだけ送信する。
(3) シリアルモードで40ビットの周波数設定値と制御データを送信する。

まず(1)のマスタRESETを行うには、下記のように最小5クロック幅のRESET信号
を加えます。今回は念のため、プログラムで1μsecのRESET信号を加えています。




次が、パラレルモードでのシリアルモード設定コマンドの送信なのですが、この
シリアルモードへの設定コマンドは、下図のように、最初の8ビットワードで、
「xxxx x011」を送信してから、FQ_UDパルスを送信すれば設定されるように
なっています。





 このデータを送信するには、1バイトデータで固定でよいので、データバスの
8ビットを固定で下図のように接続してしまいます。
シリアルモードの時には、データバスはD7だけしか使いませんので、これで問題無く
設定が可能になります。





このあと、シリアルモードで40ビットの周波数設定データと位相制御データを送信
しますが、そのときのビット順序は下記のようにします。
つまり32ビットの周波数設定値の下位ビットから順次送り、その後に制御データを
8ビット送信します。この8ビットの制御データは、下記のようになります。

W32 クロック6倍モード指定  0でX1倍  1でX6倍
W33 常に0(これを1にするとシリアルモード設定制御になる)
W34 省電力モード  0で通常  1で省電力モード
W35ーW39 位相制御データ 360度を32等分した位相設定になる




【周波数の設定方法】

周波数を設定する32ビットの制御データは、下記式で求めることができます。

 出力周波数 = (設定値 × クロック周波数)÷2の32乗

従って

 設定値 = (2の32乗÷クロック周波数)×出力周波数  となります。

例えばクロックが120MHzの場合には、

 設定値 = 35.791394 × 出力周波数(Hz)    となります。



【回路構成と外観】

上記構成による回路図は下図のようにしました。
左側から定番のRS232Cインターフェース、PIC18F2320、それと今回試用のAD9851と
並んでいます。コンパレータ部分は今回はコネクタに端子だけ出していますが、いろいろ
な使い方があるかと思います。クロック整形用、周波数カウンタ用などなどです。

基板単体での試作なので、放熱対策や、外部接続のことはあまり考えていません。
また出力にはローパスフィルタがあった方がよりきれいな信号になります。
さらに出力インピーダンスについても用途に合わせて決める必要があるでしょう。

PICのプログラミング用にICSPができるよう、6極のモジュラージャックを設けました。





 組み立て完了後の外観は下記写真のようになっています。 特にAD9851は
基板のパターン面に直接はんだ付けです。
ICのピンのパターンが15milという細さなので、はんだ付けには、ちょっとテクニック
が必要ですが、「フラットパッケージのはんだ付け」のページにテクニックをまとめて
おきましたので参考にして下さい。


全体の外観
レギュレータの実装位置がまずいので
修正が必要、放熱板を取り付け可能に
する必要があります。

右上が20MHzの小型発振器
左下のモジュラージャックがICSP用


はんだ面に実装したAD9851本体
0.026インチピッチは相当に狭い感じがするが
意外とはんだ付けはやさしい。詳しくは
フラットパッケージのはんだ付け」を参照。


 


下記から、本DDSボードの回路図とパターン図がダウンロードできます。
いずれもIVEX社のWinDraftとWinBoard用のファイルです。

  ★ 回路図ファイル
  ★ パターン図ファイル



【プログラム】

 テスト用のプログラムですので、簡単な機能に限定しました。
パソコンから周波数データを10進ASCIIコードで送ると、その周波数の正弦波を
出力するという単純機能です。

 ちょっと考えなければならないのが、周波数値から設定値を求める計算です。
結果を32ビット整数で求める必要があるのですが、周波数計算は浮動小数で
計算する必要があります。
そこで、これらを簡単に済ませるため、C言語を使うことにしました。C言語なら
この辺りは何も問題無くできてしまいますので楽にプログラムが作成できます。

C言語で作成した、AD9851への周波数設定出力関数の部分は、下記リストの
ようにしました。
まず、関数の引数で与えられる、10進浮動小数の出力周波数値(Freq)から、
浮動小数の乗算で設定値の浮動小数値を求めています。(Para) この値を
32ビット符号なし整数値に単純に型変換して設定出力値(Phase)を求めています。

さらに、AD9851のマスタクロックに使った20MHzの発振器の周波数誤差を補正する
ため、周波数計算のところの定数35.79139を変更して、35.79157としています。
これで、発振器の周波数誤差を補正して正確な周波数の正弦波を出力できるように
なります。

この求めた32ビットの周波数設定値をシリアルに下位側から順番に送信します。
このとき4桁のINT32型と1バイトのINT型配列をUNIONにして、1バイトづつ順番
に取り出せるようにしています。

最後に制御データ0x01を8ビットのシリアル信号として出力し、最後にFQ_UDパルス
を出力すれば、そこで周波数が設定され動作開始します。






下記からこのテストプログラムのソースファイルがダウンロードできます。

  ★ NewDDSソースファイル





   目次ページへ