OpAmp based voltage controllable current source
19 Aug 2022 - tsp
Last update 19 Aug 2022
7 mins
This is another article thatās basically a note to myself to keep that information around.
This circuit is well known all around the Internet so thereās nothing new.
Introduction
So one often requires a voltage controllable current source - for example
when one builds a power supply, drives coils for some nuclear magnetic resonance (NMR)
or electron spin resonance (ESR) experiments or tries to build magneto optical
traps for cold atoms - or just in case one requires a controlled lab power supply - there
are zillions of possible applications.
A really nice way to drive such systems up to a few Amps is the usage of operational
amplifiers such as the OPA549 by Texas
Instruments thatās capable of driving voltages up to $\pm 30V$ and continuous currents
up to $8A$ (peak currents up to $10A$). Those devices are really great even though
a little bit costly. They are commonly available at most electronics distributors at
prices between 15 and 20 Eur per piece.
So now one could simply build a voltage to current converter by attaching the load
to the amplifiers output (donāt forget flyback diodes of course - not shown in the drawing
below), pass the current over a small $1 \Omega$ sense resistor and use the voltage
drop over the sense resistor as one input to oneās operational amplifier. The other
side could then be exposed to the analog control voltage and thus in theory one
would have a 1:1 voltage to current conversion (i.e. inputting 2V would lead to an output
of 2A).

This might be sufficient for many simple applications that have no major problems with
drifts in current. The main problem is that the output current depends on the value
of the sense resistor - a drift that occurs for example due to thermal load. Since the whole
output current flows over the sense resistor this can be a rather large drift that might
be unacceptable for sensitive applications.
Luckily there is a solution that uses just some small fraction of the output current
thatās parasitically taken from the OpAmp that one can use in the feedback loop as
well as a topology for a feedback network that also compensates for thermal drift
inside the resistors used in the feedback loop - I came across this type of feedback loop
when I saw this design from an analog magician at work (and found similar implementations
later on online).

The idea is pretty simple - the output of the OpAmp drives the load via a resistor $R_5$ that
also controls the gain of the circuit. The feedback is routed through a parallel branch to
the load circuit thatās formed by $R_3$ and $R_4$. The second feedback loop is formed by $R_1$
and $R_2$ as well as the control voltage. To compensate for thermal drift inside the feedback
paths the circuit is designed symmetrically:
- $R_1 = R_4$
- $R_2 = R_3$
- $R_4 \mid R_3Ā Ā» R_5 \mid R_3$
The reason for the last requirement will be obvious when one looks at the equations. Since the
feedback paths are designed equally one will see that the feedback currents are equal - thus
all resistors will heat up the same way (up to manufacturing differences). One should select
high precision resistors for those paths of course. One will also see from the equations that
the exact value of the resistors is not relevant - they should just be chosen way larger than
the load resistor due to the current distribution between the two paths but one of course also
has to think about the thermal noise that is increased with temperature (recall Johnson-Nyquist
noise of an Ohmic resistor that as a root mean square of $\sqrt{4 k_B T R \Delta f}$ at a given
bandwidth $f$. As one can see this scales with $\sqrt{T}$ and $\sqrt{R}$ thus temperature change
has to be kept low by large resistance but on the other hand an increase in resistance will also
introduce noise into the circuit). Usually one uses a few tens of $k\Omega$ for these resistors.
Circuit analysis
To understand and model the OpAmp one has to recall that an OpAmp tries to keep both of itās inputs
equal when one supplies a proper feedback network - so it tries to achieve $U_{+} = U_{-}$.
The OpAmp tried to drive $U_{+} = U_{-}$. In case the voltage divider is symmetric one can
assume that $U_5 = U_{in}$. This can be seen easily when looking at the voltage loop formed by
the feedback network and the voltage input via the ground connection. Thus one can directly
express the current over the resistor $R_5$ in dependence of the input voltage $U_{in}$:
[
U_5 = U_{in} \\
I_5 = \frac{U_5}{R_5} = \frac{U_{in}}{R_5}
]
The current $I_5$ is composed of the large load current and the feedback current in the non
inverted feedback loop:
[
I_5 = I_{FB+} + I_L
]
The current over the inverted feedback loop is determined by the potential difference between
the amplifiers output $U_{op}$, the input voltage $U_{in}$ and the resistors $R_1$ and $R_2$:
[
I_{fb-} = \frac{U_{op} - U_{in}}{R_2 + R_1}
]
Now one can look into the non inverted feedback loop. The current over resistors $R_3$
and $R_4$ can be determined when one recalls that the current over $R_5$ has to be equal
to $U_{in}$:
[
I_{fb+} = \frac{U_{op} - U_{in}}{R_4 + R_3}
]
When one recalls that we assume or require that $R_4 = R_1$ and $R_3 = R_2$ one can see
that both feedback currents are equal:
[
I_{fb+} = \frac{U_{op} - U_{in}}{R_1 + R_2} = I_{fb-} \\
I_{fb+} = I_{fb-} = I_{fb}
]
Now one can recall that the current $I_5$ is composed of load current and feedback current:
[
I_5 = I_L + I_{fb} \\
\to I_L = I_5 - I_{fb} \\
I_L = \frac{U_{in}}{R_5} - I_{fb}
]
The last step is to recall that the operational amplifier tries to drive $U_{+} = U_{-}$,
i.e. it tries to drive the potential difference between its inputs to zero. The
voltages are only determined by the feedback resistors $R_2$ and $R_4$:
[
U_{-} = U_{op} - R_2 * I_{fb-} \\
U_{+} = U_{op} - U_{in} - R_3 I_{fb+} \\
\to U_{-} + U_{+} = 0\\
U_{op} - R_2 * I_{fb-} = U_{op} + U_{in} + R_3 I_{fb+} \\
U_{in} = (- R_2 - R_3) * I_{fb}
I_{fb} = -\frac{U_{in}}{R_2 + R_3}
]
Inserting into the equation for $I_L$:
[
I_L = \frac{U_{in}}{R_5} + \frac{U_{in}}{R_2 + R_3} \\
I_L = U_{in} (\frac{1}{R_5} + \frac{1}{2 R_2})
]
As one can see there is a direct relation between the load current $I_L$ and the input
voltage $U_{in}$ thatās independent of the load resistance $R_L$. It depends on the
resistor $R_5$ (and thus itās thermal drift) though.
The constant factor is composed of two terms, the main component being $\frac{1}{R_5}$.
The second term $\frac{1}{2 R_2}$ is usually pretty small - when one uses $20 k\Omega$ for
all four resistors in the feedback network this should be around $10^{-5}$ in comparison
to the factor $\approx 1$ or larger usually used at $R_5$ (remember that this resistor
should be near unity or smaller since the whole load current flows through this resistor
and might generate massive amounts of heat). In case one uses smaller resistors such
as $1 m\Omega$ on can decrease the thermal load, thermal energy loss but also requires
more fine grained control over the input voltage. Thus one can approximate:
[
I_L \approx U_{in} \frac{1}{R_5}
]
This article is tagged: Tutorial, DIY, Electronics, Physics, Basics, Measurements, OpAmp