Examples: Difference between revisions
No edit summary |
|||
(29 intermediate revisions by 3 users not shown) | |||
Line 1: | Line 1: | ||
SweepMe! can be used for sheer number of academic and industrial measurements and processes, from a simple reading of a temperature sensor to device fabrication by physical vapor deposition in a vacuum chamber. A few example use-cases are presented in this article. However, the possibilities are indeed unlimited! As the retired NASA astronaut Ron Garan once said, “We are limited only by our imagination and our will to act”. | |||
* | For each use-case, a self-explanatory example [[Sequencer]] is given, with a short explanation. One can configure the [[Modules]] by double-clicking on them in the [[Sequencer]] window. In this article, the [[Sequencer]] is depicted with the free online ASCII tree-generator tool [https://tree.nathanfriend.io Tree]. | ||
* Current-voltage | |||
* Angle dependent spectra | == Current-voltage characteristics == | ||
'''Task''' | |||
* | |||
* Wafer prober tests | Acquire an IV curve of a two-terminal device, such as an LED, a solar cell, a photodetectors, or a sensor. | ||
* Temperature | |||
* | '''Sequencer''' | ||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── SMU - Keithley 2400 | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath*~trailingSlash*~rootDot*)~.(%27.%27%5CnMakeFile%5Cn%20SMU%20-%20Keithley%202400%27)~version!%271%27)*!false.source!%01.* Tree] | |||
'''Explanation''' | |||
One [[SMU]] module is all you need for a quick and simple current-voltage curve of a semiconductor device. Don't forget to configure the Sweep editor that comes with the SMU module to define your voltage or current sweep. | |||
== Transistor measurement == | |||
'''Task''' | |||
Acquire IV characteristics of a transistor, e.g. output characteristics or transfer characteristics. | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
SMU - Keithley 4200-SCS | |||
└── MakeFile | |||
└── SMU - Keithley 4200-SCS | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath.~trailingSlash.~rootDot.)~5(%275%27*3MakeFile3%20*%27)~version!%271%27)*SMU%20-%20Keithley%204200-SCS.!false3%5Cn%205source!%0153.* Tree] | |||
'''Explanation''' | |||
The upper [[SMU]] module makes voltage sweep, e.g. to vary the gate voltage. The lower SMU module is performing its variation for each higher variation. So, if it is performing a drain voltage variation, one finally gets output characteristics as for each gate voltage of the upper SMU a drain variation of the lower SMU is done. If you swap the SMU modules regarding gate and drain variation, one can measure transfer characteristics for a number of drain voltages. | |||
== Joint base/gate and collector/drain transistor sweep == | |||
'''Task''' | |||
Acquire an IV characteristics of a transistor by simultaneously sweeping the voltage at gate (or base) and drain (or collector) with a constant offset. | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── SMU drain | |||
└── Calc | |||
└── SMU gate | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath-~trailingSlash-~rootDot-)~.(%27.%270MakeFile*SMU%20drain2Calc2%20SMU%20gate%27)~version!%271%27)*0%20-!false.source!0%5Cn2*%20%0120.-* Tree] | |||
'''Explanation''' | |||
Sometimes, the drain voltage and the gate voltage need to be ramped up at the same time. In this case, one SMU module must follow the voltage of another module. To achieve this, the module [[SMU]] drain will perform in this example the main voltage variation, e.g. from 0.5 V to 1.5 V. Now, a module [[Calc]] is inserted between the SMU modules to calculate a new sweep value for SMU gate. Here, it is important that the Calc module uses the "Sweep value of SMU drain" so that the calculation is done based on the sweep value of SMU drain and not the measured value of the voltage (which would be known to late). The Sweep value of the SMU gate then needs to be the result of the Calc module instead of the Sweep editor that is normally used as default. | |||
== Current/voltage/resistance transients == | |||
'''Task''' | |||
Measure current, voltage, or resistance over time with a given time distance between the points | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── Loop | |||
└── SMU - Keithley_2400 | |||
└── Delay | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath.~trailingSlash.~rootDot.)~5(%275%273MakeFile3*Loop3*6SMU%20-%20Keithley_24003****Delay%27)~version!%271%27)6%20.!false3%5Cn5source!6*%20%01653.* Tree] | |||
'''Explanation''' | |||
The [[SMU]] module will be configured to measure exactly one point. This can be done in the Sweep editor by using the same value for start and end. Thus, the SMU performs a "sweep" over one value, i.e. it stays at a constant voltage or current. Whether the SMU is sourcing voltage or current can be adjusted with the Sweep mode in the Setup tab of the SMU module. Further, one can select 'Resistance' and/or 'Conductance' in the post-processing section of the module. To now repeat the measurement, a Loop module is added to the same branch. It can be configured by double-click to run for a given number of points or infinite (using 0). To have a given time between the measurement points, the module "Delay" is used. Double-click it and enter the number of seconds. The module will make sure that the next point is not started before the given time has passed since the start of the previous measurement point. If you for example use a delay of 1 s and a loop of 1000, your measurement will run 1000 s. The MakeFile module defines how often new files are created. As it is the topmost module, only one data file is created in which all data is saved. | |||
== Frequency dependent capacitance-voltage measurements == | |||
'''Task''' | |||
Measure the capacitance vs. voltage bias for a set of constant frequencies | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
Sweep | |||
└── MakeFile | |||
└── LCRmeter | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath-~trailingSlash-~rootDot-)~.(%27.%27Sweep0MakeFile0*LCRmeter%27)~version!%271%27)*%20%20-!false.source!0%5Cn*%010.-* Tree] | |||
'''Explanation''' | |||
To measure impedance and capacitance, the [LCRmeter] module is used that can load instrument drivers for various impedance analyzers and LCR meters. The LCRmeter module has a Sweep and a Step section. The Sweep of the module is configured to make voltage bias variation and the sweep editor that comes with the module can be selected as Sweep value and thus used to create the voltages scan. | |||
The Step section of the LCRmeter module can be used to define now the frequencies at which the CV scan should be done. Here, you can select Frequency as the Step mode. The Step value cannot come anymore from the Sweep editor that belongs to the LCRmeter module because it is already used for defining the voltages. This is why a module "Sweep" is added above the LCRmeter according to the above Sequencer scheme. The module "Sweep" can be used to define arbitrary value variations. It is now configured to make a variation over the desired frequencies. | |||
To handover the frequency values of the "Sweep" module to the LCRmeter module, the Step value of the LCRmeter is set to the value of the "Sweep" module. | |||
Because the LCRmeter module is nested into the "Sweep" module, the voltage variation of the LCRmeter module is performed for each variation of the "Sweep" module. | |||
To get a new data file for each iteration of the "Sweep" module, a MakeFile module can be placed between "Sweep" and LCRmeter. | |||
== Battery charging & discharging tests == | |||
'''Task''' | |||
Measure accelerated battery capacity test | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── Loop1 | |||
└── SMU - Rohde&Schwarz NGx series | |||
└── Loop2 | |||
└── Logger - Temperature sensor | |||
└── Delay | |||
└── Condition | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath0~trailingSlash0~rootDot0)~4(%274%27MakeFile.Loop1.*SMU3Rohde%26Schwarz%20NGx%20series5Loop25*Logger3Temperature%20sensor5**Delay5***Condition6%27)~version!%271%27)*%20%20.6*0!false3%20-%204source!5.**6%5Cn%0165430.* Tree] | |||
'''Explanation''' | |||
An [[SMU]] module applies a number of fixed voltages to the battery and reads the current flow. The [[Loop]]2 module make sure that each voltage is read out multiple times with time spacing as given by the [[Delay]] module. The higher [[Loop]]1 module allows to repeat the entire voltage variation to make lifetime test, e.g. of charging and discharging cycles. The [[Condition]] module can be used to stop the measurement when a certain criteria is reached. Of course, further modules can be adeded. For example, a temperature sensor could be helpful to log the batteries temperature at each step. | |||
== Sensor monitoring system== | |||
'''Task''' | |||
Make a simple data acquisition and monitoring system for sensors and actuators of a lab or building | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── Loop | |||
└── Logger - Arduino_DHTxx | |||
└── MQTT | |||
└── Delay | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath.~trailingSlash.~rootDot.)~2(%272%273MakeFile*Loop0Logger-Arduino_DHTxx4MQTT4%20Delay%27)~version!%271%27)*3%20.!false0*%202source!3%5Cn40%20%014320.* Tree] | |||
'''Explanation''' | |||
A microcontroller board like Arduino can come in handy as an interface between sensors and computers. There are different SweepMe! drivers accompanied with Arduino .ino sketch files to read common sensors. In the example below, a DHT temperature and relative humidity sensor is read with the Logger-Arduino_DHTxx driver in a certain interval, defined by [[delay]]. The data then is published with popular IoT protocol MQTT over the local network. For more information, please refer to [[Arduino Driver guide]] and [[MQTT]] articles. | |||
== Angle dependent spectra == | |||
'''Task''' | |||
Measure angular-dependent spectra of a light sources like OLED or LED | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── Switch - Rotation stage | |||
└── SMU - Keithey 2400 | |||
└── Spectrometer - OceanOptics USB4000 | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath.~trailingSlash.~rootDot.)~3(%273%275MakeFile*Switch-Arduino_StepperMotor*6MU-Keithey_2400*%206pectrometer-OceanOptics_USB4000%27)~version!%271%27)*5%20.!false3source!5%5Cn6%20S%01653.* Tree] | |||
'''Explanation''' | |||
A [[Switch]] module controls a rotation stage (e.g. a stage from Zaber or an Arduino controlled stepper motor) and sweeps angles from -90 to 90 around the light source. At the same time, an [[SMU]] drives the light source with a constant current and a spectrometer acquires the spectrum at each point. | |||
== Sensitive EQE measurements == | |||
'''Task''' | |||
Measuring external quantum efficiency of solar cells or photo detectors | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── Switch - Lamp | |||
└── Switch - Optical chopper | |||
└── Monochromator | |||
└── Switch - Filter wheel | |||
└── Switch - Current amplifier | |||
└── LockIn | |||
└── LockIn | |||
└── CustomFunction | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath2~trailingSlash2~rootDot2)~5(%275%27MakeFile4.Lamp4*.Optical%20chopper0Monochromator0.Filter%20wheel0*.Current%20amplifier03%200*306**CustomFunction07%27)~version!%271%27)7%20.*Switch%20-%200462!false36LockIn4%5Cn5source!6***7*%20%017654320.* Tree] | |||
'''Explanation''' | |||
A module [[Switch]] is used to load a driver for controlling a lamp power supply and another one for controlling an optical chopper. A [[Monochromator]] module makes a wavelength variation defined in the Sweep editor of this module. At each wavelength, the wavelength is handed over to a Switch module that connects to a filter wheel in order to change filters such that second harmonics are reduced. A further Switch module controls a current amplifier. Two [[LockIn]] modules are used to measure the signal at the sample and at the same time at a reference to be able to automatically calculate important parameters such as EQE with a CustomFunction module that is running an individual evaluation script. | |||
== Device lifetime and material degradation characterization == | |||
'''Task''' | |||
Measure device lifetime and material temperature, humidity dependent characterization | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
Loop # loop which is set to run endlessly | |||
└── Condition # condition to break the measurement loop e.g. after one month | |||
└── Delay # a delay ensures a certain time gap between each data point | |||
└── MakeFile # MakeFile here only saves the data of the modules below it | |||
└── Temperature-BELEKTRONIG_BTC-LAB # Peltier element temperature controller | |||
└── Logger-RaspberryPi-Pico # an MCU as a simple DAQ | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27optiWs!(%27fancy!true~fullPath8~trailingSlash8~rootDot8)~q(%27q%27Loop**2looZwhich%20i5set9o%20ru0endlessly%5C0CWditiW*2cWditio0to%20break9h3measurement%20looZe.g.zftJ%20W3mWth4Delay*26delayxnsure56cJtai0tim3gaZbetwee0each%20dat6point4Ve2HavingV3hJ3Wly%20save5th3dat6of9h3module5below%20itjTXe-BELEKTRONIG_BTC-LAB*7PeltiJxlement9X3cWtrollJj%20LoggJ-RaspbJryPi-Pico*Y7a0MCUz56simpl3DAQ%27)~vJsiW!%271%27)*YY0n%202****73e%204%5C0%205s%206a%207%23%208!false9%20tJerV%20MakeFilWonXempJaturY%5CtZp%20j4%20%20qsource!x%20ez%20a%01zxqjZYXWVJ987654320* Tree] | |||
'''Explanation''' | |||
SweepMe! not only suits short-time measurements, but also measurements that can last for weeks and months! You can integrate SweepMe! into your lifetime and degradation setups. In the comments of the Sequencer section above, the purpose of each module is explained. | |||
== Wafer prober tests and measurements == | |||
'''Task''' | |||
In semiconductor industry, it's sometimes the case that the test and automation engineer design a measurement routine quickly and apply different measurements for each die on a wafer. | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile # generate a txt file to save the data | |||
└── ReadValues # read wafer map and measurement flags from an Excel file | |||
└── WaferProber-SENTIO # wafer prober modules sweeps through a wafer map, defined either by the Excel file or the prober native software | |||
└── Switch-Keithley_707B # this module activates required eletrical probes for each measurement | |||
├── Condition # example measurement routine one | |||
│ └── SMU-Keithley_4200-SCS | |||
│ └── SMU-Keithley_4200-SCS | |||
├── Condition # example measurement routine two | |||
│ └── Temperature-Eurotherm_350x | |||
│ └── SMU-Keithley_4200-SCS | |||
│ └── SMU-Keithley_4200-SCS | |||
└── Condition # example measurement routine three | |||
└── SMU-Keithley_4200-SCS | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPaZj~trailingSlashj~rootDotj)~source!(%27source!%27MakeFileAAAAQQ9generatGa%20txtYilGto%20savGZGdata%5Cn%20ReadValuesAAA**Q9readz%20and%20LYlagsYrom%20an%20ExcelYile8WaferProber-SENTIOAA*9wafeJprobeJmodules%20sweeps%20Zrough%20az%2C%20defined%20eiZeJby%20ZGExcelYilGoJZGprobeJnativGsoftwareQ8%20Switch-KeiZley_707BAAQ%23%20Zis%20modulGactivates%20required%20eletrical%20probesYoJeach%20LHA.one8X68**6H*X.two8XTemperature-EuroZerm_350x8**68*X6*XHA.Zree8X688%208%27)~version!%271%27)X%20.9examplGL%20routinG6SMU-KeiZley_4200-SCS8%5Cn*9QQ%23%20A***Ge%20H8*ConditionAAJr%20LmeasurementQ%5CtX*%20Y%20fZthj!falsez%20wafeJmap%01zjZYXQLJHGA986.* Tree] | |||
'''Explanation''' | |||
This example consists of three branches and the first three modules are shared among all of them. The user needs to set the initial parameters of the wafer prober with the native software or on the machine itself. Then one can define the wafer chip die positions or index and different measurement routine flags in an Excel file and read it by putting the add-on module [[ReadValues]] in the [[Sequencer]]. SweepMe!'s [[WaferProber]] module interfaces with the prober machines and sweeps through the wafer map given by the Excel file or by the native software. At each die, a series of [[Condition]] modules check for the measurement flags defined in the Excel file and run the appropriate measurement for the specified die. | |||
== Vacuum thin film deposition == | |||
'''Task''' | |||
Make a fully automated and controlled sample fabrication system through Physical Vapor deposition (PVD) by thermal evaporation | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
MakeFile | |||
└── Delay # define an interval | |||
└── Logger-Leybold_CombivacCM31 # UHV pressure meter | |||
└── Logger-Inficon-SQM-160 # two-channel QCM deposition rate monitor | |||
└── CustomFunction-Smoothing_Savitzky-Golay # smoothing filter for the matrix deposition rate | |||
└── CustomFunction-Smoothing_Savitzky-Golay # smoothing filter for the dopant deposition rate | |||
└── Switch-Yoctopuce_Yocto-Relay # pneumatic shutter | |||
├── Loop # pre-heating to slightly below the evaporation temperatures | |||
│ └── Temperature-Eurotherm-22xx # temperature controller for matrix crucible | |||
│ └── Temperature-Eurotherm-22xx # temperature controller for dopant crucible | |||
│ └── Condition # exit the loop when the temperatures are reached | |||
├── Loop # waiting loop to guaranty ultra-high vacuum | |||
│ └── Condition # exit the loop if UHV is met | |||
├── Loop # stabilization loop (with more aggressive PID parameters) | |||
│ └── PID # PID module to stabilize the matrix rate | |||
│ └── PID # PID module to stabilize the dopant rate | |||
│ └── Temperature-Eurotherm-22xx # read temperature and apply power to matrix crucible | |||
│ └── Temperature-Eurotherm-22xx # read temperature and apply power to dopant crucible | |||
│ └── Condition # open the shutter at the right deposition rate and exit the loop | |||
└── Loop # deposition loop (with more robust PID parameters) | |||
└── PID # PID module to keep the matrix rate stable | |||
└── PID # PID module to keep the dopant rate stable | |||
└── Temperature-Eurotherm-22xx # read temperature and apply power to matrix crucible | |||
└── Temperature-Eurotherm-22xx # read temperature and apply power to dopant crucible | |||
└── Condition # stop the measurement when a desired thickness is deposited | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27options!(%27fancy!true~fullPath!false~trailingSlash!false~rootDot!false)~source!(%27source!%27MakeFile%5Cn%20Delay......%3Ddefine%20an%20interval%5CnBLogger-Leybold_CombivacCM31N*B..*%208UHV%20pressure%20meter9Logger-Inficon-SQM-160N***%3Dtwo-channel%20QCMK%20monitor9%20X%5Ct%22qK9BX%22%2CK9*Switch-Yoctopuce_Yocto-RelayN%20%5Ct8pneumatic%20shutterWpre-heating%2Bslightly%20below7evaporation%20tOs9*B5..%24qA5.%5Ct%24%2CA%20%25N%20.8%2F%20when7tOs%20are%20reachedWwaiting%20loop%2Bguaranty%20ultra-high%20vacuum%209*B%25....8%2F%20if%20UHV%20is%20metW%3BaZaggressivejN**%20J%3Be7q%269**PIDNN*J%3Be7%2C%269**%205**4qAB5B4%2CA*%25N8open7shutter%20at7rightK%20and%20%2FWdeposiZrobustjN**%20Jkeep7q%3APIDNN*Jkeep7%2C%3A%205**4qAB5B4%2CA*%25%20..8stop7measurement%20when%20a%20desired%20thickness%20is%3Ced9%209%5CnB%27)~version!%271%27)*B%20.%5Ct%5Ct48read%20tO%20and%20apply%20power%2B5TO-Eurotherm-22xx7%20the%208%23%209%5Cn*A%20crucible9**B%20%20J8PID%20module%2BK%3Cion%26N*****OemperatureW9*%20Loop.....8XCustomFunction-Smoothing_Savitzky-Golay**.Ztion%20loop%20%7Bwith%20more%20j%20PID%20parameters%7D9*BPIDNqmatrix%228smoothing%20filter%20for7%248tO%20controller%20for%20%25Condition%26%20rate%2B%20to%20%2Cdopant%2Fexit7loop%3A%26%20stable9**%3Bstabiliz%3C%20deposit%3D.%5Ct*%208%01%3D%3C%3B%3A%2F%2C%2B%26%25%24%22qjZXWONKJBA98754.* Tree] | |||
'''Explanation''' | |||
With SweepMe! you have all you need for a quick, yet powerful thin-film fabrication with PVD by thermal evaporation. For this you need to boost your SweepMe! with its [[Add-On Modules]] like [[PID]], [[Condition]], and [[CustomFunction]]. It's not even required to manually tune the PID parameters; instead, one can use PID module's autotuning feature. | |||
== Optimization or alignment routine == | |||
'''Task''' | |||
Change a position e.g. of a motor until some signal is optimized | |||
'''Sequencer''' | |||
{{syntaxhighlight|lang=python|code= | |||
Loop - nonstop | |||
└── Switch - Motor | |||
└── Logger - Sensor | |||
└── CustomFunction | |||
└── Condition | |||
}} | |||
[https://tree.nathanfriend.io/?s=(%27opt3s!(%27fancy!true~fullPath2~trailingSlash2~rootDot2)~4(%274%27Loop0nonstop.*Switch0Motor5Logger0Sensor5*CustomFunct35*6Condit3.%20%27)~vers3!%271%27)6%20.%5Cn0%20-%202!false3ion4source!5.**6*%20%01654320.* Tree] | |||
'''Explanation''' | |||
Such an optimization routine can be done in an branch that is just dedicated to the alignment task. Such a branch can be, for example, added before the branch at which the final measurement should run. The idea is to use [[Loop]] module that run nonstop. A [[CustomFunction]] module returns at each iteration of the sequencer flow a new value that is used by the [[Switch]] module as sweep value for the motor position. The signal of the sensor measured with a [[Logger]] module is handed over again to the CustomFunction script that saves the history and further returns a boolean flag (True or False) that is used by the [[Condition]] module to decide whether the alignment branch is skipped and the next branch can continue. This is way it also possible to create CustomFunction script that first runs a coarse scan over the possible range of positions and later a more fine-grained scan to e.g. find a maximum or minimum of the signal. | |||
Once the optimum position is found and calculated, the CustomFunction script could return this position to the move the motor there and once the motor has arrived, the boolean flag can be changed to proceed with the next branch of the sequencer, e.g. to perform a certain measurement at this position. |
Latest revision as of 18:20, 18 April 2024
SweepMe! can be used for sheer number of academic and industrial measurements and processes, from a simple reading of a temperature sensor to device fabrication by physical vapor deposition in a vacuum chamber. A few example use-cases are presented in this article. However, the possibilities are indeed unlimited! As the retired NASA astronaut Ron Garan once said, “We are limited only by our imagination and our will to act”.
For each use-case, a self-explanatory example Sequencer is given, with a short explanation. One can configure the Modules by double-clicking on them in the Sequencer window. In this article, the Sequencer is depicted with the free online ASCII tree-generator tool Tree.
Current-voltage characteristics
Task
Acquire an IV curve of a two-terminal device, such as an LED, a solar cell, a photodetectors, or a sensor.
Sequencer
MakeFile
└── SMU - Keithley 2400
Explanation
One SMU module is all you need for a quick and simple current-voltage curve of a semiconductor device. Don't forget to configure the Sweep editor that comes with the SMU module to define your voltage or current sweep.
Transistor measurement
Task
Acquire IV characteristics of a transistor, e.g. output characteristics or transfer characteristics.
Sequencer
SMU - Keithley 4200-SCS
└── MakeFile
└── SMU - Keithley 4200-SCS
Explanation The upper SMU module makes voltage sweep, e.g. to vary the gate voltage. The lower SMU module is performing its variation for each higher variation. So, if it is performing a drain voltage variation, one finally gets output characteristics as for each gate voltage of the upper SMU a drain variation of the lower SMU is done. If you swap the SMU modules regarding gate and drain variation, one can measure transfer characteristics for a number of drain voltages.
Joint base/gate and collector/drain transistor sweep
Task
Acquire an IV characteristics of a transistor by simultaneously sweeping the voltage at gate (or base) and drain (or collector) with a constant offset.
Sequencer
MakeFile
└── SMU drain
└── Calc
└── SMU gate
Explanation Sometimes, the drain voltage and the gate voltage need to be ramped up at the same time. In this case, one SMU module must follow the voltage of another module. To achieve this, the module SMU drain will perform in this example the main voltage variation, e.g. from 0.5 V to 1.5 V. Now, a module Calc is inserted between the SMU modules to calculate a new sweep value for SMU gate. Here, it is important that the Calc module uses the "Sweep value of SMU drain" so that the calculation is done based on the sweep value of SMU drain and not the measured value of the voltage (which would be known to late). The Sweep value of the SMU gate then needs to be the result of the Calc module instead of the Sweep editor that is normally used as default.
Current/voltage/resistance transients
Task
Measure current, voltage, or resistance over time with a given time distance between the points
Sequencer
MakeFile
└── Loop
└── SMU - Keithley_2400
└── Delay
Explanation
The SMU module will be configured to measure exactly one point. This can be done in the Sweep editor by using the same value for start and end. Thus, the SMU performs a "sweep" over one value, i.e. it stays at a constant voltage or current. Whether the SMU is sourcing voltage or current can be adjusted with the Sweep mode in the Setup tab of the SMU module. Further, one can select 'Resistance' and/or 'Conductance' in the post-processing section of the module. To now repeat the measurement, a Loop module is added to the same branch. It can be configured by double-click to run for a given number of points or infinite (using 0). To have a given time between the measurement points, the module "Delay" is used. Double-click it and enter the number of seconds. The module will make sure that the next point is not started before the given time has passed since the start of the previous measurement point. If you for example use a delay of 1 s and a loop of 1000, your measurement will run 1000 s. The MakeFile module defines how often new files are created. As it is the topmost module, only one data file is created in which all data is saved.
Frequency dependent capacitance-voltage measurements
Task
Measure the capacitance vs. voltage bias for a set of constant frequencies
Sequencer
Sweep
└── MakeFile
└── LCRmeter
Explanation
To measure impedance and capacitance, the [LCRmeter] module is used that can load instrument drivers for various impedance analyzers and LCR meters. The LCRmeter module has a Sweep and a Step section. The Sweep of the module is configured to make voltage bias variation and the sweep editor that comes with the module can be selected as Sweep value and thus used to create the voltages scan. The Step section of the LCRmeter module can be used to define now the frequencies at which the CV scan should be done. Here, you can select Frequency as the Step mode. The Step value cannot come anymore from the Sweep editor that belongs to the LCRmeter module because it is already used for defining the voltages. This is why a module "Sweep" is added above the LCRmeter according to the above Sequencer scheme. The module "Sweep" can be used to define arbitrary value variations. It is now configured to make a variation over the desired frequencies. To handover the frequency values of the "Sweep" module to the LCRmeter module, the Step value of the LCRmeter is set to the value of the "Sweep" module. Because the LCRmeter module is nested into the "Sweep" module, the voltage variation of the LCRmeter module is performed for each variation of the "Sweep" module. To get a new data file for each iteration of the "Sweep" module, a MakeFile module can be placed between "Sweep" and LCRmeter.
Battery charging & discharging tests
Task
Measure accelerated battery capacity test
Sequencer
MakeFile
└── Loop1
└── SMU - Rohde&Schwarz NGx series
└── Loop2
└── Logger - Temperature sensor
└── Delay
└── Condition
Explanation
An SMU module applies a number of fixed voltages to the battery and reads the current flow. The Loop2 module make sure that each voltage is read out multiple times with time spacing as given by the Delay module. The higher Loop1 module allows to repeat the entire voltage variation to make lifetime test, e.g. of charging and discharging cycles. The Condition module can be used to stop the measurement when a certain criteria is reached. Of course, further modules can be adeded. For example, a temperature sensor could be helpful to log the batteries temperature at each step.
Sensor monitoring system
Task
Make a simple data acquisition and monitoring system for sensors and actuators of a lab or building
Sequencer
MakeFile
└── Loop
└── Logger - Arduino_DHTxx
└── MQTT
└── Delay
Explanation
A microcontroller board like Arduino can come in handy as an interface between sensors and computers. There are different SweepMe! drivers accompanied with Arduino .ino sketch files to read common sensors. In the example below, a DHT temperature and relative humidity sensor is read with the Logger-Arduino_DHTxx driver in a certain interval, defined by delay. The data then is published with popular IoT protocol MQTT over the local network. For more information, please refer to Arduino Driver guide and MQTT articles.
Angle dependent spectra
Task
Measure angular-dependent spectra of a light sources like OLED or LED
Sequencer
MakeFile
└── Switch - Rotation stage
└── SMU - Keithey 2400
└── Spectrometer - OceanOptics USB4000
Explanation
A Switch module controls a rotation stage (e.g. a stage from Zaber or an Arduino controlled stepper motor) and sweeps angles from -90 to 90 around the light source. At the same time, an SMU drives the light source with a constant current and a spectrometer acquires the spectrum at each point.
Sensitive EQE measurements
Task
Measuring external quantum efficiency of solar cells or photo detectors
Sequencer
MakeFile
└── Switch - Lamp
└── Switch - Optical chopper
└── Monochromator
└── Switch - Filter wheel
└── Switch - Current amplifier
└── LockIn
└── LockIn
└── CustomFunction
Explanation
A module Switch is used to load a driver for controlling a lamp power supply and another one for controlling an optical chopper. A Monochromator module makes a wavelength variation defined in the Sweep editor of this module. At each wavelength, the wavelength is handed over to a Switch module that connects to a filter wheel in order to change filters such that second harmonics are reduced. A further Switch module controls a current amplifier. Two LockIn modules are used to measure the signal at the sample and at the same time at a reference to be able to automatically calculate important parameters such as EQE with a CustomFunction module that is running an individual evaluation script.
Device lifetime and material degradation characterization
Task
Measure device lifetime and material temperature, humidity dependent characterization
Sequencer
Loop # loop which is set to run endlessly
└── Condition # condition to break the measurement loop e.g. after one month
└── Delay # a delay ensures a certain time gap between each data point
└── MakeFile # MakeFile here only saves the data of the modules below it
└── Temperature-BELEKTRONIG_BTC-LAB # Peltier element temperature controller
└── Logger-RaspberryPi-Pico # an MCU as a simple DAQ
Explanation
SweepMe! not only suits short-time measurements, but also measurements that can last for weeks and months! You can integrate SweepMe! into your lifetime and degradation setups. In the comments of the Sequencer section above, the purpose of each module is explained.
Wafer prober tests and measurements
Task
In semiconductor industry, it's sometimes the case that the test and automation engineer design a measurement routine quickly and apply different measurements for each die on a wafer.
Sequencer
MakeFile # generate a txt file to save the data
└── ReadValues # read wafer map and measurement flags from an Excel file
└── WaferProber-SENTIO # wafer prober modules sweeps through a wafer map, defined either by the Excel file or the prober native software
└── Switch-Keithley_707B # this module activates required eletrical probes for each measurement
├── Condition # example measurement routine one
│ └── SMU-Keithley_4200-SCS
│ └── SMU-Keithley_4200-SCS
├── Condition # example measurement routine two
│ └── Temperature-Eurotherm_350x
│ └── SMU-Keithley_4200-SCS
│ └── SMU-Keithley_4200-SCS
└── Condition # example measurement routine three
└── SMU-Keithley_4200-SCS
Explanation
This example consists of three branches and the first three modules are shared among all of them. The user needs to set the initial parameters of the wafer prober with the native software or on the machine itself. Then one can define the wafer chip die positions or index and different measurement routine flags in an Excel file and read it by putting the add-on module ReadValues in the Sequencer. SweepMe!'s WaferProber module interfaces with the prober machines and sweeps through the wafer map given by the Excel file or by the native software. At each die, a series of Condition modules check for the measurement flags defined in the Excel file and run the appropriate measurement for the specified die.
Vacuum thin film deposition
Task
Make a fully automated and controlled sample fabrication system through Physical Vapor deposition (PVD) by thermal evaporation
Sequencer
MakeFile
└── Delay # define an interval
└── Logger-Leybold_CombivacCM31 # UHV pressure meter
└── Logger-Inficon-SQM-160 # two-channel QCM deposition rate monitor
└── CustomFunction-Smoothing_Savitzky-Golay # smoothing filter for the matrix deposition rate
└── CustomFunction-Smoothing_Savitzky-Golay # smoothing filter for the dopant deposition rate
└── Switch-Yoctopuce_Yocto-Relay # pneumatic shutter
├── Loop # pre-heating to slightly below the evaporation temperatures
│ └── Temperature-Eurotherm-22xx # temperature controller for matrix crucible
│ └── Temperature-Eurotherm-22xx # temperature controller for dopant crucible
│ └── Condition # exit the loop when the temperatures are reached
├── Loop # waiting loop to guaranty ultra-high vacuum
│ └── Condition # exit the loop if UHV is met
├── Loop # stabilization loop (with more aggressive PID parameters)
│ └── PID # PID module to stabilize the matrix rate
│ └── PID # PID module to stabilize the dopant rate
│ └── Temperature-Eurotherm-22xx # read temperature and apply power to matrix crucible
│ └── Temperature-Eurotherm-22xx # read temperature and apply power to dopant crucible
│ └── Condition # open the shutter at the right deposition rate and exit the loop
└── Loop # deposition loop (with more robust PID parameters)
└── PID # PID module to keep the matrix rate stable
└── PID # PID module to keep the dopant rate stable
└── Temperature-Eurotherm-22xx # read temperature and apply power to matrix crucible
└── Temperature-Eurotherm-22xx # read temperature and apply power to dopant crucible
└── Condition # stop the measurement when a desired thickness is deposited
Explanation
With SweepMe! you have all you need for a quick, yet powerful thin-film fabrication with PVD by thermal evaporation. For this you need to boost your SweepMe! with its Add-On Modules like PID, Condition, and CustomFunction. It's not even required to manually tune the PID parameters; instead, one can use PID module's autotuning feature.
Optimization or alignment routine
Task
Change a position e.g. of a motor until some signal is optimized
Sequencer
Loop - nonstop
└── Switch - Motor
└── Logger - Sensor
└── CustomFunction
└── Condition
Explanation
Such an optimization routine can be done in an branch that is just dedicated to the alignment task. Such a branch can be, for example, added before the branch at which the final measurement should run. The idea is to use Loop module that run nonstop. A CustomFunction module returns at each iteration of the sequencer flow a new value that is used by the Switch module as sweep value for the motor position. The signal of the sensor measured with a Logger module is handed over again to the CustomFunction script that saves the history and further returns a boolean flag (True or False) that is used by the Condition module to decide whether the alignment branch is skipped and the next branch can continue. This is way it also possible to create CustomFunction script that first runs a coarse scan over the possible range of positions and later a more fine-grained scan to e.g. find a maximum or minimum of the signal. Once the optimum position is found and calculated, the CustomFunction script could return this position to the move the motor there and once the motor has arrived, the boolean flag can be changed to proceed with the next branch of the sequencer, e.g. to perform a certain measurement at this position.