Linear Bench Power Supply

Linear Bench Power Supply

This project is a simple linear bench power supply with adjustable voltage and current. It is meant to be a learning experience, putting ideas of circuit design, feedback, stability into practice building a complete practical power supply. I have intentionally avoided using a 3 terminal regulator or purpose built chip and instead implemented the feedback for voltage and current using a couple of opamps. The idea is for this to be a practical final product while giving pactice implementing some basic circuits.


  • 0-30V
  • 0-2A
  • separate fixed 5V output
  • Display of setpoint and measured current and voltage

Beyond this, everything is kept as simple as possible with no additional features to compliacate the design. The display is a 20×4 character LCD controlled by an Arduino which reads the currents and voltages. The voltage and current are set by 2 pots on the front panel. There is no data logging or serial comms, although this could be added later if desired with an update to the arduino firmware.



Overview of operation

The design is fairly simple and uses a single npn darlington transistor as the main pass transistor in a common collector configuration. This provides current gain but no voltage gain, which is provided by a small signal npn transistor in a  common emitter configuration. The current and voltage feedback loops are controlled by two opamps which compare the measured output values with setpoints generated by two potentiometers on the front panel which are driven by a 5V reference.
The output voltage is sampled via a 6:1 votlage divider (converts the 0-30V output to a 0-5V signal) and the current is sampled by measuring the voltage drop over a 100mOhm resistor in series with the output. Everything is mapped down to the 0-5V range so that they can be directly measured with an arduino using the 5V rail as the reference voltage.
There is additional circuitry for the mains rectification, the transformer tap select and a 7805 5V regulator which provides the reference voltage, powers some of the chips and is routed to the front panel to provide a fixed 5V output.


Feedback loop


Voltage Control

The main feedback loop and output stage is shown in the figure above. Opamp U1A has it’s non-inverting input connected to the wiper of a pot on the front panel, driven by a 5V reference signal which provides the setpoint between 0V and 5V. The inverting input comes from the 6:1 voltage divider R5/R6 which divides the 0-30V output down to a 0-5V signal. The output voltage is amplified by the common emitter amplifier created by R1, R3 and Q2, with the pnp transisor Q1 required as the common emitter amplifier is inverting. The current gain is then provided by the common collector amplifier formed by Q3. Q3 is the main pass transistor and so must have high gain and be capable of dissipating a lot of power (see below) – I use a TIP120 which is an npn darlington transistor rated to 5A with a DC current gain (hfe) of ~1000.

  • If the output voltage is larger than the setpoint voltage, U2A output goes low ( V- > V+ ).
  • This reduces the base voltage into transistor Q1, reducing the collector current.
  • This causes the collector voltage to increase (V=IR through resistor R1).
  • This reduces the base-emitter voltage at Q2 and reduces the collector current.
  • This in turn reduces the base current into Q3 which reduces the output voltage

Current control

The output current is monitored by measuring the voltage drop over the shunt resistor R4. This is achieved with U2 (INA196)  which is a dedicated current monitor IC – basically a differential amplifier with a gain of 20V/V. With a 100mΩ resistor at 2A this develops 200mV, which means the output is in the range from 0-4V. This is fed into the negative input of opamp U1B, with the positive input being the setpoint coming from a second pot on the front panel. This is also connected to the base of transistor Q2 along with the voltage control signal, except that it is through a diode D3.


  • When the measured current is lower than the set point, opamp U1B output is high, diode D3 is reverse biased and no current flows, disabling the current limiting.
  • If the measured current is above the set point, opamp U1B output goes low, diode D3 starts conducting and pulls the base of Q2 low which results in the main pass transistor base current decreasing, reducing the output current.
  • Also note resistor R2 which limits the current when in current limiting mode. When current limiting is active, U1B output goes low and tries to sink the current from U1A (voltage setpoint) and pull the base of transistor Q2 low. R2 simply limits the current to ~0.1mA, rather tran trying to sink the maximum output current of the opamp.

Mains Input

The transformer I am using has 2 windings rated at 2.5A, each with a 9V and 12V tap. The two windings are connected in series to provide 3 AC voltages of 9V, 12V and 24V. The 21V tap is unused.

  • The 12V and 24V taps are the main supply voltages
  • The 9V tap is rectified and filtered and powers two voltage regulators to provide 9V and 5V rails which power all of the low-voltage components.
    • The 5V regulator (U3) powers the LCD, the tap select relay, forms the 5V reference voltage for the board and provides a fixed 5V output to the front panel. It is a TO220 package mounted to the heatsink so that it can provide a high current ouput (1A).
    • The 9V (U4) regulator powers the two opamps, the current monitor IC and the arduino – all low current devices so it is a low current TO-92 package limited to 100mA.

A multi-tap transformer is needed to reduce the power dissipation in the pass transistor. The worst case in terms of power dissipation is a short circuit, when the full voltage is dropped over the pass transistor at maximum current. With 30V at 2A this gives 60W, which is outside the spec of most  cheap transistors. The transistor used in this design (TIP120) has maximum dissipation of 65W at room temperature, but this is reduced to 30W at 80 degrees (see figure below from the datasheet). By using 2 taps I limit the maximum power dissipation to around 30W, at the expense of the extra complexity of the tap selection circuitry. Some alternative solutions could be sharing the current between multiple pass transistors, or using a larger heasink with forced cooling.

The main voltage supply is selected via relay K1 based on the output voltage from the 12V or 24V taps, bridge rectified and filtered. Opamp U5A is set up as a hysteresis comparator via resistors R7, R9 and R10 with a trip point of 10V +- 2V (output voltage, the actual trip point is 6x lower due to the 6:1 voltage divider). The output from the opamp drives the base of npn transistor Q4 which switches the relay coil current on or off to select the correct tap. Resistor R8 limits the base current into Q4.


Display is handled by an Arduino nano, which measures the setpoint and actual voltages and outputs to a 20×4 character LCD on the front panel. I use the Arduino’s internal 10 bit ADC (giving 1024 different values) which at 30V and 2A gives about 30mV and 2mA resolution – more than enough for my purposes. The code (available here) is very simple, just sampling the 4 votages and updating the display roughly every 100ms . The measured voltage and current must be calibrated by measuring the actual output with a multimeter  and comparing to the value output by the arduino, as described in the code.



More Details

Some more details about this power supply design and build are available on my personal blog

Current Status

5 April 2016: The current revision (Rev1.1) is assembled, tested and working. The above description has been updated to correspond to the latest revision. All that remains is to finish the power supply enclosure by finishing the lid, giving it a coat of paint and adding some knobs to the front panel pots.

30 March 2016: The new version of the board has arrived, been built and tested and is working correctly. I will update this post in the next few days with the changes.

For More Details: Linear Bench Power Supply

© 2015 Powered By Engineering Projects Team, Raspberry Pi Projects

Scroll to top