FET選別ツール
簡単にIdss、BIAS(Vgs)が測れます
ぺるけ式FET差動ヘッドフォンアンプを自力で作る(この頃はより小型に作ることを目指してました)ためには、このアンプの最大に肝となるFETの選別が最大のポイントでした。「FET
選別」でググルとたくさんの先輩諸氏がぺるけさんの資料を元に作られていました。 でも、どの作例もテスターを繋いで計測するものだったので、例のhFE測定器と同様にPICで作ることにしました。Nチャンネルがあればぺるけ式には足りるのですが、物好きな小生はPチャンネルまで計測できるものにしてしまいました。 このツールのぺるけ師匠オリジナル記事はこちらです。 |
●回路図
このときも回路図エディタには水魚堂のBSch3vにお世話になりました。![]() <基本的な構成と説明> ・電圧はOPアンプ経由でPICのAD計測で、電流は検出抵抗の電圧差をオペアンプの差動入力で増幅してADする ・単電源で差動入力を使うとマイナス電圧はゼロ(というか誤動作)となる。配線に工夫が必要 Vgs計測は表示で−を付与した。 ・PICの電源は3端子レギュレータ78L05を使用 ・PチャンネルのIDssを計測する目的でIDss用のIV抵抗を増設した。 これは手持ちのオペアンプLM358がレールtoレールで無かったため?低い電圧領域ではうまく動作 しないという予備テストによるもの ・・・・>結果としては不用だったようだ ・スイッチ1の位置を検出して、Id調整かVgs計測かを判定する目的で、回路図内Vin3電圧計測を追加した。これが12V近傍だとId、6V近傍だとVgsと判定する。(人間の目の機能の代替) ・NとPチャンネルの表示を切り替えるためにVin4にNチャンネル作動電圧を入力。 これも私のお遊びです。切替は中央スイッチで判るので機能的に必須ではない。 ・PICのAD基準電圧のためMCP1541(4.096V)を用意したが、PIC入力がこの基準電圧を超えたために使用しなかった。 この部分は精度面で変える必要あるか要検討 (今の分解能では不用か) ・緑の太い線で囲んだ部分はあとから追加したリレー接点です。Nチャンネル、Pチャンネル切替用です |
●実体配線図
多分お役に立ちませんが実体配線図です。自分の気休めで載せています![]() |
●製作時の内部写真
部品を取り付けた状態:まだスッキリしています |
配線状態:追加したリレーも入りグチャグチャ状態だ |
●ソフトウエア
hFE測定器ではプログラムメモリーが2k未満だったのだが、作っていくうちに2kを超えてしまった。仕方が無いのでmikroBasic(これは有償版)に切り替えました。 このソフトでもオペアンプ増幅度は使った抵抗値を計測し、そこから求めた値をソフト内固定定数として使っている。これ1台を安価に作るにはこのほうが簡単です。 <リスト> '=========================================================================== program J_FET_MESUREMENT '/** '* J-FETのIdss、Id調整したVgs計測ツール '* '* PIC16F88 @4MHz '* '* 電源:J-FET計測回路から3端子レギュレータで5V供給 '* '* Device Flags1: _CP_OFF,_CCP1_RB#,_DEBUG_OFF,_WRT_ENABLE_OFF,_CPD_OFF, '* _LVP_OFF,_BODEN_OFF _MCCR_OFF,PWRTE_OFF,_WDT_OFF,_INTRC_IO '* Device Flags2: _IESO_OFF,_FCMEN_OFF '* '* MikroC 8.1 By H.Igarashi '* '* PORT I/O '* RA0: IN : analog volt from OP_Id and Vds to vin1 '* RA1: IN : analog volt from OP_Idss to vin2 '* RA2: IN : analog volt from S1 SW UP volt to vin3 '* RA3: IN : REF+ (4.096V) 今回は使用していない。VddがREF+ '* RA4: IN : analog volt from Nchannel Power ON volt to vin4 '* RB0: OUT: LCD_D4 11 '* RB1: OUT: LCD_D5 12 '* RB2: OUT: LCD_D6 13 '* RB3: OUT: LCD_D7 14 '* RB4: OUT: LCD_RW 5 (GND) '* RB5: OUT: LCD_EN 6 '* RB6: OUT: LCD_RS 4 '*/ dim vin1 as integer dim vin2 as integer dim vin3 as integer dim vin4 as integer dim Idss as float dim Id as float dim Vgs as float dim iIdss as integer dim iId as integer dim iVgs as integer dim sVin as string[13] main: OSCCON = %01100000 '//4MHz PORTA = %00000000 '//PORTAの中身をきれいにする PORTB = %00000000 '//PORTBの中身をきれいにする '// ANSEL = %00011111 '//RA0 & RA1 & RA2 & RA3 & RA4 is ANALOG INPUT '// TRISA = %00011111 '// TRISB = %00000000 ADCON1.ADCS2=1 ADCON0.ADCS1=0 ADCON0.ADCS0=1 '//ADCON1.VCFG1=1; //Vref+ is Vref+(RA3),RA3 Vref+ is 4.096V = 1023 ADCON1.VCFG1=0 '//Vref+ is AVdd ADCON1.VCFG0=0 '//Vref- is AVss '//LCD Init Lcd_Config(PORTB,3,2,1,0,PORTB,6,4,5) 'Lcd_Init(PORTB) '//これを入れてはダメ、ハングする Lcd_Cmd(Lcd_Cursor_Off) Lcd_Cmd(LCD_CLEAR) Lcd_Out(1,1,"FET Vgs-Mes Iga") '//2秒待つ Delay_ms(2000) Lcd_Cmd(LCD_CLEAR) lop: vin1 = ADC_Read(0) iId = vin1 iVgs = vin1 Delay_ms(50) vin2 = ADC_Read(1) iIdss = vin2 Delay_ms(50) vin3 = ADC_Read(2) Delay_ms(50) vin4 = ADC_Read(4) Delay_ms(50) '//計測項目の判定 '//Idss:vin2で計測している。この値が1V(元の電流で2.7mA)を超えていたらIdss '//Id :vin1で計測している。vin2が1V以下でvin3が2V以下(スイッチ1が下) '//Vgs :vin1で計測している。vin3が2V以下だったらVgs計測 '//Idssを求める '//Idssは100ΩIV抵抗の差分電圧を、OPアンプで(8.12/2.17=3.7)倍にしている '//この計測値が1V=250よりも大きかったらIdss計測中とする if (vin2 >= 250) then if (vin4 > 300) then Idss = vin2 / 99.7 * 1000 * 2.17 * 5.03 / 8.12 / 1.023 '//(uA) else Idss = vin2 / 98.5 * 1000 * 2.17 * 5.03 / 8.12 / 1.023 '//(uA) end if iIdss = Idss '// (uA) Idss = Idss / 1000 '//(mA) else Idss = 0 iIdss = Idss '// uA end if '//Id(mA) または Vgs(V)を求める '//Id計測は100ΩIV抵抗の差分電圧をOPアンプで(27k/4.7k=5.7)倍にしている '//これをvin1にて計測している '//よってId(uA)は if (vin2 < 250) then if (vin4 > 300) then Id = vin1 / 99.3 / 5.7 * 1000 * 5.03 / 1.023 * 1.04'//uA else Id = vin1 / 98.3 / 5.7 * 1000 * 5.03 / 1.023 * 1.04'//uA end if iId = Id '//(uA) Id = Id / 1000 '//(mA) else Id =0 iId = Id end if '//Vdsは計測した電圧を極性を逆(+)にし、OPアンプで5.7倍にしている '//これをvin1で計測している '//この計測モードではvin3電圧が約6V=vin3デジタル値で約250となる '//よってVgs(mV)計測はvin3が300以下の場合とする if (vin3 < 300) then Vgs = -(vin1 / 1023) / 5.7 * 1000 * 5.03 * 1.017 '//mV iVgs = Vgs '//(uV) Vgs = Vgs / 1000 '//(mV) else Vgs = 0 iVgs = Vgs end if '//値をLCDに表示する '//電圧表示 ' Lcd_Cmd(Lcd_Clear) ' IntToStr(vin1,sVin) ' Lcd_Out(1,1, "vin1=") ' Lcd_Out(1,6, sVin) ' Delay_ms(300) ' Lcd_Cmd(Lcd_Clear) ' IntToStr(vin2,sVin) ' Lcd_Out(1,1, "vin2=") ' Lcd_Out(1,6, sVin) ' Delay_ms(300) ' Lcd_Cmd(Lcd_Clear) ' IntToStr(vin3,sVin) ' Lcd_Out(1,1, "vin3=") ' Lcd_Out(1,6, sVin) ' Delay_ms(300) ' Lcd_Cmd(Lcd_Clear) ' IntToStr(vin4,sVin) ' Lcd_Out(1,1, "vin4=") ' Lcd_Out(1,6, sVin) ' Delay_ms(300) '//Idssがゼロ(vin2が250以下)で無ければiIdssを表示する if (Idss <> 0) then Lcd_Cmd(LCD_CLEAR) IntToStr(iIdss,sVin) Lcd_Out(1,5, "Idss=") if (vin4 > 300) then Lcd_Out(1,1, "(N)") else Lcd_Out(1,1, "(P)") end if Lcd_Out(2,6,sVin) Lcd_Out(2,13,"(uA)") else '/* '//IdssがゼロならばId計測か、Vgs計測なはず '//vin3が300越え(>7.4V)且つvin2が250未満ならばId調整中なのでIdを表示する if (vin3 >= 300) then if (vin2 < 250) then Lcd_Cmd(LCD_CLEAR) IntToStr(iId,sVin) if (vin4 > 300) then Lcd_Out(1,1, "(N)") else Lcd_Out(1,1, "(P)") end if Lcd_out(1,5, "Id =") Lcd_out(2,6,sVin) Lcd_Out(2,13,"(uA)") else end if else '//Vgs計測中とする Lcd_Cmd(LCD_CLEAR) IntToStr(iVgs,sVin) if (vin4 > 300) then Lcd_Out(1,1, "(N)") else Lcd_Out(1,1, "(P)") end if Lcd_out(1,5,"Vgs =") Lcd_out(2,6,sVin) Lcd_Out(2,13,"(mV)") end if end if PORTA.7 = 0 PORTA.7 = 1 Delay_ms(100) PORTA.7 = 0 Delay_ms(200) goto lop end. |