DDSとPICによる周波数特性測定器(PICのSW編)

DDSで正弦波を出力し、ログアンプでレベルを測定します。
そのデータをPICで液晶表示器に表示すると同時にパソコンに転送して、
パソコンのプログラムで周波数特性として表示、保存します。



【概要】
 市販キットのDDSユニットにPICを組み合わせた正弦波発信器と、ログアンプとPIC16F876を
使ったデシベル測定器を組み合わせて、10Hzから10MHzまでの範囲で周波数特性を測定
するための測定器を作ってみました。
これにパソコンをシリアルインターフェースで接続して、周波数特性をグラフ表示できる測定器
が完成します。この


前面パネルの液晶表示器の表示例です。
1行目には現在出力している正弦波の
周波数を1Hz単位で表示します。

2行目には、2チャンネルのレベル計測結果
をデシベル値で直接表示します。
-64dB〜+30dBの範囲を少数点2桁まで
表示します。


このPICのプログラムリストは下記で直接みることが出来ます。CCS社のCコンパイラでお使い
下さい。

  ★周波数特性測定器PICプログラムソースリスト
  ★液晶表示制御用関数ライブラリ


【機能概要】

 今回の周波数特性測定器の本体側の機能は下記のようになっています。これらの
機能をPICで実現しますが、プログラムはCCS社のC言語で作成しています。
Cコンパイラの組込み関数のお陰で結構複雑な機能を簡単に記述することが出来ました。

A)リモートモード
 (1) 周波数のDDS設定出力と表示
   パソコンからシリアルインターフェース経由で指定された周波数範囲をDDSに設定し
   出力する。 
   設定値は2バイトを2回で受信し、それからDDSへの26ビットの設定フォーマットに
   変換し専用シリアルインターフェースで出力する。
   同時にその出力周波数値を液晶表示器に表示する。
 
 (2) レベル計測値の表示と転送
   パソコンからシリアルインターフェース経由で指定された時に、2チャンネルのレベル
   を計測し、デシベル値に変換したあと、転送する。
   同時にその値を液晶表示器にも表示する。

B)手動モード
 (3) ロータリースイッチによる周波数アップダウン
   手動モードの時に、ロータリースイッチの回転方向を常時検出し、それにより周波数を
   現在値からアップダウン制御する。同時にレベル測定も行い両方を液晶表示器に
   表示する。
   アップダウンは、広範囲の周波数設定を早く変更できるように周波数ディケードの
   1/100刻みで行うものとする。


【全体構成】

本周波数特性測定器のPICのプログラムの全体の流れは下図のようになっています。
まず最初に入出力ピンのモード設定や、USART、A/D変換などの初期設定を行います。
その後で、モードスイッチの状態を入力し、手動かリモートかに分岐します。
手動の場合には、ロータリースイッチを常時監視し、入力変化があった場合には、左右の
回転方向を検出して、周波数のアップ、ダウンをします。その周波数のアップダウンの刻み
は、その時の周波数の桁(10の何乗か)の1/100にします。

自動の場合には、USART経由でデータを受信し、そのデータの中身をコマンドとして判定し
それぞれの処理に分岐し、処理が終了したら最初に戻り、再度受信待ちとなります。
コマンドには3種類あり、0の場合には何もしません。
1の場合には、周波数設定出力ということで、続く周波数データを受信して、DDSへの設定値
に変換して出力します。その時の周波数を液晶表示器に表示します。

2の場合には、レベル計測指示ということで、2チャンネルのレベルデータを計測し、その
データをデシベル値に変換してから、PCに返送します。同時に、そのデータを液晶表示器に
表示します。






このメインの処理部分の実際のコードは下記のようになります。
ロータリースイッチの読み込み部ではチャッタリング回避のためにディレイ関数が挿入されて
います。またLatchはロータリースイッチの処理を一度実行したら、次に変化がおきるまでは
同じ処理を繰り返さないようにするためのフラグで、Mupdown関数内でセットされます。
周波数データは上位、下位とも2バイトで送られてくるのでそれをlong型の変数に変換してから
DDSへの設定関数に渡します。



【周波数の設定制御】

PCから送られて来た上位、下位2バイトのデータを、DDSへの設定データに変換し出力します。
変換は、上位10ビット+下位16ビットをそのまま26ビットの周波数データとします。
DDSへの出力データフォーマットは、下図のように、3ビットのデバイスアドレス、4ビットのコマ
ンド、26ビットの周波数設定の3つを、クロック信号と一緒にシリアルデータとして送り込みます。
そして最後にストローブ信号を出力すればしれがラッチされてコマンドとして機能します。
このときのアドレス、コマンドは固定データとなっていてddsCmd(0x67)の定数としています。





実際のDDSへの周波数設定の処理関数は下記のようになっています。
float型のfrequencyが実際の周波数値でこれを液晶に表示します。float型でないと数値が
表現できません。(桁数が大きいため)
あとはDDSへ指定ビット数をシリアル出力する関数shift_outで順次33ビットの全ビットを
出力します。最後にddsStbをonにしてコマンドの実行制御をします。








【レベル計測】

ログアンプの出力をA/D変換で読み込みそれをデシベル値に変換します。
変換はハードウェア編で説明したように、+Refで2.5Vの上限を設定していますから
下式で変換できることになります。

    Lv = (95×Ad)/1024− 68 

実際の計測と変換関数は下記のようになっています。
まず10ビットモードでA/D変換をした右詰めのデータをlong型で計測します。
そのデータをfloat型に変換したあと、上記計算式に当てはめて、float型で計算します。
計算結果として求めたデシベル値をRS232Cで送信するとともに、液晶表示器の2行目に
2チャンネル分並べて表示します。





【手動の周波数制御】

手動モードの場合には、ロータリースイッチの回転に合わせて周波数をアップダウン
します。その制御処理が下記となります。
面倒なのは、周波数のその時の値でアップダウンの増分を変更する処理です。
これは周波数の桁毎にその桁の1/100づつアップダウンさせようとする処理です。
こうすることで、手動でも実用的な早さで設定を変更することが出来るからです。
その代わり、その周波数の1/100より細かい設定は出来ないことになります。
手動の場合には、最高周波数を16MHzまでできるようにしています。










  目次ページに戻る