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バイト)として出力します。
バイナリ/BCD変換
「AD変換」、または「スケール変換」から出力されるバイナリデータ(2バイト)をBCDコード(5桁)に変換します。
LCD表示
BCDコード(5桁)をASCIIコード(5桁)に変換、LCDへの書き込みの制御を行います。1の桁、少数点以下の桁以外の数字0は、表示されないようにしています。
スケールの変換
上の「AD変換」「BCD変換」「LCD表示」まで出来上がるとLCDに数値を表示させることができます。
しかし、入力データをdBmで表示するには、さらに工夫が必要です。
スケール変換定数の確定
PICへの入力信号、すなわち、電界強度計出力信号を正しく知る必要があります。電界強度計にさまざまのレベルの信号を与え、LCDに表示させてみました。
PIC LCD表示値から電界強度計の出力、すなわち、PIC入力値が分かります。下の表は、例です。入力信号レベル値は、オシロ(Tek2430A)のカーソルをあてて、mVp-p値を読み、dBmに換算したものです。4桁も並んでいますが、精度が良いわけがありません。せいぜい2桁でしょうけど換算に使っているExcelが出してくれた数値をそのまま書いています。
| 入力信号dBm | ADC出力値 |
|---|---|
| +2.84 | 994 |
| -7.79 | 883 |
| -17.21 | 783 |
| -27.30 | 677 |
| -36.74 | 576 |
| -47.39 | 465 |
| -51.41 | 424 |
スケール変換の考え方を図<拡大>にしてみました。(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.84 | 994 | +2.9 | 0.68 |
| -7.79 | 883 | -7.7 | -0.89 |
| -17.21 | 783 | -17.3 | 0.24 |
| -27.30 | 677 | -27.4 | 0.20 |
| -36.74 | 576 | -37.0 | 0.66 |
| -47.39 | 465 | -47.6 | 0.36 |
| -51.41 | 424 | -51.5 | 0.11 |
スケール変換プログラム
AD変換から出力されるバイナリデータ(2バイト)をスケール変換しバイナリデータ(2バイト)として出力します。変換係数は、D'61'としてAd=0x003D、D'58804'としてB=0xE5B4、D'64'は2の6乗ですからAn=0x06です。

<「スケール変換フローチャート」拡大>
<「スケール変換ソースファイル」asm>
スケール変換シミュレーション
予定通りのスケール変換を行ってくれるのか、PICに組み込む前に、MPLAB IDEでシミュレーションを行ってみました。


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

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





