Skip to content
Snippets Groups Projects
Commit ca478c99 authored by Alexandros Asonitis's avatar Alexandros Asonitis
Browse files

Double Gate devices part 5 (Smu configuration details,measurements,plots)

parent 57a63d48
Branches
No related tags found
No related merge requests found
......@@ -25,6 +25,8 @@ checkboxes = widgets.HBox([transfer_check,output_check,gatediode_check])
display(checkboxes)
print()
#details of smus
details= details()
#transfer
Vds_transfer_widgets,Vds_transfer = secondary('VDS',1,0,1,0.1)
......@@ -47,12 +49,12 @@ terminal = widgets.Dropdown(
value ='VTG',
style= {'description_width': 'initial'}
)
Vg_gatediode_widgets,Vg_gatediode=primary('VG',-8,0.05,2,0.02)
Vgs_gatediode_widgets,Vgs_gatediode=primary('VG',-8,0.05,2,0.02)
gatediode_box = widgets.VBox([integration_gatediode,terminal,Vgs_gatediode_widgets])
#the tab widget
children = [transfer_box,output_box,gatediode_box]
titles = ["Transfer","Output","Gatediode"]
children = [details,transfer_box,output_box,gatediode_box]
titles = ["SMU Configuration","Transfer","Output","Gatediode"]
tab = widgets.Tab()
tab.children = children
tab.titles = titles
......@@ -60,6 +62,7 @@ tab.titles = titles
display(tab)
print()
# the button
button = widgets.Button(description ='Start Measurement')
output = widgets.Output()
......@@ -137,14 +140,15 @@ def on_start_clicked(b):
comp = Vbg_transfer['comp'].value,
pcomp = Vbg_transfer['pcomp'].value
)
smu3.update(VARD=vard)
smu4 = device.smu_dict()
smu4.update(vname ='VS',iname = 'IS',mode = 'COMM',func='CONS')
#execute measurement
values=Transfer(smu1,smu2,smu3,smu4,integration_transfer.value,norm,device)
values=Transfer(smu1,smu2,smu3,smu4,integration_transfer.value,device)
#plot results
plot_transfer(values["VGS"],values["IDmm"],values["Gmmm"],points,norm_unit)
plot_transfer(values,points)
#save results
if norm_unit =='mA/mm':
header=['VGS/V','VDS/V','ID/A',"IG/A",'gm/S',"IDmm/mA/mm","IGmm/mA/mm","gm/mS/mm"]
......@@ -166,7 +170,7 @@ def on_start_clicked(b):
if vds_ok== True and vbg_ok == True and vtg_ok == True:
#calculate number of points for var2(VGS)
points = number_of_points(Vtg_output['start'],Vtg_output['step'],Vtg_output['stop'])
points_vtg = number_of_points(Vtg_output['start'],Vtg_output['step'],Vtg_output['stop'])
#configure smus
smu1 = device.smu_dict()
......@@ -208,14 +212,14 @@ def on_start_clicked(b):
step = Vbg_output['step'].value,
stop = Vbg_output['stop'].value,
comp = Vbg_output['comp'].value
cons = device.cons_smu_dict().update(value=start,comp = comp)
cons = device.cons_smu_dict()
)
#execute measurement
values= Output(smu1,smu2,smu3,smu4,integration_output.value,norm,device)
values,points_vbg= Output(smu1,smu2,smu3,smu4,integration_output.value,device)
#plot results
#clear_output()
plot_output(values["VDS"],values["IDmm"],values["IGmm"],points,norm_unit)
plot_output(values["VDS"],values["IDmm"],values["IGmm"],points_vtg,norm_unit)
#save results
if norm_unit == 'mA/mm':
......@@ -236,16 +240,19 @@ def on_start_clicked(b):
vg_ok = check_values(Vg_gatediode,'primary')
if vg_ok == True:
if terminal.value =='VBG':
#configure smus
smu1 = device.smu_dict()
smu1.update(vname ='VS1',iname = 'IS1',mode = 'COMM',func='CONS')
smu = device.smu_dict()
smu.update(vname='VBG',iname ='IBG',mode='V',func='VAR1',number =3)
else:
smu = device.smu_dict()
smu.update(vname ='VTG',iname = 'ITG',mode = 'COMM',func='CONS',number = 1)
smu3 = device.smu_dict()
smu3.update(vname='VGS',iname ='IG',mode='V',func='VAR1')
smu4 = device.smu_dict()
smu4.update(vname ='VS',iname = 'IS',mode = 'COMM',func='CONS')
var1=device.var1_dict()
var1.update(
mode=Vgs_gatediode['hyst'].value,
......@@ -256,9 +263,9 @@ def on_start_clicked(b):
pcomp=Vgs_gatediode['pcomp'].value
)
smu3.update(VAR1=var1)
smu.update(VAR1=var1)
#execute measurement
values=Gatediode(smu1,smu3,smu4,integration_gatediode.value,norm,device)
values=Gatediode(smu,smu4,integration_gatediode.value,device)
#clear_output()
plot_gatediode(values["VGS"],values["IGmm"],norm_unit)
......
......@@ -9,39 +9,30 @@ import tkinter.messagebox
import pandas as pd
def plot_transfer(x,y1,y2,curves,norm_unit='mA/mm'):
def plot_transfer(values,curves):
x = np.array_split(x,curves)
y1 = np.array_split(y1,curves)
y2 = np.array_split(y2,curves)
x1 = np.array_split(values["VBG"],curves)
x2 = np.array_split(values["VTG"],curves)
y = np.array_split(np.abs(values["ID"]),curves)
fig, ax1 = plt.subplots()
color = 'tab:red'
ax1.set_xlabel('$V_{GS} (V)$')
if norm_unit == 'mA/mm':
ax1.set_ylabel('$I_{D} (mA/mm)$', color = color)
else:
ax1.set_ylabel('$I_{D} (uA/um)$', color = color)
ax1.set_xlabel('$V_{BG} (V)$')
ax1.set_ylabel('$I_{D} (A)$', color = color)
ax1.set_yscale('log')
for i in range(curves):
ax1.plot(x[i], y1[i], color = color)
#ax1.plot(Vgs, Idmm, color = color)
ax1.tick_params(axis ='y', labelcolor = color)
ax1.plot(x1[i], y[i], color = color)
# Adding Twin Axes
ax2 = ax1.twinx()
ax2 = ax1.twiny()
color = 'tab:green'
if norm_unit == "mA/mm":
ax2.set_ylabel('$g_{m} (mS/mm)$', color = color)
else:
ax2.set_ylabel('$g_{m} (uS/um)$', color = color)
color = 'tab:red'
ax2.set_xlabel('$V_{TG} (V)$')
for i in range(curves):
ax2.plot(x[i], y2[i], color = color)
#ax2.plot(Vgs, gm, color = color)
ax2.tick_params(axis ='y', labelcolor = color)
ax2.plot(x2[i], y[i], color = color)
# Adding title
fig.suptitle('Transfer Curve', fontweight ="bold")
......@@ -51,16 +42,13 @@ def plot_transfer(x,y1,y2,curves,norm_unit='mA/mm'):
display(fig)
def plot_output(x,y1,y2,curves,norm_unit = "mA/mm"):
x = np.array_split(x,curves)
y1 = np.array_split(y1,curves)
y2 = np.array_split(y2,curves)
def plot_output(values,curves_var2,curves_var3):
x=np.array_split(np.array_split(values["VDS"],curves_var3),curves_var2)
y = np.array_split(values["ID"],curves_var3)
fig,ax1 = plt.subplots()
color='tab:red'
ax1.set_xlabel('$V_{DS} (V)$')
if norm_unit == 'mA/mm':
ax1.set_ylabel('$I_{D} (mA/mm)$', color = color)
else:
ax1.set_ylabel('$I_{D} (uA/um)$', color = color)
......
......@@ -206,3 +206,18 @@ def additional_secondary(name,start,step,stop,comp):
return secondary_grid,parameters
# How to place smus
def details():
smu1 = widgets.Label("SMU1:Top Gate",layout=Layout(height='auto', width='auto'))
smu2 = widgets.Label("SMU2:Drain",layout=Layout(height='auto', width='auto'))
smu3 = widgets.Label("SMU3:Back Gate",layout=Layout(height='auto', width='auto'))
smu4 = widgets.Label("SMU4:Source(Ground)",layout=Layout(height='auto', width='auto'))
smu1.style.font_weight='bold'
smu2.style.font_weight='bold'
smu3.style.font_weight='bold'
smu4.style.font_weight='bold'
vbox = widgets.VBox([smu1,smu2,smu3,smu4])
return vbox
\ No newline at end of file
......@@ -15,21 +15,21 @@ def Setup(device):
#disable all irrelevant units
device.disable_not_smu()
def Transfer(smu1,smu2,smu3,smu4,integration,norm,device):
device.del_user_functions()
def Transfer(smu1,smu2,smu3,smu4,integration,device):
#set all the smus
device.setup_smu(1,smu1)
device.setup_smu(2,smu2)
device.setup_smu(3,smu3)
device.setup_smu(4,smu4)
device.setup_var1(smu3['VAR1'])
device.setup_var1(smu1['VAR1'])
device.setup_var2(smu2['VAR2'])
device.setup_vard(smu3['VARD'])
device.integration_time(integration)
device.display_mode("LIST")
variables_list = ["VTG","VDS","ID"]
variables_list = ["VTG","ITG","VDS","ID","VBG","IBG"]
device.variables_to_save(variables_list)
device.single_measurement()
......@@ -41,99 +41,66 @@ def Transfer(smu1,smu2,smu3,smu4,integration,norm,device):
return values
def Output(smu1,smu2,smu3,smu4,integration,norm,device):
device.del_user_functions()
def Output(smu1,smu2,smu3,smu4,integration,device):
#setup all smus
device.setup_smu(1,smu1)
device.setup_smu(2,smu2)
device.setup_smu(3,smu3)
device.setup_smu(4,smu4)
device.setup_var2(smu3['VAR2'])
device.setup_var2(smu1['VAR2'])
device.setup_var1(smu2['VAR1'])
device.integration_time(integration)
device.display_mode("LIST")
variables_list = ["VTG","ITG","VDS","ID","VBG","IBG"]
device.variables_to_save(variables_list)
#display
device.display_variable('X','VDS')
device.display_variable('Y1','IDmm')
device.display_variable('Y2','IGmm')
if smu2['VAR1']['start']<smu2['VAR1']['stop']:
device.display_variable_min_max('X','MIN',smu2['VAR1']['start'])
device.display_variable_min_max('X','MAX',smu2['VAR1']['stop'])
else:
device.display_variable_min_max('X','MAX',smu2['VAR1']['start'])
device.display_variable_min_max('X','MIN',smu2['VAR1']['stop'])
if smu2['VAR1']['comp']!=0:
device.display_variable_min_max('Y1','MIN',-abs(smu2['VAR1']['comp'])*norm)
device.display_variable_min_max('Y1','MAX',abs(smu2['VAR1']['comp'])*norm)
first = True
if smu3['VAR2']['comp']!=0:
device.display_variable_min_max('Y2','MIN',-abs(smu3['VAR2']['comp'])*norm)
device.display_variable_min_max('Y2','MAX',abs(smu3['VAR2']['comp'])*norm)
VBG_start = smu3['start']
VBG_stop = smu3['stop']
VBG_step = smu3['step']
VBG_comp = smu3['comp']
variables_list = ["VGS","VDS","ID","IG","IDmm","IGmm"]
device.variables_to_save(variables_list)
counter = 0
for VBG in range(VBG_start,VBG_stop+VBG_step,VBG_step):
smu3["cons"].update(value=VBG,comp =VBG_comp)
device.setup_cons_smu(3,smu3['cons'])
if first == True:
device.single_measurement()
first = False
else:
device.append_measurement()
while device.operation_completed()==False:
pass
device.autoscaling()
counter = counter + 1
values = dict([(variable,device.return_values(variable)) for variable in variables_list])
return values
def Gatediode(smu1,smu3,smu4,integration,norm,device):
device.del_user_functions()
return values,counter
def Gatediode(smu,smu4,integration,device):
#setup all smus
device.setup_smu(1,smu1)
device.setup_smu(smu['number'],smu)
device.smu_disable(2)
device.setup_smu(3,smu3)
device.setup_smu(4,smu4)
device.setup_var1(smu3['VAR1'])
device.integration_time(integration)
#define user functions
device.user_function('IGmm','mA/mm',f'IG*{norm}')
device.user_function('ABSIGm','mA/mm','ABS(IGmm)')
#display
device.display_variable('X','VGS')
device.display_variable('Y1','IGmm')
device.display_variable('Y2','ABSIGm')
if smu3['VAR1']['start']<smu3['VAR1']['stop']:
device.display_variable_min_max('X','MIN',smu3['VAR1']['start'])
device.display_variable_min_max('X','MAX',smu3['VAR1']['stop'])
if smu['number']==1:
device.smu_disable(3)
else:
device.display_variable_min_max('X','MAX',smu3['VAR1']['start'])
device.display_variable_min_max('X','MIN',smu3['VAR1']['stop'])
if smu3['VAR1']['comp'] !=0:
device.display_variable_min_max('Y1','MIN',-abs(smu3['VAR1']['comp'])*norm)
device.display_variable_min_max('Y1','MAX',abs(smu3['VAR1']['comp'])*norm)
device.display_variable_min_max('Y2','MIN',0)
device.display_variable_min_max('Y1','MAX',abs(smu3['VAR1']['comp'])*norm)
device.axis_scale('Y2','LOG')
device.smu_disable(1)
device.setup_smu(4,smu4)
variables_list = ["VGS","IG","IGmm","ABSIGm"]
device.setup_var1(smu['VAR1'])
device.integration_time(integration)
device.display_mode("LIST")
variables_list = [smu['vname'],smu['iname']]
device.variables_to_save(variables_list)
device.single_measurement()
while device.operation_completed()==False:
pass
device.autoscaling()
values = dict([(variable,device.return_values(variable)) for variable in variables_list])
return values
......
%% Cell type:code id:81f37cac-ea14-4540-8bc9-78bee248dfbb tags:
``` python
import sys
sys.path.insert(0, './lib')
sys.path.insert(0, '..') #append parent directory
from interface import *
```
%% Cell type:code id:731635ba-6f97-4a65-ad78-ae90b277544b tags:
``` python
# Create the grids
#create the information grid
style = {'description_width': 'initial'}
sample = information_box_new()
###end of sampling information#######################################
# move checkboxes outside of the tabs
transfer_check,integration_transfer = header('Transfer Curve')
output_check,integration_output = header('Output Curve')
gatediode_check,integration_gatediode=header('Gatediode')
checkboxes = widgets.HBox([transfer_check,output_check,gatediode_check])
display(checkboxes)
print()
#detais
details= details()
#transfer
Vds_transfer_widgets,Vds_transfer = secondary('VDS',1,0,1,0.1)
Vtg_transfer_widgets,Vtg_transfer = primary('VTG',-7,0.1,7,0.01)
Vbg_transfer_widgets,Vbg_transfer = synchronous('VBG',-50,50,0.01)
transfer_box = widgets.VBox([integration_transfer,Vds_transfer_widgets,Vtg_transfer_widgets,Vbg_transfer_widgets])
#output
Vds_output_widgets,Vds_output = primary('VDS',0,0.01,5,0.1)
Vtg_output_widgets,Vtg_output = secondary('VTG',1,1,5,0.01)
Vbg_output_widgets,Vbg_output = additional_secondary('VBG',10,10,20,0.01)
output_box = widgets.VBox([integration_output,Vds_output_widgets,Vtg_output_widgets,Vbg_output_widgets])
#GateDiodde
terminal = widgets.Dropdown(
options = ['VTG','VBG'],
description = 'Selected Gate:',
value ='VTG',
style= {'description_width': 'initial'}
)
Vgs_gatediode_widgets,Vgs_gatediode=primary('VG',-8,0.05,2,0.02)
gatediode_box = widgets.VBox([integration_gatediode,terminal,Vgs_gatediode_widgets])
#the tab widget
children = [transfer_box,output_box,gatediode_box]
titles = ["Transfer","Output","Gatediode"]
children = [details,transfer_box,output_box,gatediode_box]
titles = ["SMU Configuration","Transfer","Output","Gatediode"]
tab = widgets.Tab()
tab.children = children
tab.titles = titles
display(tab)
print()
```
%% Output
%% Cell type:code id:df6835fd-e02c-49cb-aa4e-42fddef69b86 tags:
``` python
```
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment