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