Electronic – How does an addressable LED in a strip work


Take an addressable LED strip (e.g. with chipset WS2801) that you might control with an Arduino. I understand that there are clock and data lines, and the data propagates through shift registers on each LED, extracting the information for that pixel (RGB).

I'd like to know more detail. How do the RGB values passed through the data line influence the intensity of the diodes? What logic is involved in doing this? Is it based on PWM or continuously changing the voltage of the diodes? I can't find a schematic.

Best Answer

While your question stated the WS2801 I suspect you mean the WS2812, that is the part most commonly used in a addressable LED strip.
The WS2801 is an LED controller requiring external LEDs, the WS2812 is an LED and controller in one. Either way the two parts are very similar however they do use a different electrical connection for the data link.

The datasheet for the WS2812 can be found here (the data on the WS2801 is also on that site in the LED driver IC section).

These parts have a very simple 1 wire interface that allows them to be chained together: WS2812 image from world-semi site

It's not quire like a shift register, that would imply that the first data out from the processor was for the furthest LED in the chain. It's the exact opposite, the first data is for the nearest LED.
The first LED reads the first 24 bits of data (8 bits of Green then Red then Blue) on the Din line while keeping its Dout line idle and uses that data to set up PWM drivers for it's 3 internal LEDs. After 24 bits of data have been received the device goes into pass-through mode, any further data is sent onto the Dout pin without having any internal affect.

If the data line goes idle for over a fixed length of time then the device exits the pass-through mode and will read the next set of data it receives and update the internal PWM rates appropriately.

This system means that a theoretically unlimited number of LEDs can be chained together as long as the driver is able to keep spitting the data out without too long a pause (and you have a large enough power supply). However the maximum refresh rate possible drops as the chain gets longer.

The system works very well if you want to refresh all the LEDs at once. It does not however allow you to change a single LED without changing any others (except the first one). e.g. If you only want to only update LED3 in a chain then as a minimum you must send the data for LED1, LED2 and LED3.