Im grunde genommen funktioniert PWM so: ein Zähler Läuft von Null bis zu einem Maximalwert und fängt dann wieder von Null an (einfachstes Beispiel).
Ein PWM wird nun z.B. folgendermaßen erzeugt: wenn der Zähler auf Null ist, wird der Pin auf High gesetzt. Bei einem bestimmten Wert zwischen Null und Maximalwert wird der Pin auf Low gesetzt. Je später der Pin auf Low gesetzt wird, desto länger der Higt-Zeitraum, desto höher die Durchschnittsspannung.
Hardwaremäßig geht das, in dem es ein bestimmtes "compare-match"-Ereigniss bei den Timern gibt, das den Pin automatisch auf Low stellt, du musst nur einstellen, bei wälcher Zählzeit (bei Null wird er wieder auf High gestellt).
Wenn du es per software machen willst, musst du das manuell machen. Du beobachtest also durchgehend deinen Timer und vergleichst ihn mit deinen Werten. Bei Null stellst du den Pin auf High, und bei der passenden Zählzeit (wann immer du den Pin wieder auf Low haben willst) stellst du den Pin auf Low.
Auf Porgrammbeispiele habe ich heute nicht wirklich Lust, srry.

Gruß, Yaro