STM32 Timer Theorie

Gast #3407742
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
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
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
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
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
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
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
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
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...
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
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
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

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.