Forum: Mikrocontroller und Digitale Elektronik STM32F4 Frequenzgenerator mit Zähler


von Felix F. (wiesel8)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>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.

von Felix F. (wiesel8)


Lesenswert?

Ok, bis ca. 50 KHz. 3-4 Pins.

mfg

von Meister (Gast)


Lesenswert?

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.

von Martin (Gast)


Lesenswert?

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

von Little B. (lil-b)


Lesenswert?

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.

von Felix F. (wiesel8)


Lesenswert?

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

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
Noch kein Account? Hier anmelden.