はじめに

この記事では、 トランジスタの直流電流増幅率 $h_{FE}$ を自分で測る方法 を、ふたつの章に分けて紹介します。

  • 前半(手計算編) : テスターと抵抗1本でベース電流とコレクタ電流を測り、 $h_{FE}$ を電卓で求める 方法。理屈を理解したい方、トランジスタテスターを持っていない方向け。
  • 後半(Arduino編) : 前半の測定回路を発展させて、 Arduinoで $h_{FE}$ を自動算出してディスプレイ表示する測定器 を作る話。たくさんの2SC1815をランク別に仕分けたい方、自作測定器に興味がある方向け。

理屈だけ確認したい場合は前半だけ、自動化に挑戦したい場合はArduino編 まで進んでみてください。

この記事でつかうもの

前半の手計算編で必要な道具をまとめておきます。

NPNトランジスタ(2SC1815)

本記事ではもっともポピュラーで手に入りやすいNPNトランジスタ 2SC1815 を使用します。秋月電子などで安価に入手できる定番品で、 オーディオ用途や自作エフェクターでもよく登場するトランジスタ です。

テスター

電流と電圧が測定できるテスターをひとつ用意します。 アナログテスターでもデジタルテスターでも構いません 。後述の測定回路では微小なベース電流を扱うので、 電圧モードで測れるテスター があると安心です。

テスター自体に $h_{FE}$ 測定機能が付いているモデルもありますが、ここではトランジスタの理解を深めるためにも、 あえて自力で $h_{FE}$ を測る手順 を学んでいきましょう。

1MΩの抵抗・ブレッドボード・電源

ベース側に直列に挿入する1MΩの抵抗が1本必要です。電源は乾電池やDC安定化電源(5V〜9V程度)で構いません。ブレッドボード上で組めば数分で完成します。

hFEとは

トランジスタでよく出てくる $h_{FE}$ とは、トランジスタが持つ直流電流増幅率のことです。わずかなベース電流を流したときに、コレクタ側に何倍の電流が流れるかを表す比 です。

2SC1815などのトランジスタでは、この $h_{FE}$ の値でランク分けされています。

ランク$h_{FE}$
O70~140
Y120~240
GR200~400
BL350~700

同じ型番・同じランクでも、$h_{FE}$ には個体差(バラつき)があります。 オーディオアンプや差動増幅段で2石をペア合わせするときには、 大量のトランジスタの中から実測でチョイスする ということが普通に行われます。だからこそ、 $h_{FE}$ の測り方を知っておくと自作の幅が広がります

hFEとhfeの違い

$h_{FE}$ が直流電流に対する増幅率なのに対して、似た表記の $h_{fe}$ (feが小文字)は 交流信号に対する交流電流増幅率 を指します。

ある条件下では $h_{FE} \fallingdotseq h_{fe}$ と近似できますが、厳密には別物です。本記事では $h_{FE}$ の直流電流増幅率のみ を扱います。

テスターでhFEを測定してみよう

ここからは、実際にテスターを使って 2SC1815の $h_{FE}$ を手計算で求める手順 を紹介します。

hFE計算式

$h_{FE}$ はベース電流 $I_B$ を流したときのコレクタ電流 $I_C$ の比なので、 $I_B$ と $I_C$ さえ測れば 次の式で $h_{FE}$ を求められます。

$$h_{FE}=\frac{I_C}{I_B} \tag{1}$$

hFE測定回路

ベース電流とコレクタ電流は、次のような回路で測定できます。

hFE測定回路

実験すると、1MΩの抵抗に流れるベース電流は 数μA程度 とごく微小です。テスターによってはこのレベルの電流を正確に読めないので、 1MΩにかかる電圧 $V_C$ を測ってオームの法則からベース電流を逆算 します。

$${I_B} = \frac{V_C}{1\mathrm{M\Omega}} \tag{2}$$

ここで $V_C$ は 1MΩの抵抗の両端にかかる電圧 です。コレクタ電流 $I_C$ はコレクタ側にテスターを直列に入れて、 電流レンジ(mA)で直読 します。

実験結果

手持ちの 2SC1815のGRランク を測定した結果がこちらです。

項目
$I_B$6.82μA
$I_C$2.1mA

式(1)に当てはめると $h_{FE}$ は 「308」GRランクは200〜400 なので、しっかり範囲内に収まりました。

同様に何個かの2SC1815(GRランク)を測ったところ、 $h_{FE}$ は 「260〜310」 の範囲でした。実測してみると、 1MΩにかかる電圧はどのトランジスタでもほぼ変わらない ので、ベース電流は一度算出すればOK。 あとは各トランジスタのコレクタ電流だけを測れば $h_{FE}$ を比較できます

さらに 2SC1815のBLランク(仕様は350〜700) も20個ほど測定したところ、 「600〜650」 に収まりました。 当然ですが、ベース電流(つまり1MΩ抵抗の値)を変えれば $h_{FE}$ の値も変わるので、実験結果はあくまで目安として捉えてください。

ところで、$h_{FE}$ が高ければ良いトランジスタというわけではありません。 ただし、 増幅率の高いトランジスタを使うと入力インピーダンスを少しでも稼ぎやすい ので、私は普段 Fuzz Face自作トランジスタ1石バッファー など、 エフェクター系の用途では BLランク品 をよく使っています。

$h_{FE}$ が分かると、トランジスタの入力インピーダンス $h_{IE}$ も求められるようになります。

以上、 手作業で $h_{FE}$ を測定する方法 をご紹介しました。テスター1台で手軽にできる一方で、何百個というトランジスタをペア合わせするとなると現実的ではありません。そんなときは、次章で紹介する Arduino自作測定器 や、市販の トランジスタテスター に頼るのが正解です。

ArduinoでトランジスタのhFEを測定器をつくってみた

ここからは発展編として、 前半の測定回路をArduinoで自動化 した話を紹介します。

Arduinoのアナログ入力でベース側・コレクタ側の電圧を読み取り、$h_{FE}$ を計算して液晶(ST7735)に表示する という構成です。 ボタンひとつでNPN/PNPを切り替えられる ようにしてあり、2SC1815のNPNだけでなく、2SA1015などのPNPトランジスタもそのまま測定できます。

回路図

Arduino版 hFE測定器の回路図

回路図に描かれているトランジスタは 配線しませんJ1のコネクタに被測定物のトランジスタを差し込む 形になります。NPN/PNPで電源の極性を反転させる必要があるため、 VC_PIN/VE_PINをArduinoのデジタル出力で切り替える 方式です。

ポイントは次の3点です。

  • ベース側の 510kΩ の電圧降下から $I_B$ を算出する(NPN/PNPで電源極性を反転させる都合上、回路図にはNPN用・PNP用として510kΩを1本ずつ配置していますが、 測定時に通電するのはどちらか片方 なので $I_B$ 算出ではそのまま510kΩを使います)
  • コレクタ側に 100Ω のシャント抵抗を入れ、その電圧降下から $I_C$ を算出する
  • ボタン押下のたびに NPN/PNPを切り替えて電源極性を反転 する

ソースコード

Arduino用のソースコードです。プロジェクトは GitHubで公開 していますので、ピン番号や定数を変えながら遊んでみてください。

#include <Arduino.h>
#include <Button.h>
#include <PollingTimer.h>
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h>

#define VOUT1_PIN A1
#define VOUT2_PIN A0
#define VE_PIN A2
#define VC_PIN A3

// Arduino Uno
#define  TFT_SCL 13
#define TFT_SDA 11
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8

//Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_SDA, TFT_SCL, TFT_RST);
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST);

Button button(2); // D2

enum TransistorType {
    NPN,
    PNP
};

struct TransistorCurrents {
    double Ib;
    double Ic;
};

TransistorType transistorType = PNP; // 最初に一回button.pressed()が呼び出されるのでNPNになる

PollingTimer timer;

void displayNpnPnp() {
    tft.fillRect(0, 100, 128, 20, ST77XX_BLACK);
    tft.setTextColor(ST77XX_WHITE);
    tft.setTextSize(1);
    tft.setCursor(0, 100);
    if(transistorType == NPN) {
        tft.println("NPN");
    } else {
        tft.println("PNP");
    }
}

void displayCBEDiagram() {
    tft.setTextColor(ST77XX_BLACK);
    tft.fillRect(0, 120, 15, 15, ST77XX_BLUE);
    tft.setCursor(5, 125);
    tft.print("C");
    tft.fillRect(15, 120, 15, 15, ST77XX_GREEN);
    tft.setCursor(20, 125);
    tft.print("B");
    tft.fillRect(30, 120, 15, 15, ST77XX_RED);
    tft.setCursor(35, 125);
    tft.print("E");
    tft.fillRect(45, 120, 15, 15, ST77XX_BLUE);
    tft.setCursor(50, 125);
    tft.print("C");
    tft.fillRect(60, 120, 15, 15, ST77XX_GREEN);
    tft.setCursor(65, 125);
    tft.print("B");
    tft.fillRect(75, 120, 15, 15, ST77XX_RED);
    tft.setCursor(80, 125);
    tft.print("E");
}

TransistorCurrents measureNPN() {
    digitalWrite(VC_PIN, HIGH);
    digitalWrite(VE_PIN, LOW);

    uint16_t vout1 = analogRead(VOUT1_PIN);
    uint16_t vout2 = analogRead(VOUT2_PIN);

    double Ib = (5.0 - (float(vout1) / 1024.0) * 5.0) / 0.51; // 510k ohm
    double Ic = (5.0 - (float(vout2) / 1024.0) * 5.0) / 0.0001; // 100 ohm
    return {Ib, Ic};
}

TransistorCurrents measurePNP() {
    digitalWrite(VC_PIN, LOW);
    digitalWrite(VE_PIN, HIGH);

    uint16_t vout1 = analogRead(VOUT1_PIN);
    uint16_t vout2 = analogRead(VOUT2_PIN);
    Serial.println(vout1);
    Serial.println(vout2);

    double Ib = (float(vout1) / 1024.0 * 5.0) / 0.51; // 510k ohm
    double Ic = (float(vout2) / 1024.0 * 5.0) / 0.0001; // 100 ohm
    return {Ib, Ic};
}

void measuringTask() {

//    tft.fillScreen(ST77XX_BLACK);
    tft.fillRect(0, 0, 128, 80, ST77XX_BLACK);
    tft.setTextSize(1);
    tft.setTextColor(ST77XX_WHITE);

    TransistorCurrents currents = (transistorType == NPN) ? measureNPN() : measurePNP();

    Serial.print("Ib: ");
    Serial.print(currents.Ib);
    Serial.println(" uA");
    tft.setCursor(0, 0);
    tft.print("Ib: ");
    tft.print(currents.Ib);
    tft.println(" uA");

    Serial.print("Ic: ");
    Serial.print(currents.Ic);
    Serial.println(" uA");
    tft.setCursor(0, 15);
    tft.print("Ic: ");
    tft.print(currents.Ic);
    tft.println(" uA");

    double hFE = currents.Ic / currents.Ib;

    Serial.print("hFE: ");
    Serial.println(hFE);
    tft.setCursor(0, 30);
    tft.print("hFE: ");
    tft.println(hFE);

}

void setup() {
    Serial.begin(115200);
    button.begin();

    pinMode(VOUT1_PIN, INPUT);
    pinMode(VOUT2_PIN, INPUT);
    pinMode(VC_PIN, OUTPUT);
    pinMode(VE_PIN, OUTPUT);

    delay(500);
    tft.initR(INITR_GREENTAB);
    tft.fillScreen(ST77XX_BLACK);
    tft.setRotation(0);
    tft.setTextWrap(false);
    delay(500);

    timer.setInterval(measuringTask, 1000, true);
    timer.fire();
    measuringTask();
    displayCBEDiagram();

}

void loop() {
    timer.handler();

    if (button.pressed()) {
        Serial.println("Button pressed");
        transistorType = (transistorType == NPN) ? PNP : NPN;
        displayNpnPnp();
    }
}

まとめ

  • $h_{FE}$ は直流電流増幅率 で、 $h_{FE}=I_C/I_B$ で求められる。
  • テスター1台でも、 1MΩの抵抗の両端電圧から $I_B$ を逆算 すれば $h_{FE}$ を測定できる。
  • 2SC1815のGRランク(200〜400) やBLランク(350〜700)の実測でも、 仕様の範囲内 にしっかり収まる。
  • 大量に測りたいなら Arduinoで自動測定器 にしてしまうのが手っ取り早く、 NPN/PNP両対応 にしておくと用途が広がる。

関連記事

関連アイテム

この記事で使いやすい道具をまとめておきます。 $h_{FE}$ を手計算で測るなら デジタルテスター ひとつでOK、たくさん測るなら トランジスタテスター が圧倒的に楽です。