Using ShiftPWM to control 350mA high power LED’s with Arduino

To use ShiftPWM with high power LED’s, like 1W or 3W star LED’s or Luxeon Rebel LED’s, you need a bit more than just shift registers. A normal shift register can only deliver 20mA per pin but these LED’s can go up to 350mA.

There are a few options how to use ShiftPWM with high power LED’s. You can buy a board from me that makes the whole process a bit more plug and play. This article explains the options and design considerations.

General design considerations

There are a few things you have to keep in mind when working with high power LED’s, mainly current limiting and heat dissipation.

Current limiting

High power LED’s require, just like any other LED, that you limit the current through the LED. Because LED’s are diodes, they have a very steep voltage-current characteristic: a small deviation in voltage might be the difference between no light and blowing up your LED. You should therefore never try to drive LED’s by providing ‘just the right voltage’. There are two ways to control the current through an LED: resistors or constant current drivers.

Using resistors to limit the LED current

The simplest way to control LED current is to just place a resistor in series with the LED. The value of the resistor should be R = \frac{V_{CC}-V_{FW}}{I}, where VCC is the supply voltage and VFW is the LED forward voltage. When you are using 350mA LED’s, the resistance you need will be very small: R = \frac{5V-3.3V}{350mA}=4.86\Omega.

The power dissipated by the resistor in this case will be 1.7V*0.35A = 0.6W.

You have to make sure that the resistors you are using have a power rating that is higher than that, otherwise they will be damaged. Using two resistors in parallel (with double the value of course) will distribute the heat and stay cooler.

When you have your resistors sorted out, you need to switch the current with a transistor that has a current rating higher than 350mA. Your shift registers will drive the transistors and those will switch the LED current.

My first prototype high power LED driver used this approach: it used BS170 MOSFET’s and two resistors per LED pin.

Using constant current LED drivers

A constant current LED driver integrates all 3 components (shift register, switching and current limiting) in one device. You can just connect the LED’s directly to the driver and control the brightness with an Arduino.

You can set the current for all outputs with one resistor. Not many constant current LED drivers are available that can handle 350mA per pin, most of them only go up to 150mA. The reason for this is that the driver has to dissipate the difference between the supply voltage and the LED forward voltage and it will get hot. To prevent the LED drivers from getting hot, you will have to keep the voltage difference low.


Both the LED’s and LED driving circuit will generate a lot of heat. When working with high power LED’s you will have to make sure that this heat can be transported away from the LED’s and electronics. Most high power LED’s are mounted on an aluminum star for this purpose, but you will have to mount these stars on a piece of steel or aluminum too to prevent the LED’s from overheating. You will also have to make sure to put your electronics in an enclosure with proper ventilation.

My high power LED driver for ShiftPWM

I have designed a small board with three STP04CM05XTTR LED drivers. You can find it in my shop here. The STP04CM05XTTR integrates a 4-bit shift register with 4 constant current sinks outputs. To get rid of the heat that is generated, the XTTR version of the IC has an exposed pad under the IC, which has to be soldered to the PCB. This makes it impossible to solder this driver by hand and that is why I decided to design a PCB and start selling it on my website.

My ShiftPWM high power LED driver

My ShiftPWM high power LED driver

The board has 12 outputs, so one board will allow you to control 12 single color LED’s or 4 RGB LED’s. On the board are 3 potentiometers, which you can use to adjust the current between 70 and 350 mA for each 4 outputs separately. This allows you to correct for brightness differences between red green and blue. Multiple boards can be chained to create as many outputs as you need.

I made the board as small as possible, it measures 57 x 19 mm. All inputs and outputs are on a 2.54mm grid, which should make it easy to connect it to a perfboard or to use headers or screw terminals. I am selling the small screw terminals separately for this board, because they are just very expensive.

ShiftPWM high power LED driver with screw terminals

My ShiftPWM high power LED driver with screw terminals

Power supply

The current of a few 3W RGB LED’s quickly adds up to huge supply current. 8 LED’s will require 8.4A (8x3x350mA). You need a beefy power supply and thick wires. A computer power supply and at least 1.5 mm2 wire  works well.

The drivers are current sink drivers: they connect to the minus side of the LED’s. The supply voltage for the LED’s is not present on this board, it has to be connected to the positive side of the LED’s separately. This board just needs a 5V digital supply voltage, which can come from the Arduino.

I already mentioned that the voltage difference between the LED supply voltage and he forward voltage is converted to heat by the LED drivers. To reduce heat production, you need to keep this difference small. A LED supply voltage that is 0.5V above your forward voltage is ideal. To generate this voltage, I am selling 16A DC-DC converters as well. They convert a 8.4-14V input voltage to an adjustable output voltage of 0.75-5.5V.

The 16A Murata DC-DC converter available in my shop

Complete schematic for high power LED’s and ShiftPWM

Click the image below to view a full schematic of how to use ShiftPWM with high power LED’s. It uses two of my high power LED driver boards and two DC-DC converters. You can find both of them in my shop.

Full ShiftPWM High Power LED Schematic. Click to expand.


  • The red LED’s have a lower forward voltage than the green and blue LED’s. By placing a diode in series with the red LED’s, the combined forward voltage of the normal diode and LED equals the forward voltage of the blue and green LED and all LED’s can be powered from the same power supply.
  • The sense input of the DC-DC converter allows it to sense the output close to the LED’s to compensate for the voltage drop over a long wire. If you are using short wires, you can just connect it to the outputs at the DC-DC converter.
  • You can adjust the output voltage of the DC-DC converter with a potentiometer to the ideal value of 0.5V above the LED forward voltage. The easiest way to do it is to measure the voltage at an output of the LED driver when the LED is on and to turn the potentiometer until it reads 0.5V.
  • Use ShiftPWM_invertOutputs = false.
  • Make sure that the ground of your Arduino and the ground of your external power supply are connected.
  • Try to avoid running thick power wires parallel to your data/clock/latch wires. They can cause interference due to the high switched currents.
  • If your data/clock/latch wires are very long, the Arduino might not have enough power to drive them. Take a look at my article for normal LED’s for a push-pull line driver circuit to solve this problem.
  • If the LED drivers get too hot or get a too high voltage on their outputs, they will automatically shut down until you disconnect and reconnect the digital supply voltage.
  • If you want to use 700 mA LED’s, you can tie two LED driver outputs together to drive one LED.




Leave a Reply

Your email address will not be published. Required fields are marked *