Für so viele Kanäle sollte man das software PWM schon in ASM schreiben. Ob man jetzt Inline ASM oder als extra Datei ist relativ egal. Als dritte alternative wäre noch das gesamte Programm in ASM zu schreiben.
Da man wohl die komplette ISR in ASM hat, ist die extra Datei vermutlich einfacher, Inline ASM bei GCC ist zwar sehr mächtig, aber auch etwas unübersichtlich.

Gerade die Software PWM routine geht in ASM sehr effektiv - auch mit guter optimierung wird ein C Compiler da noch etwa 2-3 mal langsamer sein. Man kann da zum einen das Laden aus dem Speicher und hochzählen per LD Reg,x+ machen. Wenn man glück hat schaft das der Compiler auch, von der Tendenz her aber eher nicht. Vor allem kann man aber die Ergebnisse des Vergeleiches per ROL oder ROR direkt aus dem Carry flag in ein Byte zusammenfassen - da gibt es in C einfach keine equivalente Strucktur. Die Vergleiche für die 15 Kanäle kann man einfach so hintereinander schreiben, ohne Schleife., da sind je Kanal ja nur 3 Befehle (LDR,x+ / cp / ROL ).

Mit dem Hardware PWM könnte auch gehen, aber man sollte das PWM Signal ja mit der Umschaltung der LED Ebenen syncron halten. Es könnte gehen auch ein Paar LEDs per hardware zu steuern, viel Vorteil hat man dait aber nicht - dafür aber ein schränkungen bei der Frequenzwahl, um syncron zu bleiben.
Es wird also jede LED nur für eine unterschiedliche lange Zeit angeschaltet, dann ggf. etwas gewartet und dann schon die nächste LED-gruppe.