1uA-step CC circuit / DAC with 1mV output and sub-mV offset

I'm creating a circuit that is supposed to output constant current between 1uA and 2mA with 1uA steps. It took me a while to come up with the circuit that does just that (I think).

Of course, there is some other op-amp with microvolt-range offset and I have provided a negative supply for it.

So the idea is that the op amp outputs whatever voltage it needs to equalize inputs, which, in case of 1mV input from DAC would mean 1uA of current through the R1. I can't crank the resistance up because then the op amp will quickly saturate once I try to output anything higher, such as if I want 1mA current, I will already have DAC output 1V, so it's harder for the op amp to provide necessary voltage difference for the load (op amp supplies are +-5V). I'm ok with losing 1V for 1mA (and 2V for 2mA), but change of order of magnitude is out of the question.

While I solved the problem with op amp input offset as well as zero volt output by providing it with charge pump negative supply, DAC 1mV output is an open question: all DACs within a pair of bucks (on mouser) have a zero output of a few millivolts; the least I found was like 1.5mV, I didn't find any DACs that could have microvolt offset for zero output.

Questions/Question-like statements:

1. Is there a way to produce relatively accurate 1mV (I don't care much about superpresicion, if it's 10% off for outputs of a few microamps, I'm ok with it). By that question I also mean if there is any part of reasonable price (<5\$) that can do it? As you can see, DAC output load is simply an op amp input with currents in the range of microamps or even nanoamps.
2. I don't mind changing my circuit. My goal is to produce constant current, if my circuit is garbage, I'm ok with it. So feel free to propose any kind of changes to it.
3. Random idea 1: I can offset DAC voltage to some negative supply, provide it with 4.096V reference offset by the same negative rail (such as -1V). Sounds like a lot of work and many extra components; I would also have to come up with some idea about how to control the DAC now that it wouldn't be referenced to ground anymore. Opinion?
4. Random idea 2: I could actually connect R1 not to the ground but to 1V (or 100mV) to shift the whole outputting circuit up so that my DAC wouldn't have to actually output near-zero. Compensate in software. Sounds like fewer extra components than 3). Also, I will probably be able to drop negative supply for op amp (I'm starting to like this idea more and more as I'm writing it). Opinion?

Of course, if my random idea or your idea of making it happen works well, there is no need to answer 1).

• What is the load? Please add it to the circuit. Commented Sep 3, 2021 at 14:02
• it's unspecified; anything from short circuit to open line
– Ilya
Commented Sep 3, 2021 at 14:02
• Given that you are happy with the op-amp and r1, why not just cut to the chase and specify the accuracy requirements for the voltage represented by DAC1 and the voltage range. Commented Sep 3, 2021 at 15:14
• @Ilya What's the compliance voltage range and do you need 2-quadrant behavior? And how fast are you changing things up? (Also, don't forget about the offset voltage of the opamp! I think this is a more serious flaw of your approach, if nothing else is.)
– jonk
Commented Sep 3, 2021 at 17:58
• if you have any sort of non-resistive load at all, this can be pretty difficult due to the potential for oscillation Commented Sep 3, 2021 at 19:17

3 Answers

Since guaranteed offset error is relatively expensive to purchase, maybe you use a 16 bit DAC and another low Vos op-amp (with an ADC input on your MCU) and auto-zero the output.The ADC does not have to be particularly high resolution or accuracy since you can have a lot of gain in the op-amp and you’re only looking for something like a null.

In practice you’d bias the output op-amp slightly negative and the auto-zero value would thus be realizable for any value of offset the DAC may have. You may also wish to bias the AZ op-amp at the input or output to be within the positive-only ADC range.

Then your accuracy will depend on the ADC resolution and the change in offset since the last AZ calibration.

Your current circuit is generally okay, however in most practical cases we want the load to be grounded. That requires something like an additional transistor.

Comment About Your Approach

A serious problem with your design approach is the offset voltage of the opamp. Let's look at a precision, rail-to-rail I/O, opamp: LT1630/1631. It's offset voltage is $$\V_{_\text{OS}}=525\:\mu\text{V}\$$ (max). That's already more than half of your supposed reference voltage! There will be other sources of error that will pile up in the design. But this is a big one. And this isn't a cheap opamp!

The low noise, precision, rail-to-rail I/O, opamp: LT1677 has $$\V_{_\text{OS}}=60\:\mu\text{V}\$$ (max). It's also not cheap. TI's OPAx197 has $$\V_{_\text{OS}}=100\:\mu\text{V}\$$ (max) and is cheaper. [Be aware that the automotive grade version has $$\V_{_\text{OS}}=400\:\mu\text{V}\$$ (max) and you might get caught with one!] The MAX400 guaranteed $$\10\:\mu\text{V}\$$ (max) but it's not available anymore. There are chopper-stabilized opamps with better figures. But I think you are getting the point.

You are depending upon high accuracy at very low voltages. You should seek a different approach.

Comment About Your Diligence

You've indicated that you want to be able to specify, in increments, anything over a 1000:1 current range of $$\1\:\mu\text{A}\$$ to $$\1\:\text{mA}\$$. This is quite a range. And you'd also need a similar dynamic range for your DAC output.

This may already be a problem for you. I don't know. But at least you can see one possible problem, now. Simply the ability to control currents (and by linear implication a control voltage/current to specify it to the circuit) over a 1000:1 dynamic range.

You didn't grapple with this in your question and you most certainly should have! You don't even need to think about a circuit, except perhaps only so much as thinking about any circuit forces you to think at all about the problems, to realize that there is a big problem to solve, already.

How to control this beast?

But that's not all there is, here. I'm sure you'll agree that you don't need to worry about accuracy issues at $$\1\:\text{mA}\$$ -- if you can solve them at $$\1\:\mu\text{A}\$$. So let's suppose you want to be within 10% at $$\1\:\mu\text{A}\$$, so that you'd be happy with anything from $$\900\:\text{nA}\$$ to $$\1.1\:\mu\text{A}\$$. That's $$\\pm 100\:\text{nA}\$$ of error budget. And if you can still hold this error budget at $$\1\:\text{mA}\$$, you are talking about 100 ppm!

That's not impossible to achieve. But there it is. And I honestly don't know what's acceptable to you because reading through the text so far doesn't give me any kind of solid information. You really need to focus on this part of the range and make design decisions about what's acceptable.

You could make this a little easier. A dynamic range of 10:1 is much easier to solve and you could use three different resistor values to select three different ranges of current, for example. This similarly relieves the DAC output problem, too. But again, I've no idea at all whether or not that's acceptable to you.

I don't see how anyone can meaningfully suggest any approach, with so little consideration effort going into your question.

An Approach I've Used

It's likely there are dozens of approaches. But one I've used (and I know works well) is to rely upon one or more current mirrors and an opamp, together with an appropriate ranged control voltage. I won't delve into it at this time, because there's no point without more information from you. But I'll give a very light overview of the approach here.

Suppose you have an opamp arranged so that it is trying to create a virtual ground and a resistor arranged to sink/source current into this node, with a control voltage at the other end to set the current to your desired value. Let's look at some error sources:

1. The opamp can achieve the virtual ground only as well as its $$\V_{_\text{OS}}\$$ permits.
2. The opamp bias current will contribute to the resulting current into/out-of the virtual ground.
3. The resistor is only as accurate as its tolerance allows.
4. The DAC output control voltage you supply will have its own accuracy errors associated with its output voltage (which is used to determine the current into/out-of the virtual ground node.)

By crafting a design that takes into account these error sources, works through the dominant one(s) and solves them, then you probably can achieve something that may be acceptable to you.

In adding the current mirror I mentioned, there's added sources of error:

1. BJT Early Effect for the BJTs that drive the load. (This is not a problem for the other half of the mirror(s). And there are a variety of approaches to solving this, including the full Wilson mirror arrangement as well as just limiting the output voltage range with respect to the rail voltages.)
2. Mismatch of the BJTs $$\V_{_\text{BE}}\$$ in the current mirrors at any given temperature. (This is resolvable by using matched dual BJT ICs such as the BCM847 and BCM857.)
3. Temperature differences in the BJTs within a current mirror. (This is resolvable by using any dual BJT IC package -- including the cheaper BCV61 and BCV62.)

The problem remains that I honestly don't know what's acceptable to you. I know a few things. For example, you've said that you don't expect to change values often. And that's very helpful to know. But you need to provide an adequate discussion surrounding your interest here before I can suggest this, or anything else.

I don't mean to be offensive in any of this. I'm just being direct. We all face the problem of sinking serious time into developing specifications. It's annoying at times to have to do that. But there's no getting around it, either, if you want to move more accurately near a path towards a design that has a better chance of success. It's just the way of things.

• Thank you for your reply. Finding op amp with 20 microvolt offset is easy-peasy, they cost close to nothing; in fact, mouser is full of superprecise rail-to-rail op amps with under 25uV offset and typical values around 5uV under 2 bucks. And I would lie if I had said that I hadn't considered current mirror. And yes, I actually DID notice DACs have errors too, especially zero output, which is actually far from zero (well, "far", some millivolts, but in my case it's far). Maybe I can't specify certain things due to my inexperience. I've read books but haven't created very much yet.Working on it
– Ilya
Commented Sep 6, 2021 at 8:14
• I have to admit, my precision requirements are not really finalized, I'm just considering different general principles to approach it. Maybe I make a bad developer, haha. Well, for now, at least. Anyway, thank you for giving food for thought
– Ilya
Commented Sep 6, 2021 at 8:15

Is there a way to produce relatively accurate 1mV

Yes, produce a larger output voltage and use a voltage divider.

• I wanted to argue that I can't control it and change it and thus it's nor really an option, but technically you answered my question, so this one's on me
– Ilya
Commented Sep 3, 2021 at 13:55
• What makes you think you can't control or change a larger voltage and then voltage divide it down to the millivolt level? Commented Sep 3, 2021 at 13:57
• I wanna see an example of circuit where I will be able to produce 1uA of current, 37uA of current, 789uA of current and 2mA of current with the same voltage divider. We're talking about 1000x. I don't think this idea is feasible in my situation
– Ilya
Commented Sep 3, 2021 at 13:58
• @MathKeepsMeBusy If you provide an example, be sure to show the impact of resistor accuracy on the accuracy of the divider output. It's non-trivial.
– jonk
Commented Sep 3, 2021 at 17:59
• @Ilya A voltage divider is sensitive to resistor tolerance. Suppose $V_{_\text{OUT}}=1\:\text{mV}$ using a $V_{_\text{REF}}=2.5\:\text{mV}$ source. 1% tolerance resistors may be as bad as 4% at output. Or $40\:\mu\text{V}$. (Computed from sensitivities of both as: $2\cdot\%tolerance\cdot\left(1-\frac{V_{_\text{OUT}}}{V_{_\text{REF}}}\right)$.) An LT1677 has itself $60\:\mu\text{V}$ of offset error. Whether it's worth using better resistors may be an open question. But added up this is already 10% error.
– jonk
Commented Sep 4, 2021 at 20:33