AD9851でシグナルジェネレータを自作する

AD9851というDDS ICを利用して正弦波発振器を作ってみました。
20Vp-p 2MHzまで出力できるように設計しました。

なぜ、こんなものを作ろうと思ったのかということですが、発振器とオシロスコープを使った周波数特性の解析方法についての記事を見つけたことがきっかけです。

電源制御ループの周波数特性を測る
本稿では、スイッチング電源回路のフィードバック制御ループの利得と位相の周波数特性を測定する手法を紹介する。測定にはネットワークアナライザは使わず、信号発生器とオシロスコープ、トランスを利用して、自らボード線図を描くことで特性を把握する。本稿...

発振器とオシロスコープを用意すれば高価なFRA(周波数特性分析装置)という装置を用意しなくても回路の周波数特性を解析することが可能です。

しかし、電源ループなどに信号注入を行う場合、注入対象の回路GNDと発振器の回路GNDが絶縁されている必要があります。元の記事では絶縁トランスを用いていますが、絶縁トランスの周波数特性が加算されてしまいます。そこで周波数特性の出来るだけフラットな絶縁トランスを用いるのですが、そう言った絶縁トランスは比較的高価という欠点があります。

「いっそのこと発振器ごと絶縁してしまえ」と思って手持ちの部品でシグナルジェネレータを構築することができないか検討してみました。

このシグナルジェネレータを使ってFRAを作る方法については、また別の記事で執筆したいと思います。

※ FRA(周波数特性分析装置)
周波数特性分析器は、正弦波信号を被測定物に与えて、その周波数応答を求める装置で、FRA (Frequency Response Analyzer) と呼ばれています。

周波数特性分析器 - エヌエフ回路設計ブロック
周波数特性分析器は、正弦波信号を被測定物に与えて、その周波数応答を求める装置で、FRA (Frequency Response Analyzer) と呼ばれています。 測定のダイナミックレンジが広いので高精度な測定ができる、超低周波数の測定...

AD9851

アナログデバイセズ社が販売しているDDS ICです。
10bit DAC、6逓倍回路を内蔵しているため非常に綺麗な正弦波を生成することができます。

DDS ICの初期設定後、DDS ICのレジスタに周波数設定値を書き込むだけで正弦波を生成することができます。制御装置(MCU,CPLD)側で正弦波発生に関する制御を常に行う必要はありません。設定さえしてしまえばDDS ICがDACを自動的に制御して正弦波を出力してくれます。

特徴(AD9851データシートより)
〇 選択可能な6×基準クロック乗算器による180MHzのクロック・ レート
〇 高性能10ビットDACとヒステリシス付き高速コンパレータを内蔵
〇 70MHz AOUTでSFDR>43dB
〇 32ビットの周波数チューニング・ワード
〇 パラレルまたはシリアル非同期ローディング・フォーマット

直接出力できる波形は正弦波のみとなっています。内蔵されているコンパレータを用いることで生成した正弦波から矩形波を生成することも可能です。

AD9851データシートおよび製品情報 | Analog Devices
AD9851は、先進のDDS技術を使用し、高速・高性能のD/Aコンバータ(DAC)およびコンパレータを搭載した高集積デバイスです。デジタル・プログラミングが可能な周波数シンセサイザで、クロック生成機能も備えています。正確なクロック源を基準と...

便利な設計ツールも用意されています。特性の確認を行うことが出来て便利ですね。

ADIsimDDS (Direct Digital Synthesis) | アナログ・デバイセズ
ダイレクト・デジタル・シンセサイザ(DDS)IC出力をシミュレーションします。 スプリアス、DACイメージ、高調波を確認できます。

非常に有名なICでネット上に参考となる情報が多いことも特徴です。

電子工作室
AD9833やAD9851など使えるDDS7選と使い方
低い周波数から高い周波数まで出力レベルが一定で歪のない正弦波が、ちょっ~とだけ欲しいだけなんすっけど~・・・DDSは送信機のキャリア発振や受信機の局部発振としてVCOの代わりに、またオーディオのマスター信号生成などファンクションジェネレータ

様々なサイトで使い方について説明されていますが以下にまとめます。

基本回路構成

以下に基本回路構成を示します。AD9851とIV変換用のオペアンプから構成されています。回路図上には記載されていませんが、この回路と合わせてMCUとクロックを供給する水晶発振器が必要になります。

〇制御信号端子(D0~D7,W_CLK,FQ_UD)
DDSをコントロールする制御信号の入力端子です。インターフェースはパラレル、シリアルを選択して利用することが出来ます。通常は配線が少なくなるシリアルモードを選択することが多くなると思います。D0,D1をHi、D2をLoに固定するとシリアルモードが選択されます。

〇リセット端子(RESET)
リセット端子です。DDSをリセットします。

〇出力端子(IOUT,IOUTB)
DDSで生成された信号の出力端子で電流として出力されます。また、出力端子はIOUTとIOUTBの2出力あり、IOUTBはIOUTと180度位相が回った信号を出力します。電圧信号を得る場合には出力に電流-電圧変換回路を設ける必要があります。

〇クロック入力端子(REFCLK)
DDSの基準となるクロックを入力する端子です。このクロックを元に信号生成回路が動作します。

〇出力レベル制御(振幅制御)端子(RSET)
出力レベル(電流値)を設定する端子です。RSET端子に流れる電流によって出力レベルが決まるようになっています。推奨値は3.9kΩとなっており、出力に10mAの電流を流します。この抵抗値又は、流れる電流値を変更することによって出力レベルを可変することが出来ます。今回、製作したシグナルジェネレータでは、定電流回路を設けて電流可変することでレベル調整を行いました。

※空コンパレータの端子も適切に処理する必要があります。基本回路構成では未処理です。

制御方法

制御にはTMS320F28035を用いました。この前作成したTMS320F28035ボードを用いましたが、IOポートで単純にHi/Loを出力しているだけなので、どんなマイコンであっても制御はできると思います。ArduinoやRaspberry Piなんかを使っても問題はありません。

レジスタ構成

40bitのレジスタに値を設定することで動作モード、周波数、位相を設定します。

周波数設定値は以下のように設定します。
周波数設定値 = ( 2^32 ÷ クロック周波数 ) × 出力周波数
ここで言うクロック周波数はREFCLKになります。内部で逓倍回路を経由する場合は6倍になるので注意が必要です。

MCUとの接続は先ほど示した基本回路構成と同様です。今回MCUの通信ペリフェラル(SPI)等は一切利用しません。I/Oポートに接続していればOKです。入力専用ピンに接続しないように…

当初、C2000のSPIを使って制御してみましたが、うまく動きませんでした。要求されるタイミングが少し特殊っぽいためペリフェラルの設定が上手くできなかったようです…

void DdsSerialOut(float Freq){
    unsigned int i;
    unsigned long long DDSdata,BitMask;

    DDSdata = 29.82616178 * Freq;      //2の32乗÷144MHz=29.82616178

    //周波数設定値32ビットを出力する
    BitMask = 0x01; //ビットマスクの初期設定
    for(i=0; i<32; i++){
        if(DDSdata & BitMask){
            GpioDataRegs.GPASET.bit.GPIO16    = 1;
        }
        else{
            GpioDataRegs.GPACLEAR.bit.GPIO16  = 1;
        }
        GpioDataRegs.GPASET.bit.GPIO18      = 1;
        GpioDataRegs.GPACLEAR.bit.GPIO18    = 1;
        BitMask = BitMask << 1; //ビットマスクのビットシフト
    }

    //制御設定値8ビットを出力する
    //基準クロック乗算器 ×6設定
    BitMask = 0x01; //ビットマスクの初期設定
    for(i=0; i<8; i++){
        if(0x01 & BitMask){
            GpioDataRegs.GPASET.bit.GPIO16    = 1;
        }
        else{
            GpioDataRegs.GPACLEAR.bit.GPIO16  = 1;
        }
        GpioDataRegs.GPASET.bit.GPIO18      = 1;
        GpioDataRegs.GPACLEAR.bit.GPIO18    = 1;
        BitMask = BitMask << 1; //ビットマスクのビットシフト
    }
    GpioDataRegs.GPASET.bit.GPIO17      = 1;
    GpioDataRegs.GPACLEAR.bit.GPIO17    = 1;
}

電流-電圧変換回路(I-V変換回路)

AD9851の出力は、電流出力となっています。したがって電流出力を電圧出力に変換する回路が必要になります。データシートでは抵抗に電流を流してI-V変換を行う方法が記載されています。ただ、この方法だと出力インピーダンスが比較的大きくなってしまうという問題があります。そこで今回はオペアンプを用いたI-V変換回路を出力段に設けることにしました。

AD9851の出力は、負荷のインピーダンスが対称になるように設定することが推奨されています。どちらの経路も200Ωの抵抗を経由するようにして、インピーダンスが一致するようになっています。

10mAp-pの電流を2Vp(4Vp-p)の電圧に変換します。

ここまでで、AD9851を動作させることが出来るようになりました。次の記事では、実際のシグナルジェネレータの構成について説明していきたいと思います。

コメント