高速動作のCPLDでダイレクトディジタルシンセサイザを構成し
それをPICで制御しています。
PICはシリアルインターフェースでパソコンと接続しパソコンから
リモコンが可能な低周波発振器です。
VHDLで正弦波のディジタルパターンを生成できることをヒントにして、アダー回路
を加えてダイレクトディジタルシンセサイザを構成しました。
6ビットで64分解能の正弦波ですので、結構きれいな正弦波を生成することが出来
ます。
このVHDLをCPLD(Complex Programmable Logic Device)に生成し、最高260kHz
までの正弦波を1Hz単位で設定し生成できます。
このCPLDをPICで制御して任意の周波数の正弦波を生成させることが出来ます。
さらにPICのシリアルインターフェースでパソコンと接続して、パソコン側からすべて
リモコンで動かせる低周波発振器を製作しました。
これでいわゆるスイープジェネレータとして動かすことが出来ます。
CPLD側のVHDlの詳細については下記ページを参考にして下さい。
★ VHDLによるDDSの製作
【実際の出力波形】
本低周波発振器で生成した波形は下図のようになっています。ほぼ実用域の波形と
いって良いと思います。アンプの周波数特性やフィルタの特性の測定に使えると思います。
10Hzの波形
階段波になっている
のが良く分かる100Hzの波形
まだ飛び飛びの
階段波が分かる1kHzの波形
大分きれいになって
来た10kHzの波形
ほとんど滑らかな
波形になっている50kHzの波形
6ビットの最高値100kHzの波形
5ビットの最高値250kHzの波形
4ビットの最高値
【全体の構成】
この低周波発振ブロックの全体構成は下図のようになっています。全体はPICとCPLD
を中心にして構成しています。
CPLDはDDS機能の大部分を果たし、出力は直接D/AコンバータのDAC0808に接続
されて、アナログデータに変換されます。それを高出力オペアンプで出力電流増幅をして
ローパスフィルタを通してから外部信号として出力しています。
このローパスフィルタはディジタル信号で作成した階段状の正弦波を滑らかな波形にする
働きをします。つまり階段状の波形の高周波成分を取り除いて、ぎざぎざを少なくします。
このローパスフィルタの上限周波数が低いほどきれいな正弦波にすることが出来ますが、
出力信号の振幅も比例して小さくなってしまいますので、上限周波数を1MHz程度にして
います。
このCPLDのDDSの周波数設定制御はPICで行っています。PICは、外部からRS232C経由
で、周波数設定値を受信し、そのデータをCPLDへの設定値に変換したあと、CPLDのシフト
レジスタに転送しています。18ビットを転送すれば良いのですが、プログラムを簡単にする
ため、3バイトの24ビットを送ってしまっています。それでも上位の6ビットは無視されてしま
いますので問題はありません。最後にset信号を出力すれば、周波数設定は完了して、指定
した周波数の正弦波が出力として現れます。
パソコンとの通信にはRS232Cを使っていますが、その通信モードの設定は下記となって
います。
通信速度 : 9600bps
データ長 : 8ビット
パリティ : なし
ストップビット長 : 1ビット
フロー制御 : なし
この条件でRS232Cでパソコンと接続し、パソコン側のプログラムで周波数設定を行います。
電源はD/Aコンバータとオペアンプにはマイナスの電源が必要で、出力波形をピークピーク
で5Vにするため、+5Vと−8Vを使いました。
マイナス側は、10mA程度のほんのわずかの電流で良いのですが、+5V側は、CPLDに
最大300mA程度の大電流が流れるので、大き目の容量とする必要があります。
そこで+5V側には1Aタイプの3端子レギュレータを使い、それに放熱板を取り付けています。
【全体回路構成】
上記のブロック構成を元に作成した回路が下図のような回路です。 CPLDには、ゲート数の
大きいXC95108を使いました。本当はもう少し大きな容量のものを使いたいところですが、
これ以上のサイズではソケットなどの実装が厄介なので、84ピンのPLCCソケットのものと
しました。全体のピン数は84ピンと多いのですが、使うのはそのうちの信号12ピンと電源と
グランドだけなので、配線や実装は楽です。配線の際には、余ったCPLDのピンはグランドに
接続しておきます。
D/AコンバータのDAC0808はもともとは8ビットのD/Aコンバータですので、余った下位
2ビットはグランドに接続して6ビットとして使います。
PICには、発光ダイオードやスイッチが接続されていますが、将来用で今回の試作では使って
いません。
CPLDにはJTAGのピンがありますので、それをコネクタとして出しておきます。こうすれば
CPLDの内容はいつでも書き換えが出来ますので、機能変更など自由に[行うことが出来ます。
このJTAGコネクタには、ザイリンクスの書き込み用のケーブルを接続します。
CPLD用のクロックには、ちょうど2の22乗に相当する、4.194304MHzの発信器が容易に
入手できますので、これが便利だと思います。
このクロック出力をPIC用のクロックに兼用しても構いませんが、今回は10MHzの別のクリス
タル振動子を使っています。
低周波発振ユニットの回路図 (下図は拡大できます)
★ 低周波発振ユニットの回路図とパターン図
(IVEX社 WinDraftとWinBoard用のファイルでダウンロードできます)
【PICのプログラム】
上記のDDSであるCPLDを制御するのに、PIC16F876を使いました、PIC16F873でも
構いません。 そして、この制御プログラムをCCS社のCコンパイラを使いC言語で作成しま
した。C言語を使ったのは、何と言ってもRS232Cの制御が非常に楽だからです。
プログラムの内容としては、単純で、スタートしたら、RS232Cに向けてstartメッセージを
送信し、そのまま受信待ちとします。
そしてデータを受信したら、それをバッファに順次格納し、リターンコード(0x0D)を受信した
ら、受信データを処理します。
受信データとしては、周波数の18ビットのデータなのですが、18ビットを扱う変数がCCS社の
Cコンパイラには用意されていないので、これを2つに分割して最上位2ビットと下位16ビットと
に分割して順番に2種類のデータが送られて来るものと決めています。
まず、最上位の2ビットを0,1,2,3の数値文字で受信します。次に下位16ビット分が10進数の
数値文字として送られて来るものとし、これをlongの正整数に変換して数値として扱います。
CCS社のコンパイラでは、long型は2バイトのデータとして扱いますので、これをそのまま18ビット
の内の下位16ビットの周波数設定用のデータとして扱います。
(1) main の中のデータ処理部分
下記はmain関数の主要部分で、実際に周波数データを文字列で受信し、それを3バイトの
出力データに変換してから、シフトレジスタに出力する部分です。
文字列データの受信にはgets()関数がそのまま使えます。このgets()関数は終わりをCR
コード(0x0D)で判定しますので、送る側がCRコードを追加して送る必要があります。
上位2ビット分は1文字の数字で送られて来ますので、単純にINT型の正整数(1バイト)に
変換するだけです。下位16ビット分は数字の文字列で送られて来ますので、これも一旦
long型の正整数(2バイト)に変換します。、その後この2バイトを上位バイトと下位バイトに
8ビットシフトするだけで分解できます。これで3バイトのデータがそろったことになります。
これをシフトレジスタへの転送関数でそれぞれ出力し、最後にset信号を出力すれば、
周波数設定データの出力あg完了したことになります。
(2) シフトレジスタ転送制御関数
下記は、周波数設定用のシフトレジスタに1バイトを出力する関数です。
出力する1バイトのデータを上位ビットから順番に見て、0か1かにより、出力ポートに
0か1を出力したあと、シフトクロックを1回出力します。これを8回繰り返せば8ビットの
出力が完了したことになります。
(3) プログラム全体
下記はPIC側のDDS制御プログラムのC言語のソースファイルです。CCS社のCコンパイラ
でコンパイルして下さい。 テキストエディタ等で直接見ることができます。
★ DDS制御プログラム(CCS社Cコンパイラ用)
【パソコンのプログラム】
この低周波発振ユニットを制御するパソコン側のプログラムは自由に作成できますが、
以下は、私がVisual Basicで作成したプログラム例です。
まずフォームは下記のような実行状態の表示となります。この内容から推測できるように
下記の主要機能を持っています。
(1) 通信条件の設定と接続(オープン)、切り離し
(2) PICから受信したデータの表示(そのまま表示)
(3) 個別に設定する周波数の入力と送信
(4) 範囲指定した周波数の間の設定とスイープ出力
このパソコンのプログラムは、MSCommコンポーネントを利用してシリアル通信を実現
していますので、Visual Basicの Ver5 以上が必要です。今回の製作では、Ver6を使用
しました。
下記はこのVB Ver6で作成したプロジェクトのデータ1式です。ダウンロードして解凍して
お使い下さい。
★ 周波数発振ユニット制御プログラム(VB6用project)
(1) フォームロードイベントの処理
ここではスイープに使用するタイマーを停止させ、MSCommコンポーネント
を使った通信ポートの初期設定を行っておきます。
受信は1バイトごとのイベント発生とし、送信はバッファが空でイベント発生とします。
(2) 通信開始ボタンの制御
通信開始ボタンのclickイベントでMSCommのOpenをします Openするとき
既にOpenだったら閉じるという交互動作をします。同時にボタンの表示内容
も連動して変更します。
(3) 送信ボタンのclickイベント
送信ボタンを押すと 送信テキストエリアに設定されている周波数を出力します。
そのとき設定データの範囲チェックをします。
出力データは2つに分割して上位2ビットにあたる部分と下位16ビットの部分に
分割して、それぞれ最後にリターンコードの追加された文字列として送ります。
(4) MSCommのOnCommイベントの処理
いろいろな条件のイベント発生があるので、それぞれに処理を記述しますが、
ここでは受信処理と通信エラー処理だけ記述してあとは省略しています。
受信処理では、受信したテキストデータをそのまま受信テキストボックスに表示
しているだけです。
(5) スイープ開始コマンドのclickイベント
スイープ開始ボタンが押されたら、開始、終了周波数と間隔の範囲チェックをした
あと、タイマをスタートさせます。このあとはタイマの割込み処理で実行します。
スイープ停止ボタンが押されたときには、単純にタイマを停止させているだけです。
(6) タイマーのイベント
タイマがスタートすると一定時間間隔でtimerイベントが発生し、本処理が実行され
ます。ここでは、開始周波数から順次指定された周波数間隔で周波数を徐々に
上げながら周波数データを出力しています。出力データはやはり2つに分割して
出力しています。
【低周波発振器の外観】
今回はまだ基板のレベルでのユニットですが、これに電源を追加すれば立派な発信器と
することが出来ます。
低周波発振ユニットの全体外観
CPLDへの電源電流が大きいので
3端子レギュレータには放熱板が必要
PIC部とRS232Cインターフェース部
発光ダイオードやスイッチが接続できるコネクタ
も用意されていますが、今回は未使用です。
アナログ部で、D/Aコンバータ、オペアンプ、
ローパスフィルタ部です。
右端はCPLD用の4.194304MHzの発振器です。
プリント基板の裏面です。CPLDの余ったピンは
すべてGNDに接続しますので、パターンは簡単
になります。
JTAGプログラミング用のケーブルを接続した
所です。これで何時でもVHDLで変更した内容
に更新が出来ます。