水銀CV(Mercury Probe CV)測定を想定する場合、金属(水銀)と半導体の間に形成されるショットキー接合としてモデル化するのが一般的です。
pn接合との大きな違いは、金属側の空乏層を無視できるため、計算式がよりシンプルになる点です。また、コンダクションバンド(伝導帯)のポテンシャル形状 $E_c(x)$ は、ポアソン方程式を2回積分することで放物線状のプロットとして得られます。
1. ショットキー接合の数式
空乏層幅
外部バイアス
(逆バイアスのとき負)を加えたときの空乏層幅は以下の通りです。
※
は拡散項(Debye lengthの影響)ですが、通常は省略されることも多いです。
伝導帯の形状 
空乏層内(
)での電位分布
を求め、エネルギー単位に変換します。
(表面)で最大値(障壁高さ)となり、
でバルクの値に収束します。
バルクの
の算出
非縮退半導体近似を用いると、伝導帯下端
とフェルミ準位
の差は以下の式で求まります。
ここで、
は有効状態密度であり、GaN(300K)では以下の値を用います。
-

-
(at 300K)
ショットキー障壁と内蔵電位
水銀(Hg)とn型GaNの界面における障壁高さ
は文献によりますが、一般に
程度です。
内蔵電位
は、表面の曲がりからバルクのオフセットを引いたものになります。
2. Pythonコード
GaNだけでなく、AlGaNでも計算ができるように線形補間でAl組成によるパラメータ変化を仮定し、コンダクションバンドと
プロットをできるプログラムを作りました。
import numpy as np
import matplotlib.pyplot as plt
import argparse
def get_algan_properties(al_ratio, Nd, T=300):
q = 1.602e-19
k = 1.38e-23
k_ev = 8.617e-5
eps0 = 8.854e-14
m0 = 9.11e-31
h = 6.626e-34
eps_r = al_ratio * 8.5 + (1 - al_ratio) * 8.9
eps_s = eps0 * eps_r
me_star = (al_ratio * 0.3 + (1 - al_ratio) * 0.2) * m0
phi_bn = 1.1 + 1.5 * al_ratio
nc = 2 * [I]2 * np.pi * me_star * k * T) / (h**2**(1.5) * 1e-6
Ec_Ef_bulk = (k_ev * T) * np.log(nc / Nd) if Nd < nc else 0
Vbi = phi_bn - Ec_Ef_bulk
return eps_s, Vbi, Ec_Ef_bulk, q
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--al', type=float, default=0.2, help='Al composition (0-1)')
parser.add_argument('--nd', type=float, default=1e17, help='Donor concentration [cm^-3]')
parser.add_argument('--v_min', type=float, default=-10.0, help='Min voltage [V]')
parser.add_argument('--v_max', type=float, default=0.0, help='Max voltage [V]')
parser.add_argument('--area', type=float, default=5e-3, help='Probe area [cm^2]')
args = parser.parse_args()
# 物性値の取得
eps_s, Vbi, Ec_Ef_bulk, q = get_algan_properties(args.al, args.nd)
# 電圧スイープデータの作成
v_sweep = np.linspace(args.v_min, args.v_max, 100)
w_list = []
c_list = []
for v in v_sweep:
pot = Vbi - v
w = np.sqrt[II]2 * eps_s / q / args.nd) * pot) if pot > 0 else 1e-9
c = (eps_s / w) * args.area * 1e12 # [pF]
w_list.append(w)
c_list.append(c)
w_sweep = np.array(w_list)
… Continue reading
# --- 1. バンドプロファイル (V_min と V_max) ---
x_plot = np.linspace(0, max(w_sweep)*1.5, 500)
for v_val, col, lbl in zip([args.v_min, args.v_max], ['crimson', 'dodgerblue'], ['V_min', 'V_max']):
pot = Vbi - v_val
w_val = np.sqrt[III]2 * eps_s / q / args.nd) * pot) if pot > 0 else 0
Ec = np.full_like(x_plot, Ec_Ef_bulk)
mask = x_plot <= w_val
Ec[mask] = (q * args.nd / (2 * eps_s * (w_val - x_plot[mask])**2 + Ec_Ef_bulk
ax1.plot(x_plot * 1e7, Ec, color=col, lw=2, label=f'Ec at {v_val}V')
ax1.axvline(w_val * 1e7, color=col, linestyle='--', alpha=0.5)
ax1.axhline(0, color='black', lw=1, label='Ef')
ax1.set_title("Band Profile Comparison")
ax1.set_xlabel("Depth [nm]")
ax1.set_ylabel("Energy [eV]")
ax1.legend()
ax1.grid(True, alpha=0.2)
# --- 2. C-V カーブ ---
ax2.plot(v_sweep, c_sweep, color='blue', lw=2)
ax2.scatter([args.v_min, args.v_max], [c_sweep[0], c_sweep[-1]], color=['crimson', 'dodgerblue'], zorder=5)
ax2.set_title("C-V Characteristics")
ax2.set_xlabel("Bias Voltage [V]")
ax2.set_ylabel("Capacitance [pF]")
ax2.grid(True, alpha=0.2)
# --- 3. 1/C^2 - V プロット ---
ax3.plot(v_sweep, inv_c2_sweep, color='red', lw=2)
ax3.scatter([args.v_min, args.v_max], [inv_c2_sweep[0], inv_c2_sweep[-1]], color=['crimson', 'dodgerblue'], zorder=5)
ax3.set_title("$1/C^2$ - V Plot")
ax3.set_xlabel("Bias Voltage [V]")
ax3.set_ylabel("$1/C^2$ [$pF^{-2}$]")
ax3.grid(True, alpha=0.2)
plt.tight_layout()
plt.show()
if __name__ == '__main__':
main()
Al組成、ドナー密度、CV測定の電圧の最小・最大値、Hgプローブの面積を変数に実行することができる。
脚注
| ↑I | 2 * np.pi * me_star * k * T) / (h**2 |
|---|---|
| ↑II | 2 * eps_s / q / args.nd) * pot) if pot > 0 else 1e-9 c = (eps_s / w) * args.area * 1e12 # [pF] w_list.append(w) c_list.append(c) w_sweep = np.array(w_list) c_sweep = np.array(c_list) inv_c2_sweep = 1.0 / (c_sweep**2) # グラフの作成 (1行3列) fig, (ax1, ax2, ax3) = plt.subplots(1, 3, figsize=(18, 5 |
| ↑III | 2 * eps_s / q / args.nd) * pot) if pot > 0 else 0 Ec = np.full_like(x_plot, Ec_Ef_bulk) mask = x_plot <= w_val Ec[mask] = (q * args.nd / (2 * eps_s |

最近のコメント