Current version



Completed, ready for production

PCB manufactured

Yes (r1B9 08/2015, r2B6b 03/2016)

PCB assembled

Yes (r1B9 08/2015, r2B6b 03/2016)


Yes (Farnell, TME)

File repository shield

(include Eagle, Gerber and BOM files)


TAPR v1.0

Revision history

2016-06-14: r3B3

  • Removed suport for Mega2560 – only 3.3 V board such as Due (and hopefully soon STAR - OTTO) is supported
  • TFT touch screen rotated (landscape view) for housing in more compact (2U height) enclosure. Tested with both SSD1289 and ILI9341 display controllers
  • Reset supervisor and watchdog (TPS3705-33)
  • Power connector replaced with 10-pin IDC to carry master sync out
  • W5500 Ethernet controller
  • 10-pin IDC for channel's SPI bus replaced with 26-pin IDC that carry output power signals, remote sense, remote programming, temperature sensor and SMPS sync
  • Redesigned wiring of output serial/parallel connection
  • Ethernet RJ-45 connector replaced with 8-pin 0.1" header (see also new AUX PS board)
  • 2x5-pin 0.1" header for optional W5500 Ethernet module (eBay)
  • 2x4-pin 0.1" header for optional NRF24L01 Wifi module (eBay)
  • Added support for incremental encoder
  • 4 mm binding posts for remote sensing inputs replaced with 0.1" push-in connector

2016-04-06 r1B14 (Version 1.0 on github)

  • Added fan control (FAN_PWM, FAN_SENSE)
  • Power connector replaced with 6-pin IDC as on the AUX PS r4B41
  • Removed optional reset connector

2016-03-28 r1B13a

  • Change remote sense inputs position on X4

2016-03-27 r1B13

  • Fixed remote sense wiring
  • Output protection redesigned (TVS moved, SAR and MOVs removed)
  • Smaller footprint
  • Remote sense 4 mm banana binding posts replaced with compact "push-in" connectors
  • Digital trigger input (with buffer and level shifter) added
  • THT LEDs replaced with SMD counterparts (lightpipes are now required)

2015-12-07 r1B12b – First public release



Fig. 1: PSU enclosure with Arduino shield (second working prototype, front mask is still missing)


Table of contents

First try – an Arduino Leonardo compatible MCU board

The power supply becomes programmable when the Arduino Shield module is added. Although the Arduino shield as a concept was our first choice, we decided to make our own MCU board based on Arduino Leonardo design (Fig. 2). It has been chosen because it is built around Atmel ATmega32u4 that includes USB interface. That simplifies design when that important interface is supported. Trying to add MCU support based on Arduino was a natural choice for our project since it is completely open source hardware and software.

Other important features of our first MCU board was RTC, external EEPROM, Ethernet controller, beeper, 1-wire keypad (Fig. 3), monochrome 128 x 64 display (Fig. 3), two non-isolated SPI bus ports (5 V and 3.3 V logic) and of course two isolated required for communication with post-regulators. 5 V non-isolated SPI port mimicked 10-pin ICSP pinout that was used for initial MCU programming before USB became functional as a channel for uploading Arduino sketches. 3.3 V SPI port was intended for communication with external SD-card.


Fig. 2: Arduino Leonardo compatible MCU board (r2B32) (obsolete)


Fig. 3: 128 x 64 LCD graphic display and 4 x 4 keypad (obsolete)


Fig. 4: Binding posts PCB (r2B32) (obsolete)


Unfortunately we found pretty early that this module is inadequate for our project. The main obstacle is rather small Atmega32u4 memory capacity: 32 Kb of flash memory and 2.5 Kb of SRAM. That was barely enough to accomplish setting and monitoring voltage and current on two channels. Adding e.g. support for the Ethernet controller was not possible due to lack of flash memory space. 1-wire keypad concept (that was a separate PCB) also was not a good choice: it was prone to errors and inaccurate inputs.

Even if we put hardware obstacle aside one mechanical issue became apparent: we had three PCB: MCU, 4 x 4 keypad and Binding posts PCB (Fig. 4) that needs to be mounted on enclosure front panel with different mounting distance from it. That requires spacers of various length and keypad alone requires drilling of 20 holes that could increase manufacturing cost of the front panel.

Second try – the Arduino Shield with binding posts section

All perceived shortfalls has been taken in account during development of the next digital control board. We decided to design it as an Arduino Shield and become less dependent of memory but also MCU type that is used on some of the Arduino boards. We decide to step up from the Entry level boards (that is entry level indeed) to the level with the Enhanced Features. In this category we can find two boards with the same form factor but two completely different architecture. The first one is Mega2560 is a 8-bit, AVR powered by 5 V, and another one is Due, 32-bit, ARM powered by 3.3 V. Regardless of the obvious differences on hardware and software level (AVR and ARM have different command sets) we decided to support both. Both comes with much more memory then previously used Atmega32u4: on Mega we have on disposal 256 Kb of flash memory and 8 Kb of SRAM (that is not a great improvement in comparison to 2.5 Kb) while Due comes with 512 Kb of flash memory and 96 Kb of SRAM and much faster clock frequency: 84 MHz instead of 16 MHz on Mega and Leonardo variants.

Trying to make an Arduino shield that support both will makes it really multi-platform in the Arduino terms and in that way more attractive for broader audience. Hopefully Arduino team will offer even more powerful boards using the same form factor in the future and give us more room for adding new features. The software difference is currently well managed thanks to the Arduino IDE. Most of the time the same sketch could be used for both AVR and ARM, and programmer just need to select before compilation a target platform.

Level shifting

Hardware difference will require some electrical adaptation because powering Due with 5 V is not allowed and could damage the board. This issue is easily solved by providing voltage selector and two power sources: 3.3 V and 5 V. The former could be derived from the later by adding a LDO on the Shield powered by 5 V that comes from the Auxiliary power module.

But, this is just a part of the problem. Arduino board has to communicate with peripherals that is located on the Shield that have their own power requirements. For example if we decide that external EEPROM will be powered with 5 V that is fine for Mega I/O voltage levels but will be inappropriate for Due that can provide only 3.3 V on its outputs. On the other side if we decide to power it with 3.3 V that could be insufficient to successfully trigger Mega’s inputs. It become obvious that some sort of logic level shifting has to be deployed for proper support of the both board. Fig. 5 shows different communication scenarios (bidirectional, output only, input only) and various ICs and logic families that can be used as a logic level shifters.

Fig. 5: Logic level shifting scenarios


One IC in particular catches the eyes: SN74LVCC3245A, a octal bus transceiver with adjustable output voltage and 3-State outputs. It has two separate power inputs and adjustable output voltage has a really special meaning covering all imaginable combination between “A-side” and “B-side” within allowed voltages. That also include possibility to have the same voltage level on the both sides what cannot be found in most of the other level shifters. This is actually the case if we want that all peripherals are powered with 3.3 V and Due board is used.

Merging three into one

Three PCBs used in the first version are now merged into the single one. That was possible thanks to switching from LCD / 4 x 4 keypad combination to the TFT display (Fig. 6) that has touch-screen that not just replacing keypad as an input devices limited to 16 keys but also gives us a pointing device that can be used for simpler and more efficient navigation throughout various application features. The selected TFT display model price is very attractive and it could be easily find on many on-line shops by searching for name TFT_320QVT. Additionally the search query could be further narrowed with size (3.2 Inch), resolution (240 x 320) and LCD controller model (SSD1289).


Fig. 6: 3.2" Color TFT display with touch screen and SD-card socket


There is many other benefits that comes with such display:

  • Colors for highlighting important messages and display sections for better user experience
  • Simpler front panel that reduces manufacturing costs (no drilling for multiple keys is needed)
  • SD-card socket that removes requirement for an SPI extra 10-pin SPI connector
  • Lower overall cost then combination of separate LCD display and keypad

The only possible disadvantage of such device in comparison with previous LCD display is higher pinout count required for the connection. The LCD controller is a 16-bit device that use just for the data transfer 16 digital lines. Additional 8 will be required for the touch screen and SD-card control. Fortunately both Mega and Due offers more then enough I/O pins to satisfy that. When I/O requirements for the other peripherals has been taken into accounts we still have 15 I/O lines unused (See Arduino Shield pin mapping).


Fig. 7: Arduino Shield +BP (r1B9) top side without Arduino board attached


Fig. 8: Arduino Shield +BP (r1B9) top side with Mega2560R3 installed


Fig. 9: Arduino Shield +BP (r1B9) bottom side


The Arduino Sketch +BP module (BP stands for binding posts) after merging of three previously described boards has the following features:

  • Outputs and remote sense inputs protection using TVS
  • LED indications for output enable, remote sense and Stand-by mode
  • Power relays for making serial or parallel connection of two outputs
  • Signal relays for remote or local voltage sense
  • Connectors for hosting Arduino Mega/Due board
  • On-board 3.3 V / 1 A LDO powering all peripherals
  • Analog input for temperature sensor
  • Soft-start/Stand-by control for the Auxiliary power supply module
  • Level shifters for 3.3 V ↔ 5 V (3.3 V ↔ 3.3 V is also supported)
  • Digital isolators for two SPI ports for output channels control (Post-regulator module)
  • Buzzer
  • External EEPROM
  • Real-time clock (RTC) with supercap back-up
  • Ethernet controller
  • TFT color display with touch-screen
  • LED CV/CC mode indicators
  • Optional V/F (Voltage-to-Frequency) converters for isolated temperature sensors (NTCs) that can be used for battery temperature monitoring
  • r1B13: External digital trigger input with protection and level shifter

The schematic diagram is consists of five sheets that will be discussed in sections that follows.

Binding posts section

This section is added to simplify wiring of power outputs, remote sense inputs and serial and parallel connection of two channels without external wires. The is another maybe not so obvious advantage of such wiring: it does not leave a room for erroneous wiring and programming, e.g. that polarity are mismatched or that channels connected in parallel are programmed with different output voltages.

Output terminals and remote sense input terminals are protected against reverse polarity and over-voltage spikes using TVS (ZD1 – ZD4).


Fig. 10: Arduino Shield binding posts section


Serial connection is established through power relay K_SER while for parallel connection the K_PAR power relay is used. Both relays is rated for 8 A and should withstand 50 VDC switching without load connected. When driving serial or parallel relay the following things has to be taken into consideration:

  • Voltage and current has to be set to zero before channels are connected or disconnected. The easiest way to do that is to disable output (OE is off) but it's also recommended to also program output values to zero.
  • Parallel connection could follows only if programmed output voltages are the same on both channels
  • Optionally down-programmer circuit could be disconnected on one of the channels that are connected in parallel

Mentioned recommendations should be taken seriously otherwise it is possible to damage either the PSU and/or connected load. For example when we tested outputs connection in serial with connected load and OE was switched on when total voltage became higher then 60 V, the K_SER relay was irreparably damaged during disconnection! Contacts were simply melted down and left shorted.

Since separate power relays is used for outputs connection is serial and in parallel it is possible to activate it simultaneously by software. If that case the outputs of the both channels will become shorted that could be dangerous if e.g. over-current protections was not set. To avoid such situation a hardwired blockage is added (the Q4 mosfet) to inhibit parallel power relay (K_PAR) when serial power relay (K_SER) is activated.

Two tiny signal relays (K_S1, K_S2) are used to control voltage sense that could be local or remote. By default (when relay is not polarized) sense inputs are connected locally – to the power outputs. When load is remote and voltage accuracy is critical for the connected load, sense inputs become connected to a separate pair of binding posts.

All relays are controlled by TLC5925 that is a 16-channel constant current LED driver that is intentionally selected because we wants to add a LED indications of biding posts states and makes them in that way more obvious to the user. Therefore one LED is added above each of eight binding posts as shown on Fig. 9. When channel’s outputs are enabled a pair of green LEDs are illuminated. Remote sensing is backed with illumination of yellow LEDs. Connection of output channels in serial or parallel is also indicated thanks to bi-color LEDs used above channel one power outputs. In that case LEDs are illuminated in red.

All allowable binding posts connections with LED indications and programming codes that can be used for controlling TLC5926 can be found here.

Arduino board interface

Arduino Mega and Due have seven female headers used for interfacing with I/O pins, power, reset, etc. They are located at the three board sides and we learned that such arrangement is quite impractical when board has to be removed. A close attention is required to not bend one or more pins on the Arduino Sketch side. Interfacing with the Arduino board is done using SN74LVCC3245A as a level shifter. Five (IC2, IC3, IC4, IC5, IC7) are used for pins that will be programmed as digital outputs and an another one (IC8) is used for digital inputs. IC3 and IC5 are handling LCD 16-bit data bus and rest of the outputs controls various “chip selects”, SPI bus output signals (SCLK and MOSI) and similar signals.

Input level shifter (IC8) is passing SPI bus input (MISO) and interrupt requests from the installed peripherals. Pin mapping of all used pins is described here.


Fig. 11: Arduino board interface


Main power comes to the pin 5 V (MCU_POWER header) that is also applicable in the case of Due since it has on-board LDO to step down to the working 3.3 V. That is visible on an excerpt from the Arduino Due schematic shown in the fig. 12 (IC4 encircled in red).


Fig. 12: Arduino Due power section


Attentive reader who is familiar with Arduino boards will probably notice that something is missing on the first assembled version of the sketch (Fig. 7). The ICSP 6-pin header does not exist! That mistake was based on the naive presumption that because Mega and Due are sharing the same form factor they must have the same pin mapping. That is almost true, the only exception is SPI bus signals available on Mega (pin 50, 51, 52) are not connected on the Due. ICSP is primarily used for MCU programming using SPI bus but Arduino designers decide to make it as the only port for communication with SPI peripherals. Therefore all Due compatible shields have to communicate using 3.3 V logic levels but also should incorporate 6-pin female header if SPI programming supported by standard libraries is required.

We noticed that too lately, when Due board was attached for the first time on the shield. Fortunately with few cuts on Due and two wires the problem was solved and we could use Due for the firmware testing. This mistake is now corrected, as it is shown on the Fig. 13.


Fig. 13: Arduino shield PCB r1B9 and r1B12b with added ICSP pin header


Digital isolators

The Arduino Shield has to control two PSU channels that are electrically isolated by default and they have to stay isolated when are connected to the shield. That means that digital control signals cannot share the common ground. If such connection exists it could be even dangerous when e.g. channel outputs are connected in serial or when the PSU is used as a symmetrical source (positive output from one channel is connected to the another channel negative output). Digital channel isolation is accomplished using high speed digital isolators.


Fig. 14: SPI ports isolation


The SPI bus port pin mapping is compatible with the ICSP 10-pin header:


Pin No.














Not connected

I/O expander chip select




DAC chip select








ADC chip select








I/O expander IRQ / ADC conversion end










Eight lines in total has to be isolated for each channel and both input and output directions is needed. Six line isolators (IC9, IC12) are used for outputs and two line isolators (IC10, IC11) for input signals. MISO input require special attention. Used isolators are not 3-state what is a requirement for the MISO signal since only one device could send data to the MCU at the time. Lack of 3-state outputs on the isolators is fixed with additional buffer gate (IC10C, IC10D) that can provide 3-state output.

On-board peripherals

The SPI bus used for isolated communication with peripherals that resides on two PSU channels is also used for making connection with few other SPI peripherals located on the shield itself. They are added to “equalize” features on both Arduino board variants. EEPROM (IC15) and RTC (14) are added because Due is lacking former and Mega is lacking later. The RTC is also powered with a 1 F Supercap that should be enough for running for a couple of weeks when the main power is not present.

On top of that SPI Ethernet controller (IC16) is added and socket (LCD1) for hosting TFT display. Display controller use parallel 16-bit data bus, but touch screen controller also need SPI.


Fig. 15: On-board peripherals


Few other things that are directly connected to the MCU pins are also included:

  • Buzzer driven with digital output (via Q8)
  • Temperature sensor connected directly to an ADC input and
  • Display back light adjustment driven with PWM output (via Q9)

SPI modes

A few words about SPI modes of operation. Four modes are available and defined by serial clock (SCK or SCLK) polarity and phase. For example the Arduino IDE provides four data constants for them: SPI_MODE0, SPI_MODE1, SPI_MODE2 and SPI_MODE3. Selecting a right mode of operation could be frustrating if IC manufacturers missed to specify it. We learned that if IC is not damaged or improperly connected but IC is responding in a wrong way, checking SPI mode is the first thing that should be done. If you are not sure what to specify the easiest way is to simply select them one by one and see the results (i.e. the outputs are set correctly or returned data register content is equal to one that is set, etc.).

CC/CV indicators, load temperature sensing and external trigger

Channel output mode of operation is indicated using two LEDs: Yellow for constant voltage or CV (LED_CV1, LED_CV2) and red for constant current or CC mode (LED_CC1, LED_CC2). Most of the time the channel output will be in one of that two modes. But there is also the third mode that is called unregulated or UR when output is possibly under influence of both CV and CC control loops. This mode is indicated by switching off both LEDs.


Fig. 16: CC/CV indicators and optional temperature sensing


Finally the shield contains one optional circuit that could be used for isolated measurement of the outside temperature. That could be a battery NTC sensor used for monitoring battery during fast charging or discharging cycles. Temperature sensor inputs are located on 6-pin push-in connectors (X3, X4) that are located near the channel’s binding posts (J1, J2, J3, J5). Its output is analog, a variable resistance that depends of the temperature. It has to be isolated for the same reason that is mentioned for SPI buses: to avoid connection of their grounds to the same potential. Analog isolator circuit is not used here because it’s in general more complex or expensive for the same precision. Therefore the sensor output is first converted to a digital signal by mean of V/F (voltage-to-frequency) conversion using popular 555 timer. For better linearity NTC is not connected directly to the timer but a current mirror circuit is used (IC17, IC19). Timer output signal could be now digitally manipulated and it’s delivered to the MCU using opto-coupler (OK1, OK2).

An external digital trigger circuit is added as a mean of controlling the PSU from external process. This input has simple protection circuit against over-voltage (ZD5, D8) and reverse voltage (D9). Additional protection of MCU input is proveded with buffer (IC21 together with R42 and R43). Selected buffer also offers level-shifting therefore trigger signal could comes from circuits with different logic level (e.g. 1.8 translated to 3.3 V or 3.3 to 5 V).

PCB layout

A two layer PCB (175 x 105 mm) is used with clearly separated analog (output protections, relays and V/F converters) and digital section. Binding posts (five of them) can be directly mounted on the PCB from the PCB rear side (that is enclosure front side).

The Ethernet RJ-45 jack is also hosted on the PCB. Therefore additional short (30 cm) adapter cable is required to make it reachable from the enclosure rear panel.

The Arduino is positioned in the way that neither part on the shield or Arduino board touch each other.


Fig. 17: PCB layout (both layer)


Fig. 18: PCB layout (top layer)


Fig. 19: PCB layout (bottom layer)


Possible improvements and further development

This shield could be further developed in various ways without leaving used Arduino platform. Here is some ideas that should be feasible within existing PCB dimensions:

  • Add support for more output channels; at least one to have under control some kind of “aux” low voltage/high current output e.g. 0 – 8 V / 0 – 5 A
  • Add automatic recognition of board using Arduino IOREF pin (jumper JP2 could stay on the PCB if one don’t want to solder components required for IOREF monitoring)
  • Replace or complement the Ethernet with wireless (e.g. using nRF24L01+)
  • Add two more signal relays to cover remote sensing case when two channels are connected in serial
  • Rearrange binding posts to have in one row power outputs and in another remote sense inputs that uses much smaller connectors
  • Somehow combine LED indicators from the BP section with CC/CV indicators
  • Dedicate more inputs for NTC temperature sensors
  • Add digitally isolated outputs for e.g. relays control
  • Add isolated and clamped analog input (i.e. 0 – 2.5 V) for direct control of output voltage or current. That can be used in scenario when e.g. the channel output acts as an pre-regulator that track output voltage of the connected D.U.T.

The shield could be sized down both physically and “logically/electrically” when budget is tighter. If smaller PCB is required a complete BP section that contains output protections and convenient connection between two channels without extra wires could be removed and cut PCB size in half. “Electrical” reduction will decrease circuit complexity and parts count. That can be done by removing support for the Mega board when all level shifting logic (IC2, IC3, IC4, IC5, IC7 and IC8) are not needed anymore.

More radical intervention could be giving up from Arduino board/shield concept and incorporate MCU on the PCB.

Other possibility is to move from Arduino to some other open hardware platform such as BeagleBone Black or not so open Raspberry PI. Such boards comes with much more processing and memory capabilities that whole operating system such as Linux could be run. On top of that they comes with Ethernet port and multiple USB ports. Former removes need for Ethernet controller that is currently deployed on the shield and later opens new possibility for communication with PSU’s channels. For example, instead of 10-pin flat cable connection that is limited to max. 30 cm it’s possible to use 4-wire USB cable that is terminated on the other side with USB-to-SPI bridge such as MCP2210. That could also simplify isolation: instead of 8 signals that requires two digital isolators it is possible to use only one USB isolator such as ADuM3160.


One of the above mentioned shield variant is already designed. More info