STM32 Timer Theorie

Gast #3407742
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 ?
Angehängte Dateien:
Gast #3407761
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
#3407767
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.
Gast #3407768
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 ?
Gast #3407775
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 ?
Gast #3407801
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 ?
Gast #3407812
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
#3407826
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
Gast #3407827
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...
#3407836
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
Gast #3407847
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
Gast #3407976
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren