Wer Mikrocontroller-Projekte professionell umsetzen will, kommt an STM32 Timers im Detail kaum vorbei. Timer sind nicht nur „Zähler“, die eine Verzögerung erzeugen, sondern eine der leistungsfähigsten Peripherieeinheiten im STM32-Ökosystem: Sie messen Zeiten mit hoher Auflösung, erzeugen präzise PWM-Signale, synchronisieren ADC-Messungen, zählen Impulse, decodieren Quadratur-Encoder und liefern Trigger für DMA-Transfers. Gerade weil STM32-Familien unterschiedliche Timer-Typen (Basic, General Purpose, Advanced Control, Low-Power) anbieten, entstehen in der Praxis viele Fragen: Welche Timer eignen sich für Millisekunden-Ticks, welche für hochauflösende PWM? Wie berechnet man Prescaler und Periodenregister sauber? Wie funktionieren Capture/Compare und Output-Compare? Und wie setzt man den Encoder-Modus so auf, dass Drehzahl und Position stabil erfasst werden? Dieser Artikel führt strukturiert durch die wichtigsten Konzepte, zeigt typische Konfigurationen (CubeMX/HAL und register-nah) und erklärt Zusammenhänge so, dass Sie Timer-Setups reproduzierbar planen, erweitern und im Debugging sicher beurteilen können.
Timer-Landschaft im STM32: Typen, Fähigkeiten und typische Einsatzzwecke
STM32-Mikrocontroller bieten je nach Serie mehrere Timerblöcke. Die Bezeichnungen variieren (TIM1, TIM2, …), doch funktional lassen sie sich gut einordnen:
- Basic Timer (z. B. TIM6/TIM7): einfache Zeitbasis, Update-Events, ideal für periodische Interrupts oder Trigger für DAC/ADC, oft ohne PWM-Ausgänge.
- General Purpose Timer: mehrere Kanäle, Capture/Compare, PWM, Input-Capture, Output-Compare, oft 16 Bit (manchmal 32 Bit).
- Advanced Control Timer (z. B. TIM1/TIM8): für Leistungselektronik, komplementäre PWM-Ausgänge, Dead-Time-Generator, Break-Input, präzise Synchronisation.
- Low-Power Timer (LPTIM): energiesparende Zeitmessung/Counting, oft im Stop/Standby nützlich, abhängig von MCU-Serie.
Die Unterschiede sind relevant: Für ein einfaches 1-kHz-Systemtick reicht oft ein Basic Timer. Für Motorsteuerungen oder Halbbrücken-PWM ist ein Advanced Timer nahezu Pflicht. Für Encoder-Auswertung eignen sich Timer mit Quadratur-Encoder-Modus (typisch General Purpose oder Advanced, je nach Serie).
Als verlässliche Einstiegspunkte zu STM32-Dokumentation und Werkzeugen eignen sich die Übersichten von ST, etwa zu STM32CubeIDE und STM32CubeMX, da dort die Toolchain und Referenzen zur Peripheriekonfiguration gebündelt sind.
Grundprinzip: Timer-Takt, Prescaler, Zähler und Auto-Reload
Fast jede Timer-Konfiguration im STM32 lässt sich auf vier Bausteine reduzieren: Eingangstakt fTIM, Prescaler (PSC), Zähler (CNT) und Auto-Reload-Register (ARR). Der Timer zählt von 0 bis ARR (oder je nach Modus in beide Richtungen). Bei Erreichen des Endes entsteht ein Update-Event (Überlauf/Unterlauf), das Interrupts, DMA oder Trigger auslösen kann.
Der Timer-Takt nach Prescaling ergibt sich zu:
Die Update-Frequenz (z. B. für periodische Interrupts) lautet typischerweise:
Wichtiger Praxisaspekt: Timer-Takt und Bus-Prescaler
In vielen STM32-Serien gilt: Wenn der APB-Bus-Prescaler größer als 1 ist, wird der Timer-Takt im Vergleich zum APB-Takt oft verdoppelt. Das führt zu „unerklärlichen“ Frequenzabweichungen, wenn man nur den APB-Takt betrachtet. Prüfen Sie daher im Clock-Tree (CubeMX) stets den tatsächlichen Timer-Kernel-Takt. Genau hier entstehen viele typische Einsteigerfehler.
Zeitmessung mit Timern: Periodische Interrupts, One-Shot und Zeitstempel
Timer eignen sich hervorragend als präzise Zeitbasis. Es gibt drei häufige Muster:
- Periodischer Interrupt (Timebase): z. B. 1 kHz, um Task-Scheduler, Soft-Timer oder Debouncing zu betreiben.
- One-Shot (Timeout): Timer läuft einmal bis ARR und stoppt; ideal für Watchdog-ähnliche Zeitfenster, Protokoll-Timeouts oder Pulsbreiten.
- Freilaufender Zähler (Timestamp): Timer läuft mit hoher Auflösung (z. B. 1 MHz), CNT wird als Zeitstempel gelesen.
Für einen 1-MHz-Zeitstempel (1 µs pro Tick) wählen viele Entwickler PSC so, dass fcnt = 1 MHz ergibt. Dann lassen sich Zeitdifferenzen einfach als CNT-Differenz in Mikrosekunden interpretieren. Bei 16-Bit-Timern müssen Sie Überläufe berücksichtigen; bei 32-Bit-Timern ist das deutlich entspannter.
Überlauf korrekt behandeln
Wenn CNT überläuft, ist eine einfache Subtraktion trotzdem möglich, solange Sie in unsigned-Arithmetik arbeiten und die Differenz nicht größer als der Zählbereich ist. Alternativ zählen Sie Update-Events mit und bauen einen erweiterten Zeitstempel (z. B. 16 Bit CNT + 16 Bit Overflow-Counter). Damit erhalten Sie eine stabile Zeitbasis für Profiling, Sensor-Timing oder Kommunikationsmessungen.
Capture/Compare: Die Schlüsselmechanik für Messen und Erzeugen
Capture/Compare-Kanäle sind das Herzstück vieler Timer-Funktionen. „Capture“ bedeutet: Ein externer Signalflankenereignis speichert den aktuellen CNT-Wert in ein Capture-Register (CCR). „Compare“ bedeutet: Wenn CNT einen Compare-Wert erreicht, wird ein Ereignis ausgelöst (z. B. Pin toggeln, PWM schalten, Interrupt/DMA).
- Input Capture: Pulsbreite, Periodendauer oder Frequenz eines externen Signals messen.
- Output Compare: präzise Zeitpunkte für Ereignisse erzeugen (z. B. Toggle-Ausgang, Trigger-Impulse).
- PWM: Compare steuert Duty Cycle, ARR steuert Periodendauer.
Input Capture für Frequenzmessung
Ein typischer Ansatz: Sie erfassen zwei aufeinanderfolgende Flanken, lesen die beiden Capture-Werte und bilden die Differenz. Aus der Tick-Differenz und fcnt berechnen Sie Periodendauer und Frequenz. Damit sind auch sehr kurze Impulse oder hohe Frequenzen messbar, solange das Signal sauber und der Timer-Takt hoch genug ist.
PWM im STM32: Präzision, Auflösung und sichere Updates
PWM (Pulsweitenmodulation) ist eine Standardanwendung für STM32-Timer. Grundidee: ARR definiert die PWM-Periode, CCR den Umschaltpunkt innerhalb der Periode. Je höher ARR, desto feiner die Auflösung des Tastgrads – allerdings sinkt bei festem Timer-Takt dann die PWM-Frequenz. Das ist der zentrale Trade-off.
Die PWM-Frequenz ist (wie oben) abhängig von PSC und ARR. Der Duty Cycle lässt sich näherungsweise so ausdrücken:
Für LED-Dimmen reichen oft einige kHz PWM-Frequenz und 9–12 Bit Auflösung. Für DC-Motoren sind 16–25 kHz beliebt (oberhalb der Hörgrenze). Für Servos sind 50 Hz mit 1–2 ms Pulsbreite typisch. Die Wahl hängt also vom Anwendungsfall ab.
- Preload aktivieren: Damit werden Änderungen an CCR/ARR erst beim Update-Event übernommen, was Glitches vermeidet.
- Center-Aligned Mode: Reduziert bestimmte EMV-Effekte und kann symmetrische Schaltflanken erzeugen.
- DMA für PWM-Wellenformen: Duty-Cycle-Listen ausgeben (z. B. LED-Fades oder Motorprofile) ohne CPU-Last.
Advanced Timer: Dead Time, Break und komplementäre PWM
Für Leistungselektronik (Halbbrücken, BLDC, Inverter) sind Advanced Timer wichtig. Komplementäre Ausgänge (CHx/CHxN) erlauben High-Side/Low-Side-Ansteuerung, Dead Time verhindert Shoot-Through, und Break-Inputs können bei Fehlern (z. B. Überstrom) die PWM hardwareseitig sofort abschalten. Diese Funktionen erhöhen Sicherheit und Robustheit deutlich, wenn sie korrekt integriert sind.
Encoder-Modus: Quadratur-Encoder auswerten – Position und Richtung
Der Encoder-Modus nutzt zwei phasenverschobene Signale (A und B) eines inkrementellen Encoders. Der Timer interpretiert diese Signale hardwareseitig und zählt je nach Drehrichtung hoch oder runter. Dadurch erhalten Sie Position und Richtung, ohne Flanken in Software auswerten zu müssen. Das ist für Motorregelung, Robotik, CNC-ähnliche Anwendungen oder Präzisionsantriebe besonders wertvoll.
- Encoder A/B an Timer-Kanäle: meist CH1 und CH2 als Inputs.
- Zählmodus: x2 oder x4 je nach Auswertung (Flanken auf einem oder beiden Kanälen).
- CNT als Positionszähler: kann fortlaufend gelesen werden, mit Überlaufbehandlung für lange Wege.
Auflösung und Umrechnung in Winkel oder Weg
Die mechanische Encoderauflösung wird oft als Impulse pro Umdrehung (PPR) angegeben. Bei Quadraturauswertung erhöht sich die effektive Zählauflösung. Beispiel: Bei x4-Auswertung werden pro Impuls vier Flanken gezählt. Die Schritte pro Umdrehung sind dann:
Der Winkel pro Schritt ergibt sich zu:
Für lineare Systeme (Spindel, Riemen) ersetzen Sie den Winkel durch Weg pro Umdrehung und erhalten direkt Millimeter pro Tick. So lässt sich aus CNT eine physikalische Position berechnen.
Drehzahlmessung mit Encoder: Differenzen, Zeitfenster und Filter
Aus dem Positionszähler allein erhalten Sie noch keine stabile Drehzahl. Gängige Methoden sind:
- Delta-CNT pro Zeitfenster: Sie lesen CNT in festen Intervallen (z. B. alle 1 ms) und berechnen die Differenz.
- Periodenmessung per Input Capture: Sie messen die Zeit zwischen Encoderflanken, gut für niedrige Drehzahlen.
- Kombination: Umschalten zwischen Methoden, um in weiten Drehzahlbereichen stabil zu bleiben.
Für die Delta-Methode gilt bei einem festen Zeitfenster Δt:
Um daraus Umdrehungen pro Sekunde zu erhalten, teilen Sie durch die Schritte pro Umdrehung. In realen Systemen sollten Sie das Ergebnis filtern (z. B. gleitender Mittelwert oder IIR), um quantisierungsbedingtes Rauschen zu reduzieren.
Trigger, Synchronisation und DMA: Timer als Taktgeber für das Gesamtsystem
Timer werden in STM32-Projekten oft zum „Orchestrator“: Sie triggern ADC-Messungen zu exakt definierten Zeitpunkten, starten DMA-Transfers, synchronisieren mehrere PWM-Kanäle oder koppeln Timer untereinander (Master/Slave). Das ist besonders wichtig, wenn Messungen phasenrichtig zur PWM stattfinden sollen (z. B. Strommessung bei Motorsteuerung).
- Timer-Trigger für ADC: reproduzierbare Abtastzeitpunkte, weniger Jitter als softwaregesteuert.
- DMA für periodische Updates: Duty-Cycle, Compare-Werte oder Output-Patterns ohne CPU-Overhead.
- Timer-Kaskadierung: ein Timer erzeugt Zeitbasis, ein anderer generiert PWM oder Encoderzählung.
Jitter vermeiden: Warum Hardware-Trigger überlegen sind
Wenn Sie PWM und Messung softwaregesteuert „irgendwann im Interrupt“ aktualisieren, entsteht Jitter durch Interrupt-Latenzen und konkurrierende Tasks. Hardware-Trigger (Timer-Events) sind deterministischer und damit in Regelungen oder präzisen Messketten deutlich überlegen. Das ist einer der Gründe, warum Timer in STM32-Systemen oft zentraler sind als es auf den ersten Blick wirkt.
Typische Stolpersteine und Debugging-Checkliste
Wenn Timer nicht wie erwartet laufen, liegt es häufig an wenigen, wiederkehrenden Ursachen. Diese Checkliste hilft beim systematischen Debugging:
- Clock-Tree prüfen: Stimmt der Timer-Kernel-Takt wirklich? APB-Prescaler und Timer-Multiplikator beachten.
- Prescaler/ARR plausibel: Ergibt die Rechnung die gewünschte Frequenz? ARR = 0 ist ein häufiger Fehler.
- Preload/Update-Events: Werden Registeränderungen sofort oder erst beim Update übernommen?
- GPIO Alternate Function: Bei PWM/Encoder: Ist der Pin korrekt gemappt und als AF konfiguriert?
- Interrupt-Prioritäten: Werden Timer- oder DMA-Interrupts blockiert, weil andere ISRs zu lang laufen?
- Messmittel korrekt: Oszilloskop-Masseführung und Trigger-Einstellungen prüfen, sonst entstehen Fehlinterpretationen.
Weiterführende Ressourcen: Datenblätter, Reference Manuals und Beispiele
Für belastbare Implementierungen empfiehlt es sich, neben CubeMX auch immer die MCU-spezifischen Reference Manuals zu nutzen, da dort Timer-Register, Sondermodi und Einschränkungen präzise beschrieben sind. ST bündelt viele Dokumente und Lernressourcen über die STM32 Education-Seite. Für einen breiteren Blick auf Timer- und PWM-Konzepte allgemein kann zusätzlich der Hintergrund zu Pulsweitenmodulation helfen, insbesondere wenn Sie Anwendungen wie Motorsteuerungen, Dimmer oder getaktete Leistungsregelung planen.
IoT-PCB-Design, Mikrocontroller-Programmierung & Firmware-Entwicklung
PCB Design • Arduino • Embedded Systems • Firmware
Ich biete professionelle Entwicklung von IoT-Hardware, einschließlich PCB-Design, Arduino- und Mikrocontroller-Programmierung sowie Firmware-Entwicklung. Die Lösungen werden zuverlässig, effizient und anwendungsorientiert umgesetzt – von der Konzeptphase bis zum funktionsfähigen Prototyp.
Diese Dienstleistung richtet sich an Unternehmen, Start-ups, Entwickler und Produktteams, die maßgeschneiderte Embedded- und IoT-Lösungen benötigen. Finden Sie mich auf Fiverr.
Leistungsumfang:
-
IoT-PCB-Design & Schaltplanerstellung
-
Leiterplattenlayout (mehrlagig, produktionstauglich)
-
Arduino- & Mikrocontroller-Programmierung (z. B. ESP32, STM32, ATmega)
-
Firmware-Entwicklung für Embedded Systems
-
Sensor- & Aktor-Integration
-
Kommunikation: Wi-Fi, Bluetooth, MQTT, I²C, SPI, UART
-
Optimierung für Leistung, Stabilität & Energieeffizienz
Lieferumfang:
-
Schaltpläne & PCB-Layouts
-
Gerber- & Produktionsdaten
-
Quellcode & Firmware
-
Dokumentation & Support zur Integration
Arbeitsweise:Strukturiert • Zuverlässig • Hardware-nah • Produktorientiert
CTA:
Planen Sie ein IoT- oder Embedded-System-Projekt?
Kontaktieren Sie mich gerne für eine technische Abstimmung oder ein unverbindliches Angebot. Finden Sie mich auf Fiverr.

