Wie können Sie die Geschwindigkeit eines externen GPIO-Interrupts in stm32f4 erhöhen?

Ich versuche, die Geschwindigkeit eines Gleichstrommotors mit einem IR-Sensor zu messen. An meinem Motor war eine Scheibe befestigt, von der nur 1/4 Teil reflektierte. Ich wollte den Interrupt sowohl bei fallender als auch bei steigender Flanke aktivieren, damit die Interrupt-Routine zweimal in diesem 1/4-Reflexionsbereich aufgerufen wird, dessen Entfernung ich bereits kenne.

Meine ISR aktiviert den Timer beim ersten Mal und deaktiviert ihn beim nächsten Aufruf des Interrupts. Das Problem (das ich beim Untersuchen des Verhaltens einer Variablen gefunden habe) besteht darin, dass, wenn ich den Sensor schnell reagieren lasse, mein Interrupt nur einmal generiert wird und nicht, wenn die reflektierende Oberfläche verschwindet. Aber wenn ich etwas langsam davor bewege, dann tritt beides perfekt auf.

Meine Schlussfolgerung ist also, dass mein Interrupt nicht schnell genug reagiert. Was denken Sie, ist das Problem?

Sie müssen zuerst die Wellenform des Eingangssignals sehen, bevor Sie die Geschwindigkeit der Interrupt-Routine verantwortlich machen. Dann müssen Sie die Geschwindigkeit des Interrupts überprüfen, indem Sie bekanntermaßen gute Eingaben vornehmen, und einen anderen GPIO innerhalb Ihrer Interrupt-Verarbeitungsroutine einstellen und sich das Timing der Signalflanken ansehen. Welches Oszilloskopmodell verwenden Sie beim Debuggen Ihres Codes?

Antworten (1)

Meine ISR aktiviert den Timer beim ersten Mal und deaktiviert ihn beim nächsten Aufruf des Interrupts.

Dies ist nicht die richtige Methode, um schnelle Zeitsignale zu messen. Der Mikrocontroller hat Timer, und diese Timer haben einen Erfassungsmodus.
Im Capture-Modus bewirkt eine steigende/fallende Flanke des Eingangs, dass der aktuelle Timer-Wert im Capture-Register gespeichert wird. Sie haben bis zur nächsten Kante Zeit, um den Zeitstempel der Kante zu lesen.
Wenn Sie zwei Zeitstempel haben, können Sie die Zeit dazwischen berechnen.

Auf diese Weise sind Sie nicht von Interrupt-Latenz und Jitter abhängig.

Das Problem (das ich beim Untersuchen des Verhaltens einer Variablen gefunden habe) besteht darin, dass, wenn ich den Sensor schnell reagieren lasse, mein Interrupt nur einmal generiert wird und nicht, wenn die reflektierende Oberfläche verschwindet.

Möglicherweise liegt hier ein elektrisches Problem vor. Überprüfen Sie, ob die Kanten korrekt sind und kein Prellen auftritt.
Sie könnten einige elektrische Probleme mit den grundlegenden digitalen Eingangsfiltern in den Timern von ST beseitigen. Aber es ist besser, überhaupt einen Filter zu haben.

Es gibt noch ein weiteres Problem. Ich wette, er verwendet HAL und die Interrupt-Latenz ist nicht das Problem (es sei denn, die Interrupt-Trigger kommen in den Bruchteil von uns). Die Verwendung von HAL-Bibliotheksfunktionen fügt Hunderte (manchmal Tausende) von Taktzyklen hinzu.
@ PeterJ_01 Ja, alles, was Sie mit Lego bauen, wird ungeschickt sein.
Aber ich sehe viele Fragen wie: Pin Toggle sehr langsam.