高性能8桁周波数カウンタ

高速動作のCPLDをカウンタ部に使い、表示部をPICで
分担した高性能8桁周波数カウンタです。




【概要】

 この周波数カウンタを作ると最大50MHz以上の周波数カウンタが単体で可能
となります。前項のPIC2個による8桁周波数カウンタも便利ですが、単体では
20MHz程度の周波数範囲に制限されるので、少し物足りない範囲でした。
そこでもっと高速動作の可能なCPLD(Complex Programmable Logic Device)
を使い、VHDLでカウンタ回路を構成しました。これで設計上は、85MHzまでは
カウント可能です。
 表示部分にはセグメント発光ダイオードを使いましたが、この制御にはPIC16F873
を使いました。CPLDがBCDで直接カウントしてくれるのでPIC側は、セグメントデータ
に変換するだけという至って簡単なプログラム構成となっています。

CPLDの開発はVHDLを使い、WebPACK ISEで開発しました。
この詳細はVHDLの下記ページを参照して下さい。

  ★ VHDLによるカウンタブロックの製作


【全体の構成】

 全体の構成は下図のように、大きく制御基板と表示基板の2つで構成し、
制御基板内は、入力アンプ、カウンタ部、表示制御部の3つの部分から構成します。
 制御基板内のカウンタ部は、CPLDで構成し、入力アンプで増幅され整形された
信号をCPLDに直接入力して8桁のBCDでカウントします。
 そして毎回カウント結果の8桁のBCDデータを表示制御部のPICのポートへ出力
します。

 表示制御部はPIC16F873で構成し、カウント部にカウント開始指令信号を出力したら
busy信号がoffになるのをチェックします。そしてbusyが解除されたら8桁ののBCD
データを1桁ずつ直接入力し、それをセグメントデータに変換して表示部に出力します。
 このカウント終了を待っている間には、セグメント発光ダイオードのダイナミック点灯
制御を実行します。
約2msecごとに1桁づつ点灯信号を出力しながら8桁をぐるぐる繰り返して表示します。


【全体回路構成】

クロックには12.8MHzの高精度水晶発信器を使用して1ppmという高精度を確保
します。そしてその出力を直接CPLDに入力するとやや不安定になるので、一旦74AC
14でバッファしてから加えます。PICにも同じクロックを使っています。
入力アンプはお決まりのパターンの回路ですが、トランジスタにはfTが1GHz以上の
周波数特性の良いものを使います。さらに出力に74AC14のシュミットバッファを挿入して、
波形の崩れたパルスでも誤カウントしないようにします。
CPLDのピン配置は自由に決められますので、PICとの配置で配線しやすい出し方と
することが出来ます。但し、XC9572の内蔵マクロモジュールを98%程度使ってしまって
いますので入りきるように配置を設定する必要があります。
PICは、ポートAを全て入力、ポートBとCは全て出力として単純にディジタル入出力だけで
使っています。ポートCの下位は、発光ダイオードの桁ドライブと、CPLDからデータ入力を
する時の桁選択指定と共用していますので、CPLDとデータをやり取りする間は、セグメント
を全てOFFとして表示が乱れないようにする必要があります。
ポートBは7セグメントを直接ドライブしますので、Highで電流供給して点灯することになり
ます。従って電流制限用の抵抗を220Ωとして、セグメント当たり15mA程度にしています。
桁ドライブはセグメントの合計で最大100mA程度が流れますので、トランジスタでドライブ
します。簡単にするため、4個のMOS FETを内蔵したICを2個使っています。

CPLDを実装したままプログラミングができるように、JTAGの端子を用意しています。
ここにXilinxのプログラマのJTAG信号を接続すれば、電源を入れたまま機能を書き換
えて即動作させて確認することが可能となります。

(下記回路図は拡大表示が出来ます)




【表示部のプログラム】

表示制御にはPIC16F873を使いました。この中のプログラムはCPLDが基本的な機能を
全部代わりにやってくれるので、至って簡単な構成で済みます。
全体の流れは下図のフローチャートのようになっていて、まずポートの初期化を実行します。
この中では、PIC16F87xシリーズの特徴である、デフォルトでIOポートがアナログ入力に
なっていますので、全部ディジタルモードで使うように設定しておきます。
そして最初にCPLDに対してカウント開始指令(trigger)を瞬時パルスで出力してから、
あとは、ダイナミック点灯制御のループの繰り返しだけで、8桁の表示データをBCDデータ
からセグメントデータに変換してポートBに出力します。
全桁の表示が完了した時点で、CPLDのカウントが終了したかをbusy信号をチェックする
ことで行います。まだカウント中なら表示制御を繰り返します。
カウント終了が判定できたら、CPLDからカウント結果のBCDデータを順次8桁分読込み
変数データに格納します。これを格納すれば自動的に表示データとして次の表示サイクルで
使われますので表示内容が更新されることになります。


             

このPICのプログラムソースは書きとなっています。クリックすればそのまま見られます。

  ★ 高精度8桁周波数カウンタ アセンブラソースファイル


【表示基板】

 セグメント発光ダイオードを使った表示基板を組み立てます。
今回使用するセグメント発光ダイオードはカソードコモンタイプです。
表示部分の回路図は下図のようになります。簡単な回路ですので問題は無いでしょう。
小数点も表示できるようにジャンパで接続できるようにコネクタに端子を出しておきます。
 (下図は拡大できます。)





【製作】

ケースにはタカチの見かけが計測器タイプのプラスティックケースを使いました。
このケースは前面、背面パネルだけがアルミ板となっているので、工作が比較的
楽です。
穴あけは、発光ダイオードが長方形の大きな穴となるので、やや面倒ですが、
あとは丸穴だけでですので楽に組み立てが出来ます。
各基板の回路図とパターン図は、WinDraftとWinBoardで作成しましたが、そのファイルを
下記からダウンロード出来ます。

   ★ 制御基板回路図
   ★ 制御基板パターン図

   ★ 表示基板回路図
   ★ 制御基板パターン図




全体外観
タカチのケースを使用



真中下側の四角いICソケットのICが
Xilinx社のCPLD XC9572である。



ケース内実装も前項のカウンタを
そのまま利用した。



セグメント発光ダイオードのパネル部分は
L金具で固定し、前面パネルにはアクリル板を
両面接着テープで固定しています。
発光ダイオードの表示面はアクリル板に
ぴったり当たるように固定します。




電源はトランスとブリッジダイオード、電解コンデンサ
で構成しています。
電解コンデンサを両面接着テープで固定しトランス
との間にダイオードブリッジを空中配線で固定して
います。



実装したままCPLDのプログラミングが出来
即そのまま動作させることが出来るので
非常に便利である。






  目次ページに戻る