2017-06-21 12 views
0

Ich benutze 3 PWM + USB (3 verschiedene TIM), um 3 80khz Rechteckwellen zu generieren und wenn sie anfangen zu arbeiten in der Nähe von sagen 50kHz merke ich, dass die Hauptschleife nicht ausgeführt wird (i habe eine blinkende LED von 1 Sek.). USB hat eine Priorität von 0, während PWMs 1 haben (könnte geändert werden). Dies liegt daran, dass die Zielwellenfrequenz über USB gegeben ist.NVIC_Priority und main() Priorität auf stm32

Im PWM-Callback, da die Wellen beschleunigen oder verlangsamen können, rufe ich eine Funktion auf, die ausrechnet, auf welchen Wert der nächste CCR/ARR zählen soll, um eine sanfte Beschleunigung zu haben.

Mein Verständnis ist, dass die benötigte Rechenleistung zu wachsen beginnt und die Interrupts eine Menge sind, die verfügbaren Steckplätze ausfüllen.

Ich könnte die oben genannte Funktion in der Hauptschleife aufrufen, indem ich eine einfache boolesche Variable verwende, die innerhalb der PWM-Callback-Funktion auf true wechselt, und einmal die Funktion funcion als false bezeichnet.

Ich befürchte, dass dieser Ansatz zu einer nicht so perfekten 70/100khz Rechteckwelle führen könnte (vielleicht 63khz oder 95khz aufgrund der benötigten Rechenzeit).

Also gibt es eine Möglichkeit, dem Haupt eine Art Priorität zu geben? Der Main prüft grundsätzlich, ob zB 5ms/10ms/50ms/1s bestanden haben.

+0

Welche STM32 verwenden Sie? Warum machst du die PWM mit Interrupts? Warum lässt du das Timer-Modul nicht alles für dich arbeiten? Sie können einige der Registerwerte mit dem DMA ändern. Ich habe Sinuswellen mit Timer1 mit dieser Methode erstellt. Ich vermute, ich muss etwas vermissen, aber die Erstellung von 100k-Quadrat-Wellen in Software scheint mir verrückt zu sein. :) – DiBosco

+0

Ich brauche Interrupts, weil ich jeden Rechteckimpuls zählen muss. Außerdem brauche ich die Interrupts, denn wenn ich ein 100kHz Ziel habe, sollte die Welle 10-20-30-40-50-60-70-80-90-100Khz mit einer linear kalibrierbaren "Beschleunigung" machen. Dies bedeutet, dass ich CCR und ARR dynamisch ändern muss – Luigi

+0

Ich bin mir nicht sicher, was Sie mit "zählen" jeder Rechteckwelle meinen.Sagen Sie mir wirklich, dass Sie bei jedem Timer-Interrupt den Pin in der Software umschalten? Wie oft ändern Sie die Frequenz? Ich glaube, mir fehlt noch etwas. – DiBosco

Antwort

0

Also gibt es eine Möglichkeit, dem Haupt eine Art Priorität zu geben? Die Haupt prüft grundsätzlich, ob 5ms/10ms/50ms/1s für Beispiel bestanden haben.

Nein, Main per Definition läuft mit der niedrigsten Priorität, im Leerlauf. Sie können jedoch Dinge im Systick (oder einem anderen Interrupt) ausführen, um regulären Aufgaben eine höhere Priorität zu geben. Aber wenn Sie wirklich keine Zeit mehr haben, wird eine Änderung der Prioritäten nicht helfen.

Im PWM-Rückruf, da die Wellen beschleunigen oder verlangsamen können, ich bin eine Funktion, die aufwendigen bei welchem ​​Wert der nächste CCR/ARR Aufruf , um eine gleichmäßige Beschleunigung zu haben, zählen sollte.

Ich schlage vor, dass Sie stattdessen die DMA verwenden.
Am Anfang berechnen Sie im Voraus einen Abschnitt der Werte. Dann verwenden Sie die DMA (Timer haben DMA-Anforderungen), um die neuen Werte in den Timer zu schreiben, die Quelladresse zu erhöhen und es in Hardware ausführen zu lassen. Der Timer hat die Option, die Register so zu puffern, dass sie nur bei einem Überlauf aktualisiert werden, um Störungen zu vermeiden. Bei Halbübertragungsunterbrechung berechnen Sie den nächsten Abschnitt des zirkulären Quellpuffers. Und weiter und weiter.

Sie können viele Timer miteinander synchronisieren und verbinden. Du musst nur ein bisschen rätseln.