オーディオクラフト工房(196)

更新日:2015年10月22日


復活:トラ技のCPLD基板で正弦波発振器を作ろう
最新号の「トランジスタ技術」は久しぶりのFPGAの特集でした。我々のような趣味で電子工作をしている人には正直、最近のFPGAは敷居が高い内容です。(あくまでも個人の見解です)。しかしながら、プログラマブルロジックの魅力は、一度はまってしまうと、なかなか抜けることが出来ない内容でもあります。そこで今回は久しぶりに「トランジスタ技術・2006年4月号」の付録であったCPLD基板を使って何かをしてみたい気持ちになりました。丁度オーディオシステムの確認に正弦波の発振器が欲しかったので、今回「サクッと」作ってみました。それでは製作をスタートしましょう。
過去にこのCPLD基板でいくつもの製作を行いました。現存して日常に使っている製作品もありますが、今回使ったように過去の製作品から取り出されて、CPLD基板として新しい製作を待っているものもあります。皆さんも探せば出てくるのではないでしょうか。
(懐かしのトランジスタ技術2006年4月号の付録)
当時の付録のCPLD基板の写真です。この時はCPLD基板とPCをパラレルケーブルで接続してCPLDの開発を行っておりました。現在のPCにはそのような端子はないので、このCPLD基板では開発が出来ないと思われがちだと思います。しかしながらそんなことはないのです。今でもこのCPLD基板の開発は可能です。当時から基板にもこの時既にコネクタのランドが用意してあったのです。上写真手前の10ピンのコネクタ部分です。そうです今でもこのJTAGインターフェイスを通して開発が可能なのです。
早速ですが今回の開発に先立って、、「USB-Blaster」を準備しましょう。
詳しくはこちらのHPを参考にして下さい。http://sa89a.net/mp.cgi/ele/ub.htm
私もここの製作記事に基づいて製作を行いました。作者の方にこの場をお借りして感謝申し上げます。で、この「USB-Blaster」はPCのUSB経由でアルテラ社のCPLDやFPGAにプログラムの書き込みが出来ます。
(私の製作したUSB-Blaster)
開発ツールはアルテラ社のHPにユーザー登録すれば、フリーのツールがダウンロード出来ます。ちなみに私は「Quartus II 9.1sp2 Web Edition」をインストールして使っています。今回紹介させて頂くソースもこのバージョンで正しくコンパイルが可能です。
過去の製作でも今回と同様の手法を用いて正弦波発振器を作りましたが、今回は更に実用に耐えるように設計しています。オーディオ用のツールとしてその存在価値を発揮出来るものと考えています。
製作した正弦波発振器の使用は次の通りです。
1)正弦波を出力する装置である。正弦波は0Vをセンターに振れる信号とする。
2)能力として周波数は1Hz単位に設定出来る。最大周波数は156KHzとする。
  (但し今回発振器の最小周波数ステップは10Hz単位)
3)正弦波の出力レベルは0Vから約2Vp-p程度まで出力可変が出来る。
4)発振周波数の設定はボリュームとスイッチで行う。
5)信号は10bit精度であり極めて綺麗な波形となっている。
全体の構成を記します。
(今回製作のブロック図)
CPLD基板の構成は次のようになります。
(CPLD基板の内部構成)
CPLD基板の役割は大きく3つあります。
1)マイコンからの周波数設定のインターフェイスモジュール
2)正弦波のベースとなるクロックジェネレータモジュール
3)正弦波発生モジュール
それぞれの詳細な理解については私の過去の記事を参照して下さい。
http://www.max.hi-ho.ne.jp/nonchansoft/cpld/osc1.htm
http://www.max.hi-ho.ne.jp/nonchansoft/cpld/oscnew1.htm
http://www.max.hi-ho.ne.jp/nonchansoft/cpld/sin1.htm
過去の製作のCPLD基板には10MHzの水晶発振子を搭載していたので、正弦波は78kHzまでしか出せませんでしたが、今回は20MHz品を搭載しましたので、156kHzまでの発振が可能となりました。
(CPLD基板のインターフェイス仕様)
CPLDの内部構成を記します。
(CPLDの内部構成、クリックすれば見易い画像が出ます)
(CPLDのピン割付)
最初に完成した姿を見て頂きましょう。
(機能ごとにまとまった内部構成)
(どちらから見ても素晴らしい)
全体の回路図です。
(正弦波発振器の回路図)
回路のポイントとしては、電源回路にDCフィルタを入れてノイズを防いでいます。今回の製作から最近購入したオシロ(DSO138)を使って電源回路のノイズレベルを測定して、ノイズが大きい箇所には電解コンデンサを追加しています。正弦波モジュールから出力される信号はOPアンプとフィルタを介して出力されます。OPアンプには±電源が必要になります。たまたまですが、DSO138の回路図に±電源の回路がありましたので、今回それを拝借させて頂きました。その関係から回路図中にある「POWER UNIT」の詳細回路は記載することが出来ません。原理としては極性反転型チュッパー回路で負電源を構成しています。マイコンからPWM信号でこの回路が適正となるように制御しています。負電源の電圧をマイコンでモニターしてPWM制御に反映しています。(電源投入時のみですが)
マイコンは超定番のPIC16F886を使います。マイコンの役割は大きく2つあります。
1)操作入力に応じて周波数設定データなどをCPLDへ送る
2)操作に応じた表示を行う
CPLD内のクロックジェネレータは原理的に10MHzまでのクロックを発生出来るモジュールです。その周波数をマイコンから設定します。設定の式は次の通りです。
(CPLDへの設定データの計算式)
クロックジェネレータモジュールでは約1.2Hz毎に周波数が設定出来る計算になります。(原理などは最初に示した過去の製作のページを見て下さい)
一方で、正弦波発生モジュールは1周期256ステップで10bitのデータを出力します。クロックジェネレータから発振されるクロックをベースに正弦波データを順次出力します。1周期に256クロック分を消費しますので、正弦波として出力される周波数はクロックジェネレータのクロックの1/256になります。従って、出力したい周波数の256倍の周波数をクロックジェネレータに設定する必要があります。またクロックジェネレータの最大周波数は10MHzですから、正弦波としては1/256とすると39kHz程度しか出力出来ません。そこで周波数が高くなるに従い、ステップ数を間引いて対応することで、156kHzまでの正弦波を発振することが可能になります。
(周波数に応じてステップ数を変えて対応)
38kHzから78kHzまでは128ステップ、それ以上では64ステップが正弦波データの1周期になります。今回データを10bitにしたのでより滑らかな正弦波が出力出来ました。正弦波モジュールの周波数としては1Hzのステップで出力出来る能力があります。
(操作スイッチの割付)
4つのスイッチとボリュームの操作で正弦波出力を操作します。大きくは「ボリューム操作」と「スイッチ操作」になります。ボリューム操作の説明をします。
VR1からVR4の4つのモードがあります。上図の通りにボリューム操作で周波数を変えることが出来ます。これらのモードはSW3を押すことで切換えます。VR2からVR4はオーディオに使い易いようにしたつもりです。オーディオ帯域を詳しく調べる時に便利と思います。ボリュームの位置と発振周波数は絶対値で対応していますのでボリュームを右に回しきった時に最高周波数となります。
ボリューム操作モードからSW1/SW2を押すことでスイッチ操作に移行します。
スイッチ操作ではより細かい周波数設定が可能です。通常押しと長押しで変化ステップが変わります。VR1のボリューム操作モードの最高周波数は146kHzですが、スイッチ操作でこの発振器の最高周波数の156kHzまで変化することが可能です。まずはいろいろ操作してみるのが良いと思います。スイッチ操作からSW3を押すことでボリューム操作に戻ります。正弦波出力はSW4でON/OFF出来ます。
(マイコンのポート割付です)
今回PICマイコンで初めてPWM制御を使いました。約18kHzの周期で25%デューティの信号を出力しています。デューティは初期は25%ですが、負電源の電圧をモニタして適正電圧になるように自動調整していますので、調整後はデューティが変わっている可能性があります。詳しくはPICのソースを見て下さい。
CPLDで生成された10bitの正弦波データはR-2R・DACでアナログ変換されます。ディスクリートで組んでいますので、公差±1%の抵抗が必要です。このDACから出力される信号は0V〜3.3Vの範囲で振幅していますので、オーディオ機器の信号に合うように±5V電源で駆動するOPアンプを経由します。最高出力周波数は156kHzですので、約200kHzのローパスフィルタを経由して出力します。OPアンプには手持ち品ですが、動作周波数の高いものを使用しています。ローパスフィルタの特性は次の通りです。まあこんな感じで良いでしょう。 
(ローパスフィルタ回路のシミュレーション)
完成した姿はこちらです。
(なかなか良い顔をしています)
(正弦波出力はモノラルなので出力は並列です)
オーディオ機器に接続しやすいように出力は2端子設けています。それぞれLとRに接続して下さい。電源はトランスタイプで定電圧出力DC6Vタイプを使用して下さい。
(±電源部のクローズアップです)
(7kHz、2Vp-p出力中)
(100kHz、2Vp-p出力中)
周波数を上げても振幅にほとんど変化はありません。
(15kHz、0.1Vp-p出力中)
小さな振幅もこの通り大丈夫です。簡易的なオシロですが、導入したことで製作の範囲が広がったように思います。
今後はこの正弦波発振器をオーディオ回路の調整や確認などに活かしていきたいと考えています。今年もオーディオネタでぐいぐい来ましたね。まだまだ続きますよ。では次回をご期待下さい。
CPLDのソース一式はこちらです。
PICのソース一式はこちらです。
皆さんの製作の参考となりますように。

オーディオクラフト工房へ戻る