schottky.py ダウンロード/コピー

schottky.py をダウンロード

schottky.py
schottky.py
  1"""
  2ショットキーダイオードの電流-電圧特性シミュレーションスクリプト。
  3
  4概要:
  5    ショットキーダイオードのIV特性を計算し、プロットします。
  6詳細説明:
  7    さまざまなショットキーモデル(単純拡散、拡散、ショットキー障壁低下、トンネル、熱電子電界放出)を用いて、
  8    ショットキーダイオードのIV特性を計算し、プロットします。
  9    物理定数や材料パラメータを入力として受け取り、順方向および逆方向バイアスでの電流を数値的に解きます。
 10関連リンク:
 11    schottky_usage
 12"""
 13import numpy as np
 14import math
 15import argparse
 16import matplotlib.pyplot as plt
 17
 18# 物理定数
 19KB = 1.380649e-23  # ボルツマン定数 [J/K]
 20QE = 1.60217663e-19 # 素電荷 [C]
 21EPS0 = 8.854187e-12 # 真空の誘電率 [F/m]
 22ME = 9.109383e-31 # 電子の静止質量 [kg]
 23
 24def calculate_params(args):
 25    """
 26    概要:
 27        ショットキーダイオードの主要な物理パラメータを計算します。
 28    詳細説明:
 29        リチャードソン定数、半導体側の有効状態密度とフェルミ準位、
 30        ショットキー障壁高さ、内蔵電位、直列抵抗(単位面積あたり)、
 31        飽和電流密度などを計算します。
 32    引数:
 33        :param args: コマンドライン引数から解析されたパラメータを含むオブジェクト。
 34        :type args: argparse.Namespace
 35        :param args.temp: 温度 [K]。
 36        :type args.temp: float
 37        :param args.men: 電子の有効質量比。
 38        :type args.men: float
 39        :param args.ecn: 半導体の電子親和力 [eV]。
 40        :type args.ecn: float
 41        :param args.efm: 金属のフェルミ準位 [eV]。
 42        :type args.efm: float
 43        :param args.ndn: 半導体のドナー濃度 [cm^-3]。
 44        :type args.ndn: float
 45        :param args.mun: 電子の移動度 [cm^2/Vs]。
 46        :type args.mun: float
 47        :param args.dn: 半導体の厚さ [nm]。
 48        :type args.dn: float
 49    戻り値:
 50        :returns: 飽和電流密度 [A/cm^2]、内蔵電位 [V]、ショットキー障壁高さ [eV]、半導体側の有効状態密度 [cm^-3]、直列抵抗(単位面積あたり) [Ω cm^2] のタプル。
 51        :rtype: tuple
 52    """
 53    T = args.temp
 54    # リチャードソン定数の計算
 55    reff = 1.20173e6 * args.men # A/m2/K2
 56    am_cm2 = reff * 1e-4        # A/cm2/K2
 57    
 58    # 半導体側の統計
 59    nc = 2.51e19 * (args.men**1.5) * ((T/300)**1.5) # cm-3
 60    efn = args.ecn - (KB * T / QE) * math.log(args.ndn / nc)
 61    
 62    # 障壁と内蔵電位
 63    phi_b = -(args.ecn - args.efm)
 64    v_bi = -(efn - args.efm)
 65    
 66    # 抵抗と飽和電流
 67    sigma_n = QE * args.ndn * args.mun
 68    rn = 1.0 / sigma_n * args.dn * 1e-7 # ohm cm2
 69    rs = rn
 70    
 71    js = am_cm2 * T**2 * math.exp(-QE * phi_b / (KB * T))
 72    
 73    return js, v_bi, phi_b, nc, rs
 74
 75def calculate_schottky_current(model_type, v_target, temp, mus, ncs, nds, epss, js, phi_b, v_bi, n_diode, rs, area, v_initial, men, n_tunnel):
 76    """
 77    概要:
 78        指定されたモデルに基づき、ショットキーダイオードの電流を計算します。
 79    詳細説明:
 80        ニュートン法を用いて、直列抵抗効果を考慮したダイオード電圧 v_diode を数値的に解き、
 81        それに対応する電流を求めます。
 82        内部関数 get_current(vd) は、与えられたダイオード電圧 vd に対して、
 83        モデルに応じた電流を計算します。モデルには 'Simple', 'Diffusion', 'Schottky' (障壁低下),
 84        'Tunneling', 'TFE' (熱電子放出と電界放出) があります。
 85    引数:
 86        :param model_type: 使用するショットキーモデルの種類 ('Simple', 'Diffusion', 'Schottky', 'Tunneling', 'TFE')。
 87        :type model_type: str
 88        :param v_target: 印加電圧 [V]。
 89        :type v_target: float
 90        :param temp: 温度 [K]。
 91        :type temp: float
 92        :param mus: 電子の移動度 [cm^2/Vs]。
 93        :type mus: float
 94        :param ncs: 半導体の有効状態密度 [cm^-3]。
 95        :type ncs: float
 96        :param nds: 半導体のドナー濃度 [cm^-3]。
 97        :type nds: float
 98        :param epss: 半導体の誘電率 [F/m]。
 99        :type epss: float
100        :param js: 飽和電流密度 [A/cm^2]。
101        :type js: float
102        :param phi_b: ショットキー障壁高さ [eV]。
103        :type phi_b: float
104        :param v_bi: 内蔵電位 [V]。
105        :type v_bi: float
106        :param n_diode: ダイオードの理想係数。
107        :type n_diode: float
108        :param rs: 直列抵抗 [Ω]。
109        :type rs: float
110        :param area: ダイオードの面積 [cm^2]。
111        :type area: float
112        :param v_initial: ニュートン法の初期ダイオード電圧 [V]。
113        :type v_initial: float
114        :param men: 電子の有効質量比。
115        :type men: float
116        :param n_tunnel: トンネルモデルの理想係数。
117        :type n_tunnel: float
118    戻り値:
119        :returns: 計算されたダイオード電圧 [V] と計算された電流 [A] のタプル。
120        :rtype: tuple
121    """
122    if v_target == 0: return 0.0, 0.0
123    v_diode = v_initial
124    dv, eps, max_iter = 1e-4, 1e-7, 100
125    vt = (n_diode * KB * temp) / QE
126    
127    # 単位換算 (cm -> m)
128    mus_m = mus * 1e-4
129    ncs_m = ncs * 1e6
130    nds_m = nds * 1e6
131
132    # get_current をループの外で定義できるよう vd を引数に取る形式に
133    def get_current(vd):
134        if v_target >= 0.0 or model_type == 'Simple' or (v_bi - vd) < 0:
135            return js * (math.exp(vd / vt) - 1.0) * area
136        
137        elif model_type == 'Diffusion':
138            e_max = math.sqrt(2.0 * QE * nds_m * (v_bi - vd) / epss)
139            k_exp = QE * mus_m * ncs_m * e_max * math.exp(-QE * phi_b / (KB * temp))
140            return k_exp * (math.exp(vd / vt) - 1.0) * 1e-4 * area
141        
142        elif model_type == 'Schottky':
143            k1 = (QE / epss)**1.5 * math.sqrt(2) / (4.0 * math.pi) * math.sqrt(nds_m) * math.sqrt(v_bi - vd)
144            k_exp = math.exp(QE / (KB * temp) * math.sqrt(k1))
145            return js * k_exp * (math.exp(vd / vt) - 1.0) * area
146
147        elif model_type == 'Tunneling':
148            # 簡易的な指数関数モデル
149            k_tunnel = math.exp(vd / (n_tunnel * 0.026)) 
150            return js * k_tunnel * (math.exp(vd / vt) - 1.0) * area
151
152        elif model_type == 'TFE':
153            hbar = 1.0545718e-34
154            m_eff = men * ME
155            # E00の計算
156            e00_j = (QE * hbar / 2.0) * math.sqrt(nds_m / (epss * m_eff))
157            e00 = e00_j / QE # [eV]
158            kt_q = (KB * temp) / QE
159            e0 = e00 * (1.0 / math.tanh(e00 / kt_q))
160            
161            if vd >= 0:
162                # 順方向:傾きが 1/e0 になる
163                return js * (math.exp(vd / e0) - 1.0) * area
164            else:
165                # 逆方向:電界による障壁の薄層化を考慮(簡易WKB)
166                # 電界が強くなる(vdがマイナスに大きくなる)ほど指数関数的に増大させる
167                e_max = math.sqrt(2.0 * QE * nds_m * (v_bi - vd) / epss)
168                # 補正項:E00が大きくなる(ドーピングが高い)ほど透過率が爆発的に増える
169                tunnel_factor = math.exp(abs(vd) * (e00 / kt_q)**2) 
170                return js * tunnel_factor * (math.exp(vd / e0) - 1.0) * area        
171        return 0
172
173    for _ in range(max_iter):
174        im = get_current(v_diode - dv)
175        ip = get_current(v_diode + dv)
176        
177        v_total = 0.5 * ((v_diode - dv + im * rs) + (v_diode + dv + ip * rs))
178        if abs(v_total - v_target) < eps:
179            return v_diode, 0.5 * (im + ip)
180        
181        dv_dv = ((v_diode + dv + ip * rs) - (v_diode - dv + im * rs)) / (2.0 * dv)
182        v_diode += (v_target - v_total) / dv_dv
183        
184    return v_diode, get_current(v_diode)
185
186def main():
187    """
188    概要:
189        コマンドライン引数に基づいてショットキーダイオードのIV特性シミュレーションを実行し、結果をプロットします。
190    詳細説明:
191        argparse を使用して入力パラメータを解析し、calculate_params で基本パラメータを計算した後、
192        calculate_schottky_current を繰り返し呼び出してIV曲線を生成します。
193        最後にMatplotlibで結果を可視化します。
194    戻り値:
195        :returns: なし
196        :rtype: None
197    """
198    parser = argparse.ArgumentParser(description='ショットキーダイオードの電流-電圧特性をシミュレートします。')
199    parser.add_argument('--model', choices=['Simple', 'Diffusion', 'Schottky', 'Tunneling', 'TFE'], default='Simple',
200                        help='使用するショットキーモデル。')
201    parser.add_argument('--temp', type=float, default=300.0,
202                        help='温度 [K]。')
203    parser.add_argument('--area', type=float, default=0.01,
204                        help='ダイオードの面積 [cm^2]。')
205    parser.add_argument('--efm', type=float, default=4.4, 
206                        help='金属のフェルミ準位 [eV]。')
207    parser.add_argument('--ecn', type=float, default=4.05, 
208                        help='半導体の電子親和力 [eV]。')
209    parser.add_argument('--ndn', type=float, default=1.0e16,
210                        help='半導体のドナー濃度 [cm^-3]。')
211    parser.add_argument('--mun', type=float, default=1500.0,
212                        help='電子の移動度 [cm^2/Vs]。')
213    parser.add_argument('--eps_r', type=float, default=11.9, 
214                        help='比誘電率。')
215    parser.add_argument('--dn', type=float, default=1000.0, 
216                        help='半導体の厚さ [nm]。')
217    parser.add_argument('--men', type=float, default=0.19,
218                        help='電子の有効質量比。')
219    # トンネルモデル用のパラメータを追加
220    parser.add_argument('--n_tunnel', type=float, default=2.0, 
221                        help='トンネルモデルの理想係数。')
222    parser.add_argument('--v0', type=float, default=-2.0,
223                        help='印加電圧の開始値 [V]。')
224    parser.add_argument('--v1', type=float, default=1.0,
225                        help='印加電圧の終了値 [V]。')
226    parser.add_argument('--step', type=float, default=0.02,
227                        help='印加電圧のステップサイズ [V]。')
228    args = parser.parse_args()
229
230    # パラメータ計算
231    js, v_bi, phi_b, ncs, rs_unit = calculate_params(args)
232    epss = args.eps_r * EPS0
233    rs = rs_unit / args.area 
234
235    v_apps = np.arange(args.v0, args.v1 + args.step, args.step)
236    currents = []
237    v_prev = args.v0 * 0.2
238    
239    for v_app in v_apps:
240        v_d, i = calculate_schottky_current(
241            args.model, v_app, args.temp, args.mun, ncs, args.ndn, epss, 
242            js, phi_b, v_bi, 1.0, rs, args.area, v_prev,
243            args.men, args.n_tunnel  # 不足していた引数を追加
244        )
245        currents.append(i)
246        v_prev = v_d
247
248    # 結果表示
249    print(f"Model      : {args.model}")
250    print(f"Barrier phiB: {phi_b:.4f} eV")
251    print(f"V_bi       : {v_bi:.4f} V")
252    print(f"Js         : {js:.6e} A/cm2")
253
254    # グラフ表示
255    plt.figure(figsize=(8, 6))
256    plt.semilogy(v_apps, np.abs(currents), label=f'{args.model} model')
257    plt.xlabel("Applied Voltage [V]")
258    plt.ylabel("|Current| [A]")
259    plt.grid(True, which='both', alpha=0.3)
260    plt.legend()
261    plt.title(f"Schottky Diode IV Characteristics ({args.model})")
262    plt.show()
263
264if __name__ == "__main__":
265    main()