低い周波数から高い周波数まで出力レベルが一定で歪のない正弦波が、ちょっ~とだけ欲しいだけなんすっけど~・・・
DDSは送信機のキャリア発振や受信機の局部発振としてVCOの代わりに、またオーディオのマスター信号生成などファンクションジェネレータの端くれ的な使い方として、電子工作の間でも応用範囲は広いです。
今やDDSには多くの品種がありますが、実験用などではなく電子機器向けのデバイスとして開発されているため、電子工作派には豪華すぎたり扱いにくいのも多いですよね。
そんな中から、電子工作派にも扱いやすいDDSをセレクトし、その特徴や使い方をサクッとご紹介します。
DDSで正弦波を作る方法
正弦波生成の原理
DDSで正弦波を作る原理。数値形式で表されたSIN波のデータを、DACでアナログに変換して出力します。数学的に計算された値に基づくので理論的には歪はありません。
でも連続的な信号ではないので、こんな感じでガタガタな形をしています。これが高調波成分になります。
この高調波成分は、マスタークロックと出力周波数の比が小さければ小さいほど大きくなります。どんな成分がどのくらい出るかは後述。
このガタガタは、ローパスフィルタを通すとなめらかになります。
理論的にはマスタークロックの1/2の正弦波がDDSから出力できますが、これだと方形波になるのでローパスフィルタが大変!現実的には、せめて1/4以上の比率で考えた方が良さそうですね。
例えば、クロックが20MHzなら作れる正弦波は5MHz以下を目安にします。
なお、この1/2という最低限の周波数は「ナイキスト周波数」と呼ばれていて、サンプリングの話になると必ず登場する有名な定理です。
AD9837で16.384MHzから4MHzの正弦波を出力した実際の波形。「これって正弦波?」って思うような形してますが、これでもローパスフィルタを通すとちゃんと正弦波になります。
AD9833で25MHzから1KHzを出力した波形。こうなると普通フィルタは不要です。
基本の構成
DDSチップ単品だけではなく、周りのお膳立ても必要です。
必要な手順
普通はオシレータを使います。各DDSで最大周波数が決まっているのでそれ以下の周波数にします。(普通は最大で使う)
また、クロック周波数で次のことが決まります。
・高いほど高調波成分が減る。
・低いほど指定可能な出力周波数の分解能が上がる。
なお、保証外になりますが多少のオーバークロック(120%とか)でも一応動作します。
デカップリングやパスコンを配置するのがメインなのでわりと簡単です。
DDSの出力から高調波成分を取り除きます。無視できる時は不要です。
PICなどのマイコンやarduinoなどを用意して、主にシリアルで通信します。
DDSに対して出力周波数などを指示します。レジスタに値を設定するだけです。
電子工作で使えるDDS
使えるDDSチップ
DDSといえば今のところアナログデバイセズの独壇場みたいになってます。他のメーカーのもないこともないですが、使いにくいし入手性も悪いですね。
現在(2018年2月)アナデバから出ているDDSは31品種で、電子工作でよく使われたり使えそうなものは7品種、それ以外は高機能多ピンものとかになります。
ダイレクト・デジタル・シンセサイザ | アナログ・デバイセズ
製品番号 | Clock | MP | Package | 備考 |
---|---|---|---|---|
AD9833 | 25MHz | × | 10pin MSOP | 周辺回路が簡単。 現在のところ最も扱いやすい。 |
AD9837 | 16MHz | × | 10pin LFCSP | AD9833と基本は同じで ClockとPackageだけが異なる。 |
AD9851 | 180MHz | ○ | 28pin SSOP | 6逓倍のマルチプライヤを内蔵、 30MHzのクロック入力で済む。 |
AD9850 | 125MHz | × | 28pin SSOP | AD9851の前身。 マルチプライヤがなく低Clock。 |
AD9834 | 50MHz | × | 20pin TSSOP | 電子工作でも良く使われる。 少し前の品種。 |
AD9835 | 50MHz | × | 16pin TSSOP | AD9832のクロックアップ版。 その代わり電源は5Vのみ。 |
AD9832 | 25MHz | × | 16pin TSSOP | 少し前の品種。 基本的でわりと扱いやすい。 |
DACは全て10ビットなのでキレイな波形が作れます。12ビットや14ビットの品種もありますが多ピンで面倒。高性能なファンクション・ジェネレータなどを作るわけでもない限り普通はそこまで要らないでしょう。
オススメなのは、わりと新しいAD9833、ハンダ付けしやすいAD9832、もっと高周波ならAD9851あたり。古株のAD9834も電子工作の間では良く使われているようです。
アナデバのADIsimDDSツールがこれまた便利
アナデバでは、これらのDDSを評価・設計するためのWebベースのツールを公開しているんですが、これがかなり便利なので紹介しておきます。
ADIsimDDS
品種を選んで、目的の周波数を入れると、レジスタへの設定値を計算してくれます。さらに、不要な高調波のスペクトラムを表示してくれたり、フィルタを使った時のシミュレーションまでしてくれるので設計が楽になります。
変換基板
変換基板があるとプリント基板を自作しなくてもチップ単体で使えます。
SSOP/TSSOP 16 変換基板 SOとSSOPとTSSOPとDIPの16ピンが変換できる安価な変換基板。 |
SSOP/TSSOP 28 変換基板 SOとSSOPとTSSOPとSOICとDIPの28ピンが変換できる変換基板。20ピンでもOK。 |
MSOP 10 変換基板 MSOPとDIPの10ピンが変換できる変換基板。5枚入りです。 |
より詳しく⇒プリント基板の自作!感光基板を使った作り方で簡単製作
DDSモジュール
DDSチップとオシレータやパスコンなど、基本的な回路が小さな基板上に組み込まれているものです。ピンヘッダがついているのでブレッドボードに刺し、PICやarduinoを使って実験とかもできます。
ただし、これらの基本的モジュールにはちゃんとしたローパスフィルタが付いておらず、高い周波数を出力すると高調波が目立って出てきますので心得ておきましょう。
AD9833 DDSモジュール チップ単品で買うより安いお得なAD9833モジュール。25MHzオシレータを内蔵しているので後はマイコンをつなぐのみ。 |
AD9833 DDSモジュール 基本回路がしっかり組み込まれたAD9833モジュールで電源LEDも付いています。出力にはSMAコネクタを取り付けられます。 |
AD9851 DDSモジュール AD9851の機能を試せるように作られているモジュール。30MHzの発振器が付いているので6逓倍した180MHzで動かせます。 |
AD9850 DDSモジュール AD9850の機能を試せるように作られているモジュール。3種の波形が出力可能。125MHzの発振器と電源LED付きです。 |
AD9834 DDSモジュールキット AD9834のモジュールキット。キットなのでハンダ付けする必要がありますが、事前に詳しい情報が得られるので安心です。 |
上の一覧表にあってここにないDDSのモジュールは、販売されていなかったり販売終了になっていて、今のところ手軽に買えるようなものは無いようです。
AD9833 DDSモジュールの使用例
上で紹介している AD9833 モジュール をブレボで使う例です。
回路図はこれだけです。モジュールにはパスコンも含めて基本パーツが実装されているので、ちょっと動かすだけなら追加の部品は不要。必要に応じてフィルタを追加します。
この例では、PICに PIC12F1822 を使っていますが、他のPICでも使えます。
周波数設定のソースはこんな感じ。設定値は後述の計算式で求めますが、ADIsimDDSを利用すると簡単です。完全なソースはこの main.c のみ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | // ●メイン void main(void) { // ポート初期化 ~ 略 ~ AD9833_Reset(); // 周波数設定 //AD9833_SetFreq(0x51EB852); // 8MHz //AD9833_SetFreq(0x28F5C29); // 4MHz //AD9833_SetFreq(0x147AE14); // 2MHz AD9833_SetFreq(0x0A3D70A); // 1MHz //AD9833_SetFreq(0x04A8C15); // 455KHz // 出力開始 AD9833_Start(FALSE); for(;;); return; } // ●AD9833周波数設定 static void AD9833_SetFreq(DWORD dwVal) { AD9833reg_t Reg1, Reg2; Reg1.wValue = dwVal & 0x3FFF; Reg2.wValue = dwVal >> 14; // FREQ 0/1 交互に利用する if (AD9833.FSEL == 0) { // FREQ1へ書き込む AD9833.FSEL = 1; Reg1.D15 = 1; Reg2.D15 = 1; } else { // FREQ0へ書き込む AD9833.FSEL = 0; Reg1.D14 = 1; Reg2.D14 = 1; } AD9833_Send(Reg1.wValue); AD9833_Send(Reg2.wValue); // FREQ0/1切り替え AD9833_Send(AD9833.wValue); } |
電源電圧は2.3Vから5.5まで使えて、どの電圧でも600mVppの正弦波を出力します。
3.3Vの時の消費電流は10mAでした。
各DDSの特徴と使い方
使い方としてはそんなに大差はなく、どれも似たような感じです。
※こちらで掲載する内容は参考情報です。正式にはメーカーの公式情報でご確認ください。
AD9833の特徴と使い方
・パッケージ:10ピンMSOP
・電源電圧:2.3~5.5V
データシート
周辺回路は基本的にパスコンだけ。
VOUT端子に入っている22pFのコンデンサは、AD9833の出力抵抗(約200Ω)を利用したローパスフィルタとなっており、カットオフ周波数36MHzで不要な高調波成分を取り除きます。ただ、電源OFF時にチップ側への放電があるので、あまり大きな容量にしてはいけません。ちなみに、評価ボードの回路では0.1uFと書かれていますが誤りです。
通信ワードは16ビット単位です。DDSとの通信プログラム-3線式シリアル
AD9833は4つのレジスタを持っていて、どれに対する書き込みかをD15とD14ビットで指定します。
D15 | D14 | レジスタ |
---|---|---|
0 | 0 | コントロールレジスタ |
0 | 1 | 周波数レジスタ0(28ビット) |
1 | 0 | 周波数レジスタ1(28ビット) |
1 | 1 | 位相レジスタ0/1(D13で0か1を指定) |
コントロールレジスタのRESETビットを操作することで、リセット状態と動作状態を切り替えます。パワーオン直後はまず、RESETビットを「1」にした値をコントロールレジスタに書き込みます。その後、周波数レジスタに目的の設定値を書き込んで、RESETビットを「0」にした値をコントロールに書き込むと動作を開始します。
周波数レジスタは2つありますが、好きな方に切り替えて使います。無理に両方使わずとも、片方だけ使っても良いです。
周波数レジスタにの設定値は、下記の式で計算します。
位相レジスタに値を書き込むことで位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
AD9837の特徴と使い方
・パッケージ:10ピンLFCSP
・電源電圧:2.3~5.5V
データシート
周辺回路は基本的にパスコンだけ。
VOUT端子に入っている22pFのコンデンサは、AD9837の出力抵抗(約200Ω)を利用したローパスフィルタとなっており、カットオフ周波数36MHzで不要な高調波成分を取り除きます。ただ、電源OFF時にチップ側への放電があるので、あまり大きな容量にしてはいけません。ちなみに、評価ボードの回路では0.1uFと書かれていますが誤りです。
通信ワードは16ビット単位です。DDSとの通信プログラム-3線式シリアル
AD9837は4つのレジスタを持っていて、どれに対する書き込みかをD15とD14ビットで指定します。
D15 | D14 | レジスタ |
---|---|---|
0 | 0 | コントロールレジスタ |
0 | 1 | 周波数レジスタ0(28ビット) |
1 | 0 | 周波数レジスタ1(28ビット) |
1 | 1 | 位相レジスタ0/1(D13で0か1を指定) |
コントロールレジスタのRESETビットを操作することで、リセット状態と動作状態を切り替えます。パワーオン直後はまず、RESETビットを「1」にした値をコントロールレジスタに書き込みます。その後、周波数レジスタに目的の設定値を書き込んで、RESETビットを「0」にした値をコントロールに書き込むと動作を開始します。
周波数レジスタは2つありますが、好きな方に切り替えて使います。無理に両方使わずとも、片方だけ使っても良いです。
周波数レジスタにの設定値は、下記の式で計算します。
位相レジスタに値を書き込むことで位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
AD9837の評価基板を自作した時のハンダ付け方法を紹介します。裏面にエクスポーズドパッドが付いているので難易度は高いですが、一応ちゃんとできます。
自作のAD9837評価基板。
練習のためのパターンも一応用意しましたが、一発でできたので使いませんでした。
裏面にあるエクスポーズドパッドをグランドに接続する必要があるんですが、これが厄介。
まず、これに予備ハンダをします。
基板側にも予備ハンダをしておきます。盛りすぎるとショートの原因になるので注意。
ちょっとだけフラックスを塗っておくと、AD9837を接着しておけるのでやりやすくなります。
十分にコテを押し当ててハンダを溶かし、ピンセットで上から押さえつけるとパッドとその下のパターンがハンダ付けされます。ポイントは十分に加熱すること。
AD9851の特徴と使い方
・パッケージ:28ピンSSOP
・電源電圧:2.7~5.25V
データシート
この回路ではシリアル通信を想定しており、データシートでの指示通り、D0=1、D1=1、D2=0、D3~D6は未使用としています。
RSETに接続する抵抗は最大出力電流を決定します(最大30mA以内)。最大出力電圧は、その電流値と負荷抵抗値を掛け合わせて求まります。
また、IOUTとIOUTBに接続する負荷抵抗は、なるべく同じになるようにします。
コンパレータを使わない時は、入力をVDD/GNDへ接続して暴れないようにします。
通信ワードは40ビット単位です。DDSとの通信プログラム-ローディング方式
電源投入とマスターリセット直後はパラレルモードで起動するため、シリアルモードで使う場合は、まずシリアルモードへ移行させるための手順が必要です。
1. マスターリセット(5クロックサイクル以上)を行う。
2. xxxxx011(1バイト)を送信する。
以降、40ビットのシリアルデータを送信すると設定通りに動いてくれます。
W0~W31 | 周波数設定値(下位ビットから) |
---|---|
W32 | 1にすると6逓倍マルチプライヤ有効 |
W33 | 常に0 |
W34 | 1にするとパワーダウンモードへ移行 |
W35~W39 | 位相設定値(不要なら0) |
周波数の設定値は、下記の式で計算します。
位相設定値により位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
AD9850の特徴と使い方
・パッケージ:28ピンSSOP
・電源電圧:3.3~5V
データシート
この回路ではシリアル通信を想定しており、データシートでの指示通り、D0=1、D1=1、D2=0、D3~D6は未使用としています。
RSETに接続する抵抗は最大出力電流を決定します(最大30mA以内)。最大出力電圧は、その電流値と負荷抵抗値を掛け合わせて求まります。
また、IOUTとIOUTBに接続する負荷抵抗は、なるべく同じになるようにします。
コンパレータを使わない時は、入力をVDD/GNDへ接続して暴れないようにします。
通信ワードは40ビット単位です。DDSとの通信プログラム-ローディング方式
電源投入とマスターリセット直後はパラレルモードで起動するため、シリアルモードで使う場合は、まずシリアルモードへ移行させるための手順が必要です。
1. マスターリセット(5クロックサイクル以上)を行う。
2. xxxxx011(1バイト)を送信する。
以降、40ビットのシリアルデータを送信すると設定通りに動いてくれます。
W0~W31 | 周波数設定値(下位ビットから) |
---|---|
W32 | 常に0 |
W33 | 常に0 |
W34 | 1にするとパワーダウンモードへ移行 |
W35~W39 | 位相設定値(不要なら0) |
周波数の設定値は、下記の式で計算します。
位相設定値により位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
AD9834の特徴と使い方
・パッケージ:20ピンTSSOP
・電源電圧:2.3~5.5V
データシート
FS ADJUSTに接続する抵抗は最大出力電流を決定します(最大4mA以内)。最大出力電圧は、その電流値と負荷抵抗値を掛け合わせて求まります。
また、IOUTとIOUTBに接続する負荷抵抗は、なるべく同じになるようにします。
使わない入力ピンはGNDへ接続して暴れないようにします。
通信ワードは16ビット単位です。DDSとの通信プログラム-3線式シリアル
AD9834は4つのレジスタを持っていて、どれに対する書き込みかをD15とD14ビットで指定します。
D15 | D14 | レジスタ |
---|---|---|
0 | 0 | コントロールレジスタ |
0 | 1 | 周波数レジスタ0(28ビット) |
1 | 0 | 周波数レジスタ1(28ビット) |
1 | 1 | 位相レジスタ0/1(D13で0か1を指定) |
コントロールレジスタのPIN/SWビットを「1」にすることにより、RESETピン、SLEEPピン、FSELECTピン、PSELECTピンが有効になり、コントロールレジスタの設定より優先されます。これにより外部機器からの信号入力で操作することが可能になります。
パワーオン直後はまず、RESETビットを「1」にした値をコントロールレジスタに書き込みます。その後、周波数レジスタに目的の設定値を書き込んで、リセット状態を解除すると動作を開始します。
周波数レジスタは2つありますが、好きな方に切り替えて使います。無理に両方使わずとも、片方だけ使っても良いです。
周波数レジスタにの設定値は、下記の式で計算します。
位相レジスタに値を書き込むことで位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
AD9835の特徴と使い方
・パッケージ:16ピンTSSOP
・電源電圧:5V
データシート
アプリケーションノート
FS ADJUSTに接続する抵抗は最大出力電流を決定します。最大出力電圧は、その電流値と負荷抵抗値を掛け合わせて求まります。
IOUT端子に入っている47pFのコンデンサは、AD9835の出力等価抵抗を利用したローパスフィルタとなっており、不要な高調波成分を取り除きます。ただ、電源OFF時にチップ側への放電があるので、あまり大きな容量にしてはいけません。ちなみに、評価ボードの回路では0.1uFと書かれていますが誤りです。
使わない入力ピンはGNDへ接続して暴れないようにします。
通信ワードは16ビット単位です。DDSとの通信プログラム-3線式シリアル
AD9835に対する設定は、コマンドビット(D15~D12)で種類を指定し、続くビット(D11~D0)にレジスタのアドレスや内容を記述します。
D15~D12 | コマンドビット(C3~C0) |
---|---|
D11~D8 | レジスタのアドレス(A3~A0) |
D7~D0 | データ |
パワーオン直後は、まずリセットコマンドを発行します。その後周波数レジスタ設定コマンドを発行し、リセットコマンドでリセット状態から復帰させると動作を開始します。
AD9832は6つのレジスタを持っています。
レジスタ |
---|
周波数レジスタ0(32ビット) |
周波数レジスタ1(32ビット) |
位相レジスタ0(12ビット) |
位相レジスタ1(12ビット) |
位相レジスタ2(12ビット) |
位相レジスタ3(12ビット) |
周波数レジスタは2つありますが、好きな方に切り替えて使います。無理に両方使わずとも、片方だけ使っても良いです。
周波数レジスタにの設定値は、下記の式で計算します。
位相レジスタに値を書き込むことで位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
AD9832の特徴と使い方
・パッケージ:16ピンTSSOP
・電源電圧:3~5.5V
データシート
アプリケーションノート
FS ADJUSTに接続する抵抗は最大出力電流を決定します。最大出力電圧は、その電流値と負荷抵抗値を掛け合わせて求まります。
IOUT端子に入っている47pFのコンデンサは、AD9832の出力等価抵抗を利用したローパスフィルタとなっており、不要な高調波成分を取り除きます。ただ、電源OFF時にチップ側への放電があるので、あまり大きな容量にしてはいけません。ちなみに、評価ボードの回路では0.1uFと書かれていますが誤りです。
使わない入力ピンはGNDへ接続して暴れないようにします。
通信ワードは16ビット単位です。DDSとの通信プログラム-3線式シリアル
AD9832に対する設定は、コマンドビット(D15~D12)で種類を指定し、続くビット(D11~D0)にレジスタのアドレスや内容を記述します。
D15~D12 | コマンドビット(C3~C0) |
---|---|
D11~D8 | レジスタのアドレス(A3~A0) |
D7~D0 | データ |
パワーオン直後は、まずリセットコマンドを発行します。その後周波数レジスタ設定コマンドを発行し、リセットコマンドでリセット状態から復帰させると動作を開始します。
AD9832は6つのレジスタを持っています。
レジスタ |
---|
周波数レジスタ0(32ビット) |
周波数レジスタ1(32ビット) |
位相レジスタ0(12ビット) |
位相レジスタ1(12ビット) |
位相レジスタ2(12ビット) |
位相レジスタ3(12ビット) |
周波数レジスタは2つありますが、好きな方に切り替えて使います。無理に両方使わずとも、片方だけ使っても良いです。
周波数レジスタにの設定値は、下記の式で計算します。
位相レジスタに値を書き込むことで位相をシフトすることができます。位相の操作が必要ない場合には設定する必要はありません。
DDSとの通信プログラム
DDSへのシリアルデータの送信プログラム例を示します。PICのC言語ソースですが、他の環境でも応用できるでしょう。
ここで紹介しているDDSとの通信方法は二種類しかなく、次のどちらかになります。
3線式シリアル(SPI)
通信ワードは16ビット単位です。下図のようにFSYNCをローにした後、上位ビットから送出、SCLKの立ち下がりでSDATAがサンプルされます。
PICなどのペリフェラル(内蔵SPIモジュール)を使っても良いですし、GPIOを手動で操作してもOKです。
以下は、GPIOを操作する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | #define DDS_SYNC LATC1 // デジタル出力 初期値:1 #define DDS_SCLK LATC2 // デジタル出力 初期値:1 #define DDS_SDAT LATC3 // デジタル出力 初期値:0 // DDSに送信する void DDS_Send(WORD wData) { DDS_SYNC = 0; int nCount = 16; do { DDS_SDAT = (wData & 0x8000)? 1 : 0; DDS_SCLK = 0; DDS_SCLK = 1; wData <<= 1; } while (--nCount); DDS_SYNC = 1; } |
ここで紹介しているDDSのSPIはどれも高速(数十nsレベル以下)です。PIC32を48MHzで駆動し1サイクルで命令を実行するような場合を除いて、多くはPIC側でウェイトを取る必要はないでしょう。不安なら、要所にNOP命令を一つ入れておけば大丈夫です。
非同期ローディング
通信ワードは40ビット単位です。W_CLKの立ち上がりでDATAがサンプルされ、ローディング信号(FQ_UD)の立ち上がりで内部レジスタに転送されます。
マイコンのペリフェラルでやれないこともないですが、普通はGPIOを使います。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | #define DDS_DATA LATC1 // デジタル出力 初期値:0 #define DDS_FQUD LATC2 // デジタル出力 初期値:0 #define DDS_WCKL LATC3 // デジタル出力 初期値:0 // 40bitシリアルワード typedef union { struct { DWORD FREQ; BYTE REFx6 :1; BYTE LOG0 :1; BYTE POWD :1; BYTE PHASE :5; }; BYTE cData[5]; } DDSWORD40_t; // DDSに送信する void web_DDS_Send(DDSWORD40_t* pWord) { int i = 0; do { BYTE c = pWord->cData[i]; int j = 8; do { DDS_DATA = (c & 0x01)? 1 : 0; DDS_WCKL = 1; DDS_WCKL = 0; c >>= 1; } while (--j); } while (++i < 5); DDS_FQUD = 1; DDS_FQUD = 0; } |
SPIと同様こちらも高速に動作(10ns未満)するので、通常PIC側でウェイトを取る必要はないでしょう。
DDS後のローパスフィルタ
下の図はAD9851のデータシートに載っているもので、DDSの出力には多くの成分の高調波成分(赤線)が含まれていることが示されています。
一番多い成分は Fc-Fo と Fc+Fo の成分で、両者の周波数が近いと高調波成分のレベルも高くなります。逆に離れていると Fc✕N に近くなりレベルも低くなります。
高調波成分が少ない場合
マスタークロックと出力の周波数の差が大きい場合は、高調波成分も少なく離れているので、ローパスフィルタは不要か、一次CRで十分なケースがほとんどでしょう。
●一次CRローパスフィルタ
入出力インピーダンスに注意。
この回路のカットオフ周波数は入力先の出力抵抗の影響も受けるので、インピーダンスの低い相手に接続する必要があります。その点、DDSの出力抵抗は一般に数百Ωと低い方なのであまり気にする必要はありません。その10倍以上、例えば4.7Kとかで大丈夫です。
ただし、今度は出力先の入力抵抗に注意が必要。Rとの分圧により出力電圧が下がってしまうので、相手の入力抵抗が低い場合は、トランジスタのエミッタフォロアやオペアンプのボルテージフォロアで応援しましょう。
高調波成分が多い場合
マスタークロックと出力の周波数の差が小さくなればなるほど高調波成分も多くなります。また「後段には絶対ノイズを入れるな!」的な回路でも気を使う必要がありますね。
出力先の入力インピーダンスが高い場合は、上のCRのローパスフィルタの段数を増やしていくだけで良いケースもあります。
●二次CRローパスフィルタ
特に信号レベルの低下に注意。
また、コイルとコンデンサを使ったLRCフィルタやその多段型も有効ですが、共振によるピークや磁界の発生に注意が必要な場合もあります。
●LCRローパスフィルタ
共振と磁界に注意。
コイル無しでもっとシャープに高調波成分を取り除きたいときや、出力先のインピーダンスが低い場合には、オペアンプを使ったアクティブフィルタを使います。
アクティブフィルタにはいろいろ種類がありますが、代表的なものにサレンキー型(正帰還型)や多重帰還型があります。計算方法は複雑なので普通は計算ツールを使います。
●サレンキー型LPF
・部品定数がシビアになりにくい。
・オペアンプ性能への依存性が低い。
・超高域で漏れがある。
●多重帰還型LPF
・部品定数がシビアになりやすい。
・オペアンプ性能への依存性が高い。
・超高域の漏れが少ない。
オペアンプ多重帰還型ローパス・フィルタ計算ツール
もっと色々できるツールとして、テキサス・インスツルメンツ社の「FilterPro」という無料のWindowsアプリがあるのですが、これが結構オススメ。
ただしこのアプリは公開終了予定。現在は非推奨になっていて、2010年の最終版が2018年現在でもダウンロードできますが、いつ消えるか分かりません。今のうちダウンロードしておきましょう。(ユーザー登録が必要です)
※確か日本語のページからはDownloadできなかったような…
WEBENCH Active Filter Designer
ローパスフィルタの例
NJM2137Dという秋月で¥100で売っている200MHz広帯域オペアンプを使って、サレンキー型ローパスフィルタを試しました。AD9833の出力につないで効果を確かめます。
一段でも良いのですが、オペアンプが余るので二段にしてみました。
AD9833に供給するMCLKは16.384MHz、出力は最大2MHz程度の正弦波を想定してますが、可聴域のような低周波でも同様です。
部品定数はFilterProを使って、次の条件で設計しました。
- フィルタタイプ:SallenKey
- カットオフ周波数:3MHz
- フィルタ応答:Butterworth
- ゲイン:x1
16MHzから2MHzの正弦波なので、かなりガタツキが見られます。
回路図中NJM2173の1ピンでの波形です。少しだけ高調波が残っている状態ですが、見た目はほぼ滑らかです。
かなり綺麗になりました。当たり前ですが、2MHz以下ならみんなこんな感じです。
16MHzから4MHzともなるとこんな感じ。高レベルの高調波成分が含まれているので、正弦波の形からはかけ離れているように見えます。
少し高調波成分が残っています。
というか、2MHz出力を想定しカットオフ周波数を3MHzにしてあるので、レベル低下の方が気になります。
1MHzだと十分すぎる結果が得られます。
XDS3202A 最大1GS/s 14bitAD 200MHzバンド幅のデジタルオシロスコープ。タッチ式スクリーンは広くて見やすいです。 |
DDSの入手先
最近では、amazonでもDDSチップ単体でしかも安く入手できます。
海外通販なら以下のサイトがおすすめです。
MOUSER
Digi-Key
Digi-Keyと提携しているマルツでも入手可能です。
マルツオンライン