I have a current source circuit with an op amp and pass transistor. The simplified schematic is this:
I would like the output to be adjustable over a pretty wide dynamic range, let's say 4-6 decades (amperes to microamperes), and most importantly I'd like the output to be a true zero if the input is zero.
The problem is the offset voltage of the opamp which introduces an offset to the output current. The opamps with the right speed for what I'm looking for have offsets of 100-500uV. This is not much of a problem when the current is 1A (and the voltage across the sense resistor is 1V), but becomes a pretty big problem when the current is 1mA and the sense voltage is 1mV.
The other problem is saturation. If the offset happens to be positive, when the input is zero, the opamp would try to drive to a negative sense voltage and its output would hit the negative rail. When the input goes positive (eg at the beginning of a short current pulse) the op amp would take time to get out of saturation, and then to slew from the negative rail to a high enough positive voltage to turn the MOSFET on. This results in a delayed and slower rise time at the beginning of current pulses in some of the breadboard versions of this I have built.
I could try to null the opamp offset either using the null pins or slightly offsetting the input. I think drift over temperature and time would make it so this would need pretty frequent adjustments.
I could also add an extra switch on the high side to get a true zero, but that doesn't solve the dynamic range problem (at best I'd have 4 decades of dynamic range, and more likely only 3) and also the saturation problem.
Span errors or deviations from linearity don't matter as much, but zero shift errors are really bad for my use case.
Is there some way to avoid the offset issue in a circuit like this, and have a current source which is essentially exactly proportional over a very wide dynamic range? Is there some way to use a current feedback amplifier instead of voltage feedback?
(Example component choices: THS4541 opamp, BSS816 mosfet. R_load is not actually a resistor, it has a nonlinear I-V curve)