Semiconductor Laboratory














Diode Measurements with a Sourcemeter

This page describes how to use a Keithley 2600 Series Sourcemeter to measure the current-voltage characteristics of a diode. The sourcemeter consists of two source-measurement units (SMUs). Each SMU can source a voltage and measure a current or source a current and measure a voltage. Connect one side of the diode to the Hi terminal of an SMU and the other side to a Lo terminal of the same SMU. We will use a Python program to execute a loop where in each step of the loop the sourcemeter will source a voltage across the diode and then measure the current through the diode. The data that is collected will then be plotted using the package matplotlib.

Download the Python script and the Python library Keithley 2600 Python library and save them in your directory.

In the script,, first the source meter is initialized and then the voltage and current limits are set. Read the data sheet of the diode you are measuring to find out what currents and voltages it can tolerate. For the example measurements we used a BZY97C18 Zener diode. In the BZY97C18 data sheet it specifies that the diode can tolerate a maximum current of 66 mA.

A For-loop is defined in the script which sets the voltage across the diode using the 'smu.set_voltage()' command and then the voltage across the diode and the current through the diode are measured with the 'smu.measure_current_and_voltage()' command. Review the script and then run it. It should print out the datapoints and make a plot. An example current-voltage characteristic for a BZY97C18 Zener diode is shown below. There is a sharp increase in the current for forward bias voltages and an abrupt breakdown at -18.2 V in reverse bias.

The code steps the voltage from -20 V to +20 V but the sourcemeter will not apply a voltage that will cause the current to be higher than the current limit that was set.

For analysis later, it would be convenient to save the data. We will add some code that automatically saves the data in a text file and automatically transfers the data and the measurement script to ElabFTW (as TU Graz or KFU Graz student, you have an account). This code appends the time to the file name so that each measurment is saved in a separate file. Make a new directory and download the file '' into it. Download the library, place it in your directory, and quickly adjust the library to your token as described here. Copy the Keithley 2600 Python library into this directory as well. Open the file, '' and find the line where the file names are defined and replace (your directory) with the name of the directory where the files should be saved.

There are three interesting regimes of this diode curve.

  1. The forward bias regime where the current increases exponentially with current.
  2. The reverse blocking regime where very little current flows.
  3. The reverse breakdown regime where diode abruptly conducts in reverse bias.

Forward bias regime
In the forward bias regime we expect that the current to obey the diode formula,

$$I = I_S\left(\exp\left(\frac{eV}{\eta k_BT}\right) - 1\right)\hspace{0.5cm}\text{[A]}.$$

Here \(I\) is the current, \(I_S\) is the saturation current, \(e\) is the elementary charge, \(V\) is the voltage, \(k_B\) is Boltzmann's constant, \(T\) is the absolute temperature, and \(\eta\) is the non-ideality factor which is usually between 1 and 2.

In the forward bias regime it is common to plot the logarithm of the current vs. voltage. Save the Python script with a different name and modify it to sweep the voltage from -1 V to 1 V. The sweep_step should be decreased to about 0.01 so that enough data is collected in this voltage range. Make a semilogarithmic plot \(\log (I) \) vs. \(|V|\) as shown below.

For larger positive voltages, the plot should be a straight line where the slope is \(\frac{e}{\eta k_BT}\) and the intercept is \(\log (I_S) \). It will be necessary to record the data for different current ranges. A current range of 100 mA will not measure the small currents near \(V=0\) accurately. Below is a plot of \(\log (I) \) vs. \(V\) for different current ranges. Note that the larger current ranges give inacurate reading for low currents.

A program that reads the csv data files and plots \(\log (I)\) vs. \(V\) to make a plot like this is shown below.

You can adjust the plot ranges to exclude the data that is taken where the current range is set poorly. An example of an adjusted plot is shown below.

A plot of \(\log (I) \) vs. \(|V|\) over a wider voltage range that included the breakdown voltage is shown below.

Focusing on the region near breakdown shows a distinct change in the behavior of the current at \(V=18.3\,\text{V}\).