# Design Question: Precision Current Source

I am attempting to design a voltage-controlled bidirectional current source that will drive an inductive load. The current source needs a range of 100uA to 200mA, and it needs to work with precision of about 100uA at lower load currents, with lower precision acceptable at higher load currents. It needs to be able to output sinusoidal, (approximate) traingle and (approximate) square waves over frequencies from 1Hz to 1kHz (I understand I'm driving an inductor so perfect square and triangle waves are impossible), and ideally with as low an operating voltage as possible, as the system will be battery-powered.

Here is what I have tried so far:

I tried designing this circuit I designed based on instrumentation amplifier feedback, but it's unstable and oscillates at around 130kHz. I considered using the circuit below from this TI document, but it introduces excessive series resistance with the load and does not have easily-adjustable current precision.

For the same reasons I've decided against using an op-amp with the load in the feedback loop. Does anyone have suggestions?

In case you're curious, this is the load, a Helmholtz coil I 3D-printed and wound which will be acting as a magnetic field generator.

• Why not something like this: cdn.instructables.com/FM3/2YUC/HEXSMPM1/…? It will need some protection diodes. I don't know how it would work with an inductor as load. Or you could use a buck converter, and control the current. Commented Sep 29, 2016 at 19:27
• Do you want the circuit to spontaneously on its own generate the triangle and square wave or will you feed it with a function generator? Commented Sep 29, 2016 at 19:33
• I will be feeding the signal in from a DDS to the circuit. @user110971 because that only allows current to flow through the load in one direction, and I need it to flow in both directions. Commented Sep 29, 2016 at 20:17
• @Jordan Use the NPC (neutral point clamped) topology. Two bucks, one for each side, and two switches to change the bucks when crossing the 0 point. That is what is used for inverters in certain power systems. Commented Sep 29, 2016 at 20:22
• If the bucks have synchronous rectifiers (and can therefore sink current too) user110971 has the most efficient answer (@200mA). Commented Sep 29, 2016 at 20:29

You can put the load in the feedback signal of a power amplifier in the obvious manner, but add an R-C Zobel network (aka Boucherot cell) across the load or to ground in order to stabilize the amplifier at higher frequencies.

in order to get 200mA drive , your Op Amp needs complementary emitter followers with high Hfe inside the feedback loop on the output. then allow for Vce drop of at least 1.5V or 2V for high Hfe from supply rails, so you need a bigger Vcc,Ve such as +/-6V minimum.

or if you have access to your ATX supply. just change the cap value series R to make RC=1/(2f) for pot range.

Note equal pull-up/down on emitter is the driver bias and equal to 5V/2 same as 5V clock

Your original idea works, you are just going to have to spend some time tweaking it.

simulate this circuit – Schematic created using CircuitLab

The idea is that C1 and R2 create a low pass filter to limit the bandwidth of OA1 so it isn't the same as IA1, as this talks a little bit about. R3 makes the load resistance for OA1 just a little more, though you will eventually need to make the output of OA1 drive a transistor or FET push-pull stage to get the current you want, and that won't be necessary anymore.

I recommend you screw around with LTSpice, here is a small simulation that I put together. Some of the things you will need to do:

• Figure out how to increase the current output. There are two ways to do this:

• Use a power op-amp for OA1 that can source and sink 200mA.
• Drive a MOSFET or BJT totem pole buffer (aka push-pull buffer). See this question and the corresponding answers for more information.
• Right now, this only works for ~ +/- .5V driving load, which gives +/- 9/10mA. Figuring out how R1/R2/R3 play with the overall gain of the circuit is something you are going to have to work on.