1-Mikrosekunden-Timer

Bereits seit geraumer Zeit hatte ich vor, einen Timer zu realisieren, der im Rhythmus von einer Mikrosekunde "tickt". Mit einem Mikrocontroller, der mit einer Maximalfrequenz von 180 MHz getaktet wird, sollte dies problemlos möglich sein. Meine ersten Versuche nutzten allerdings seinerzeit nur die Standard-Taktfrequenz der NUCLEO-Boards aus, die also nur mit 16 MHz getaktet werden, sodass ich aufgrund kleiner Werte für den Preload-Wert des verwendeten Timers schnell an die Grenzen des Systems gestoßen bin: Kürzere Delays als 5µs konnte ich so nicht zuverlässig erzeugen.

Im Internet findet man auch zahlreiche Tutorials, die aber allesamt die HAL-Bibliothek nutzen, deren Verwendung ich aber vermeiden wollte. Mit der von mir entwickelten MCAL-Bibliothek ist die Generierung von 1-µs-Delays inzwischen aber auch kein Problem mehr. Wenn Sie ebenfalls vor der Herausforderung stehen, Delays von 1µs (oder kürzer) erzeugen zu müssen, kann Ihnen das folgende Beispiel bei der Lösung dieser Anforderung behilflich sein!

Mit der MCAL-Bibliothek stelle ich zunächst eine Taktfrequenz von 160 MHz ein (siehe Funktion configClock(160)). Hierdurch erreiche ich durch die Verwendung zulässiger Prescaler-Werte für die Busse AHB/APB1/APB2 ganzzahlige Werte ohne Rest, sodass die Einstellung des gewünschten Delays besonders einfach ist. Für das Beispiel habe ich Timer TIM2 verwendet, andere Timer sollten aber ebenfalls verwendbar sein. Wenn Ihnen ein Oszilloskop zur Verfügung steht, so können Sie an Pin PB8 (GPIOB, Pin 8) das Ergebnis leicht nachvollziehen. Wie die folgenden Oszillogramme zeigen, lassen sich bei geeigneter Wahl des Preload-Values von TIM2 sogar Delays von 250 ns erzielen. Achten Sie beim "Spielen" mit dem Preload-Wert nur darauf, dass dieser nicht zu klein wird: Für das Delay von 250 ns habe ich den Preload-Wert auf 10 gesetzt, für das 500-ns-Delay auf 20 und für das 1000-ns-Delay auf 40.

 

Delay: 250 ns

Delay: 500 ns

Delay: 1000 ns (= 1µs)