USB接続の8桁周波数カウンタ(ソフトウェア編)

 CPLDの周波数カウンタブロックとPICを組み合わせた
 8桁の周波数カウンタです。USBでパソコンと接続できます。
 PICのプログラムはPICROSでマルチタスク化しました。


【概要】

CPLDでカウントした周波数を8桁数値で液晶表示器に表示するとともに、
USBコントローラでパソコンとフルスピードのUSB接続が出来ますので、
データ収集やグラフ作成には便利に使えます。
 PICのプログラムには「PIC用リアルタイムOSのPICROS」を使ってマルチタスク化
しましたので、意外に簡単にプログラムが出来ました。


表示は8桁数値で3桁ごとにカンマを追加



【機能仕様】

 本周波数カウンタの機能仕様は下記のようになっています。

  ・測定周波数 : 最大約80MHz
  ・測定周期   : 1秒 自動更新
  ・表示      : 16文字2行の液晶表示器による 8桁表示
             液晶表示器はバックライト付き
 ・USB接続  : フルスピードによる接続
         インターフェースは下表とする

 ・電源   : DC9V 最大約250mA

パイプ 送受信 データ量 データ内容 備考
受信 8バイト コマンド受信 1文字コマンド
送信 16バイト 計測値返送 状態 1byte
データ BCD8byte
受信 8バイト 未使用
送信 8バイト 未使用
受信 8バイト 未使用
送信 16バイト 未使用



【PIC側プログラム】

 本周波数カウンタの全体制御用にはPIC16F876を使っています。これで
CPLDのカウント値を読み取り、液晶表示器に表示するとともに、USB制御
を行ってパソコンとのUSB通信を制御します。
PIC側プログラムは、自作リアルタイムOSである「PICROS」を使ってマルチ
タスク化しました。
全体のソフトウェア構成は下図のようになっていて、新規に作成した部分は、
図中で色のついているタスク群と定義部だけとなっています。
すべてCCS社のC言語で作っています。





 上記の構成で製作したプログラムの全体の流れは下図のようになっています。
全体が大きくローカル動作の左側半分と、リモート動作の右側半分とに分かれます。
まずローカル系は、初期起動でkicktskが起動されると、CPLD動作を開始させて、
EndCheckタスクを起動し、1秒後のCPLDのカウント終了をEndCheckタスクで待合
せます。
 EndCheckタスクでは、CPLDのカウント終了の割込み回路が無いので、CPLDの
Busyを50msec間隔でチェックするため、 Busyが続いていたら、Wait_Timer関数で
50msecのタイマ待ちとしてPICROSに戻ります。
Busyが解除された時には、Request_Task関数でmesureタスクを起動します。

 mesureタスクでは、CPLDから8桁のカウント値を入力し、データに保存してから
液晶表示器に単位とともに表示します。表示終了後、今回のカウント中にUSBから
データ要求があったときのために、usbrcvのmesureタスクからのイベント待ちを、
Resume_Task関数で解除します。

 上記のローカル動作中にはUSBの割込みが可能で、もしパソコンからUSB経由で
データ要求のコマンドの受信をしたなら、usbrcvタスクをTrigger_Task関数で起動します。
usbrcvタスクは、CPLDのカウンタの終了を待合せるため、Suspend_Task関数により
messureタスクのイベント待ちとします。
そしてmesureタスクからのイベント待ち解除により、データとして保存されている
カウンタの値をUSBで送信します。











下記はPIC側のプログラム一式です。ダウンロードしてMPLABとPCMの
統合環境でお使い下さい。
PCMはCCS社のCコンパイラです。

 ★ USB接続周波数カウンタ プログラムファイル一式



【パソコン側プログラム】

今回の周波数カウンタ用のパソコン側のプログラムは、長期間のカウント値に
中心周波数からのずれを計測するためのものとしました。
基本フォームのデザインは下図のようになっています。
図右上のTimerとCommon Dialog Controlが隠しコンポーネントとなっています。
まずUSBの接続を制御するためVebderIDとProductIDが変更指定できるように
テキストボックスとしました。基本の値をデフォルト値として、そのままで基本の
値で接続するようにしています。正常に接続できると背景色が茶色に変わる
ようにしました。
次が計測周期の指定で、カウンタ本体側が1秒間隔でしか測定できないので、
最低が1秒間隔となり、最大60秒とします。
その下が実際の周波数を表示するテキストボックスです。最大8桁です。

境界線の下側はグラフを作成するための設定となります。
計測中にグラフ作成ボタンを押すと、それまでの計測値をグラフにし、そのまま
リアルタイムで計測値を更新表示します。
中心周波数と変動幅の欄には、グラフを表示する時のY軸を決めます。中心
周波数の値がY軸の真中になり、変動幅の2倍の値がそれぞれプラスマイナスの
表示範囲になります。
グラフは基本色は青ですが、変動幅を超えた部分は赤色で表示します。
表示時間はX軸で、分の時には、上の時間間隔で設定した値で自動的にX軸の
時間を変更しますが、時間を指定した時には固定値の時間軸となります。
グラフ名と信号名はグラフの凡例として表示する内容です。

グラフ保存ボタンで、現在表示されているグラフをファイルとして保存します。
グラフ読出しボタンで、保存しておいたグラフを読み出して表示します。
この表示の時には既存表示のグラフを消去しないので、複数データを重ね合わせて
表示することが可能です。 但し、この場合の中心周波数と変動幅は同じである
ことが前提です。









 下図が実際のグラフ作成結果でクリスタル発振器の電源投入時の周波数
変化をグラフにしたものです。
2つのデータを重ねて表示した結果です。途中で赤色の線になっているのは
その時の計測値がグラフで指定した変動幅を超えたためです。

これで約67MHzのクリスタル発振器を安定に計測することが確認できました。








下記は上記パソコン側のプログラムファイル1式です。 Visual Basicで
お使い下さい。

  ★ USB接続周波数カウンタ制御プログラム 1式





目次に戻る