A low-cost VI Plotter

I’m currently working on a project that uses custom made LEDs emitting at an unusual wavelength. One of the most important characteristics is the current against voltage curve.

This is hard to measure because the chip is tiny and heats up sufficiently in 25us to make the optical output with 25us pulses significantly lower than it is with 10us pulses.

The obvious way to measure the device is to apply short pulses of increasing voltage and measure the current. And the obvious instrument to use is an SMU (similar to the one being RoadTested on E14 right now).

The voltage and current ranges are no problem (0 -5V and 0 – 250mA) but the pulse width rules out all the SMUs I know of except the Keithley 2601B-PULSE currently listed at £10,900 on Farnell.

The Keithley has 1MHz sampling (for pulses) which is much faster than most other SMUs.

The downside of the Keithley (and other SMUs) is that it has no capability for additional channel recording, when you test an LED it’s really nice if you can measure V, I and light output (a second V channel).

The purpose of this project is to develop a much simpler instrument that can do the IV plotting and additional recording but without the cost and complexity burden of supporting all the classic SMU features.


The basic spec is:

Pulse voltage: 0 – 10V

Max current: 1A

Pulse width: 5us – continuous

Settling time to 1% of final voltage: < 2.5us

16 bit sampling on 4 channels at > 1MHz per channel

In the first instance I shall control V and measure I. The DUT (Device Under Test) connections will not be floating (a major cause of SMU cost) and the output will be unipolar.

A very much simplified schematic shows the crucial elements:




R7 is the current sense resistor. U3 buffers the voltage across R7 and the low end of the DUT (LOAD) and drives one input of the differential amplifier U2.

The other diff amp input is driven via R3 connected to the top end of the load and the source of the N channel MOSFET.

U1 drives the MOSFET to force the voltage across the DUT to be equal to that applied to its positive input (PULSE_IN).

Connecting U2 as a diff amp in the feedback loop of U1 ensures that it is the voltage across the DUT that is forced to match the input pulse and that voltage dropped across the current sense resistor has no effect.

The buffer U3 might not be needed when the sense resistor is 2 ohms but in the practical circuit R7 is switched in decade steps between 2 and 2000 ohms.

OPA192 amplifiers are used for U1, U2 and U3, and are just about fast enough. A faster amplifier  for U1 could possibly improve performance.

A -5V supply is used so that a definite bias current of 50mA flows through the MOSFET at zero output volts. Without this bias current the MOSFET gate would settle to very close to zero volts for zero output but with the bias current it settles at about 3.9V. This means that U1 is already holding the MOSFET on the threshold of conduction when the pulse starts and saves it at least 0.4us of switch on time.

A 20V supply is required to be sure to get 10V into the load at 1A (2V will be dropped across R7) so the source follower configuration of M1 will need about 17V of gate drive.



I’ve built the analogue sections of the plotter on a prototype PCB which I’ll drive with the board developed for my frequency response analyser.

The prototype schematic looks like this:



Part numbers on the full schematic don’t match the simplified version.

U4 buffers the DC voltage from the control board which will determine the pulse height. SW1 is  a fast analogue switch which is controlled by a logic level pulse from the control board  - the output of SW1 is pulses with an amplitude set by the control board and with fast rise and fall times. The filter made by R4, R5, C1 and C2 shapes the pulse to give the amplifier an easier life.

RL1 allows the controller to select 10V or 300mV max pulse height ranges. The FRA based controller has only a 12 bit DAC so the two voltage ranges will have setting resolution of 2.4mV or 73uV.

The three amplifier and one MOSFET pulse driver has been described already. The main difference in the practical circuit is that the current sense resistor is selected by 4 relays. The complicated contact arrangement is intended to avoid relay contact resistance induced voltage drops being included in the voltage feedback path to U2. On the other hand to avoid contact resistances appearing in the current measuring path different contacts route the sense voltage to U5, which buffers the current sense voltage. U6 can optionally provide gain of 10.

The full-scale measuring range of the FRA analogue input is about +/- 2.5V using a 16-bit converter, so the current measuring range is from 1.25A full scale to 125uA full scale. The resolution is 38uA on the 1.25A range and 3.8nA on the 125uA scale.  Actual working resolutions will be affected by noise and offsets.

A combination of passive attenuation (R28 – 30), RL7 and another x10 amplifier (U6) allow for full scale voltage ranges of 10, 3.16 and 1V, and voltage resolutions between 0.3mV and 30uV.





So far, I’ve hooked the analogue board up to a variety of power supplies, a pulse generator and a little board capable of controlling the relays.

This has enabled me to do some initial setting up and testing.






In all the scope traces that follow the blue trace is the voltage (on TP1) and the red trace is the current monitor output on TP3.

1.2A pulse into 8.24R load, 2R current sense, relay code = 16


6.65mA pulse, 47R load, current measure amp on, realy code = 49


6.65mA pulse, 47R load, 200R current sense selected, relay code = 5. This is a silly way to set things up but

is interesting since it requires the feedback loop to have again (from pulse in to voltage out) of (200 + 47)/47

rather than the usual gain of about 1. The system runs out gain/bandwidth and takes about 5x longet to settle.



29.7uA pulse, 10k load and 2k current sense resistor, relay code = 3.



There's more to measure (like with inductive and capacitive loads) - but so far it looks OK.


Next thing is to write lots of code for the real processor !