PICマイコンRFレベルメータの実験

秋月電子の電界強度計キットは、ログアンプを内蔵しています。メータの目盛はdBμですが、目盛間隔が不均一のため中間値はなかなか読みずらいものです。
ロッドアンテナを外して、高感度レベルメータとして使えそうです。PICマイコンを使ってdBmで直読できるようにすると便利に使えそうです。
上左の写真は外観です。レベルメータ本体(表示部)と小さなボックス(電界強度計LOGアンプ)です。このボックスは電界強度計のLOGアンプ部のみを取り出したものです。これにメータをつければ元の電界強度計となります。上右の写真は、レベルメータ表示部とLOGアンプの内部です。
測定範囲(電界強度計LOGアンプAD8307データシート):-70dBm〜+17dBm

なお、ここに掲示したデータは、すべて自作計測器で得たものです。これらの機器は、信頼できる計測器で校正をしているものではありません。データは、「おおよそ」「傾向」を見ていただく程度と理解してください。

ハードウエア

PIC回路には、特に目新しいところはありません。PICは、16F873A、クロックは10MHz、液晶表示器は、SC1602BSを使っています。電界強度計(ログアンプAD8307)の出力電圧は、max2.5Vです。PICのVref+=2.5Vとしています。破線の切替回路は、将来、dBμも表示できるようにしたいと考えています。


<拡大>

プログラム

プログラムは、アセンブリ言語で作っています。ツールは、Microchip社の「MPLAB IDE」を使っています。ソースプログラムはページ最後でダウンロードできます。興味があれば、ご覧ください。このプログラムは、高度な手法は使っていません。だらだらと書いています。コメントを参考に読めば、流れは簡単に分かると思います。

プログラム構成

プログラムは、「ラベル定義」、「初期設定」、電界強度計からのアナログ信号をバイナリコードに変換する「AD変換」、電圧スケールをdBmスケールに換算する「スケール変換」、 バイナリコードをBCDコードに変換する「BCD変換」、BCDコードからASCIIコードへの変換、LCD書き込み等を行う「LCD表示」です。


<「プログラム構成」拡大>

AD変換

アナログ信号を10ビットバイナリデータ(2バイト)として出力します。


<「AD変換フローチャート」拡大>

バイナリ/BCD変換

「AD変換」、または「スケール変換」から出力されるバイナリデータ(2バイト)をBCDコード(5桁)に変換します。


<「BCD変換フローチャート」拡大>

LCD表示

BCDコード(5桁)をASCIIコード(5桁)に変換、LCDへの書き込みの制御を行います。1の桁、少数点以下の桁以外の数字0は、表示されないようにしています。


<「LCD表示フローチャート」拡大>

スケールの変換

上の「AD変換」「BCD変換」「LCD表示」まで出来上がるとLCDに数値を表示させることができます。
しかし、入力データをdBmで表示するには、さらに工夫が必要です。

スケール変換定数の確定

PICへの入力信号、すなわち、電界強度計出力信号を正しく知る必要があります。電界強度計にさまざまのレベルの信号を与え、LCDに表示させてみました。
PIC LCD表示値から電界強度計の出力、すなわち、PIC入力値が分かります。下の表は、例です。入力信号レベル値は、オシロ(Tek2430A)のカーソルをあてて、mVp-p値を読み、dBmに換算したものです。4桁も並んでいますが、精度が良いわけがありません。せいぜい2桁でしょうけど換算に使っているExcelが出してくれた数値をそのまま書いています。

入力信号dBmADC出力値
+2.84994
-7.79883
-17.21783
-27.30677
-36.74576
-47.39465
-51.41424

スケール変換の考え方を図<拡大>にしてみました。(X、Y軸が通常とは逆に表現しています。)
横軸"Y軸"がAD変換部への入力レベルdBmで、縦軸"X軸"がそれに対するPIC表示値です。スケール変換では、それを裏返して、PIC表示値に対する入力レベル値dBmを出力するものです。

 まず、スケール変換曲線の勾配を求めます。
上の表から、表示したい値/入力値(dBm)が+2.84〜-51.41、よって幅「542.5」、4捨5入して、「543」とします。 対応するADC出力値は、994〜424、よって、幅「570」です。
これより、勾配は、k=543/570 です。仮に切片をkとすると、変換式は、
     Y=543X/570-k
となります。PICは、割り算は不得意ということです。そこで、ここは一つ妥協して、割り算は、2のn乗の数(・・、32、64、・・・)で行うこととします。 数字は元の数字に近いほうが、変換誤差は、少なくて良いかと考えられますが、もう一つ問題があります。 数値計算には、2バイトしか用意していません。2バイトで表現できる数は、D'65535'です。これを越えるとオーバーフローしてしまいます。 計算の過程で、絶対、この数字を越えないことが条件です。小さくすると誤差が増えます。妥協したのが、これです。
     Y=61X/64-k
PICは、小数点を含む計算が出来ません。そこで、計算式は、このように変えます。
     Y=(61X-64k)/64
ここで、上の図から分かるように、
(切片"964"は、Excelのオプション機能を利用して近似線を引き、数式を表示します)
     X=964 のとき、 Y=0 としたいわけですから
     0=(61*964-64k)/64
     64k=61*964=58804
よって、変換式は、
     Y≒(61X-58804)/64

スケール変換誤差

スケール変換式は、妥協の結果、次のように決めました。
     Y≒(61X-58804)/64
スケール変換には、いくつかの妥協で出来ていますので、誤差を含みます。おおよそのところをExcelで出してみました。
これは、ADC出力レベル(実測)をもとに上の近似式でスケール変換値(計算)を算出し、入力レベル(dBm)との差を求めたものです。
この結果から、まあ、アマチュア用としては使えるか?!、といったところです。

入力レベル(dBm)ADC出力値スケール変換値(dBm)誤差(%)
+2.84994+2.90.68
-7.79883-7.7-0.89
-17.21783-17.30.24
-27.30677-27.40.20
-36.74576-37.00.66
-47.39465-47.60.36
-51.41424-51.50.11

スケール変換プログラム

AD変換から出力されるバイナリデータ(2バイト)をスケール変換しバイナリデータ(2バイト)として出力します。変換係数は、D'61'としてAd=0x003D、D'58804'としてB=0xE5B4、D'64'は2の6乗ですからAn=0x06です。


<「スケール変換フローチャート」拡大>
<「スケール変換ソースファイル」asm>

スケール変換シミュレーション

予定通りのスケール変換を行ってくれるのか、PICに組み込む前に、MPLAB IDEでシミュレーションを行ってみました。

MPLAB IDE
プログラムの開発、シミュレーションは、Microchip社のMPLAB IDEを使っています。Debugger/SIMを使ってレジスタとその数値を読み取ることができます。
シミュレーションの結果
アナログ入力値を変えて、スケール変換結果データを取ってみました。まあ大体良さそうです。

 

dBm表示

「スケール変換ルーチン」を組み込みました。仕上がりの程度を確認してみました。信号源として、FRMS/FREX(50MHz)、信号レベルの確認には、オシロスコープ「Tecktronix 2430A (150MHz)」でmVp-p値を読み、dBm値に換算しています。
電界強度計のLOGアンプAD8307では傾き、切片調整が可能です。校正のため微調整が必要な場合、データシート(下右の図)を参考に調整回路を付け加えておいた方が良いかと思います。

RFレベルメータ表示例
FRMS/FREXの出力を表示しています。
AD8307関数傾き、切片調整回路
ANALOG DEVICES社AD8307データシートより抜粋<拡大>

プログラムダウンロード

ソースファイル(asm、16kB)
(註)スケール変換定数は、手持ちの電界強度計に合わせています。定数はハードウエアに合わせて修正が必要です。
なお、このプログラムは、十分、チェックを済ませたわけではありません。まだ、バグがあるかと思います。ご容赦ください。