PICを使ったトランジスターhfeメーター

[公開:any]

[電子工作/PIC]
[PIC,PIC16F88,mikroC,測定器]

origin 2008-07-06
fix 2008-07-07
fix 2008-07-08
fix 2008-07-19
fix 2008-07-31
fix 2009-03-26


製作まで一気に紹介しているので画像が多く重たいコンテンツとなってます。


構想

ラジオの製作その5(4石スーパー)」で、ラジオを作っています。このラジオは、受信周波数帯の上側と下側で感度が異なり、上側では若干の発振気味になっています。
これは、自分の設計が悪いのではなく、使用しているトランジスタの2SC1815GRのftが低い割りにhfeが大きいことが原因だと部品の責任にしています。^^;

hfeは小信号増幅率といって交流の増幅率です。今回測定するのは直流増幅率なので正確にはhFEと書かなくてはならないです。・・が、以下面倒なのでhfeと書きます。なお、現在の小信号用トランジスタは、hfeとhFEは、ほぼ等しいらしいです。


・・・ということで高周波用トランジスタをいくつか調達しました。

高周波用トランジスタ

ラジオの周波数変換部と中間周波数増幅部に、調達したトランジスタを使おうと電流帰還型増幅回路のバイアス抵抗値を計算してみると、hfeが幅を持っているため、なんだか面倒です。大体のところで良いのでしょうが、せっかく用意したトランジスタを使っても発振気味なのは直りません。^^;←設計が悪いのは棚に上げております。

設計

今回の件は別にしても、やっぱり、個々のトランジスタのhfeがわかったほうが、回路設計は楽だと思います。昔は、乾電池と抵抗2本とテスターだけでhfeを実測していた記憶もあるので、簡単なhfe測定器でも作ってみるかとインターネットでhfeの測定を検索してみるといくつか見つかります。


一番最後のデジタルマルチメータは邪道かもしれませんが、hfeも測定できるマルチメータがこの値段なら「買い」かも知れません。^^;

・・で、これらのサイトを参考にさせていただくとhfe測定のキモは、コレクタ電流にありそうです。・・←よく理解していませんが・・^^;
ベースへのバイアス抵抗を可変にしてベース電流を調整することで、コレクタ電流を一定化し、常に同じコレクタ電流でhfeを計算する方法がよさそうです。
一方、ベースやコレクタにかける電圧は、コレクタ電流と比べてhfeに与える影響が少ないようです。今回は、5Vの固定電圧で測定するものを考えます。

考えた回路がコレです。

トランジスターhfeメーター回路図

NPNとPNPの切り替え部分を変更しました。(2008-07-07)

ベースのバイアス抵抗の可変抵抗を500KΩから1MΩに変更しました。(2008-07-19)

ベース電流Ibとコレクタ電流Icを抵抗の両端の電圧からもとめてhfeをhfe=Ic/Ibから求める方法です。電流(電圧)計測は、PICのAD変換ポートで読み取り、計算結果は3桁の7セグメントLEDをダイナミック点灯で表示します。
ベース電流Ibは、バイアス抵抗が47KΩ〜1047KΩなので4.8μV〜106μVとなります。コレクタの電流制限抵抗は、100Ωなのでコレクタ電流Ibは50mAまで流せます(当然、ベース電流とhfeに応じた電流です)。hfeの表示が3桁までなのでhfeの計測制限は999までとなります。

PICでのhfe計算は、実際の電流値に換算して計算するのではなく、AD変換で得られた10ビット値(0〜1023)で直接計算するようにしました。これによって、AD変換のリファレンス電圧である電源電圧に左右されずhfeを計算することができます。
また、切り替え表示するコレクタ電流は、電源電圧を5V固定で計算しているので、実際の電源電圧が異なれば誤差がでます。でもコレクタ電流は同一条件で比較するための指標に近い扱いですからこれで良しとします。

RA4ポートには、表示の切り替えスイッチをつけます。このスイッチでhfe、またはコレクタ電流の表示と切り替えることができます。

NPNとPNPの切り替えは、トランジスタの端子をVccに接続するかGNDに接続するかを切り替えることにより対応します。

ブレッドボードでの実験

ブレッドボードでテストします。2SC1815Yのhfeを測定中してみると160となりました。2SC1815GRでは、250近くを示します。なお、この2SC1815シリーズは、コレクタ電流を変化させてもhfeは大きく変わることはありませんでした。

トランジスタhfeメーターテスト1

表示の切り替えスイッチ(トグルスイッチ)をコレクタ電流にして可変抵抗で調整し、2.0mAと10.0mAにセットしてみました。

トランジスタhfeメーターテスト2トランジスタhfeメーターテスト3

多段増幅回路などでAGCをかけるトランジスタは、コレクタ電流に応じてhfeが変化するものが使いやすいと書籍には書いてあります。

手持ちのトランジスタのデータシートを眺めて、コレクタ電流変化でhfe変化の大きなトランジスタとして2SC460があります。

2SC460って、数年で電極のメッキが酸化して接触不良を起こす有名なトランジスタです。^^;問題になったのは20年近く前のことだから、今のものは対策されたものだろうと通販で取り寄せてみたら、トランジスタの足が酸化で若干黒くなったものがありました。大丈夫かな?

2SC460のデータシートの抜粋です。コレクタ電流によってhfeが大きく変化しています。

2SC460データシート抜粋

実際に測定してみました。
コレクタ電流0.5mAの時のhfeは、75となりました。

トランジスタhfeメーターテスト4トランジスタhfeメーターテスト5

次に、ベース電流を調整してコレクタ電流を5.0mAとしたときには、hfeは120となりました。

トランジスタhfeメーターテスト6トランジスタhfeメーターテスト7

コレクタ電流によりhfeが変化することが確認できます。データシートのグラフよりは大きなhfeが計算されますが、個体差の範囲内でしょう。

製作

いつものようにユニバーサル基板を使用することにして、pcbeで実装配線図を作成しました。
部品数が少ないのであまり考えず、いい加減な接続です。電源もLCメーターなどで使用しているACアダプタがそのまま使えるように3端子レギュレータを実装します。一応、ACアダプタ等の極性を気にせずに使用できるようにブリッジも付加しておきます。

トランジスタhfeメーター配線図

この実装配線図は、上のほうの回路図と接続が異なっています。実装配線は、ジャンパーが少なくなるように接続し、ブレッドボードでの回路(=回路図)と異なる部分は、ソフトウェアで対応するようにしています。よって、下のほうにあるプログラムで動作させるには、この実装配線図とおりの接続にする必要があります。ご指摘ありがとうございます。→Nobuさま(2008-07-31)

NPN/PNP切替スイッチの接続が間違っていました。ご指摘ありがとうございます。→吉村さま(2009-03-26)


早速、半田付けしました。裏面と表面。実は、この画像では、上の実装配線図と異なっています。最初は、NPNとPNPの切り替えを単純にエミッタとコレクタの入れ替えで考えていたのですが、よく考えると流れる電流の方向が逆になるので、電源を入れ替えるのが正しい方法と気が付きました。(実装配線図と回路図は修正済みです。)

基板上に測定端子としてシングルICソケットを直接半田付けしてテストしたところ良好です。ただ、この測定端子は、エミッタ接地のNPN専用となります。

基板裏基板表

ケースに入れました。最近は、7セグメントLEDの部分を開口するのがメンドーなので、透明ケースの使用が多くなってます。このケースは、秋月電子のポリカーボネートケースの中サイズです。電動ドリルで穴を開けてもひびが入ったりしないので使いやすいケースです。

トランジスタの測定端子は、基板上と同じくシングルICソケットを使用しました。耐久性はあまりなさそうですが、接触が悪くなったら新しいものに交換する方法でいこうと思います。

トランジスタhfeメーター完成写真トランジスタ測定端子

コレクタ電流の実測(2008-07-08追記)
AD変換のリファレンス電圧である電源電圧の実測で補正した指数をコレクタ電流の計算に使用しているのでかなり正確な値になっています。

コレクタ電流2.0mAコレクタ電流10.0mA

コンプリメンタリペアトランジスタのhfe実測テスト


PNPも測定できるようになったので・・・・
「やってみたかったこと」→コンプリメンタリのペアトランジスタのhfe測定を試します。コンプリメンタリの定義は「特性が似たもの」ということらしいですが、hfeが大きく異なるようでは、当然使いにくいと考えられます。

2SC1815と2SA1015、2SC2120と2SA950のペアトランジスタです。この2種類は、B級プッシュプルなどの小信号の低周波増幅回路でよく使われる良く使われるコンビです。

コンプリメンタリペアトランジスタ

以下いずれのトランジスタも、コレクタ電流を10mAに固定してhfeを測定します。画像は、左がコレクタ電流、右がhfeです。

2SC1815(GRランク)の測定

2SC1815GRコレクタ電流2SC1815GR hfe

2SA1015(GRランク)の測定

2SA1015GRコレクタ電流2SA1015GR hfe

2SC2120(Yランク)の測定
2SC2120Yコレクタ電流2SC2120Y hfe

2SA950(Yランク)の測定
2SA950Yコレクタ電流2SA950Y hfe

・・・・結構、差があります。こんなもんでしょうか?。いずれの組み合わせも10%以上の差があります。この差が問題になるかどうかは、よくわかりませんが、性能を求めるときは、沢山のトランジスタから特性の似た(hfeの近いもの)を選択したほうがよさそうです。

発振対策(2008-07-08追記)

低周波用トランジスタは問題なく測定できたのですが、高周波用トランジスタを測定するとかなり大きなhfeが測定されます。コレクタ電流も計算より多く流れてその値も大きく変動します。
2SC2786を測定するとhfeは590となります。本来は100前後。

基板上にある測定端子にトランジスタをつなげば、高周波用トランジスタでも正常に計測できます。

オシロスコープでトランジスタのエミッタ・コレクタ間の波形を見てみると、見事に発振しています。さずが、高周波用トランジスタです。^^;

オシロスコープの接続異常発振波形

測定端子の裏のエミッタ・コレクタ間に0.1μFのコンデンサを発振防止に取り付けて正常に計測できるようになりました。

発振防止コンデンサ取り付け

ソフトウェア


PIC16F88に書き込んだソフトウェアです。mikroCで開発しました。
・・開発といっても、7セグメントLEDにAD変換の結果をちょこっと計算して表示するだけなので、以前に作った「PICを使った温度計・湿度計の製作」とほとんど共通です。

NPNとPNPの切り替えは、PICでは感知できないので、ベース電圧の検出値vb1とvb2の値により判別させています。


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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/*
* Transister hfe Meter with 7segment led multiplex
* PIC16F88 Device Flags:
* _CP_OFF  _CCP1_RB3  _DEBUG_OFF  _WRT_ENABLE_OFF
* _CPD_OFF  _LVP_OFF  _BODEN_OFF  _MCLR_OFF  _PWRTE_ON
* _WDT_OFF  _INTRC_IO  _IESO_ON__CFG2  _FCMEN_ON__CFG2
*
* 2008-07-06 orgin.
* 2008-07-07 toggle to NPN and PNP add.
*/

unsigned short seg[3];
unsigned short v;

// Returns mask for anode cathode 7-seg. display
unsigned short mask(unsigned short num) {
      switch (num) {
        case 0 : return 0xf5;
        case 1 : return 0x05;
        case 2 : return 0xb3;
        case 3 : return 0xa7;
        case 4 : return 0x47;
        case 5 : return 0xe6;
        case 6 : return 0xf6;
        case 7 : return 0x85;
        case 8 : return 0xf7;
        case 9 : return 0xe7;
        case 10 : return 0x00;  // all clear
        case 11 : return 0xf2;  // E
        case 12 : return 0x12;  // r
    }
}

void interrupt() {
    if(INTCON.T0IF) {
        INTCON.T0IF = 0;    // Timer0 Interrupt flag clear
        PORTB = seg[v];

        switch(v) {
            case 0: PORTA.F6 = 1; PORTA.F7 = 0; PORTA.F0 = 0; break;
            case 1: PORTA.F6 = 0; PORTA.F7 = 1; PORTA.F0 = 0; break;
            case 2: PORTA.F6 = 0; PORTA.F7 = 0; PORTA.F0 = 1; break;
        }
        v++;
        if(v > 2u)
            v = 0;
    }
}

unsigned int read_adc(unsigned short p)
{
    unsigned int data;
    unsigned int i;
    
    data = 0;
    for(i = 0; i < 10; i++) {   // 10 count avg.
        data += Adc_Read(p);
        Delay_ms(20);
    }
    return data / i;
}

void main()
{
    unsigned int vb1, vb2, vc;
    unsigned long ib, ic;       // ic: Index of Collector Current
                                // ib: Index of Base Current
    unsigned int disp;
    unsigned short i;
    unsigned short ic_flag;     // Collector Current Display mode flag

    OSCCON = 0b01110000;        // 8MHz internal clock
    PORTB = 0b00000000;
    PORTA = 0b00000000;
    TRISA = 0b00011110;            // RA1,RA2,RA3,RA4 is input
    TRISB = 0b00000000;            // 7SegLED Drive

    ANSEL = 0b00001110;            // AN1,AN2,AN3 A/D input

    ADCON0 = 0b10010001;        // Fosc/32 AN6
    ADCON1 = 0b10000000;        // ADFM Right and A/D Ref for Vdd to Vss

    OPTION_REG = 0b10000100;    // PORTB pull-up,PSA set 100=1/16

    INTCON.T0IE = 1;            // Timer0 Interrupt Enable
    INTCON.GIE = 1;                // General Interrupt Enable

    i = 0;
    v = 0;
    ic_flag = 0;

    while(1) {
        vc = read_adc(1);
        vb1 = read_adc(2);
        vb2 = read_adc(3);

        if(vb2 >= vb1) {    // true NPN false PNP
            ic = 1023 - vc;
            ib = vb2 - vb1;
        } else {
            ic = vc;
            ib = vb1 - vb2;
        }
        
        if(Button(&PORTA, 4, 1, 1)) {
            disp = ic * 470 / ib;    // 47KΩ / 100 = 470
            ic_flag = 0;
        } else {
            disp = ic * 0.495;    // 5.07/1024*10=0.49511
            ic_flag = 1;
        }

        if(disp > 999 || disp < 1) {
            seg[0] = mask(11);
            seg[1] = mask(12);
            seg[2] = mask(12);
        } else {
            i = (disp / 100u) % 10u;
            if(i == 0)
                i = 10;
            seg[0] = mask(i);
            i = (disp / 10) % 10u;
            seg[1] = mask(i);
            i = disp % 10u;
            seg[2] = mask(i);
        }
        
        if(ic_flag) {        // view fixed-point at 2nd 7segment LED
            seg[1] = seg[1] + 0x08;
        }
    }
}

コレクタ電流の計算に使う指数を実際の電源(3端子レギュレータ)の出力電圧で校正しました。(2008-07-07)


▲ページ Top へ...