hFE測定器

簡単操作で演算結果を表示



完成品                                ブレッドボードで試作中




●作るに至った経緯

オーディオアンプの製作を始めてから9ヶ月経った頃である(2009年9月)
ぺるけさんからパーツを頒布頂いてヘッドフォンアンプを作っていたのですが、FET特性選別の他にトランジスタのhFE選別も必要なことが判った。自力でヘッドフォンアンプが作れるようになるためにはhFE選別ツールも必須なのでこれも自作する必要がある。

例によってNetを徘徊してみるとかなりの諸先輩方がツール作りをしている。 基本的な原理・原則がわかったので、ブレッドボードに部品を配置して計測をしてみようと思った。 ここで問題発生。ベース電流とコレクタ電流の両者を同時計測するには、「電流を測れるテスタが 2個必要」なのに、私には1個しかない!! しかも2箇所も測って計算するのは面倒くさい。

ずぼらな私の発想である。 >>>> そんな訳で、まだ使い始めのPICを使ったhFE測定器作りになりました。




●回路図

この頃はまだ自作基板を作る技術も無く、ユニバーサル基板に回路を組むしかなかったので、回路図もEAGLEではなく、水魚堂のBSch3vという回路エディタを使っていました。



原理は簡単であった。本来はコレクタ側の電流をある値にする方法でトランジスタのデータシートが作られているが、色々調べてみるとコレクタ電流やベース電流が少々変わってもhFEは大きく変わらないようである。そこで私はIb、即ちベース電流を調整する計測方法を取った。
Ibベース電流の測定は、VR3でベースに流す電流を調整しながらV1とV2の電位をPICで計測し、そこの間の抵抗46.2kを用いた内部演算で求める。
Icコレクタ電流は、回路に印加する電源電圧とコレクタ部電圧V3の差分と102.4Ω抵抗で演算する。
hFE算出精度に関わるところは、電流を算出している46.2kと102.4Ωの抵抗値である。これは手元にあったものの抵抗値を測って組み込みソフト内の定数に書き込みました。
値が違う抵抗を使う場合はソフト修正が必要です。

NPNとPNPでは端子配列は同じであるが、スイッチで反転させた電流方向が逆なので電位差の符号を検知して演算結果を反転させる方式とした。
LCD上にはNPNかPNPかの種別、ベース電流、コレクタ電流、hFE(=コレクタ電流/ベース電流)を表示させている。

回路図が上図の左、実態配線図(のようなもの)が右である(今、見てみると判りにくい絵です)
回路図には無いがVR3は実体配線図ではVR3の500k(租調)と25k(微調)になったが、使ってみて微調は不要だった。



●マイコン系の仕様とソフ

<機材>

このころマイコンにはPIC16F88を好んで使い始めていた。サイズが手ごろだったのとプログラムメモリー4k、データメモリ368Byteとまずまず、そしてなんと言っても皆さんの作例がネット上に沢山あり、諸設定のやり方が参考になったからです。
書き込み器にはPicKit2(会社から借用)を使いましたが、お遊び好きの小生としては「ほぼPicKit2」なるものを製作して使ってみたりしてました。

         ほぼPickit2


使ったソフトは、mikroCです (microの間違いではありません・笑)
このソフトはプログラムが2kまではフリーで使えるので大変重宝しました。ライブラリーも完備しており、ADやLCDの関数を使いました。使用したプログラムメモリーは1965Byteと2k制限ギリギリでした。デバッグのためにLCDからADデータ等を表示させようとソースを追加したが2kを超えてコンパイルできなかったことを思い出します。

<ソース> 参考までに掲載します。コメントアウトしたデバック行までも表示していますのでご注意ください。

void main(){
 float v1, v2, v3, ib, ic, hfe;
 char buf[10];

 OSCCON = 0b01110000;
 CMCON = 0b00000111;
 ANSEL = 0b00101100;
 TRISA = 0b00101100;
 TRISB = 0b11000000;
 ADCON0 = 0b10111110;
 ADCON1 = 0b11000000;
 //OSCCON = 0b11100000;

 //PORTA.F7 = 0;

 Lcd_Config(&PORTB, 4, 5, 6, 3, 2, 1, 0);
 Lcd_Cmd(LCD_CLEAR);
 Lcd_Cmd(LCD_CURSOR_OFF);
 Lcd_Out(1, 1, "hFE ver0.1 iga");
 //
 Delay_ms(3000);
 Lcd_Cmd(LCD_CLEAR);

 while (1) {
  v1 = Adc_Read(2);
  v2 = Adc_Read(3);
  v3 = Adc_Read(4);
  //
  if (v1 > v2) {
   ic = (1023 - v3) * 4.99 / 1023 / 102.4 * 1000000;
   ib = (v1 - v2) * 4.99 / 1.023 / 46.2;
   Lcd_Out(1, 12, "(NPN)");
  } else {
   ic = v3 * 4.99 / 1023 / 102.4 * 1000000;
   ib = (v2 - v1) * 4.99 / 1023 / (46.2 * 1000) * 1000000;
   Lcd_Out(1, 12, "(PNP)");
  }
  hfe = ic /ib;

  WordToStr(ib, buf);
  Lcd_Out(2, 1, "Ib=");
  Lcd_Out(2, 4, &buf[1]);
  //
  WordToStr(ic, buf);
  Lcd_Out(2, 9, "Ic=");
  Lcd_Out(2, 13, &buf[1]);
  //
  WordToStr(hfe, buf);
  Lcd_Out(1, 1, "hFE=");
  Lcd_Out(1, 5, &buf[1]);
  /*
  Delay_ms(1000);
  Lcd_Custom_Cmd(LCD_CLEAR);
  
  WordToStr(v1, buf);
  Lcd_Out(2, 1, "v1=");
  Lcd_Out(2, 4, &buf[1]);
  WordToStr(v2, buf);
  Lcd_Out(2, 9, "v2=");
  Lcd_Out(2, 12, &buf[1]);
  WordToStr(v3, buf);
  Lcd_Out(1, 1, "v3=");
  Lcd_Out(1, 4, &buf[1]);

  Delay_ms(1000);
  */
  //
  //test LED
  //if (PORTA.F7 = 0) {
  PORTA.F7 = 1;
  Delay_ms(500);
  //} else {
  PORTA.F7 = 0;
  Delay_ms(500);
  //}

  //PORTA.F7 = 0;
  //
  //Delay_ms(500);
 }
}

mikroCプロジェクトファイル(hFE_for_16F88_mikroC.LZH)のダウンロードはこちらです。