# Timer / Counter

Ein Timer, auch Eieruhr genannt, hat den Zweck, zu sich wiederholenden Zeiten ein Signal oder einen Interrupt auszuführen.

Um den Einstieg ein wenig zu vereinfachen, kann ein Timer auch im Code nachgebaut werden.

while (1) {
	for (uint32_t arrs=0; arrs < ARRS; psc++) {
		for (uint32_t psc=0; psc < PSC; psc++) {
			// sleep for 1 CPU Cycle
			// increase psc by 1
		}
		// increase ARRS by 1
	}
	// ARRS OVERFLOW OCCURED
	// INTERRUPD CALLED
	UIF();
}

Zähler

BitsVonBis
16 bit02^16
32 bit02^32

Es gibt zwei Arten von Zählern:

### Up-Counter

  • Zählt nach oben, beginnt bei 0, endet bei ARR
  • Generiert einen Overflow, also wenn der Wert über ARR kommt

Down-Counter

  • Zählt nach unten, beginnt bei ARR bis 0
  • Generiert einen Underflow, also wenn der Wert unter 0 kommt.

2 Bit Zähler

alt text

alt text

Prescaler

Der Prescaler besimmt wie viele Impulse benötigt werden, damit der Counter erhöht / verringert wird.

Timer berechnen

NameSymbolEinheitBeschreibung
QuelleFCLKHzFrequenz des Eingangssignales
Prescaler WertPSC-
Auto Reload RegisterARR-Auf welchen Wert das Register gesetzt werden soll, wenn
Zeitintervaltoutsin welchem Abstand, der Timer ausgeführt werden soll

Aufgaben

  • Der ARR soll jede 100us erhöht werden
  • Der Counter soll im Interval von 1s ticken
  • FCLK = 1 Mhz

dann folgt folgendes daraus für den Prescaler (PSC)

  • FCLK = 1'000'000 Hz
  • (PSC+1) = 100us * FCLK
    • (PSC+1) = 0.000'100s * FCLK
    • (PSC+1) = 0.000'100s * 1'000'000Hz
    • (PSC+1) = 4200
    • PSC = 4200 - 1 = 4199

Und für den ARR

  • FCLK = 1'000'000 Hz
  • CLK = 100us
  • (ARR+1)= 1s / 100us
    • (ARR+1)=100'000
    • ARR = 100'000 - 1 = 99'999

alt text

# PWM - Pulse Width Modulation

Mit PWM wird mit gan schnellem ein-und ausschalten ein Sinussignal nachgemacht.

alt text

Duty cycle

Gibt in Prozent an, wie oft das Signal an ist.

  • 50% => 50%
  • 0.5 => 50%

Average Signal