STM32F4 Frequenzgenerator mit Zähler

OP #4355469
Hallo,

ich will auf einem STM32F4 einen Pin mit einer bestimmten Frequenz 
toggeln.
Theoretisch kein Problem, da die Timer zur Frequenzgeneration ausgelegt 
sind. Aber ich habe natürlich wieder einen Sonderfall. Und zwar soll der 
Pin nur eine bestimmte Anzahl getoggelt werden.

Z.B. Frequenz mit 5 KHz erzeugen, wenn 1000x High an Pin ausgegeben, 
dann Timer stop.

Mit PWM auf 50% duty cycle und hochzählen in der ISR sollte kein Problem 
sein, aber ich befürchte dass ich dann zu viele Interrupts bei höheren 
Frequenzen erzeuge, da es nicht bei diesem 1 Signal bleiben soll. Und 
anderer Code soll ja auch noch laufen.

Jetzt weiß ich einfach nicht weiter, wie ich dieses Problem am Besten 
löse.

mfg
Gast
>Jetzt weiß ich einfach nicht weiter, wie ich dieses Problem am Besten
>löse.

Da kann dir auch keiner weiterhelfen wenn man nicht
weiß wie hoch die Frequenz werden soll. Über 5000 Interrupts/s
lacht der STM32F4 sich jedenfalls tot.
Gast
Probieren geht über studieren in dem Falle. Selbst mit einer einfachen 
SW Lösung solltest du auf >>100 KHz kommen.

Per Timer geht noch mehr, gerade wenn du auf allen vier Pins die gleiche 
Frequenz haben willst. Dann brauchst du nur einen Timer.

Du kannst auch ein Bitmuster per DMA raushauen. Dann brauchst du die CPU 
gar nicht und es dürfte noch mal mehr gehen.

Möglichkeiten gibt es genug. Implementier doch einfach das was für dich 
am Einfachsten ist.
Gast
Du kannst einen anderen Timer 1000*(1/5kHz) lang laufen lassen (One Shot 
mode z.B.) Dann lässt du den PWM Timer im Gated mode laufen.
So kannst du den ersten Timer immer anstoßen. Dieser ist dann für eine 
Zeit aktiv, solange läuft der PWM Timer
Ich würde für diese Anwendung einen zweiten Timer verwenden.

Setze bei deinem PWM-Timer die "Master Mode Selection" bits des 
"TIMx_CR2" auf "Update".

Bei deinem zweiten Timer setzt du die Anzahl der Toggles ins 
AutoReloadRegister, setzt "Slave Mode Selection" auf "External Clock 
Mode 1" und "Trigger Selection" auf den PWM-Timer. (Beides im TIMx_SMCR)
Achtung: Nicht jeder Timer kann von jedem Timer getriggert werden. Suche 
dir passende Timer!

Wenn nun ein Overflow Interrupt deines zweiten Timers auftritt, ist die 
gewünschte Anzahl der Toggles erreicht.
OP
Little B. schrieb:
> Ich würde für diese Anwendung einen zweiten Timer verwenden.
>
> Setze bei deinem PWM-Timer die "Master Mode Selection" bits des
> "TIMx_CR2" auf "Update".
>
> Bei deinem zweiten Timer setzt du die Anzahl der Toggles ins
> AutoReloadRegister, setzt "Slave Mode Selection" auf "External Clock
> Mode 1" und "Trigger Selection" auf den PWM-Timer. (Beides im TIMx_SMCR)
> Achtung: Nicht jeder Timer kann von jedem Timer getriggert werden. Suche
> dir passende Timer!
>
> Wenn nun ein Overflow Interrupt deines zweiten Timers auftritt, ist die
> gewünschte Anzahl der Toggles erreicht.

Das hört sich gut an, werde das mal genauer untersuchen.

mfg

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 10 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.