I would never power LEDs in parallel without a series resistor in each branch to balance the currents between the branches, especially if the LEDs are intended to be powered close to their maximum current. If you don’t try the balance the currents, a branch may get slightly more current than the others, which will make the LEDs in the branch slightly hotter, changing the U-I characteristics such that the branch will get more current, and you have thermal runaway. I think a 1Ω resistor in each branch should be enough.
The pulse current is the maximum current allowed in the LED for a short time (for example if one wants to flash the led for a still picture camera). The max current should be the maximum current the LED can accept, probably with perfect thermal dissipation. I’d rather not use currents much higher than the nominal current.
Your calculations for resistor values and power dissipations look fine to me.
Edit: it is not fine. First, if the maximum current in your LEDs is \$4 \times 90\textrm{mA} = 360\textrm{mA}\$ you should certainly not design a current regulator for a higher current, or you will burn your LEDs. You should rather design it for a lower current to ensure you won’t burn them. I’d go for \$4 \times 60\textrm{mA} = 240\textrm{mA}\$. Then, you’d get \$\textrm{R5} \parallel \textrm{R6} = \frac{0.7\textrm{V}}{0.24\textrm{A}} = 2.9\Omega\$, with \$\textrm{R5} \parallel \textrm{R6} = \frac{\textrm{R5} \times \textrm{R6}}{\textrm{R5} + \textrm{R6}}\$. If you choose \$\textrm{R5} = \textrm{R6}\$ (which is sane), you have \$\textrm{R5} \parallel \textrm{R6} = \frac{\textrm{R5}}{2} = \frac{\textrm{R6}}{2}\$, hence \$\textrm{R5} = \textrm{R6} = 5.8\Omega\$.
Your circuit is more a current limiter than a current regulator. It works because when current gets (too) high, the Vbe of T1
gets high, and then T1
will reduce the Vgs voltage of Q1
, which become more resistive and will reduce the current. R7
is useful so that T1
can reduce the voltage. Without it, you might just burn T1
if WHITE_GPIO
was connected to a low-impedence voltage source.
I have no idea about the use of R21
.
I'm almost completely sure they're common anode(12V+ pin + 3 for each color channel to GND).
OK. So we need to switch the GND pins (low-side switch).
TP120 VCE(sat) = 2.0 Vdc (Max) @ IC = 3.0 Adc
= 4.0 Vdc (Max) @ IC = 5.0 Adc
Well your LEDs aren't gonna light very well if the transistor eats 2-4V from their 12V supply. So we use a MOSFET.
Max current per strip is about 5A. We dont want heatsinks, so this means 0.5W max dissipated in the switch. So we should select a MOSFET with 20mOhm RdsON. If driven from 5V these should be a logic level FET.
Example. Just use DigiKey/Mouser search engine with criteria: RdsON<20mOhm, Vds 20-40V, Id>10A, Thru-Hole, Sort by price. If driven from 5V, add RdsON<20mOhm for Vgs=4.5V, otherwise it will be at 10V Vgs.
Place them in the power supply air flow for cooling.
Now, the driver... your TLC5940 outputs are current sinks, meant to drive LEDs directly. It can't drive a FET without some help.
You could connect the outputs to the FET gates and add pullups, but signals will be inverted (LEDs will light fully when PWM is at 0%).
Or you could use an extra transistor as an inverter like this guy. Seems pretty easy.
In this case since the FET is driven from +12V you don't even need a logic level FET.
Best Answer
The point of using a constant current driver is to avoid the use of less efficient current limiting items (such as resistors). Since you already have resistors in the LED strip acting as the current limiter, adding a constant current IC and other necessary components would be more detrimental than beneficial in your application by adding not only the complexity but also the inefficiency of both methods. Also with a constant current driver you will be unable to change the length of the strips you are using without having to readjust the constant current. With a constant voltage you can just add or remove strips or length to the same driver provided it can handle the load, since the current limiting will be embedded in the strip. Using a fet to drive the strips is a common method, if you are worried about this method of control.