トランジスタのhFE測定方法
はじめに
こんなことやります。
- \(h_{FE}\) について解説
- テスターを使って \(h_{FE}\) を測定

この記事でつかうもの
この記事でつかうものをご紹介いたします。
NPNトランジスタ
本記事ではもっともポピュラーで手に入りやすいトランジスタ2SC1815を使用します。
テスター
電流と電圧が測定できるテスターがひとつ必要です。アナログテスターでもデジタルテスターでも構いません。ちなみに、こちらは私が愛用しているテスターです。
テスターそのものにトランジスタの(h_{FE})を測定できる機能がついていたりしますが、ここではトランジスタの理解を深めるためにも、あえて自力で(h_{FE})を測定するやり方を学んでいきましょう。
hFEとは
トランジスタでよく出てくる \(h_{FE}\) とは、トランジスタが持つ直流電流増幅率のことです。それは、わずかなベース電流を流した時に流れるコレクタ電流の比になります。
2SC1815などのトランジスタでは、トランジスタの持つ \(h_{FE}\) を元にランク分けされてます。
ランク | \(h_{FE}\) |
---|---|
O | 70~140 |
Y | 120~240 |
GR | 200~400 |
BL | 350~700 |
同じ型番で同じランクのトランジスタでも、\(h_{FE}\) には結構バラつきがあります。
オーディオアンプなどで精度を揃える場合には、大量のトランジスタの中から自分で増幅率を調べチョイスするなんてこともよく聞く話です。ですから、ここで \(h_{FE}\) の測定方法を学んでおいても損はないです。
hFEとhfeの違い
\(h_{FE}\) が直流電流に対するトランジスタの増幅率でした。似たような表記で、\(h_{fe}\) があります。feが小文字になってますね。\(h_{fe}\) とは、交流信号に対するトランジスタの交流電流増幅率になります。 ある条件下では \(h_{FE} \fallingdotseq h_{fe}\) となり近似しますが、厳密には異なります。 本記事では \(h_{FE}\) の直流電流増幅率のみを扱います。
テスターでhFEを測定してみよう
ここからは、実際にテスターを使ってトランジスタのhFEを測定していきます。
hFE計算式
お伝えしたとおり、\(h_{FE}\) はわずかなベース電流 \(I_B\) を流した時のコレクタ電流 \(I_C\) の比になります。ですから、\(I_B\) と \(I_C\) の値が分かれば\(h_{FE}\) を次式で求めることができます。
\[h_{FE}=\frac{I_C}{I_B} \tag{1}\]
hFE測定回路
ベース電流とコレクタ電流は、次のような回路を使えば測定できます。

実際に回路で実験してみると、1MΩの抵抗には数μA程度の電流しか流れません。テスターによっては数μAの微小電流を正確に測定できないこともありますので、電圧からベース電流を算出してみました。 オームの法則 (V=RI) からベース電流を求めることができますね。
\[{I_B} = \frac{V_C}{1MΩ} \tag{2}\]
ここで \(V_C\) は、1MΩにかかる電圧です。
実験結果
さて、実験結果です。手持ちの2SC1815のGRランクを測定してみました。
項目 | 値 |
---|---|
\(I_B\) | 6.82μA |
\(I_C\) | 2.1mA |
この結果を元に、先ほどの式に当てはめると \(h_{FE}\) は「308」の値になりました。 GRランクの \(h_{FE}\) は200〜400ですので、範囲におさまってますね。
同様にして、いくつかの2SC1815(GRランク)の直流電流増幅率を測定してみました。トランジスタの \(h_{FE}\) は「260〜310」の範囲におさまりました。
実際測定してみて、1MΩにかかる電圧はどのトランジスタでもほぼ変わりませんでした。ですのでベース電流は一度だけ算出して、あとはそれぞれのトランジスタのコレクタ電流だけを測れば良いです。
さらに、2SC1815のBLランクの \(h_{FE}\) も測定してみました。BLランクは \(h_{FE}\) が350〜700の範囲におさまる仕様です。
実際に20個ほどのBLランクを測定したところ、「600〜650」の範囲に収まりました。 もちろんベース電流が変われば、つまり1MΩの抵抗を変えれば \(h_{FE}\) の値も変わります。ですから、実験結果はあくまでも目安としてください。
ところで、トランジスタの増幅率が高ければ性能が良いという話ではありません。 ただし増幅率の高いトランジスタを使うことで、入力インピーダンスをすこしでも稼げると思い、私は普段はBLランク品を使ってます。
\(h_{FE}\) が分かるとトランジスタの入力インピーダンス \(h_{IE}\) を求めることができます。
おわりに
以上、手作業で \(h_{FE}\) を測定する方法をご紹介いたしました。トランジスタへの理解が少し深まりましたでしょうか? \(h_{FE}\) に関しても、簡単に測定できました。
とはいえ今後、何百個というトランジスタの \(h_{FE}\) を手作業で測定するのは大変でしょうから、そんなときはトランジスタ専用のテスターをお使いになると良いです。 こちらの商品はトランジスタ専用のテスターです。ゲームボーイのようなデザインで可愛らしいですね。
ArduinoでトランジスタのhFEを測定器をつくってみた
ArduinoでhFEを測定してディスプレイ表示できるようにしてみました。
回路図
実際には回路図のトランジスタは配線しません。J1のコネクタに被測定物のトランジスタを繋ぎます。
ソースコード
こちらがソースコードです。プロジェクトを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();
}
}