AVRを使ったDDS方式低周波発振器の製作

※このAVR-DDSの仕組でPLL-VFOを「AVR-DDSでPLL-VFOの実験」で実験しました。(2009-01-20)


構想
 前回製作した「PICを使った周波数カウンター」を市販の周波数カウンターと比較調整するときに、これまた以前製作した「MAX038広帯域オシレータキット」を使いました。
このMAX038の発振器は、高周波まで発振するので便利には使えるのですが、発振周波数レンジを決定するタイミングコンデンサをテキトーに切り替える方式としたので、周波数安定度が今ひとつとなっています。2台の周波数カウンターを比較するときは、やっぱり周波数の安定したDDS方式の発振器がほしくなります。

 インターネットでググるとDDS方式として
*アナログ・デバイセズ社の専用チップ(AD9851等)をPICやAVRでコントロール
*秋月電子のキットでウェルパイン社DDSチップを使用したもの+コントロールユニット
*PICやAVRとCPLDによる作りこみ
が多いようです。

 CPLDはちょっと敷居が高いし、専用のDDSチップは、価格が数千円でパッケージがSSOPやTSSOPなどのフラットパッケージとなっているので気軽に試してみるわけにはいきません。

 その中で・・・

*MiniDDS(Jesper’s AVR pagesさん)
*miniDDSと疑似正弦波発生器(AVR試用記さん)
*AVR DDS signal generator V2.0(ScienceProgさん)

などで、AVRで直接波形出力するDDS方式の発振器を製作されています。いずれも元は1番目の「Jesper’s AVR pages」 がオリジナルとなっているようです。

 ということで、henteko.orgでも手持ちの部品でなんとかなりそうな、このAVRを使用したDDS方式の低周波発振器を製作してみたいと思います。出力帯域は、オーディオ関係で使用できるように10Hz~100KHz程度として1Hz単位で周波数が可変なもの。波形は、正弦波、方形波、のこぎり波、三角波が出力できるものを目標とします。


D/Aコンバータの実験
 DDS方式では、DAC(D/Aコンバータ)が必要となります。参考としたWebサイトでは、R-2Rラダー抵抗を使用しています。今回は、たまたま8ビットDACのAD558JNを持っていたのでR-2Rラダー抵抗で作るDACと比較してみました。


 その昔、アマチュア無線のパケット通信でG3RUH方式の高速モデムを作ったときに使った部品のあまりです。今回、このG3RUHモデムを探してみたら納戸の奥底のダンボールから出てきました。DACは、ICソケット上に実装したR-2Rラダー抵抗回路を使用していました。

 R-2Rラダー抵抗DACに使用する抵抗は、1%誤差の金属皮膜抵抗を使用することにして、20KΩ、10KΩとも手持ちの約100本から、抵抗値のそろったものを選択しました。

 ブレッドボードに双方のDACを並べて、AVRから正弦波やのこぎり波を入力してみます。
AVRは、ATmega168を使用します。8MHzの内部オシレータを使用して、256分割された8ビットの波形データを単純にPORTDに出力するループのみとしています。(単純にC言語でforループをまわすと全開でも8KHz程度の波形しか出ません。^^;)

AD558JNとR-2Rラダー抵抗によるDACの比較
AD558JNとR-2Rラダー抵抗によるDACの比較

 双方のDACとも一見きれいな波形を出力しますが、よく見るとAD588JNは、細かなスパイク状のノイズが重畳しているのがわかります。ノイズには規則性がないためDACそのものの問題ではないと思われますが、ローパスフィルタでとりきれない可能性もあります。

 これらの結果から、DACには、R-2Rラダー抵抗DACを使用することにします。


ブレッドボードで開発
 ブレッドボードでテストしながら、以下の回路を考えました。AVRは、複数の波形データを格納することを想定してATmega168を使用します。(予定している波形4個ならばATmega88でもイケルと思います。)

※9~12V単電源仕様とするため、ローノイズオペアンプをNE5532PからNJM4580Dに変更しました。それにともない回路も変更しました。(2008-08-16)
※回路図では、LCDユニットの電源とグランドが間違っています。本来は、VDDが2番ピン、Vssが1番ピンです。

 R-2Rラダー抵抗DACの出力は、コンデンサで直流カットしてローパスフィルタを通してローノイズオペアンプで2倍に増幅しています。
 ローパスフィルタは、カットオフ周波数200KHzの単純なCRフィルタとしています。出力波形をオシロスコープで見たところ、目標とする100KHzまでは、この程度で十分なようです。ただ、使用したオシロスコープがデジタルオシロなので、本来ならアナログオシロで波形を確認したいところです。

※ローパスフィルタを入れたことで、正弦波以外の波形は周波数が高くなると正常な波形が得られなくなります。

 オシロスコープで見た出力波形です。画像の上の波形が、オペアンプ出力で下がDAC出力です。
音声帯域の1000Hzと20KHzの正弦波です。

 目標上限周波数の100KHzと試験的に出力した200KHzです。

 100KHzまでは、そこそこきれいな波形を出力しますが、さすがに200KHzは無理なようです。もっとも200KHzでの波形の歪を問題としない用途であれば利用することは可能です。なお、DDSとしては、400KHzまで出力できることを確認しています。


テスト
 低周波発振器なので、出力の歪率が気になります。歪率計もFFT解析できる測定器も持ち合わせていませんが、インターネットをうろついているとすばらしいソフトウェアを見つけることが出来ました。

 efu’s pageさんの高速リアルタイム スペクトラムアナライザー WaveSpectraです。このソフトでは、パソコンの音源ボードに入力された信号をリアルタイムにFFT解析してスペクトル分析できます。また、同時に歪率も測定できる機能があり、音声帯域の信号解析には十分な機能があります。

 ということで、早速、AVR-DDSの出力を分析してみました。
 左上から順に正弦波で100Hz、1000Hz、20000Hz、方形波で1000Hzとなっています。

 歪率(THDで示されている)も、200Hz以下では、0.1%を超えますが、200Hz~22KHzまでは、0.1%以下と実用上は十分だと思います。(・・・・スミマセン。オーディオには、あまり詳しくないので、私の思い違いの可能性もあります。)

THDは、高調波成分のみの歪率のようです。THD+Nが、全高調波とノイズ成分を含めた歪率とのこと。・・・ということで、0.5%前後で歪率が低いとはいえません。・・でも、ノイズ成分はサウンドカードやPC内部のものがほとんどだと思われるので、THDが実際の歪率に近いと思い込んでおきます。^^;(2008-08-19)

 WaveSpectraで表示される周波数が多少ずれているのが気になったので、前回製作した周波数カウンターと比較してみました。
 10000Hz(10KHz)をAVR-DDSで出力して周波数カウンターで測定するとキッチリ10000Hzを表示します。変動もありません。AVD-DDSの出力を1Hzあげて10001Hzとすると周波数カウンターも10001Hzを表示します。(さすが、DDSです。)

 調子にのって、AVR-DDSから123456Hzを出力してみると・・・・これは、残念ながら1Hz少ない123455Hzを表示します。100KHzを超えた値なのであきらめますが、ひょっとすると周波数カウンターの精度の問題かもしれません。(未検証です。)


製作
 いつものようにユニバーサル基板の実装配線図をPCBEで作成しました。本来ならプリント基板でアース面を大きく取ったものが良いとは思うのですが・・・・メンドーです。

AVR-DDS低周波発振器基板パターン
AVR-DDS低周波発振器基板パターン

 早速半田付け完了です。カップリングコンデンサは、1uFの積層メタライズドポリエステルを使用しています。DACのR-2R抵抗回路やオペアンプ回りの抵抗は、1%誤差の金属皮膜抵抗を使用します。


AVR-DDS低周波発振器基板裏
AVR-DDS低周波発振器基板裏
AVR-DDS低周波発振器基板表
AVR-DDS低周波発振器基板表

 ケースは、前回作成の周波数カウンターと同じ、秋月電子のポリカーボネートケース中サイズです。透明ケースは、液晶などの表示部を開口しなくてもよいので加工が楽です。当初は、オペアンプにトランスと3端子レギュレータを使用した正負電源を使う予定でしたが、このケースを使用するために9~12Vの単電源仕様としています。

AVR-DDS低周波発振器

完成
 周波数カウンターとならべてみました。ワンチップマイコンはDDSがAVRで周波数カウンターがPICと節操のない使い分けです。^^;

 双方を接続し、テストしてみました。100KHzと12345Hzを出力してみましたが正確な周波数で発振しています。歪率もWavespectraで測定しましたが、ブレッドボードでテストしたときよりも高調波成分のレベルは低下しています。ただ、100Hz以下のノイズが多少増えているようで歪率自体は良くはなっていません。

AVR-DDS低周波発振器とPIC周波数カウンター

 レベル計で1000Hzの出力レベルを測定しました。600Ω終端で上は+8.7dbm、下は-51.0dbmまでとなりました。低いレベルはノイズ的に厳しいため、実用になるのは-40dbm程度までと思われます。


ソフトウェア
(参考までに公開します。コメントが手抜きになってます。また、冗長なソースも混じっています。)

 ソフトウェアは、AVRStudio4とWinAVR(gcc)で作成しました。
 肝心のDDS出力は、参考にしたWebサイトで公開されたものを一部改変して使用しています。その部分については、オリジナルのコメントとともにソース中で注記してあります。
 また、波形データも同じサイトからいただいております。波形データは、SRAMではなくFlashに格納する必要があります。AVRStudio4では、Project OptionsのMemory SettingでFlashへのデータ格納を明示的に指示してMakefileへ反映させる必要があります。

 ソースを見てもらえばわかると思いますが、AVRのクロックが12MHzの水晶発振器(SPXO)なので、周波数解像度は、0.07Hzとなります。AVRに正確なクロック源を与えれば正確な周波数の波形を出力できるとおもわれます。

 スイッチ入力は、「START/STOP」が信号のスタート・ストップ。「MODE」スイッチで、各桁の周波数変更と波形選択にラップアラウンド(1Hz→10Hz→100Hz→1000Hz→10000Hz→波形選択)でまわして、「UP」「DOWN」スイッチで値や波形を選択する方式で4個のスイッチとしました。

アイコン

avr-dds.c 10.55 KB 179 downloads

...

※LCD関連のライブラリは省略しています。
※LCDを16文字2行から8文字2行のコンパクトタイプへ変更。(2008-08-16)
※プッシュスイッチを5個から4個に変更(2008-08-16)

3件のピンバック

コメントは現在停止中です。