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 ?
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.
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 ?
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 ?
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.
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 ?
Tomi schrieb: > 1/(72*10^6)* 144000000 = 1 us > > Prescale = 144000000 ? sry statt 144000000 meinte ich die hälfte 7200000
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
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.
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
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
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: > 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.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.