Forum: Mikrocontroller und Digitale Elektronik STM32 Timer Theorie


von Tomi (Gast)


Angehängte Dateien:

Lesenswert?

Hallo ich bin ein neuling und versuche gerade heruaszufinden wie man mit 
dem Timer von ARM Prozessoren umgeht.

Was ich weiss:
Meine TIM2 arbeitet mit 16 Bit (das heißt ich kann Werte bis 2^16 
s?ms?us? darstellen ?)

System_clk = 72 Mhz


Im Anhang liegt eine doku jedoch bin ich verwirrt...

Wie berechne ich hier z.B das mein Timer bis 2ms zählt ?

von FloF (Gast)


Lesenswert?

Du setzt einen entsprechenden Prescaler um von 72 Mhz auf irgendwas zu 
kommen, wo 2 ms < 65353 sind.

Also bspw 200. Dann hast Du noch 36000 Zähler pro Sekunde -> dann noch 
500 als upper limit einsetzen und Bingo.

Gruss
FloF

von Jan K. (jan_k)


Lesenswert?

Er zählt maximal(!) bis zu der "Zahl" 2^16-1 (von 0 aus). Der timer 
inkrementiert den Zählerstand jedes Mal, wenn er "aufgerufen" wird, was 
so so häufig passiert, wie du den Takt eingestellt hast.

Der Timer muss aber nicht bis zur maximalen Größe zählen, du kannst 
vorher auch einen anderen (niedrigeren) Maximalwert angeben.

In deinem Diagramm siehst du, dass der Systemtakt noch von dem AHB und 
dem APB1 prescalern noch geteilt, anscheinend mit einem multiplier auch 
noch wieder erhöht werden kann. Damit wählst du die passende Frequenz.

Wenn du einen Takt von z.B. 1Mhz hast, zählt er alle 1/1e6 s = 1µs einen 
Wert hoch. Dein Timer ist also in maximal 1e-6*2^16s = 65,536 ms 
durchgelaufen und fängt wieder bei 0 an. Du musst also berechnen, wie 
oft der Timer aufgerufen werden muss, bis deine gewünscht Zeit erreicht 
worden ist.

Es kann sein, dass es noch stm32 spezifische Eigenschaften gibt, z.B. 
dass man einen Takt weniger oder mehr zählen muss, das weiß ich nicht.

von Tomi (Gast)


Lesenswert?

Wie kommst du auf 2 ms < 65353 ?

Also wie ich dich verstanden habe musss man die 72 Mhz irgendwie runter 
bekommen das man nur noch 2 ms hat oder ?

72 Mhz heißt ja 72 Millionen ticks pro sek.

wie komme ich von 72 Mio auf ms ?

von Tomi (Gast)


Lesenswert?

TIM_TimeBaseStructure.TIM_Prescaler = 16000 - 1; // 16 MHz / 16000 = 1 
KHz
TIM_TimeBaseStructure.TIM_Period = 1000 - 1;  // 1 KHz / 1000 = 1 Hz;

Wozu macht man Perio noch wenn der Prescaler festlegt wie der Takt ist ?

von Jan K. (jan_k)


Lesenswert?

Hab' ich doch oben geschrieben...

Er zählt mit deinem eingestellten Takt hoch. Period ist der Grenwert, 
der kleiner als 2^16-1 sein muss.

von Tomi (Gast)


Lesenswert?

Jan K. schrieb:
> Hab' ich doch oben geschrieben...
>
> Er zählt mit deinem eingestellten Takt hoch. Period ist der Grenwert,
> der kleiner als 2^16-1 sein muss.

okay glaube verstehe das langsam....

f = 1/T

bei 1Mhz clk

1/(1*10^6) = 1 us   // alle 1us geht mein Zähler hoch

wenn ich also 72 Mhz habe müsste ich den Prescale so setzen ?

1/(72*10^6)* 144000000 = 1 us

Prescale = 144000000 ?

um das aber länger zu machen bzw anzupassen z.B auf 50 ms

muss ich dann Period einfach auf 50 setzen.


TIM_TimeBaseStructure.TIM_Prescaler = 144000000
TIM_TimeBaseStructure.TIM_Period = 50


stimmt das so ?

von Tomi (Gast)


Lesenswert?

Tomi schrieb:
> 1/(72*10^6)* 144000000 = 1 us
>
> Prescale = 144000000 ?

sry statt 144000000 meinte ich die hälfte 7200000

von test (Gast)


Lesenswert?

Tomi schrieb:
> 1/(72*10^6)* 144000000 = 1 us
>
> Prescale = 144000000 ?

Nee, der Prescaler ist (wie der Name schon sagt) ein Teiler, der deinen 
eingestellten Timertakt runterteilt. Das Ergebnis ist dann der Takt, mit 
dem der Timer eigentlich läuft.

Bsp: f_tin (Timertakt) = 1 MHz
     Prescaler = 2
     f_t = f_tin / Prescaler = 500 kHz

von Rainer M. (excogitator)


Lesenswert?

Tomi schrieb:
> Tomi schrieb:
>> 1/(72*10^6)* 144000000 = 1 us
>>
>> Prescale = 144000000 ?
>
> sry statt 144000000 meinte ich die hälfte 7200000

Nicht ganz. Wenn ich mich nicht täusche hat das Prescaleregister nur 
16Bit. Folglich kannst du max. 65535 als Wert im Prescaler eintragen.

von Kaj (Gast)


Lesenswert?

Tomi schrieb:
> 72 Mhz heißt ja 72 Millionen ticks pro sek.
>
> wie komme ich von 72 Mio auf ms ?

1sek = 72MegaTicks
1sek = 1000ms
ticks pro ms = 72MegaTicks/1000ms

von Jan K. (jan_k)


Lesenswert?

1/(72e6)*7200000 = 100 ms und keine Mikrosekunde.


Guck mal bitte, was TIM_TimeBaseStructure.TIM_Period für ein Datentyp 
ist. Du kannst den nämlich nicht beliebig groß machen, da der in ein 
Register passen muss.
Genau dafür gibts ja eben den Prescaler, der teilt den Takt soweit 
runter, "bis es passt".

Vergiss die -1 nicht bei beiden Werten, so wie in dem Beispiel

von Tomi (Gast)


Lesenswert?

test schrieb:
> Nee, der Prescaler ist (wie der Name schon sagt) ein Teiler, der deinen
> eingestellten Timertakt runterteilt. Das Ergebnis ist dann der Takt, mit
> dem der Timer eigentlich läuft.
>
> Bsp: f_tin (Timertakt) = 1 MHz
>      Prescaler = 2
>      f_t = f_tin / Prescaler = 500 kHz


Also bei 72 Mhz

Prescaler = 72


f_t = 72Mhz/72 = 1 Mhz = 1 us



Period = 50

=> Zähler zählt 1us * 50 = 50ms ?

Ich hoffe jetzt habe ich es verstanden...

von test (Gast)


Lesenswert?

Tomi schrieb:
> Also bei 72 Mhz
>
> Prescaler = 72
>
> f_t = 72Mhz/72 = 1 Mhz = 1 us

Ja.

Den Rest weiß ich nicht, da ich aus dem Kopf nicht weiß, wie die Timer 
beim STM arbeiten.

von Jan K. (jan_k)


Lesenswert?

Tomi schrieb:
> test schrieb:
>> Nee, der Prescaler ist (wie der Name schon sagt) ein Teiler, der deinen
>> eingestellten Timertakt runterteilt. Das Ergebnis ist dann der Takt, mit
>> dem der Timer eigentlich läuft.
>>
>> Bsp: f_tin (Timertakt) = 1 MHz
>>      Prescaler = 2
>>      f_t = f_tin / Prescaler = 500 kHz
>
>
> Also bei 72 Mhz
>
> Prescaler = 72
>
>
> f_t = 72Mhz/72 = 1 Mhz = 1 us
Das ist eine Frequenz. 1 MHz passt, aber das ist doch nicht = 1us!
>
>
>
> Period = 50
>
> => Zähler zählt 1us * 50 = 50ms ?
50*1e-6 s = 50e-6 s = 50 us, nicht ms.
>
> Ich hoffe jetzt habe ich es verstanden...
fast ;)

Denk dran, du musst bei beiden Werten noch eine 1 abziehen

von Tomi (Gast)


Lesenswert?

Jan K. schrieb:
>> => Zähler zählt 1us * 50 = 50ms ?
> 50*1e-6 s = 50e-6 s = 50 us, nicht ms.
>>
>> Ich hoffe jetzt habe ich es verstanden...
> fast ;)
>
> Denk dran, du musst bei beiden Werten noch eine 1 abziehen



also die Formel wäre dann

t = ((Period-1)*(Prescale-1))/72Mhz

von Tomi (Gast)


Lesenswert?

Bei sys_clk=72 Mhz sollte das doch 5 ms sein oder ?

  TIM_TimeBaseStructure.TIM_Prescaler = 3600 - 1; // 72 MHz / 3600 = 2 
Mhz
  TIM_TimeBaseStructure.TIM_Period = 100 - 1;  // (1/2Mhz) * 100 = 5 ms;

Irgendwie kommt da aber nicht 5ms ... Sondern 5.2 ms wie kommt das ?


wenn ich TIM_TimeBaseStructure.TIM_Period = 10000 - 1; mache kommen 
schöne 500 ms raus . Ich benutze Hterm

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.