я делал 8-битный ШИМ примерно так:
R_PWM = (BRIGHT * R) >> 8;
G_PWM = (BRIGHT * G) >> 8;
B_PWM = (BRIGHT * B ) >> 8;
где R,G,B - заданный цвет, а BRIGHT - яркость общая, все переменные uint8_t.
проблема лишь в том, что далеко не все RGB-светодиоды сохраняют линейную зависимость яркости от тока... у многих кристаллы вообще имеют разную яркость при одинаковом токе... но чисто для себя полюбоваться - покатит
http://www.simple-devices.ru/news/11-wow/51-mood-lamp-video