Hello everyone,
I recently started using Devsim. I have some trouble with this library.
Platform :
Windows with winpython
Goal :
Simulating the DC and transitional behavior of an illuminated PIN diode.
For the transient simulation, I want to create this circuit :
First problem :
When I connect my diode directly to the voltage source (with no resistor and no illumination). It seems to work in DC and tr ( up to approx. 0.6 V). I tried several things to connect the diode cathode to the voltage source and the anode to the resistor. However, Iβm having trouble getting the right control combinations to make the connection properly. Could you tell me how to make the connection to get the given diagram, please?
Second problem :
I want to create a lighting profile that varies over time. To do this, I thought Iβd change the parameters p1 and n1 via the set_parameter command during simulation. This should simulate the creation of electron-hole pairs. Do you think this method will work?
import os
os.environ["DEVSIM_MATH_LIBS"]="C:../scripts/Devsim/Library/bin/mkl_rt.2.dll"
from devsim import *
from devsim.python_packages.simple_physics import *
from devsim.python_packages.ramp import *
from devsim.python_packages.model_create import *
import test_common
import diode_common
import numpy as np
import matplotlib.pyplot as plt
reset_devsim()
#Physical constants
q = 1.6e-19 #Coulomb
k = 1.380650e-23 #J/K
eps_0 = 8.85e-14 #F/cm^2
eps_Si = 11.1 #
eps_Ox = 3.9 #
n_i = 1e10 # /cm^3
mu_n = 400
mu_p = 200
tau_n = 1e-8 #s
tau_p = tau_n/3 #s
T = 300 #K
#Doping
Na_P = 1e18 # /cm^3
Na_I = 1e15 # /cm^3
Nd_N = 1e18 # /cm^3
Nd_I = 1e15 # /cm^3
#Photodiode schematic
"""
βββββββββββββββββββββββββtop
β P+ βtop_prime
β βPI_prime
βββββββββββββββββββββββββPI
β I βPI_second
β β
βββββββββββββββββββββββββItop
β β
β β
β β
β β
β β
β β
β I βImiddile
β β
β β
β β
β β
β β
β β
β β
βββββββββββββββββββββββββIbot
β I β
β βNI_second
βββββββββββββββββββββββββNI
β N+ βNI_prime
β βbot_prime
βββββββββββββββββββββββββbot
"""
top = 0 #m
top_prime = 0.5e-6
PI_prime = 4e-6
PI = 5e-6 #m
PI_second = 6e-6
Itop = 50e-6 #m
Imiddle = 107.5E-6
Ibot = 165e-6 #m
NI_second = 214e-6
NI = 215e-6 #m
NI_prime = 216e-6
bot_prime = 219.5e-6
bot = 220e-6 #m
name = "PIN_Diode_1D"
def CreateMesh(device, region):
ps=100e-9
create_1d_mesh(mesh="dio")
add_1d_mesh_line(mesh="dio", pos=top , ps=ps/1000, tag="top" )
add_1d_mesh_line(mesh="dio", pos=top_prime , ps=ps/100, tag="top_prime" )
add_1d_mesh_line(mesh="dio", pos=PI_prime , ps=ps/100, tag="PI_prime" )
add_1d_mesh_line(mesh="dio", pos=PI , ps=ps/1000, tag="PI" )
add_1d_mesh_line(mesh="dio", pos=PI_second , ps=ps/100, tag="PI_second")
add_1d_mesh_line(mesh="dio", pos=Itop , ps=ps/10, tag="Itop")
add_1d_mesh_line(mesh="dio", pos=Imiddle , ps=ps/1, tag="Imiddle")
add_1d_mesh_line(mesh="dio", pos=Ibot , ps=ps/10, tag="Ibot" )
add_1d_mesh_line(mesh="dio", pos=NI_second , ps=ps/100, tag="NI_second")
add_1d_mesh_line(mesh="dio", pos=NI , ps=ps/1000, tag="NI" )
add_1d_mesh_line(mesh="dio", pos=NI_prime , ps=ps/100, tag="NI_prime" )
add_1d_mesh_line(mesh="dio", pos=bot_prime , ps=ps/100, tag="bot_prime" )
add_1d_mesh_line(mesh="dio", pos=bot , ps=ps/1000, tag="bot" )
add_1d_contact(mesh="dio", name="top", tag="top", material="metal")
add_1d_contact(mesh="dio", name="bot", tag="bot", material="metal")
add_1d_region(mesh="dio", material="Si", region=region, tag1="top", tag2="bot")
finalize_mesh(mesh="dio")
create_device(mesh="dio", device=device)
def SetNetDoping(device,region):
#Step profile
# CreateNodeModel(device, region, "Acceptors", str(Na_P)+"*step("+str(PI)+"-x)+tanh(0)+"+str(Na_I))
# CreateNodeModel(device, region, "Donors" , str(Nd_N)+"*step(x-"+str(NI)+")+"+str(Nd_I))
#Soft step profile
# CreateNodeModel(device, region, "Acceptors", "0.5*"+str(Na_P)+"*erf(1000000*(-x+"+str(PI)+"))+0.5*"+str(Na_P)+"+"+str(Na_I))
# CreateNodeModel(device, region, "Donors", "0.5*"+str(Nd_N)+"*erf(1000000*(x-"+str(NI)+"))+0.5*"+str(Nd_N)+"+"+str(Nd_I))
#Exp profile
CreateNodeModel(device, region, "Acceptors", str(Na_P)+"*exp(-10*x/"+str(PI)+")+"+str(Na_I))
CreateNodeModel(device, region, "Donors", str(Nd_N)+"*exp(10/"+str(PI)+"*(1*x-"+str(bot)+"))+"+str(Nd_I))
CreateNodeModel(device, region, "NetDoping", "Donors-Acceptors")
def InitialSolution(device, region, circuit_contacts=None):
# Create Potential, Potential@n0, Potential@n1
CreateSolution(device, region, "Potential")
# Create potential only physical models
CreateSiliconPotentialOnly(device, region)
# Set up the contacts applying a bias
for i in get_contact_list(device=device):
if circuit_contacts and i in circuit_contacts:
CreateSiliconPotentialOnlyContact(device, region, i, True)
else:
###print "FIX THIS"
### it is more correct for the bias to be 0, and it looks like there is side effects
set_parameter(device=device, name=GetContactBiasName(i), value=0.0)
CreateSiliconPotentialOnlyContact(device, region, i)
def DriftDiffusionInitialSolution(device, region, circuit_contacts=None):
####
#### drift diffusion solution variables
####
CreateSolution(device, region, "Electrons")
CreateSolution(device, region, "Holes")
####
#### create initial guess from dc only solution
####
set_node_values(
device=device, region=region, name="Electrons", init_from="IntrinsicElectrons"
)
set_node_values(
device=device, region=region, name="Holes", init_from="IntrinsicHoles"
)
###
### Set up equations
###
CreateSiliconDriftDiffusion(device, region)
for i in get_contact_list(device=device):
if circuit_contacts and i in circuit_contacts:
CreateSiliconDriftDiffusionAtContact(device, region, i, True)
else:
CreateSiliconDriftDiffusionAtContact(device, region, i)
def SetSiliconParameters(device,region) :
set_parameter(device=device, region=region, name="Permittivity", value=eps_Si*eps_0) # Permittivity
set_parameter(device=device, region=region, name="ElectronCharge", value=q) # ElectronCharge
set_parameter(device=device, region=region, name="taun", value=tau_n) # taun
set_parameter(device=device, region=region, name="taup", value=tau_p) # taup
set_parameter(device=device, region=region, name="mu_n", value=mu_n) # mu_n
set_parameter(device=device, region=region, name="mu_p", value=mu_p) # mu_p
set_parameter(device=device, region=region, name="n_i", value=n_i) # n_i
set_parameter(device=device, region=region, name="n1", value=n_i) # n1
set_parameter(device=device, region=region, name="p1", value=n_i) # p1
set_parameter(device=device, region=region, name="V_t", value=k*T/q) # V_t
set_parameter(device=device, region=region, name="T", value=T) # T
set_parameter(name="extended_solver", value=True)
set_parameter(name="extended_model", value=True)
set_parameter(name="extended_equation",value=True)
"""
Simulation
"""
device = name
region = "Region"
CreateMesh(device,region)
SetSiliconParameters(device,region)
SetNetDoping(device,region)
InitialSolution(device, region)
solve(type="dc", absolute_error=1, relative_error=1e-20, maximum_iterations=100)
DriftDiffusionInitialSolution(device,region)
solve(type="dc", absolute_error=0.01, relative_error=1e-12, maximum_iterations=100)
#DC simulation
v = 0.59
set_parameter(device=device, name=GetContactBiasName("top"), value=v)
set_parameter(device=device, name=GetContactBiasName("bot"), value=0)
solve(type="dc", absolute_error=1, relative_error=1e-10, maximum_iterations=100)
PrintCurrents(device, "top")
PrintCurrents(device, "bot")
#Tran simulation
#time_step = 0.05e-3
#total_time = 1e-2
#current_time = 0
#
#while current<total_time:
# solve(type="transient_dc", absolute_error=1, relative_error=1e-10, maximum_iterations=100)
# solve(type=transient_bdf1",absolute_error=1, relative_error=1e-10, maximum_iterations=100)
# current_time += time_step
Information :
I used the following example: Reverse recovery of pin diode - #3 by Saidon70
I have read the following forum articles :
How to add optical generation (photovoltaics)
Ssac and transient in generation term
The calculated precision of Current
I looked at the following example codes :
diode_1d.py, diode_commonpy, trand_diode .py, circ1.py, circ2.py, circ3.py, circ4.py, transient_circ.py, transient_circ2.py, transient_circ3.py.
Maybe I missed something obvious. I apologize in advance, but this is the first time Iβve used TCAD.
Iβd be grateful for any help you could give me.
Have a nice day