TLC5940 PWM Driver

Views: 20061 Difficulty: 3 Status: Complete

Think of it like a shift register for Pulse Width Modulation (PWM).

The TLC5940 chip allows you to drive 16 Pulse Width Modulation PWM pins from 1 PWM and 4 control lines. Sort of like a serial-in, parallel out shift register, the TLC5940 gives 16 12-channel PWM outputs using only 5 lines on the microcontroller. We use these chips in our RGB flower necklace, to light up vibrant rainbow color around your sweetheart's clavicle. There is a great library to control these chips available for arduino. Another nice feature of these chips is they allow daisy-chaining. Want to see a tutorial about daisy-chaining TLC5940's? Let us know in the comments!

4 TLC5940 modules

4 TLC5940 modules being driven by an Arduino clone.

TLC5940 Driver and Module Video

Video demonstrating 4 TLC5940 modules being driven by an Arduino clone. As the potentiometer spins the speed of the rainbow changes. The second part of the video shows the tree PCB with its 16 LEDs also powered by a TLC5940.


This code uses the TLC5940 arduino library available here. It also uses our arduino color library available here. The code outputs a rainbow to five RGB LEDs hooked up to the TLC5940.
/* LucidTronix HSB RGB necklace
 * uses TLC5940 chip. for details see:
 * Control rgb color by specifying
 * Hue saturation and brightness.
 * This code shows a rainbow.
 * It is okay to daiy-chain the chips
 * just change the NUM_TLCS constant
 * in the Tlc5940.h file.
 * This code uses an arduino color library
 * available here:
#include "Tlc5940.h"
#include "tlc_fades.h"
#include "color.h"
// how many millis to strobe over all the LEDs


Color cur_color(1,1,1);
int scope_period = (200 * NUM_TLCS);
int led_period = scope_period / (NUM_TLCS * 16);
float hue = 0;

void setup()

void loop()
  hue += 0.001;
  if ( hue >=1 ) hue = 0;
  float sat = 1.0;
  float val = 0.5;

  uint32_t lastMillis = millis();
  int cur_val = channel % 3;
  int color_component = 0;
  if ( cur_val == 0) color_component =*16;
  else if  ( cur_val == 1) color_component =*16;
  else if ( cur_val == 2) color_component =*16;
  tlc_addFade(channel,                      // led channel
              color_component,   // start fade value (0-4095)
              color_component,                            // end fade value (0-4095)
              lastMillis + 2,               // start millis
              lastMillis + (uint16_t)scope_period / 4  // end millis
  if (channel++ == NUM_TLCS * 16) {
    channel = 0;
  uint32_t currentMillis;
  do {
    currentMillis = millis();
  } while (currentMillis - lastMillis <= led_period);


Title Description # Cost Link Picture
TLC5940 IC LED DRIVER PWM CONTROL 32-QFN Value: 3 V ~ 5.5 V 1 $3.37 Link Screen_shot_2012-12-28_at_7.34.51_pm
ATMEGA168A-AU IC MCU AVR 16K FLASH 32TQFP Value: 1.8 V ~ 5.5 V 20MHz 1 $2.43 Link Screen_shot_2012-12-28_at_7.31.53_pm
Potentiometer POT ROTARY, Linear 10K OHM 9MM SNAPIN Value: 10k 1 $0.76 Link Screen_shot_2012-12-28_at_7.41.04_pm
RGB LED LED RGB SMD DIFF 4-PLCC Value: 1.9V Red, 3V Green, 3V Blue 5 $0.55 Link Clvba-fka
Switch SWITCH SLIDE DPDT 6VDC 0.3A SMT Value: DPDT 1 $0.44 Link Mfg_js202011scqn
LED SMD LED 3X1.5MM 568NM Green Clear SMD Value: 2.2V Green 16 $0.18 Link Apl3015sgc-f01
Button 6mm Through Hole Tactile Switch Through Hole SPST-NO 0.05A 12V Value: 0.05A @ 12VDC 2 $0.1 Link Screen_shot_2012-12-28_at_7.41.40_pm
Rainbow flower necklace using the TLC5940....
RGB Flashlight, wearable sound art, rainbow lamp....
32 buttons for a fully-functioning hand-held USB keyboard....
Wearable digital compass displays the direction in green LEDs....
Play pong on a little LCD screen with two big joysticks....
Control a 120v outlet with a 5V arduino....
Wall-ter is a wall following robot....
An arduino library for the MMA8453 Triple Axis Accelerometer...