STM8 Timer 1


Timer-Pin als Ausgang

Die Timer-Pins TIM1_CHi können über das Bitfeld CCiS[1:0] im jeweiligen Register TIM1_CCMRi auch als Ausgang konfiguriert werden. Die Auswahl kann für jeden Timer-Kanal unabhängig durchgeführt werden.

Im TIM1_BKR Register befindet sich das MOE-Bit (Master Output Enable) welches alle Ausgänge sperrt solange es auf „0“ programmiert ist. Diese Funktion gilt für alle Modi welche die Ausgänge benutzen und deshalb muß dieses Bit zwingend aktiviert werden (MOE = 1) um an den Ausgängen ein Signal zu erhalten.

Unterstützt wird die MOE Funktionalität durch das AOE-Bit (Auto Output Enable) welches eine Änderung des MOE Bits auf die Software begrenzt oder zusätzlich eine automatische Änderung nach einem Update Event ermöglicht.

Komplementär-Ausgänge

Die Ausgänge der Kanäle TIM1_CH1, TIM1_CH2 und TIM1_CH3 sind außerdem im Komplementär-Format vorhanden (TIM1_CH1N, TIM1_CH2N und TIM1_CH3N) und können so für die Ansteuerung von Treibern für einen Motor benutzt werden.

TIM1_CH4 besitzt keinen Komplementärausgang ist aber über den TIM1_BKIN Blanking Eingang steuerbar. Dieser Blanking Kanal verfügt über ein eigenes Bit zur Polaritätseinstellung (BKP) und ein eigenes Freigabe-Bit (BKE) im Break-Register TIM1_BKR.

Neben den „Break Polarity“ und dem „Break Enable“ Bits gibt es noch zwei weitere Bits im TIM1_BKR Register die das Verhalten der Ausgänge im Ausschaltzustand im „Run-Mode“ (OSSR) mit MOE = 1 und für den „Idle_Mode“ (OSSI) mit MOE = 0 definieren.

Totzeiteinstellung der Ausgänge

Eine weitere Besonderheit der drei komplementären Kanäle sind die Totzeit Generatoren die ein Überlappen der komplementären Signale eines Ausgangs unterbinden.

Die einstellbare Totzeit ist immer ein Vielfaches des Zählertaktes fCK_PSC welcher durch den Prescaler erzeugt wird. Die Totzeitgeneratoren addieren die in TIM1_DTR für alle Kanäle eingestellte Totzeit zum Ende des „normalen“ Ausgangssignals OCi (positive Flanke) und verzögern den Einschalt-zeitpunkt des „komplementären“ Ausgangssignal OCiN (positive Flanke) um den selben Wert.

Die Einstellung der Totzeit erfolgt im TIM1_DTR Register welches einen 8-Bit Wert beinhaltet, der jedoch keinen linearer Wert darstellt sondern auf unterschiedliche Formeln für die Berechnung durch die Bits DTG[7:5] zurück greift.


DTG[7:5] DT (Totzeit in Takten) mit tdtg

0x0XXb

DT = DTG[7:0] * tdtg

tdtg = 1 * fCK_PSC

0x10Xb

DT = (64 + DTG[5:0]) * tdtg

tdtg = 2 * fCK_PSC

0x110b

DT = (32 + DTG[4:0]) * tdtg

tdtg = 8 * fCK_PSC

0x111b

DT = (32 + DTG[4:0]) * tdtg

tdtg = 16 * fCK_PSC<

Aus dieser Tabelle sind die verschiedenen Formeln für die Totzeiteinstellung (DT) ersichtlich.

Als kleinster Wert ist mit DTG[7:0] = 0x0000.0001b ein Takt der fCK_PSC Frequenz einstellbar was beispielsweise bei einer Zählerfrequenz von 8 MHz einer Totzeit von 125 ns entspricht.

Als größter Wert bei der gleichen Frequenz wird bei einer Einstellung von DTG[7:0] = 0x1111.1111b nach der gegebenen Formel DT = (32 + DTG[4:0])* (16 * fCK_PSC) , also (32 + 31)*(16 * 125ns) = 126 μs erreicht.

Es besteht die Möglichkeit die Totzeit länger als das negative gehende Signal OCiREF einzustellen. Dies führt zu folgendem Verhalten der Ausgangssignals OCi und OCiN.

Totzeit ist grösser als negatives Signal

Das „normale“ Signal OCi wird um die Totzeit verlängert, während das „komplementäre“ Signal OCiN durch die Totzeit vollständig unterdrückt wird.

Totzeit ist größer als positives Signal

Ein ähnliches Verhalten ergibts sich bei einem positiven Ausgangsimpuls an OCiREF. Die Totzeit verschiebt die steigende Flanke das OCi Signals soweit bis das ansteuernde OCiREF Signal bereits wieder einen „Low Pegel“ erreicht hat.

Das komplementäre OCiN Signal oder genauer die steigende Flanke des Signals wird um die Totzeit verlängert, daher verlängert sich der Puls gegenüber dem ursprünglichen Timing.

Forced Output Mode

Ein Capture/Compare Kanal der im Output Mode (CCiS-Bits = 0x00b im TIM1_CCMRi Register) programmiert ist, kann über das OCiM[2:0] Bitfeld im TIM1_CCMRi statisch auf „high“ oder „low“ gesetzt werden. Dazu wird das Bitfeld entweder mit 0x100b („Force Low“) bzw. mit 0x101b („Force High“) beschrieben.

Das OCiM[2:0] Bitfeld beinflußt aber ausschliesslich das interne OCiREF Signal. Die weitere Verarbeitung des Ausgangssignals durchläuft noch die Polaritätsumschaltung des Ausgangs welche

durch das CCiP-Bit bestimmt ist, daher kann beispielsweise bei einem auf „Forced Low“ gesetzten OCiREF durch das CCiP-Bit = 1 der Ausgangs-Pin auf „High Pegel“ gesetzt werden.

Einen Einfluß auf die physikalischen Ausgangssignale TIM1_CHi haben auch die CCiE-Bits welche die Ausgang-Signale OCi und OCiN erst freischalten.

Die gesamte Funktionsweise bezieht sich natürlich auch auf die Komplementär-Ausgänge TIM1_CHiN.

Output Compare Funktion

Der „Output Compare“ Modus wird alternativ durch die Werte 0x001b, 0x010b oder 0x011b im Bitfeld OCiM des TIM1_CCMRi und durch den Wert 0x00b in den Capture Compare Selection Bits CCiS des TIM1_CCERi aktiviert, welche auch den Timer-Pin TIM1_CHi als Ausgang konfigurieren .

Die Struktur eines Compare-Kanals ist im Bild dargestellt. Der Vergleich erfolgt zwischen dem 16-Bit Auf/Abwärtszähler und dem 16-Bit Capture/Compare Shadow Register.

In diesem Modus wird der Zählerstand TIM1_CNTRH / TIM1_CNTRL kontinuierlich mit dem Wert im 16-Bit Capture/Compare Register TIM1_CCRiH / TIM1_CCRiL verglichen und das Ergebnis des Vergleichs steuert den Logikzustand am Timer-Kanal-Ausgang OCi. Das OCi Signal treibt direkt den Pad-Treiber für den Timer-Pin TIM1_CHi (respektive auch für den invertierten Ausgang TIM1_CHiN, zumindest für die Kanäle 1, 2 und 3).

CCiP – Capture/Compare Output P olarity (Polarität des Compare Ausgangs)

Die Polarität des Ausgangssignals ist über die CCiP Bits in den beiden Registern TIMn_CCERi in ihrer Polarität einstellbar. Ist das CCiP-Bit = 0 so ist das Ausgangssignal „active High“ andernfalls CCiP = 1, ist das Signal „active Low“.

CCiE - Compare Output Enable (Freigabe des Compare Ausgangs)

Der jeweilige Ausgang kann über die CCiE Bits im gleichen Register komplett abgeschaltet werden. In diesem Fall CCiE = 0 ist der Ausgang TIM1_CHi nicht aktiv und dementsprechend CCiE = 1, aktiv.

Im nicht aktiven Zustand (Idle) richtet sich der Level des Signals nach der Einstellung der Bits MOE, OSSI, OSSR, OIS1, OIS1N und CC1E.

CCiNE - Compare Output Negated E nable (Freigabe komplementärer Compare Ausgang)

Für die Komplementär-Ausgänge TIM1_CHiN gibt es ein ensprechendes Bit in den TIM1_CCERi Registern. Ist dieses CCiEN Bit = 0 so ist der Ausgang nicht aktiv, anderfalls (CCiEN = 1), aktiv.

Im nicht aktiven Zustand richtet sich der Level des Signals nach der Einstellung der Bits MOE, OSSI, OSSR, OIS1, OIS1N und CC1EN.

CCiNP - Compare Output Negated P olarity (Polarität des komplementären Compare Ausgangs)

Für die Komplementär-Ausgänge TIM1_CHiN gibt es ein ensprechendes Bit in den TIM1_CCERi Registern. Ist dieses CCiNP Bit = 0 so ist der Ausgang „active HIgh“, anderfalls (CCiNP = 1), „aktiv Low“.

OCiCE - Output Compare Clear Enable (Freigabe “Clear” Funktion des Compare Ausgangs)

Der Compare Ausgang (TIM1_CHi) kann durch ein „High“-Signal am TIM1_ETR (Externer Triggereingang) nach einem Compare Match wieder gelöscht werden. Dazu muß das OCiCE-Bit im TIM1_CCMRi auf „1“ gesetzt werden. Ist OCiCE = 0 hat das TIM1_ETR Signal keinen Einfluß.

OCiFE - Output Compare Fast E nable (Freigabe “Fast Enable” für den Compare Ausgang)

Das OCiFE Bit im TIM1_CCMRi beinflußt das Verhalten des TIM1_CHi Ausgangs. Ist dieses Bit = 0 so wird durch eine aktive Flanke am Trigger Input nach 5 Taktzyklen der Ausgang zurück geschaltet. Ist das OCiFE-Bit = 1 erfolgt die beschriebene Aktion nach 3 Taktzyklen.

Die Funktion des OCiFE Bits ist nur in den PWM Modi möglich.

OCiPE - Output Compare Preload E nable (Freigabe Capture Compare Preload Registers)

Ist das OCiPE-Bit = 0 so wird das Preload Register TIM1_CCRi funktionslos und das TIM1_CCRi kann zu jeder Zeit beschrieben werden und der Wert wird unmittelbar übernommen. Im Gegensatz dazu, OCiPE-Bit = 1, ist das Preload Register aktiv und ein neuer Wert wird in dieses Register geschrieben und erst durch einen Update Event (UEV) in das Compare Register übernommen.

CCiIE - Capture Compare Interrupt E nable (Freigabe Capture Compare Interrupt für Kanal “i”)

Zusätzlich dazu kann bei einem eingetretenen „Compare“-Event (Zähler = C/C-Register oder alternativ Zähler > C/C-Register) ein Interrupt ausgelöst werden. Dafür muß der entsprechende Interrupt über die „CCiIE“ Bits im TIMn_EGR Register für den jeweiligen Kanal freigegeben werden.

Einzelpuls Modus

Der Einzelpuls Modus ist eine Variante des „Compare“ Modus und ermöglicht die Ausgabe eines Pulses am Timerausgang (TIM1_CHi), welcher durch ein externes Signal ausgelöst (getriggert) wird. Der Pulsbeginn kann bezogen auf das Triggerflanke auch verzögert ausgegeben werden.

Trigger Signal

Das Triggersignal setzt dabei mit seiner Flanke das CEN Bit und der Timer 1 läuft mit dem gewählten Takt los. Als Triggersignal können, wie in Absatz 3.3 „Trigger Selection“ beschrieben die folgenden Signale gewählt werden:

TI1 (Timer Input, TS = 0x100b)

TI1FP1 (gefiltertes Eingang-Signal vom Kanal 1, TS = 0x101b)

TI2FP2 (gefiltertes Eingang-Signal vom Kanal 2, TS = 0x110b)

ETR , das externe Triggersignal vom Pin TIM1_ETR (TS = 0x111b)

Die hier angegebenen „TIxxx“ Signale beziehen sich in diesem Beispiel auf den Capture/Compare Kanal 1.

Takt Signal

Der für den Timer 1 verwendete Takt kann ebenfalls von verschiedenen Quellen bezogen werden:

fMaster (von der internen Zeitbasis wenn SMS = 0x000b und ECE = 0) ,

TIM1_CHi (externer Takt vom Timer-Eingang, wenn SMS = 0x111b und ECE = 0),

TIM1_ETR (externer Takt vom ETR Pin, wenn SMS = 0x111b und ECE in TIM1_ETR = 1)

Funktion-Ablauf

Die Konfiguration des Einzelpuls-Modus erfolgt durch das Setzen des OPM-Bit im TIM1_CR1.

Zu Beginn setzt das eingehende Triggersignal das CEN-Bit (Count Enable) und started damit den Zähler. Der hochlaufende Zähler wird mit dem Cap/Com Wert verglichen und aktiviert nach einem „Match“ den Timer Ausgang. Da die Aktivierung des Timerausgangs nach einem Match mehrere Taktzyklen benötigt kann das OCiFE Bit (Output Compare Fast Enable) gesetzt werden welches ein minimales „Delay“ nach dem Timerstart ermöglicht.Die OCiFE Funktionalität ist nur im PWM1 und PWM2 Modus gegeben.

Der weiterlaufende Timer erreicht nach der eingestellten Zeit den Wert des ARR-Registers und deaktiviert das CEN-Bit (Counter Enable). Gleichzeitig wird der Timer-Ausgang zurückgesetzt.

Der ARR-Wert in den TIM1_ARRH / TIM1_ARRL Registern definiert die Summe des Anfangs-Delays plus der Pulslänge und der Cap/Com-Wert in den TIM1_CCRH / TIM1_CCRL Registern bestimmt die Pulslänge.

Der Cap/Com-Wert muß dabei kleiner sein als der ARR-Wert um einen Puls zu generieren.

PWM Ausgabe Modus

Die Ausgabe eines PWM Signals an den Timer Ausgängen erfolgt durch die Einstellung des Bitfelds OCiM[2:0] im TIM1_CCMRi Register. Wird OCiM[2:0] mit dem Wert 0x110b beschrieben erfolgt die interne PWM Ausgabe als „High“-Wert wenn der Zähler kleiner dem CCR-Register Wert ist. Ist OCiM[2:0] = 0x111b so wird das PWM-Signal mit einem „Low“-Pegel erzeugt solange der Zählerwert kleiner dem CCR-Wert ist.

Der TIM1 Zähler muß natürlich funktional freigegeben werden, was durch das CEN Bit im TIM1_CR1 Register erfolgt.

Um das PWM-Signal am entsprechenden Kanal-Ausgang zu erhalten muß im TIM1_CCMRi Register für den entsprechenden Kanal „i“ das CCiS[1:0] Bitfeld mit 0x00b programmiert werden um den TIM1_CHi Pin als Ausgang zu konfigurieren.

PWM Frequenz Einstellung

Die PWM Frequenz bzw. die PWM Zyklendauer ist von verschiedenen Einstellungen abhängig. Als Basis für die Frequenz dient die verwendete Taktrate welche von verschiedenen Quellen ausgewählt werden kann (im TIM1_SMCR Register). In der Mehrzahl aller Anwendungen wird wahrscheinlich die STM8 Masterclock (fMaster) Verwendung finden.

Im zweiten Schritt wird die Taktfreuenz durch den TIM1_PSC den Erfordernissen angepasst. Der Prescaler erlaubt Teilfaktoren von 1 bis 65365. Um beispielsweise bei einer fMaster-Frequenz von 16 MHz einen CK_CNT (Eingangstakt für den TIM1 Zähler) von 1 MHz zu erzielen muß der Prescaler auf den Wert 15 (dezimal) = 0x000Fh eingestellt werden. Der Wert errechnet sich durch die Formel:

fCK_CNT = fCK_PSC / (PSC[15..0]+1)

Mit der Festlegung der TIM1-Zählerfrequenz fCK_CNT und dem gewählten Modus der PWM (edge oder center aligned) sowie der Einstellung des Autoreload Wertes ergeben sich folgende PWM Frequenzen:

PWM Modus PWM Frequenz Beispiel (ARR = 100)

Edge aligned PWM

fCK_CNT / TIM1_ARR

1 MHz / 100 = 10 kHz

Center aligned PWM

1/2 * fCK_CNT / TIM1_ARR

1/2 * 1MHz / 100 = 5 kHz

Folgende Anmerkungen zur Frequenzeinstellung:

Der TIM1_ARR Wert darf nicht „Null“ sein da der Zähler sonst blockiert ist.

Der TIM1_ARR Wert bestimmt die Auflösung der PWM, also wieviele Schritte bei der PWM Ausgabe möglich sind. In dem genannten Beispiel mit TIM1_ARR = 100 sind 100 Schritte (1% Schritte) möglich.

„Edge aligned“ bzw. „Center aligned“ Mode

Die Ausgabe des PWM-Signals kann entweder auf den Start eines PWM-Zyklus (edge aligned) oder auf die Mitte eines Zyklus (center aligned) eingestellt werden. Die Einstellung erfolgt im TIM1_CR1 Register im Bitfeld CMS[1:0].

Bitfeld CMS[1:0] im TIM1_CR1 Register
CMS[1:0] Wert PWM Modus Zählrichtung Output Compare Interrupt Flag

0x00b

edge aligned

DIR=0 -> Auf / DIR=1 -> Ab

DIR=0 -> Zähler = CCR

0x01b

center aligned Mode1

Auf und Ab

nur im Abwärtszählzyklus (Underflow)

0x10b

center aligned Mode2

Auf und Ab

nur im Aufwärtszählzyklus (Overflow)

0x11b

center aligned Mode3

Auf und Ab

im Auf-/Abwärtszähler Mode

„Edge aligned“ Modus mit Aufwärtszähler

Ist CMS[1:0] = 0x00b und DIR = 0 so arbeitet die PWM im Aufwärtszählermodus. Dabei ist das interne OCiREF Signal „high“ solange der TIM1_CNT kleiner dem TIM1_CCRi (Capture/Compare Register) ist. Ist der Vergleichswert = 0 (CNT = CCR) dann ist das OCiREF Signal „low“.

Die Polarität des Ausgangs wird im weiteren Verlauf des Signalwegs in jedem Timer-Kanal noch zusätzlich vom jeweiligen CCiP Bit (Cap/Com Polarity) bestimmt, welches das OCiREF Signal bis zum Timerausgang TIM1_CHi noch invertieren kann.

„Edge aligned“ Modus mit Abwärtszähler

Ist CMS[1:0] = 0x00b und DIR = 1 so arbeitet die PWM im Abwärtszählermodus. Das interne OCiREF Signal ist „low“ solange der TIM1_CNT (Zähler) größer als das TIM1_CCRi (Capture/Compare Register) ist. Ist der Vergleichswert TIM1_CCRi größer als der TIM1_ARR dann ist das OCiREF Signal „high“ , was dazu führt daß in diesem Mode die PWM nicht den Wert „Null“ annehmen kann.

„Center aligned“ PWM Modus mit Auf/Abwärtszähler

In den gerade behandelten „Edge Aligned“ PWM Modi ist das „Update Event“ immer die Ursache für die fallende Flanke des internen PWM-Signals OCiREF. Bei der Verwendung mehrerer Timer Kanäle wird also der PWM-Ausgang aller verwendeten Kanäle synchron eingeschaltet (oder falls das Signal noch invertiert ist, ausgeschaltet), was bei grösseren Lasten an den angesteuerten externen Leistungsstufen zu erheblichen Stromspitzen führen wird. Dies wiederum führt zu Stress für die Spannungsversorgung, höherem Ripple am Netzteil und zu EMV Problemen.

Hier kann mit der „Center Aligned“ PWM bis zu einem gewissen Grad Abhilfe geschaffen werden da die Ein- bzw. Ausschaltflanken hier zeitlich von der PWM-Einstellung anhängen. Dies führt zu einer Verteilung der Ein- bzw- Ausschaltspitzen der verwendeten Kanäle und damit zu einer Reduzierung der genannten Effekte.

Das DIR Bit ist im „Center Aligned“ PWM Modus nicht beschreibbar da die Umschaltung der Zählrichtung durch die interne Logik des Timer 1 erfolgt.

Wie im Bild oben zu sehen ist kann sowohl beim Erreichen des Cap/Com-Wertes im Aufwärtszählen als auch beim Erreichen des Cap/Com-Wertes im Abwärtszählen ein „Update Event“ ausgelöst werden. In Abhängigkeit vom CMS[1:0] Bitfeld wird nur beim Aufwärtszählen (CMS[1:0] = 0x01b), oder nur beim Abwärtszählen (CMS[1:0 = 0x10b] oder im dritten Fall sowohl bein Aufwärts als auch beim Abwärtszählen (CMS[1:0] = 0x11b) das Cap/Com Interruptflag CCiF gesetzt.

Copyright Notiz

Dieses Dokument sowie dessen Inhalte, insbesondere Texte, Fotografien und Grafiken, unterliegt dem Copyright (© 2020) und sind nur mit einer schriftlicher Zustimmung des Autors, Dipl.Ing.(FH) Franz Henkel zur vollständigen oder auszugsweisen Weiterverwendung in Form einer gedruckten oder elektronischen Kopie oder Replikation bzw. einer vollständigen oder auszugsweisen Bereitstellung des Inhalts in schriftlicher oder elektronischer Form, zu verwenden.