I am trying to design current source of 4-20mA variable with 24vdc input. The circuit can read one output at a time and variable from 4 to 20mA.

When input varies between 0 Volts and 24 Volts, the current source should vary from 4 mA to 20 mA correspondingly. The input voltage will be constant somewhere between 0 and 24 Volts, at any given point of time, and the corresponding sourced current should be constant at that time.

  • 2
    \$\begingroup\$ What do you mean by "read one output"? Output of what? If the current is variable, how is the current varied? Please edit your question to clarify. \$\endgroup\$
    – Phil Frost
    Jun 10, 2013 at 0:08
  • \$\begingroup\$ means the cicuit can be source of 4-20mA current. output of the circuit should measure in current. variable current means variable from 4-20mA but constant at one time. \$\endgroup\$
    – ketan
    Jun 10, 2013 at 1:35
  • \$\begingroup\$ But what is the input? What tells it whether to output 4 mA or 20 mA? \$\endgroup\$
    – The Photon
    Jun 10, 2013 at 1:46
  • \$\begingroup\$ means the cicuit can be source of 4-20mA current. output of the circuit should measure in current. variable current means variable from 4-20mA but constant at one time. for example: if 16mA the circuit should be constant for 16mA. it could be done by trim pot. \$\endgroup\$
    – ketan
    Jun 10, 2013 at 1:46
  • 1
    \$\begingroup\$ It seems pretty clear, basically an analog 4-20mA current loop drive using a 0-24 Volt input signal. Edited the question as per OP's comments. \$\endgroup\$ Jun 10, 2013 at 5:23

4 Answers 4


What you're describing is a 4-20 mA Current Loop. The implementation of current loops is very vast, however, I would go with an approach similar to this one. The input range is 0-5v for the example I gave, but you could quite easily scale your input down to 5v max by using a voltage divider. The circuit is rather robust and relatively easy to implement and looks something like this: Current Loop


My preferred go-to solution for voltage inputs driving 4-20mA current loops is the 8-pin XTR117. It is trivial to implement, and is specified for precisely the 24 Volt input range in the question. It operates from 7.5 Volts to 40 Volts, and the input signal full-scale is equal to the Vcc used.


One input resistor, one transistor, and that's it: Just 2 external components. The supply voltage source can be at the receiving end, so the remote device does not even need a local power supply.

The signal bandwidth, at 380 KHz, is more than ample for the slowly changing input implied in the question.

An added bonus for remote devices is the integrated 5 Volt 12 mA regulator output, often sufficient for some basic logic circuitry or an indicator LED, saving on part count on the remote board.

IIRC this part, or some drop-in replacement, used to be available as a DIP package as well, and that version was much better at dumping heat than the MSOP version, hence much better in a harsh industrial environment. Sadly the DIP doesn't seem to be available any more.

  • \$\begingroup\$ The only downside to this chip is that the negative terminal of the VLoop source cannot be referenced to the system ground which is the negative terminal of Vin. \$\endgroup\$ May 12, 2021 at 19:11

I'd consider doing it this way.

This circuit (below) takes an input voltage Vin and with the values shown produces a high-compliance current source of Vin/100. For 20mA to the load, Vin should be 2V. For 4mA to the load, Vin should be 0.4V.

enter image description here

Next is mapping the 0 to 24V input to 0.4V to 2V. I'd do this by reducing the 0->24V input to 0->5V and adding 1.25V (in series with the reduced signal) via a series shunt regulator like the REF1112: -

enter image description here

Stages: -

  • 0 to 24V input
  • becomes 0 to 5v
  • becoming 1.25V to 6.25V
  • becoming 0.4V to 2V

This feeds the top circuit.

Alternative ways You could add 6V to the 0-24v input producing 6V-30V then voltage divide this by 15 to get 0.4V to 2V. Use a TL431 to make a 6V shunt voltage and apply it in series with the input voltage. However this does require an input voltage that is sourced from a low impedance.

If current sinking should be required, with reference to the top diagram only the first stage is required - it is a current sink and its emitter resistor can be made to be 100 ohms.

Heat dissipation A 20mA output current can warm things up and if the positive supply rail for the current source/sink is high (say 15V) the power disippation in the output FET could be 250mW into a low impedance load - this requires design attention and possibly heatsinking in the copper of a PCB.

  • \$\begingroup\$ Another alternative for shifting the signal to 4mA output at 0V input in would be to put a second (fixed) current sink into the first circuit, in parallel with the current voltage controlled sink. \$\endgroup\$ Jun 10, 2013 at 15:13
  • \$\begingroup\$ @ChrisJohnson very true but possibly slightly more circuitry. \$\endgroup\$
    – Andy aka
    Jun 10, 2013 at 15:14

Marrying space-age and stone age technologies: 1) ATtiny85 2) SPI digital potentiometer 3) Adjustable linear regulator with potentiometer between output and ADJ, like a LM350 4) A few adjusting resistors and decoupling capacitors 5) Your current source is at the ADJ terminal, and will be at a voltage at most (Vdrop + Vadj) below the input voltage.

Make the ATtiny sample the input voltage through a resistive divider. This can be done at 10 kHz speed or higher. Make the Attiny output control data to the digital potentiometer to control the feedback resistance.

If you use a regulator with 1.25V reference, the resistance at 4 mA would be (1.25 / 0.004) == 312.5 Ohms. At 20 mA, you have (1.25 / 0.020) == 62.5 Ohms. AD5254 or AD8403 would work; it's a 1kOhm part that you can gang up 4-way to get 250 Ohm range; add a 62.5 Ohm resistor and you cover the whole range perfectly.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.