ein Timer braucht einen Takt, der Takt durchläuft einen sog. Prescaler, der den Takt herunterteilt (siehe Datenblatt für die Divisoren des verwendeten Timer).
Wenn du also einen 1MHz Takt hast und einen Prescaler von 1, zählt dein Timer 1 Schritt pro Takt also 1 mio Schritte pro Sekunde.
Ein 8bit Timer kann 2^8 = 256 Schritte machen und läuft dann über. Im Fast PWM bedeutet das wenn du Set on Overflow und Clear on Compare benutzt dass dein Ausgang alle 256 Schritte auf An gesetzt wird und je nachdem wie du dein Compare Register programmierst länger oder kürzer an bleibt bis Count == Compare ist.
Du kannst auch Toggle on Overflow/Compare benutzen, dann schaltet dein Ausgang immer um wenn er einmal durchgelaufen ist.
Angenommen wir machen Clear on Compare mit Prescale 1: 1.000.000 Takte/Sekunde / 256 Takte/Überlauf = 3906,25 Überläufe pro Sekunde
also 3.9kHz ca.
das ist ziemlich krumm ... nehmen wir mal statt Fast PWM & Overflow on Top die Konfiguration PWM & Overflow on Input Compare!
Damit kannst du über das Input Capture Register einstellen WANN er überlaufen soll ... manchmal benutzt er dafür auch einen der Output Compare Register für den Timer, das kommt auf den Chip und den Timer an, siehe Datenblatt.
Setzen wir den Overflow also auf 250 (denk dran, dass der Timer immer genau EINEN Prozessortakt braucht wenn er den Zielwert erreicht hat um das REgister auf 0 zu setzen BEVOR er weiter zählt)
Input Capture = 248 (von 0 bis 248 sind es 249 Takte + den Reset Takt = 250)
1.000.000 / 250 = 4000
das sind schonmal solide 4kHz
Also nehmen wir einen Prescaler von 4 (sofern verfügbar) 1.000.000 / 4 => 250.000 / 250 = 1000
Wunderbar ... FAST ... der Prescaler ist 4 damit sind es 4 Takte pro Zählschritt, das Nullsetzen braucht aber nur EINEN Takt, also sind es nicht mehr 250 Schritte sondern 249.25 ... aber der Oszillator hat in der Regel auch einen gewissen Fehler, also kannst du mit Hilfe des Input Capture und einem Oszilloskop ein wenig nachtrimmen wenn du es exakt brauchst.
Lesezeichen