電界強度計の製作

[公開:any]

[電子工作/AVR]
[電子工作/ラジオの製作]
[AD8307,AVR,ATmega88,HT7750,測定器]

origin 2008-12-10
add 2008-12-14


電界強度計の校正」で、標準信号発生器を使って校正しました。(2008-12-21)

 エアバンド受信機の製作で久しぶりにプリアンプ(・・といっても専用ICを使った簡単なものですが・・)を作りました。性能的には十分満足なのでこれで終わりのはずですが・・・・。

 インターネットで高周波のプリアンプを検索すると、みなさんいろいろな石(FETやトランジスタ)を使って作られているようで楽しそうです。こういう記事(Webサイト)を見ていると、「高利得で低NFのプリアンプが必要」というわけではありませんが、「高性能な石をつかって簡単に作ってみたい」という技術的な興味が抑えられなくなります。^^;

 一応は、その昔、GaAs-FETを使ってアマチュア無線の144MHzや430MHzで使うプリアンプを作ったことがあります。基板のエッチングから初めて結構大変だった記憶があります。ただ、当時は、仕事先で信号発生器やスペアナなどの高周波測定機材が自由に使える環境にあったので、調整や性能評価に苦労はしていません。

 現在の環境には、高周波の測定器は一切ないので、これを何とかしなくてはなりません。プリアンプの調整や性能評価は、SGやスペアナ(できればトラッキングジェネレータ付きのスペアナ)があれば申し分なしですが、そんな高価なものは当家財務大臣にお伺いをかけることさえも恐ろしくてできません。^^; とりあえず、信号を発生するノイズジェネレータと信号を測定する電界強度計を作ってみます。

 電界強度計は、秋月電子でキット化されているものをベースに考えます。アナログ・デバイセズ社のAD8307というLOGアンプとオペアンプのCA3140で構成します。オペアンプは、ボルテージフォロアとして使用するだけです。秋月電子のキットでは、電界強度をラジケータ(メーター)で表示させていましたが、ワンチップマイコンのAVRとLCDを使って表示させるようにします。

電界強度計回路図

 AD8307は、500MHzまで動作するようです。そこまで必要ありませんが、高周波の扱いなので注意が必要です。また、表示に使うAVRなどのディジタル回路からのノイズの回り込みを排除するために、シールドされたケースにコンパクトに収めることにしました。8ピンDIPのIC2個をベタ基板で作るのが面倒なのでユニバーサル基板を使います。銅テープを張ってグランド面積を多少稼ぐことにします。(おそらくここまでしなくてもシールドすれば十分だと思います。)

AD8307LOGアンプ部表AD8307LOGアンプ部裏

テスト用に作ったためICソケットを使用しています。特性をとったら問題ないのでこのままとしましたが、本来はICソケットは使わないほうが良いと思います。


 一応、電源やケースからの信号の取り出しは貫通コンデンサを使いました。MAX038を使用したオシレータから信号を入れて出力を確認しました。

LOGアンプケースLOGアンプ部テスト

 MAX038オシレータから10MHzを入力したときの出力レベルをプロットしたグラフです。入力信号レベルは、オシロスコープのFFTでdBV値で読み取ったものをdBmに換算しました。

AD8307入出力グラフ

 AD8307の仕様とおり、高い精度でリニアな出力が得られます。AD8307の入力は50Ω(51Ω)で終端してあるので-50dBmで1.0Vが正確に出力されています。ただ、グラフ中の回帰式で示してある傾きが25mV/dBと多少異なっているのが気になります。測定環境の可能性が大きいとは思いますが、正確な校正が出来た時点で傾きや切片をAVRのプログラムで補正するのでこのままとします。

 ブレッドボードで全体をテストしながらAVRのプログラムを作りました。LOGアンプ部の出力は、電界の強度に応じて0〜2.5Vの電圧が出力されるので、AVRのATmega88のAD変換で読み取ります。AD変換のリファレンス電圧には、シャントレギュレータICのTL431で2.5Vを生成して与えます。AD8307の出力の傾きが25mV/dBとすると10ビットのAD変換で約0.1dB単位での読み取りが可能となります。
 LOGアンプの入力にワンターンのループをつけて、グリッドディップメータからテスト信号を結合入力します。ディップメータの距離に応じてAD変換値が変化することを確認しました。

電界強度計開発1電界強度計開発2

 AVRのプログラムでは、スイッチによる切替でAD変換値をdBm、dBu、mV(rms)、mWに変換して表示するようにしました。下の画像は、ほぼ同じ入力レベルを各単位で表示させたものです。

電界強度計dBm表示電界強度計dBu表示
電界強度計mVrms表示電界強度計mW表示

 LOGアンプの入力をオープンにすると、測定範囲の最小値である-80dBm近くまで下がりますが、実際にリニアに変化するのは、-60dBm程度までとなります。測定範囲の最大値は、+9.9dBmまでとなります。ここまでは、ほぼリニアに変化しています。

電界強度計の最大値電界強度計の最小値

 全体の消費電流は、30mA以下と少ないのでDC-DCコンバータICのHT7750を使って、単3電池2本の3Vから5Vへ昇圧する電源も基板上に実装することにしました。スイッチングノイズが高周波測定へあたえる影響が心配だったのですが、ブレッドボード上に組み立ててテストしても特に問題はありませんでした。

電界強度計AVRマイコン基板実装図

 ユニバーサル基板に部品を取り付けました。この時点では、電源スイッチと表示単位切替えのプッシュスイッチが実装してありませんが、この後、基板上の空スペースに取り付けました。

電界強度計AVR基板表電界強度計AVR基板裏

 ケースはいつもと同じ、秋月電子のポリカーボネートケース中サイズです。LOGアンプ部をシールドケースごと内蔵しています。電池からの電流値は、実測で50mA弱となるので長時間利用可能です。(別に長時間使う用途も思い付かないですが・・^^;)

電界強度計の完成画像

 LOGアンプ部のケースが、ほんの少しポリケースの内寸より高いようで、0.5mmほど隙間があきますが、気にしないようにします。^^;

電界強度計のサイド画像

 ディップメータからの信号を測定してみたところ動作状態は問題ありません。・・が、狭い範囲に回路を集約したせいか、ケースの蓋を開けたときに比べ、閉めたときに1dBm程度、ノイズレベルが上昇します。(ケースの蓋側に基板とLCDが固定してある)

電界強度計の動作確認

 参考までにAVRのプログラムリストを晒します。AVRStudio4とWINAVR-20080512で作成してあります。AD値からデシベル値等への計算は、簡易(手抜き)計算となっています。また、AD8307の仕様から算出した値を計算に使用しています。ちゃんと校正できた時点で修正する予定です。
 こんな短いプログラムでもmathライブラリ等を使って浮動小数点計算させると6Kを超えるサイズとなります。・・つまり、ATtiny26等のフラッシュメモリが小さいものは使えません。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <stdio.h>
#include <math.h>

#include "lcd.h"

#define ADC_ENABLE (_BV(ADEN)|_BV(ADATE)|_BV(ADIF)|0b110)
#define ADC_START  (ADC_ENABLE|_BV(ADSC))

void delay_ms(unsigned int t) {    while(t--)  _delay_ms(1); }

FILE *fp;

unsigned int get_adc(char ch)
{
    ADMUX = ch;
    ADCSRA = ADC_START;
    loop_until_bit_is_set(ADCSRA, ADIF);

    return ADCW;
}

int main()
{
    unsigned char sw0_state;
    unsigned int dat;
    unsigned char mode;
    double dbm, dbu, mv, mw;
     
    DDRB = 0b11111111;        // for LCD
    DDRC = 0b00000000;        // A/D input 
    DDRD = 0b11111110;        // PB0 SW-input

    PORTB = 0b00000001;        // PB0 pull up

    ADCSRA = ADC_ENABLE;

    lcd_init();
    lcd_cls();
    fp = fdevopen(lcd_putch, NULL);        // LCD出力ファイルディスクプリタ
    lcd_goto(0, 0);
    fprintf(fp, "SigMeter");

    sw0_state = 0;
    mode = 0;

    while(1) {
        dat = get_adc(0);
        // AD8307 spec.  Slope 25mV/dB, intercept −84dBm
        dbm = dat * (2.5 / 1024.0) / 0.025 - 84.0 - 6.0;
        dbu = dbm + 107.0;
        mv = pow(10.0, (dbu / 20.0)) * 0.001;
        mw = mv * mv / 50.0 * 0.001;
        lcd_goto(1, 0);
        if(mode == 0) {
            fprintf(fp, "% 5.1fdBm", dbm);        
        } else if(mode == 1) {
            fprintf(fp, "%5.1fdBu", dbu);        
        } else if(mode == 2) {
            fprintf(fp, "%6.2fmV", mv);        
        } else {
            fprintf(fp, "%6.4fmW", mw);        
        }
        if(bit_is_clear(PINB, PB0)) {
            sw0_state = 1;            
            delay_ms(10);
        }
        if(sw0_state && bit_is_set(PINB, PB0)) {
            sw0_state = 0;
            mode++;
            if(mode > 3)
                mode = 0;
        }
        delay_ms(100);
    }
}

▲ページ Top へ...