mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STM32F103 Timer


Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich versuche gerade mich mit dem Timern des STM32F103 anzufreunden.
Ich hab es bereits geschafft, den Timer laufen zu lassen und mittels 
Interrupt ein Bit toggeln zu lassen.
Leider komme ich aber mit den Registern nicht ganz zurecht und weiß 
nicht, wie ich den Prescalar ausschalten kann, um so auf ein Interval 
von 1/72MHz = 13,9ns zu kommen. Das niedrigeste, was ich bisher 
geschafft habe ist ca 1µs. Ich hoffe ich ihr könnt mir weiterhelfen oder 
es kennt jemand ein paar gute Beispiele dazu.
Ich arbeite mit dem MCBSTM32E von Keil und der µVision IDE.
Danke!

Grüße
Mathias

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Dubdidu schrieb:

> von 1/72MHz = 13,9ns zu kommen. Das niedrigeste, was ich bisher
> geschafft habe ist ca 1µs.

Soo arg viel schneller wirst du das per Interrupt ohnehin nicht 
hinbekommen. Kannst nicht erwarten, dass du per Interrupt alle 14ns ein 
Portpin toggeln kannst.

Dafür gibt es die Compare Register und die entsprechenden Pins, mit 
denen das automatisch ohne Interrupt erfolgt. Siehe dazu Beispielcode in 
der FwLib.

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Dafür gibt es die Compare Register und die entsprechenden Pins, mit
> denen das automatisch ohne Interrupt erfolgt. Siehe dazu Beispielcode in
> der FwLib.

Ah Danke für den Hinweis, werde mir die Compare Register gleichmal 
anschauen und schaun, ob ich damit klar komme.

Gruß

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe mir grade mal die Beispiele und auch nochmal die 
Registerbeschreibungen angeschaut, habe aber leider nichts gefunden, was 
mir weiter hilft. Was machen denn die Compare Register genau? Und was 
muss ich damit machen um schneller zu werden?
Hoffe hier kann mir das jemand kurz erklären :)
Danke

Gruß

Autor: Matthias K. (matthiask)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lade Dir von STM die "stm32f10x_stdperiph_lib.zip" runter. Darin sind 
jede Menge Timer-Beispiele zur Lösung Deines Problemes enthalten.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mathias Dubdidu schrieb:

> Hoffe hier kann mir das jemand kurz erklären :)

Du klingst wie jemand, der sich ausgerechnet einen STM32 für sein 
Erstlingswerk ausgesucht hat. Und nun den Wald vor lauter Bäumen nicht 
sieht, weil STs Manuals, wie in dieser Grössenklasse üblich, solide 
Vorkenntnis erfordern. Drum empfehle ich, eher mit AVRs anzufangen, 
deren weit geringere Komplexität es zulässt, eine detalliertere 
Beschreibung in die Manuals zu pressen.

Es gibt schon einen Grund, warum man auch als angehender Berufspilot 
nicht gleich auf einem A330 fliegen lernt, sondern mit einer einfachen 
leichten übersichtlichen Einmotorigen anfängt.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zu den Compare-Registern: Eine deren Funktionen ist es, bei Erreichen 
des dort enthaltenen Wertes durch den Zähler des Timers irgendwas an 
einem bestimmten Pin auszulösen. Beispielsweise den Zustand zu setzen, 
zu löschen oder zu toggeln.

Will man damit eine Frequenz f/(2*(N+1)) am Pin haben, dann muss man 
zusätzlich dafür sorgen, dass der Timer zu diesem Zeitpunkt wieder von 
vorne anfängt. Wozu ein weiteres Timer-Register dient. Alternativ kann 
man den Timer damit auf volle Periode einstellen und den Ausgang mit 50% 
PWM fahren, d.h. der Ausgang des Compare-Channels wird bei Rücksetzen 
des Timers gelöscht und bei Erreichen des Compare-Wertes (halbe Periode) 
gesetzt.

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
A. K. schrieb:
> Es gibt schon einen Grund, warum man auch als angehender Berufspilot
> nicht gleich auf einem A330 fliegen lernt, sondern mit einer einfachen
> leichten übersichtlichen Einmotorigen anfängt.

Das Problem ist, wenn man einen Anfäger in einen A330 setzt dann hat er 
nur die Wahl zwischen fliegen und abstürzen, will sagen ich mach das 
nicht freiwillig mit einem STM32, deswegen bin ich auch sehr froh hier 
Hilfe zu bekommen!

Was es mit dem Registern auf sich hat, habe ich denke ich verstanden.
Mein eigentliches Ziel ist es Datenpakte über einen Pin rauszuschicken. 
Dazu habe ich ein Datenfeld, in dem entweder 0 oder 1 steht. Jenachdem 
was jetzt gerade in dem aktiven Element steht soll ein Pin auf Low oder 
High gehen. Das ganze soll ich nun in Abhängigkeit eines Timers 
realisieren.
Also in etwa so:
while(x > 11){
  Pin = data[x];
  x++;  
  while(timer); //Hier das Timerevent abwarten, wobei das so klein wie möglich sein sollte
}

Wenn ich das nun mit den Compare Registern mache und den Toggle-Mode 
(011) wähle, dann müste ich doch in meiner Warteschleife nur abwarten 
bis OC1REF = !OC1REF wird oder? Nur erreiche ich auch so die maximale 
Geschwindigkeit?

Gruß

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für sowas solltest du dir eher SPI per DMA ansehen. Ignoriere den 
Taktpin wenn du ihn nicht brauchst. Nur so kriegst du die Daten sauber 
äquidistant und schnell im Gänsemarsch raus, dank DMA auch ohne dass die 
der nächste Interrupt einen Strich durch die Rechnung macht.

Einen Bitstream mit 72MHz zum Pin rauszuwerfen geht nicht, nicht mit SPI 
und nicht mit Timer. Mit einzeln programmierter Pinsteuerung gehen auch 
keine 2stelligen MHz. Mit SPI schon.

Jetzt wäre es an der Zeit, bei den Anforderungen mal konkreter zu 
werden.

Autor: Mathias Dubdidu (darkfirefighter)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm ok werde das morgen mal klären, wie sich mein Praktikumsbetreuer das 
genauer vorgestellt hat.
Danke für die ausführliche Hilfe!

Gruß

Autor: Markus Müller (mmvisual)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ausserdem kann der STM32 maximal 50 MHz am Portpin.

Lese dir doch mal den Artikel STM32 durch, da gibt es viele Hinweise 
und Links.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Markus Müller schrieb:

> Ausserdem kann der STM32 maximal 50 MHz am Portpin.

Erzähl mir mal, wie du die erreichen willst ;-).
Ausser am Taktausgang, versteht sich.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.