Hi Markus,
die Pulsweite kann pro Port individuell eingestellt werden und "Last" erzeugt man damit überhaupt nicht. Technisch funktioniert das so:
Jeder Timer des Microcontrollers erhöht bei jedem CPU-Takt den Wert eines bestimmten Registers("TCNT") um 1. Über einen Prescaler kann man das noch verringern.
In einem weiteren Register (ICR) kann man vorgeben bei welchem TCNT-Wert er wieder bei 0 mit dem Zählen beginnen soll. Hier bestimmt man als die Frequenz.
In einem weiteren Register ("OCCR") kann man einstellen bis zu welchem TCNT-Wert der Port auf HIGH bleiben soll, hier wird die Pulsweite bestimmt.
Zusätzlich gibt es noch zwei unterschiedliche PWM-Modi, einer läuft nochmal 50% langsamer.
Die Bitbreite reduziert sich mit höherer Frequenz weil man dafür niedrigere Werte für ICR angeben muss. Der Timer zählt also weniger weit hoch, dementsprechend hat man auch weniger gültige Werte für die Pulsweite.
Jeder Timer hat ein TCNT-Register und ein ICR-Register, man kann also pro Timer eine Frequenz (und damit auch ein maximale Bitbreite) einstellen. Beim Atmega2560 gehören zu jedem Timer drei OCCR-Register, die jeweils einen Port steuern. Man kann also auf jedem Port einen anderen Duty-Cycle angeben. Das läuft alles völlig unabhängig voneinander und auch wenn der Controller im Standby ist (je nach Standby-Modus). Der Prozessor muss also gar nichts hierfür tun, läuft alles automatisch parallel im Hintergrund ab. Der Prozessor wird nur benötigt um Register-Werte auf dem Programm heraus zu ändern.
Gruß
Stefan