中華AD8307のテストをしてみましたが、これはうまくいけばモジュールとして使えるようにピンヘッダを立てて作りました。

テストした感じでは使えそうなので、まずパワー計として動かしてみることにしました。

といっても、MCUのADCで読んで計算するだけです。

ただ、AD8307 そのままだと入力範囲が -76dBm〜+16dBm と、普段使うには電力範囲が小さいほうに寄りすぎているため、25dB のアッテネータを前段に挿入し、-51dBm〜+41dBm の範囲としました。

耐電力の大きなアッテネータは面倒なので、1/2W 抵抗を使い、定格1W程度、極めて短時間なら10W程度というイメージです。

使用感

実際10W入力すると3秒ぐらいでかなり発熱するのでこわいです。5W ぐらいまでなら〜5秒耐えられそうです。

確度

アッテネータの絶対的な誤差は簡単な校正で消せます (インターセプトが移動してるだけなので) 。AD8307 自体のログとの一致性は±1dB。

ただ、入力周波数によって出力電圧が結構変わりますので、確度を求めるなら周波数カウンタ機能をつけて、周波数も変数にして校正したほうが良さそうです。

例えば10MHzと500MHzだと、出力電圧にほぼ固定で10dB分の差があります (1ケタ!!)。一応、この差は周波数に応じてほぼ固定なので、入力周波数がわかっていれば簡単に補正はできます。

↓ はデータシート記載のものと、実測のもの


今回は周波数を測ってない以上、全域での絶対的な確度はあまり期待できません。

計測できた電力値が実際より大きい分にはあまり問題ではありませんが、実際よりも小さい値が表示されると、これを信じて他の機器につないだときに過大入力になることがあり、よくありません。安全策としては上限周波数で校正をかけることでしょう。

ただし、前段についているアッテネータの特性的に300MHzぐらいが上限です

用途

明確な出力が不明な信号源の場合、直接スペアナに繋ぐまえに、一旦チェックする用として使いたい気持ちです。瞬間的になら10W入力できますし、これなら壊れても痛くありません。

コード

#include <Arduino.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "interval.hpp"

static const float SLOPE = 26.367;
static const float INTERCEPT = -63.51879243;


LiquidCrystal_I2C lcd(0x27, 16, 2);
String formatWatts(const float watts) {
	if (watts < 1e-3) {
		return String(watts * 1e6) + "uW";
	} else
	if (watts < 1e-1) {
		return String(watts * 1e3) + "mW";
	} else {
		return String(watts) + "W ";
	}
}

void setup() {
	Serial.begin(115200);
	Serial.println("init...");

	Wire.begin();

	lcd.begin();
	lcd.backlight();
	lcd.setCursor(0, 0);
	lcd.print("Hello, World");
	lcd.setCursor(0, 1);
	lcd.print("TEST");
}

void loop() {
//	interval<1000>::run([]{
//		Serial.println("1000ms");
//	});

	uint16_t adc_raw = analogRead(0);
	Serial.print("ADC Got = "); Serial.println(adc_raw);
	float adc = static_cast<float>(adc_raw) / 1024 * 5;

	Serial.print("ADC Voltage = "); Serial.println(adc * 1000);

	float dBm = (adc * 1000 / SLOPE) + INTERCEPT;
	Serial.print("dBm = "); Serial.println(round(dBm));

	float watts = pow(10, dBm / 10) / 1000;
	Serial.print("W = "); Serial.println(watts);
	Serial.print("mW = "); Serial.println(watts * 1000);

	lcd.setCursor(0, 1);
	lcd.print(round(dBm));
	lcd.print("dBm");
	lcd.print("                ");

	lcd.setCursor(0, 0);
	lcd.print(formatWatts(watts));
	lcd.print("                ");

	delay(500);
}
  1. トップ
  2. tech
  3. 中華AD8307をデジタル電力計にしてみる

25dB で SMA 入出力のアッテネータが欲しくなったので作ってみました。アッテネータを作ってみるのは初めてです。

回路

アッテネータの計算機 を使って必要な抵抗値を求め、抵抗計算のサイトでどうやって近い値を作るかを調べ、このようにπ型のアッテネータ回路にしました。

ボードレイアウト

小さくつくりたかったので全部縦に並ぶようにしてみましたが、入出力が近くなるので、こう実装するのはあんまり良くなさそうな気がします。

結果

挿入損失

300MHz ぐらいまではそこそこフラットにみえます。

リターンロス

300MHz ぐらいまでなら SWR=1.2 未満になりそうです。

  1. トップ
  2. tech
  3. 高周波用アッテネータを作ってみる

中華AD8307をいくつか手に入れてみたので、ちゃんんと使えるのか実験してみました。というのも、値段的にどう考えてもコピー品だからです (単価50円ぐらい)

回路とボードレイアウト

回路はAD8307のデータシートに記載がある以下の「基本的な接続」の回路ほぼそのままです。電源のデカップリング用の 4.7Ω はフェライトビーズに変え、入力抵抗 52.3Ωは100 // 110Ωで作っています (が、手元に110Ω抵抗がなかったため100 // 220 // 220 Ω)

ボードレイアウトは以下のようにしました。PCB Milling で作るため必ずしも理想的とはいえません。

測定

手元にある信号発生器だと、スペアナのトラッキングジェネレータ出力が一番信用できるので、これを使いました。ただし出力が-20dBm〜0dBmまでを1dB単位でしか出せないので、出力がもうすこし大きくなって飽和近くになったときどうなるかはわかりません。周波数は10MHz固定です。

ということでこのようになりました。確かにログアンプになっているようで、綺麗に dB に対して直線になっています。

傾きは 24mV/dB (= (2230-1750)/20 ), インターセプトは -92.9dBm ぐらいにあります。

AD8307 本来の仕様的にはインターセプトは -87〜-77dBm なのですが、これはずれています。原因はよくわかりません。入力インピーダンスが正確に50Ωになっていない(アンテナアナライザーで測ると約52Ω)影響かもしれません。

追記

500MHz まで段階的にはかりました。

広い範囲にしてみてみると、傾き 25.5mV/dB、インターセプト-87dBm ぐらいに見えます (10MHz時)。こんなもんなのかもしれません。

まとめ

ひとまずログアンプとしては動いているようなので使えそうです。インターセプトのずれは実装の問題なのかICの問題なのかはよくわかりませんのでとりあえず保留としようと思います。自分の場合出力を必ずADCに接続するので、ここが多少ずれていても大丈夫ではあります。

余談

表面実装品のテストにPCB Millingをはじめて使ってみました。PCB Millingとしては、こういう使いかたをするのが一番の目的だったので、ひとまずうまく実験できて良かったです。SOIC は割と足の間隔が広いので、あまり細かいことができないPCB Millingでも十分いけることがわかりました。

  1. トップ
  2. tech
  3. 中華AD8307を使ってみる