Download: Diode-CV.py cv.csv
Run: python Diode-CV.py
import os
import sys
import csv
from math import exp, sqrt
import numpy as np
from numpy import arange
from scipy import integrate # 数値積分関数 integrateを読み込む
from scipy import optimize # newton関数はscipy.optimizeモジュールに入っている
from scipy.interpolate import interp1d
from matplotlib import pyplot as plt
"""
Analyze a depth profile of carrier traps from C-V date of a diode
DiodeのC-VからNdの深さ方向分析を行う
"""
# constants
pi = 3.14159265358979323846
h = 6.6260755e-34 # Js";
hbar = 1.05459e-34 # "Js";
c = 2.99792458e8 # m/s";
e = 1.60218e-19 # C";
e0 = 8.854418782e-12; # C2N-1m-2";
kB = 1.380658e-23 # JK-1";
me = 9.1093897e-31 # kg";
Debug = 0
# dielectric constant of semiconductor
eps_s = 12.9
# C-V data
infile = "cv.csv"
V0min = -10.0
V0max = 10.0
def savecsv(outfile, header, datalist):
try:
print("Write to [{}]".format(outfile))
f = open(outfile, 'w')
except:
# except IOError:
print("Error: Can not write to [{}]".format(outfile))
else:
fout = csv.writer(f, lineterminator='\n')
fout.writerow(header)
# fout.writerows(data)
for i in range(0, len(datalist[0])):
a = []
for j in range(len(datalist)):
a.append(datalist[j][i])
fout.writerow(a)
f.close()
def pfloat(str):
try:
return float(str)
except:
return 0.0
def read_csv(infile, delimiter = ',', Vmin = None, Vmax = None):
data = []
try:
infp = open(infile, "r")
f = csv.reader(infp, delimiter = delimiter)
header = next(f)
print("header=", header)
for j in range(len(header)):
data.append([])
for row in f:
V = pfloat(row[0])
C = pfloat(row[1])
print("V,C=", V, C, Vmin, Vmax)
if Vmin <= V <= Vmax:
data[0].append(V)
data[1].append(C)
except:
print("Error: Can not read [{}]".format(infile))
exit()
return header, data
def read_data(infile, xmin = None, xmax = None):
if '.TXT' in infile.upper():
header, data = read_csv(infile, '\t', xmin, xmax)
return header, np.array(data[0]), np.array(data[1])
else:
header, data = read_csv(infile, ',', xmin, xmax)
return header, np.array(data[0]), np.array(data[1])
def main():
global V0min, V0max
print("infile : ", infile)
header, V, C = read_data(infile, V0min, V0max)
ndata = len(V)
Vmin = V[0]
Vstep = V[1] - V[0]
Vmax = Vmin + Vstep * (ndata - 1)
print("Input data")
print(" ndata = ", ndata)
print(" V range: {} - {} at {} step".format(Vmin, Vmax, Vstep))
print("")
C2 = []
for i in range(ndata):
C2.append(1.0 / C[i] / C[i])
W = []
Nd = []
print("V (V)\tC (F/cm2)\tW (nm)\tNd (cm-3)")
for i in range(1, len(V)-1):
cap = C[i] * 1.0e4 # in F/m^2
dC2dV = (C2[i+1] - C2[i-1]) * 1.0e-4 / (V[i+1] - V[i-1])
dw = eps_s * e0 / cap * 1.0e9 # in nm
n = 2.0 * cap * cap * cap / e / (eps_s * e0) / dC2dV * 1.0e-6 # in cm^-3
W.append(dw)
Nd.append(n)
print("{:6.4f}\t{:10.4g}\t{:6.4f}\t{:10.4g}".format(V[i], C[i], dw, n))
#=============================
# Plot graphs
#=============================
fig = plt.figure(figsize = (10, 10))
ax1 = fig.add_subplot(2, 2, 1)
ax2 = fig.add_subplot(2, 2, 2)
ax3 = fig.add_subplot(2, 2, 4)
ax1.plot(V, C, label = 'C', color = 'black')
ax1.set_xlabel("V (V)")
ax1.set_ylabel("C (F/cm2)")
ax1.legend()
ax2.plot(V, C2, label = '1/C^2', color = 'black')
ax2.set_xlabel("V (V)")
ax2.set_ylabel("1/C^2 (cm^4/F^2)")
ax2.legend()
ax3.plot(W, Nd, label = 'Nd (cm-3)', color = 'black')
ax3.set_xlim([0.0, 3.0])
ax3.set_xlabel("W (nm)")
ax3.set_ylabel("Nd (cm^-3)")
ax3.legend()
# Rearange the graph axes so that they are not overlapped
plt.tight_layout()
plt.pause(0.1)
print("Press ENTER to exit>>", end = '')
input()
if __name__ == '__main__':
main()