[ 背景 ] PC の高性能化により従来時間が掛かった計算も可能になっている。特に、Mathematica、Maple な どの有料の数式処理タイプの計算ソフトでも計算時間が大幅に短縮されている。さらに、無料の数式処 理ソフトにMaxima があり、このソフトでも同様に計算時間が大幅に短縮された。 また、インターネットの発展により多くの情報を得ることができるようになった。検索サイトにおい て、”Maxima”で検索することで、非常に多くのサイトがあることが確認できる。 数式処理タイプの Maxima を用いることの利点として、複素数の式変形が理解できることである。 Execl を用いた場合、複素数の有理化や位相の計算は、組み込み関数を用いて計算して結果をグラフ表示 できる。Excel の問題点としては、複素数の計算過程が理解できないことが欠点である。 この文章は、電気通信大学・情報理工学域・Ⅲ類の実験課題アナログ回路I の増幅回路において、実験 内容の理解を深めるためにまとめたものである。 [ 目的 ] エミッタ接地回路において、h パラメータを用いた等価回路の増幅率の計算について、Maxima を用い て実行する。さらに、計算結果と実験結果のグラフと比較する。 [ 内容 ] 内容は以下の5章から成り、以下にタイトルを示す。 1 章 増幅率の導出 2 章 増幅率の大きさの計算 複素数計算 3 章 増幅率の周波数依存性 4 章 実験結果との比較 5 章 課題 付録1 参考文献について 付録2 課題解答例 付録3 増幅率の極限値について 付録 4 Block 関数を用いた計算 付録5 ファイル入出力について 付録6 負荷線と Ic-Vce 特性について 付録 7 直流特性と交流特性グラフについて
Maxima を用いた増幅率の計算
坂本 克好 2018.04.03 版 電通大・Ⅲ類 アナログ回路I 参考資料各章において、計算方法と計算結果のみを示し、考察などは記述していない。 また、 Maxima の Download、インストールなど基本操作は他の参考文献を参照して頂きたい。 さらに、 使用している命令とそのoption についての詳細は、各自で調査して頂きたい。 最後に、 Maxima, wxMaxima についての多くの情報を参照しました。 多くの公開サイトの参照がなければ、この資料は完成しませんでした。 Maxima に関する情報を公開している方々には本当に感謝します。 ((注意として)) 1)使用した version について、 Html への export において、画像の問題があったので wxMaxima5_23 を使用した。 2)出力結果の番号について 出力結果の番号は、本文中の順番と一致していません。
1 章 増幅率の導出
[ 目的 ] エミッタ接地増幅回路をh パラメータを用いた 等価回路に変換したときの増幅率を求める。 ただし、hre、hoe を省略している。 [ 結果 ] Fig1.1 のエミッタ接地回路の等価回路を Fig1.2 に示す。 さらに、理想定電流源であるので、Fig1.3 に変形できる。 この回路から、以下の式が得られる。 入力電圧:Vin は、Fig1.2 から、 出力電圧:Vout は、Fig1.3 から 次式の(1),(2)が得られる。 𝑣𝑖𝑛= ℎ𝑖𝑒𝑖𝑏+ 𝑍𝐸𝑖𝑏+ 𝑍𝐸ℎ𝑓𝑒𝑖𝑏 (1) 𝑣𝑜𝑢𝑡= −𝑅𝐶ℎ𝑓𝑒𝑖𝑏 (2) (1)と(2)から、増幅率:Av が得られる。 Av = 𝑣𝑜𝑢𝑡 𝑣𝑖𝑛 = −𝑅𝐶ℎ𝑓𝑒 ℎ𝑖𝑒+(1+ℎ𝑓𝑒)𝑍𝐸 (3) ただし、合成抵抗ZEは以下である。 𝑍𝐸 =1+𝑗𝜔𝐶𝑅𝐸 𝐸𝑅𝐸 ZE ZE Fig1.1 増幅回路 Fig1.2 増幅回路の等価回路 Fig1.3 理想定電流源の影響を考 慮した増幅回路の等価回路2 章 増幅度の大きさの計算
[ 目的 ] 実験で測定できる値は、複素数の大きさであるので、増幅率の大きさを計算する。 [ 結果 ] Maxima を用いて複素数計算する。しかし、Maxima は、人と違い変数は実数か複素数であるのかわ からないので、絶対値を計算する命令のabs は、そのまま単純に計算すると複雑な計算結果となる。 簡単な式を得るには、人間がしている動作を順番に実行しなければならない。 Fig2.1 のアイコンをダブル・クリックして wxMaxima を起動する。 初めに、変数のクリア(消去)を実行する。 -->kill(all); つぎに、ze を定義する。ただし、w を角周波数とする。 -->ze:(1/Re + %i*w*Ce)^-1; ze の分母を通分して、zee に代入する。 -->zee:factor(ze); 増幅率:Avz を定義する。 -->Avz:(-hfe*Rc)/(hie+(1+hfe)*zee); Avz の分母を通分して、Avzz に代入する。 -->Avzz:factor(Avz); Fig2.1 wxMaxima のアイコン次に、分子を取り出し、変数nAvz に代入する。 -->nAvz:num(Avzz); 別々に求めた分子・分母から、増幅率Avcom を定義する。 -->Avcom:(realpart(nAvz)+%i*imagpart(nAvz)) /(realpart(dAvz)+%i*imagpart(dAvz)); 変数を正の数と定義する。 -->assume(hfe>0,Rc>0,Re>0); 複素数の大きさを計算する -->cabs(Avcom); 分子を簡単化する。 -->factor(num(cabs(Avcom),w^2)); 分子を簡単化した増幅率の大きさをAvabs として定義する。 -->Avabs:factor(num(cabs(Avcom),w^2))/denom(cabs(Avcom));
3 章 増幅率の周波数依存性
[ 目的 ] Ce を変化させた場合の、前章で得られた増幅率の大きさと周波数 f の関係のグラフを表示する。 [ 結果 ] 前章と同じファイルを続けて実行しているので、出力番号が続いています。 まず、Avabs 式の Ce 以外の変数に値を代入します。 -->ev(Avabs,Rc:2020,Re:822,hfe:170,hie:2000); 前式(出力結果)において、w を 2*pi*f に変換する命令を実行する。 (注意) %o18 は、直前の出力結果を示しているので、それぞれの使用実行状況で異なることがある。 -->ratsubst(2*%pi*f,w,%o18); この出力結果の式を変数f と Ce の関数:A(f,Ce)として定義する。 -->define(A(f,Ce),%o19); Ce=220uF の関数 A220(f)を定義する。 -->define(A220(f),A(f,220*10^-6)); Ce=100uF の関数 A100(f)を定義する。 -->define(A100(f),A(f,100*10^-6));以上で、Ce が異なるときの関数は定義できたので、 定義した関数を同時にグラフ表示する。 以上で、Ce が異なる値のときの増幅率と周波数のグラフが表示できた。 つぎに、縦軸の増幅率をdB に変更する。 Maxima の Log は自然対数であるので、常用対数にするために、 次の変換を利用する。 log10(x):=log(x)/log(10)
Ref. site : http://maxima.sourceforge.jp/maxima_10.html
Ce=220uF のときの関数を dB 関数に変換して関数定義する。 -->wxplot2d([A100(x),A220(x)], [x,10,100*10^3], [logx], [xlabel, "Frequency[Hz]"], [ylabel,"Amplitude"], [legend,false], [gnuplot_preamble,"set grid"]); Fig3.1 理論グラフ
-->define(A220dB(f),20*log(A220(f))/log(10)); 同様に、Ce=100uF の関数について、dB 表示関数を定義する。 -->define(A100dB(f),20*log(A100(f))/log(10)); 以上で、dB 表示関数が定義できたので、グラフ表示で確認する。 -->wxplot2d([A100dB(x),A220dB(x)], [x,10,100*10^3], [logx], [xlabel, "Frequency[Hz]"], [ylabel,"Aplitude[dB]"], [legend,false], [gnuplot_preamble,"set grid"]);
4 章 実験結果との比較
[ 目的 ] 実験から得られた増幅率の大きさと周波数のグラフを同時に表示する。 [ 結果 ] 前章と同じファイルを続けて実行しているので、出力番号が続いています。 初めに、x軸である測定した周波数のリストをつくる。 -->datax:[10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000,100000]; つぎに、実験データを測定周波数とおなじ順番に並べたリストを作成する。 -->datay :[11.3, 57.7, 96.2, 135.8, 158.5, 159.3, 166, 166, 166, 166, 166, 166]; 入力したデータリストを確認するために、グラフ表示する。 -->wxplot2d([discrete,datax,datay],[x,10,100*10^3], [logx],[style,points],[color,red],[gnuplot_preamble,"set grid"]); 以上で、実験結果のグラフ表示を確認できた。 Fig4.1 実験データのグラフ最後に、すべてのグラフを表示する。 -->wxplot2d([A220(x),A100(x),[discrete,datax,datay]], [x,10,100*10^3], [logx], [xlabel, "Frequency[Hz]"], [ylabel,"Amplitude"], [legend,false], [color,blue,green,red], [style,lines,lines,points], [point_type,circule], [gnuplot_preamble,"set grid"]); 以上で、実験データのグラフと計算したグラフの比較が可能になりました。 Fig4.2 理論グラフと実験結果グラフ
つぎに、実験データをdB に変換して、理論値グラフと同時に表示する。 リスト変数は、要素ごとに計算されます。 以上で、dB 値に変換できたので、理論グラフと同時に表示する。 以上で、増幅率をdB 表示した結果のグラフの作成ができました。 --> dataydB:20*log(datay)/log(10); -->wxplot2d([A220dB(x),A100dB(x),[discrete,datax,dataydB]], [x,10,100*10^3], [logx], [xlabel, "Frequency[Hz]"], [ylabel,"Aplitude[dB]"], [legend,false], [color,blue,green,red], [style,lines,lines,points], [point_type,circule], [gnuplot_preamble,"set grid"]); Fig4.3 dB 表示の理論グラフと実験結果グラフ
5 章 課題
この章では、実験結果を考察するための課題について説明する。 これらの課題を実行することで、実験の考察とレポート課題の理解が深まることを期待したい。 1) コンデンサ Ce に ESR(等価直列抵抗)が存在する場合について ESR を変数とした関数を作成せよ。 そして、ESR を変化したときのグラフを示せ。 2) トランジスタ等価回路に hoe を考慮した場合について hoe の影響を考慮した等価回路と増幅率の計算式を示せ。 また、増幅率と周波数のグラフを表示してhoe の影響を説明せよ。 3) 位相について 増幅率の式から、実数部と虚数部を取り出して、位相の式を示せ。 次に、位相と周波数のグラフを作成せよ。 また、実験結果と同時にグラフを示し、両者の相違について考察せよ。 4) 誤差について Maxima では、各変数について微分も実行できる。 Av を各変数について微分して誤差を見積もれ。付録1 参考文献について
参考サイトについて
S-0) Maxima, a Computer Algebra System http://maxima.sourceforge.net/ 以下に、Windows 版のサイトを示す。(April 2018) https://sourceforge.net/projects/maxima/files/Maxima-Windows/ また、検索サイトで、Maxima で検索すると 非常に多くの参考サイトが検索結果として表示されます。 文献として
B-1) 横田 博史、“はじめての Maxima (I・O BOOKS)”、工学社 (2006/09)
B-2) 中力 眞一、“シミュレーションで学ぶ電磁気学 (I・O BOOKS)”、工学社 (2011/09) データの表示やプログラミングについての解説があります。
B-3) 中川義行、“Maxima 入門ノート 1.2.1.pdf” B-4) Wilhelm Haager, “ Graphics with MAXIMA.pdf”
http://www.austromath.at/daten/maxima/zusatz/Graphics_with_Maxima.pdf wxplot2d についての option が詳細に示されています。 B-5) 梅野 善雄、“いつでも・どこでも・スマホで数学! Maxima on Android 活用マニュアル”、 森北出版 (2017/12/19) スマホでも使用可能になりました。 Fig.A1 Download サイト
付録2 課題解答例 課題1)、課題 2)は、以下にヒントを示す。 課題1) ESR を考慮した解析について ヒントが、課題3)にある。 ESR ありの場合の解答例です。 Ce に直列接続されている。 合成インピーダンスが以下になる。 1 𝑍𝑒𝑠𝑟= 1 𝑅𝑒+ 1 𝑅𝑐𝑒+𝑗𝑤𝐶1 𝑒 課題2) hoe の次元は[1/ohm]である。等価回路で以下である。 Rc に並列接続されている抵抗である。 出力インピーダンス:Zc が変化する。 右図の合成インピーダンスが以下になる。 1 𝑍𝑐= 1 𝑅𝑐+ 1 (ℎ𝑜𝑒)−1 Fig.A2-1 ESR を考慮した等価回路 Fig.A2-2 hoe を考慮した等価回路
課題3) [解答例] 位相の計算について はじめに、増幅率の複素数の形式で求める。 re とエミッタコンデンサ Ce の合成インピーダンス ze を求める。 --> ze:(1/re + 1/(rce+1/(%i*w*ce)))^-1;
--> zee:factor(ze);
増幅率Avz を定義する。--> Avz:(-hfe*rc)/(hie+(1+hfe)*zee);
通分する。--> Avzz:factor(Avz);
分母を取り出す。--> dAvz:denom(Avzz);
分子を取り出す。--> nAvz:num(Avzz);
分母と分子を実部と虚部に分離して表示させる。
--> Avcom:(realpart(nAvz)+%i*imagpart(nAvz))
/(realpart(dAvz)+%i*imagpart(dAvz));
位相を求める。--> carg(Avcom);
回路で使用した値を代入する。--> ev(%o8,rc:2020,re:822,rce:0,hfe:170,hie:2000);
出力結果(%o9)において、w を 2*%pi*f を代入する。--> ratsubst(2*%pi*f,w,%o9);
前の計算結果(%o10)を phi(f,ce)として定義する。--> define(phi(f,ce),%o10);
実験結果の値と一致させるために、角度に変換して-360 を加えています。 Ce=220uF の時の関数 phiDeg220(f)として定義する。
--> define(phiDeg220(f),-360+phi(f,220*10^-6)*180/%pi);
Ce=100uF の時の関数 phiDeg100(f)として定義する。--> define(phiDeg100(f),-360+phi(f,100*10^-6)*180/%pi);
--> wxplot2d([phiDeg100(x),phiDeg220(x)],
[x,10,100*10^3],
[logx],
[xlabel, "Frequency[Hz]"],
[ylabel,"Phase[Deg.]"],
[legend,false],
[gnuplot_preamble,"set grid"]);
Fig.A2-3 位相-周波数の理論グラフ実験データを表示する。 周波数を測定順番にリストで定義する。
--> datax:[10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 50000,100000];
実験結果の位相を測定した順番にリストにする。--> datay :[-105.1, -109.7, -125.3, -146.9, -163.8, -174.2, -180, -180, -180, -180, -180, -180];
実験結果のグラフを表示させる。Option として、semilog、style を point にして、色を赤に設定する。 最後のoption は、グリッド線の表示を設定している。
--> wxplot2d([discrete,datax,datay],[x,10,100*10^3],
[logx],[style,points],[color,red],[gnuplot_preamble,"set grid"]);
以上までに、実験結果のグラフ化は確認できたので、 計算結果と実験結果を同時に表示させる。
--> wxplot2d([phiDeg220(x),phiDeg100(x),[discrete,datax,datay]],
[x,10,100*10^3],
[logx],
[xlabel, "Frequency[Hz]"],
[ylabel,"Phase[Deg.]"],
[legend,false],
[color,blue,green,red],
[style,lines,lines,points],
[point_type,circule],
[gnuplot_preamble,"set grid"]);
実験結果(赤点)と理論グラフ(緑実線)は、一致している。 Fig.A2-5 理論グラフと実験データの関係課題4) 増幅率に含まれる誤差の見積もりをする。 [解答例] Avabs=Avabs(Re,Rc,Ce,hfe,hie)とすると、 不確定さ(誤差)δ(Avabs)は、 δ(Avabs) = √(𝜕(𝐴𝑣𝑎𝑏𝑠) 𝜕(𝑅𝑒) 𝛿(𝑅𝑒))2+ ( 𝜕(𝐴𝑣𝑎𝑏𝑠) 𝜕(𝑅𝑐) 𝛿(𝑅𝑐))2+ ( 𝜕(𝐴𝑣𝑎𝑏𝑠) 𝜕(𝐶𝑒) 𝛿(𝐶𝑒))2+ ( 𝜕(𝐴𝑣𝑎𝑏𝑠) 𝜕(ℎ𝑖𝑒) 𝛿(ℎ𝑖𝑒))2+ ( 𝜕(𝐴𝑣𝑎𝑏𝑠) 𝜕(ℎ𝑓𝑒) 𝛿(ℎ𝑓𝑒))2 で与えられる。 以下から、Maxima で定式を1項ごとに計算する。 増幅率の関数:Avabs を定義する。 定義した関数:Avabs を用いて誤差の計算をする。項ごとに、微分を実行する。
以上で、各変数についての微分係数は計算できた。 誤差をdAvabs と定義する。また、出力式は長いので、省略する。 数値を代入して、ddAvabs に代入する。また、出力式は長いので、省略する。 以下の値を入力する。 Rc=2020±1 [ohm] Re=822±1 [ohm] Ce=100±1 [uF] hfe=170±10 [ a.u. ] hie=2000±10[ohm] 出力結果は、数値でない状態である。 float 関数をもちいて、誤差を数値で出力する。 1kHz での増幅率を計算する。 誤差率(比率)を計算する。 以上の計算結果から、増幅率には、5%の誤差があることがわかる。 このように、非常に複雑な計算を実行させる場合に、数式変形ソフトは便利である。 参考文献:
1) John R. Taylor, “An Introduction to Error Analysis 2nd”,1997,University Science Books 誤差についての参考書。翻訳版があります。
[目的] 増幅率のグラフの外形を予測するために、 周波数f=0 と f=∞の時の計算値を求める。 また、遮断周波数も計算する。 [計算結果] 以下に計算過程を示す。 すべての変数をリセットする。
増幅率の極限値について
付録3変数を正の値と仮定する。 wを2*%pi*f に変更する。 以上で周波数依存の計算式が得られたので、 極限を計算する。 limit 関数で、f0 を求める。 また、一般的に、hfe>>2 であるので、この式はさらに近似できる。
次に、f が無限大の極限値を求める limit 関数で f -> infinity を求める。 Ce と hie を正の値と定義していないので、pos を入力する。 以上で、グラフの両側の式が計算できた。 つぎに、遮断周波数をもとめる。 はじめに、数値を代入する。 変数変換する。 Ce と f の関数を定義する。
コンデンサ:Ce=220uF の関数定義 コンデンサ:Ce=100uF の関数定義 関数が定義できたので、極限f --> 0 と f --> infinity のときの値を求める。 周波数f=0 では、2.4 倍となり、f=∞では、171.7 倍になることがわかる。 つぎに、遮断周波数:fcutoff を求める。 関数find_root 関数を用いる。最大値の 1/sqrt(2)の周波数を計算する。 遮断周波数のときの増幅率を求める。 Sqrt(2)であるかを確認する。
最終的に、遮断周波数とグラフを表示する。
以上で、グラフ上での遮断周波数の位置が確認できた。
付録4 [目的] Block 関数で定義した増幅率で計算する。 [手順と結果] Block 関数により、増幅率を定義する。 関数の引数を( )中で定義し、Block 関数内での内部変数を[ ]中で定義する。 最後に、戻り値をreturn 文で示す。 定義した式に、 数値を代入する。 代入は確認できたので、 計算結果を実数で再表示する。 Block 関数を用いた増幅率の計算
定義した関数を用いて グラフを表示する。
[目的] 計算結果をCSV 形式ファイルに保存する。 その後、CSV 形式のファイルを読み込みグラフ表示する。 [結果と手順] まずは、増幅度を計算する関数を作成する。 計算の途中から示す。詳細な計算は複素数の計算を参考にせよ。 増幅度を計算する 関数を定義する。 関数が準備できたので、計算する周波数のリストを作成する。 計算する範囲で、周波数Step を変化させる。 周波数範囲ごとのリストを結合する。 作成したリストを、定義した関数に代入する。 付録5 ファイル入出力について
代入結果のリストの先頭の成分について、計算結果の内容を確認する。 リストのすべての要素を実数に変換する。 計算したデータリストをグラフ表示し確認する。 リストを行列リストにする。 行列化したリストを転置する。 作成したリスト:xydata を CSV 形式で、ファイルに保存する。 ((注意))データを保存する前に、リストを作成したファイルを保存する。 データファイルは、このファイルと同じ場所に保存されます。 Fig.A5-1 すべてのリストを表示したグラフ
つぎに、 CSV 形式ファイルを読み込んでグラフ表示をする。 Maxima において、標準装備の System 関連の命令は非常に少ないです。 (入力の番号が連続していないのは、テストしながら実行した為です。) 以下の例では、 Desktop の analog_2014 フォルダ中にデータファイルがある場合です。 はじめに、データが保存されているフォルダに移動する。 ((注意)) 先頭の?は、Lisp 命令であるとこを示す。
関数read_matrix を用いる。読み込みの Option は、comma にする。 読み込んだリスト行列を、変数に代入する。
転置したリストの1行目をxdata に代入し、 2行目をydata に代入する。
以上で、データリストの準備ができたので、 データをグラフ化する。
[目的]
負荷線と SPICE model を用いてトランジスタの Ic-Vce 特性のグラフ表示する。
[参考文献]
[1]G. Massobrio, and P. Antognetti,"Semiconductor Device Modeling with SPICE 2nd"
McGraw Hill, 1933
[手順と結果]
変数を初期化する。
(%i24)
kill(all);
参考文献[1]において、シンプルな Ebers-Moll の式である
SPICE2 で使用している BJT Ebers-Moll static model
の数式を、Block 関数を用いて定義する。
(%i1)
Ic(Vbe,Vbc,Is,betaF,betaR):=block(
[Ic,
q:1.602*10^-19,
k:1.38*10^-23,
T:300,
GMIN:1.0*10^-12,
Isf:1.0*10^-16],
/* Active */
if (Vbe>-5*k*T/q) and (Vbc<=-5*k*T/q)
then Is*Isf*(exp(q*Vbe/(k*T))+1/betaR)+(Vbe-(1+1/betaR)*Vbc)*GMIN
/* Inverse */
elseif (Vbe<=-5*k*T/q) and (Vbc>-5*k*T/q)
then
-Is*Isf*(exp(q*Vbc/(k*T))+1/betaR*(exp(q*Vbc/(k*T))-1))+(Vbe-(1+1/betaR)*Vbc)*GMIN
/* Satrurate */
elseif (Vbe > -5*k*T/q) and (Vbc>-5*k*T/q)
then
Is*Isf*(exp(q*Vbe/(k*T))-exp(q*Vbc/(k*T))-1/betaR*(exp(q*Vbc/(k*T))-1))+(Vbe-(1+1/betaR)*Vbc)*GMIN
/* Off */
elseif (Vbe <= -5*k*T/q) and (Vbc <= -5*k*T/q)
then Is*Isf/betaR+(Vbe-(1+1/betaR)*Vbc)*GMIN
);
Fig.A6-1 Run - Mode
Fig.A6-2 Ebers-Moll Model
電圧 Vbc=-Vce+Vbe を用いて変数を変換する。
(%i2)
subst(-Vce+Vbe,Vbc,Ic(Vbe,Vbc,Is,betaF,betaR));
関数 IC を再定義する。
数値を代入して関数の動作を確認する。
(%i4)
Ic(0.78,6,1,150,0.001);
(%i5)
float(%);
計算できたので、関数 Ic をグラフ表示する。
(%i6)
wxplot2d(Ic(0.8,x,1,180,0.001),[x,0.001,10],
[y,0,0.01],
[xlabel,"Vce"],
[ylabel,"Ic"],
[legend,false],
[gnuplot_preamble,"set grid"]
);
関数 Vbe が異なる関数を定義した後、同時にグラフ表示する。
Vbe=0.8[V]と Vbe=0.75[V]の関数を定義して表示する。
(%i7)
define(Ic0_8(x),Ic(0.8,x,1,180,0.001))$
(%i8)
define(Ic0_75(x),Ic(0.75,x,1,180,0.001))$
(%i9)
wxplot2d([Ic0_75(x),Ic0_8(x)],[x,0,10],
[y,0,0.01],
[xlabel,"Vce"],
[ylabel,"Ic"],
[legend,false],
[gnuplot_preamble,"set grid"]
);
Fig.A6-3 Ic – Vce グラフ
次に、負荷線を表示する。
増幅回路で使用する抵抗を定義する。
(%i10)
r1:46.4*10^3;r2:14.7*10^3;rc:2.02*10^3;re:822.3;Vcc:12;
直流負荷線を定義する。
(%i15)
Ic(x):=Vcc/(rc+re)-x/(rc+re);
交流負荷線を定義する。
Vcc’を y として定義しています。
(%i16)
Ica(x,y):=y/(rc)-x/(rc);
Fig.A6-4 Ic – Vce グラフ
定義した負荷線を、同時に、表示する。
(%i17)
wxplot2d([Ic(x),Ica(x,10)],[x,0,14],
[y,0,0.008],
[xlabel,"Vce[V]"],
[ylabel,"Ic[A]"],
[legend,false],
[gnuplot_preamble,"set grid"]
);
以上までで、
表示させるグラフの動作が確認できたので、
負荷線とトランジスタの Ic-Vce 特性のグラフを同時に表示させる。
(%i18)
wxplot2d([Ic(x),Ica(x,10),Ic0_75(x),Ic0_8(x)],[x,0,14],
[y,0,0.008],
[xlabel,"Vce[V]"],
[ylabel,"Ic[A]"],
[legend,false],
[gnuplot_preamble,"set grid"]
);
Fig.A6-5 負荷線のグラフ
以上で、
Ebers – Moll モデルの等価回路を用いて、
負荷線とトランジスタ Ic-Vce 特性グラフが表示できました。
しかし、実際のトランジスタの Ic-Vce 特性のグラフは、
単純な Ebers-Moll の式では実現できません。
さらに、多くの変更が必要です。
実際の SPICE 計算では、Gummel-Poon の式を使用しています。
Fig.A6-6 すべてのグラフ
[目的] Ebers-Moll モデル(EM1)等価回路を用いたときの直流特性と交流特性グラフを確認する。
[Ref. book]
[1]p224 Example5.1 Transport model Calculation
R. C. Jaeger & T. N. Blalock , “Microelectronic circuit design- 4th ed.”, McGraw Hill, 2011 [2]新原 盛太郎、”SPICE とデバイス・モデル”, CQ 出版、2005 [Setting Parameters] 後半の計算で使用した変数を示す。 実験に近い値になるように決定しました。 ideal coefficient: N=1.4 Is:10^-13 [A] betaF:170 betaR:170 Vt:0.026[V] VCC:12 [V] [手順と結果] 初めに、EM モデルの関数について動作を確認する。 熱電圧(thermal Voltage) (%i33) Vt:0.026; 飽和電流:Is (%i34) Is:10^-15; 順方向電流増幅率:betaF (%i35) betaF:50; 逆方向電流増幅率:betaR (%i36) betaR:1; Vcc 電圧:Vce エミッタ・コレクタ間に印加する電圧 (%i37) Vcc:5;
Fig.A7-1 Transistor Configuration
Vce=-Vbc+Vbe
Fig.A7-2 エミッタ接地回路
直流特性と交流特性グラフについて
Vbe 電圧: (%i38) Vbe:0.75; Vbc 電圧は、コレクターを基準にしています。 (%i39) Vbc:Vbe-Vcc; Ic 関数 (%i40) Ic:Is*(exp(Vbe/Vt)-exp(Vbc/Vt))-Is/betaR*(exp(Vbc/Vt)-1); Ie 関数 (%i41) Ie:Is*(exp(Vbe/Vt)-exp(Vbc/Vt))+Is/betaF*(exp(Vbe/Vt)-1); Ib 関数 (%i42) Ib:Is/betaF*(exp(Vbe/Vt)-1)+Is/betaR*(exp(Vbc/Vt)-1); (%i43) Ic+Ib; 以上で計算できていることが確認できた。 Active 領域での関数を以下に示す。(Vt=0.025 としたとき) Active 領域は、Vbe>4Vt=0.1V and Vbc<-4Vt=-0.1V である。 この範囲において、 exp(-Vbc/Vt)<<1 が成立するので、 ic=Is*exp(Vbe/Vt)+Is/betaR ie=Is/betaF*exp(Vbe/Vt)+Is/betaF ib=Is/betaF*exp(Vbe/Vt)-Is/betaF-Is/betaR と簡単化できます。さらに、ib を ic で表示する。 ib=1/betaF(exp(Vbe/Vt)+Is/(betaR*betaF))-Is/betaF-Is/betaR-Is/betaR =1/betaF*ic-Is/betaF-2Is/betaR すべての変数を初期化する。 (%i44) kill(all);
Ic 関数式を定義 (%i1) Ic:Is*(exp(Vbe/(N*Vt))-exp(Vbc/(N*Vt)))-Is/betaR*(exp(Vbc/(N*Vt))-1); Ie 関数式を定義 (%i2) Ie:Is*(exp(Vbe/(N*Vt))-exp(Vbc/(N*Vt)))+Is/betaF*(exp(Vbe/(N*Vt))-1); Ib 関数式を定義 (%i3) Ib:Is/betaF*(exp(Vbe/(N*Vt))-1)+Is/betaR*(exp(Vbc/(N*Vt))-1); Vbc を Vbe-Vce に変換する。 (%i4) ratsubst(Vbe-Vcc,Vbc,Ic); 数値を代入する。 (%i5) ev(%,Is:10^-13,Vt:0.026,betaF:170,betaR:170,Vcc:12,N:1.4); Vbe を変数とする関数:ICC を定義する。 (%i6) define(ICC(Vbe),%); 定義した関数の動作を確認する。
(%i7) ICC(0.75); Ie に関して、同様に、Vbc を変換する。 (%i8) ratsubst(Vbe-Vcc,Vbc,Ie); 値を代入する。 (%i9) ev(%,Is:10^-13,Vt:0.026,betaF:170,betaR:170,Vcc:12,N:1.4); 関数:IEE を定義する。 (%i10) define(IEE(Vbe),%); 動作確認する。 (%i11) IEE(0.75); Ib に関して、同様に Vcb を変換する。 (%i12) ratsubst(Vbe-Vcc,Vbc,Ib); 値を代入する。 (%i13) ev(%,Is:10^-13,Vt:0.026,betaF:170,betaR:170,Vcc:12,N:1.4); 関数:IBB を定義する。 (%i14) define(IBB(Vbe),%);
(%i15) IBB(0.75); 以上で関数の定義ができたので、semi- log グラフで表示する。 (%i16) wxplot2d([ICC(x),IEE(x),IBB(x)], [x,0.3,0.8], [logy], [xlabel,""], [ylabel,""], [legend,false], [gnuplot_preamble,"set grid"] ); 関数 IBB のみを表示する。このグラフが、直流特性の Vbe- Ib 特性のグラフに相当する。 --> wxplot2d(IBB(x), [x,0.3,0.8], /* [logy], */ [xlabel,"Vbe[V]"], [ylabel,"IBB[A]"], [legend,false], [gnuplot_preamble,"set grid"] );
Fig.A7-3 ICC, IEE, IBB のグラフ
Ib を再確認する。 (%i18) Ib; Vbc を変換する。 (%i19) Ibb:ratsubst(Vbe-Vcc,Vbc,Ib); Ibb を Vbe で微分する。 (%i20) diff(Ibb,Vbe); 微分した数式に、値を代入する。 (%i21) ev(%,Is:10^-13,Vt:0.026,betaF:170,betaR:170,Vcc:12,N:1.4); 代入した数式を、関数:dfIBB と定義する。 (%i22) define(dfIBB(Vbe),%);
微分関数の逆数をグラフ表示する。 --> wxplot2d(1/dfIBB(x), [x,0.75,0.9], /* [logy], */ [xlabel,"Vbe[V]"], [ylabel,"dfIBB^-1[ohm]"], [legend,false], [gnuplot_preamble,"set grid"] ); 横軸を電流にしたグラフを作成するために、 はじめに、電圧リスト:xxdata を作成する。 (%i24) xdata:makelist(x,x,7,9,0.02)$ (%i25) xxdata:xdata*0.1; リスト:xxdata を関数に代入するして、結果をリスト:ydata に入力する。 (%i26) ydata:maplist(IBB,xxdata)$ 同様に、微分関数:dfIBB の計算結果をリスト:yydata に代入する。 (%i27) yydata:maplist(dfIBB,xxdata)$
電圧リスト:xxdata と計算結果リスト:ydata のグラフを表示する。 (%i28) wxplot2d([discrete,xxdata,ydata]); 横軸が電流で、縦軸が 1/dfIBB のグラフを表示する。 (%i38) wxplot2d([discrete,ydata,1/yydata], /* [logy], */ [xlabel,"IBB[A]"], [ylabel,"dfIBB^-1[ohm]"], [legend,false],
[gnuplot_preamble,"set grid;set yrange[0:5000]"] );
関数 IBB を直接微分して、逆数を取った関数でグラフ表示する。 (%i30) wxplot2d(1/diff(IBB(x),x), [x,0.3,0.8], /* [logy], */ [xlabel,"Vbe"], [ylabel,"dfIBB^-1"], [legend,false], [gnuplot_preamble,"set grid"] ); 関数のままでの hie-Vbe のグラフ表示できることが確認できました。 つぎに、hfe= Ic/Ib のグラフを表示する。 横軸が Vbe での hfe の変化のグラフを示す。 参考サイト: Reange Setting: Ref: http://www.k3.dion.ne.jp/~kawada/Uinx/maxima-plot.html (%i31) wxplot2d(ICC(x)/IBB(x), [x,0.7,1.0], /* [logy],*/ [xlabel,"Vbe"], [ylabel,"IBB"], [legend,false],
[gnuplot_preamble,"set grid;set yrange[150:200]"] );
Fig.A7-8 hie-Vbe のグラフ
Vbe を 0.7V から 1V まで変化させたとき、hfe が一定であることが確認できる。 つぎに、横軸が電流値のグラフを表示する。
電圧リスト:xxdata を関数:ICC に代入して、結果を y3data に代入する。 その結果を、グラフ表示する。 (%i35) y3data:maplist(ICC,xxdata)$ (%i37) wxplot2d([discrete,ydata,y3data], /* [logy], */ [xlabel,"Ib[A]"], [ylabel,"Ic[A]"], [legend,false], [gnuplot_preamble,"set grid"] ); 直流特性に相当する Ib - Ic のグラフが表示できました。 グラフは、直線であることが確認できます。 このモデルでは、hfe が非線形であることは示せません。 hfe の非線形性については、EM3 以上で実現しています。[2] (課題)