Wie kann die Ankunftszeit einer Eingangsflanke genau erfasst werden?

7

Beim Arduino / ATmega328p verfügen die 16-Bit-Timer / PWM-Module über eine Eingangserfassungseinheit, mit der die genaue Ankunftszeit für eine Eingangsflanke aufgezeichnet werden kann, selbst wenn der Prozessor beschäftigt ist, wenn die Eingangsflanke eintrifft. (Einzelheiten finden Sie im Datenblatt , Abschnitt 20.9 auf Seite 155.)

Verfügt der Raspberry Pi über ein vergleichbares Hardware-Peripheriegerät oder eine andere Möglichkeit, eine Eingangsflanke, die auftritt, während der Prozessor ausgelastet ist, präzise mit einem Zeitstempel zu versehen? Ich habe versucht, das Datenblatt für BCM2835 ARM-Peripheriegeräte zu durchsuchen , konnte jedoch bisher nichts finden, das meinen Anforderungen entspricht.

Ich würde annehmen, dass dies erreicht werden könnte, indem der FIQ verwendet wird, um einen DMA vom System-Timer zu einem anderen Ort auszulösen, aber aus den Registerdokumenten scheint es, dass der FIQ nur für GPU- und Basis-Interrupts eingerichtet werden kann. Ich bin mir nicht sicher, wie ich den FIQ bei GPIO-Interrupts auslösen soll, und selbst wenn ich wüsste, wie, bin ich mir nicht sicher, ob dies eine korrekte Vorgehensweise ist oder ob es eine andere Möglichkeit gibt, dies sauberer zu tun.

Wie kann ich die Ankunftszeit einer Eingangsflanke genau erfassen?

Eine kleine konstante Verzögerung ist kein Problem, da ich sie einfach wieder herausziehen kann, aber für meine Anwendung benötige ich mindestens eine Mikrosekundengenauigkeit oder besser.

AJMansfield
quelle
"Präzise Zeitstempel einer Eingangsflanke, die auftritt, während der Prozessor beschäftigt ist" -> Da es sich bei den GPIOs um echte Hardware-Interrupts handelt und der Pi normalerweise ein echtes Multitasking-Betriebssystem ausführt, das angemessen auf solche Interrupts reagiert, sollten Sie in der Lage sein, etwas mit Near zu bekommen Millisekundengenauigkeit unter Verwendung normaler Techniken. Anders ausgedrückt, ein "beschäftigter" Atmega328 ist aufgrund der Software, die sie unterstützen können, ein ganz anderes Tier als ein "beschäftigter" BCM2835.
Goldlöckchen
@goldilocks Leider ist die Millisekundengenauigkeit nicht gut genug - die Ereignisse, die ich messe, sind höchstens ein paar Millisekunden voneinander entfernt, und ich muss in der Lage sein, eine Reihe von Ausgangsimpulsen mit sehr präzisen Zeitversätzen vom Trigger zu erzeugen. (Hat dies auf ATMega328 unter Verwendung der PWM-Ausgangsvergleichsblöcke gemacht; eine sehr ähnliche Technik sollte für Pi funktionieren, solange ich tatsächlich den Zeitstempel vom PWM-Timer erhalten kann.)
AJMansfield
Sie sind immer noch ein bisschen Apfel und Orange in dem Sinne, dass man mit einem Dinge machen kann, die man mit dem anderen nicht machen kann. Aber sie passen zusammen wie Schokolade und Erdnussbutter IMO - wenn also nur der Zeitstempel wichtig ist und der Pi nicht in Echtzeit mit einer Genauigkeit von weniger als einer Millisekunde auf Dinge reagiert, dann huckepack einen Nano auf dem Pi. Es gibt verschiedene einfache Kommunikationsmöglichkeiten (UART, I2C, SPI, GPIO-Interrupts). Hier ist implizit erforderlich, dass Sie den Pi für etwas benötigen, das Sie mit dem atmega nicht tun können, aber es sollte möglich sein, beide zu verwenden.
Goldlöckchen

Antworten:

7

Für eine allgemeine Linux-Lösung ist pigpio wahrscheinlich das Beste, was Sie finden werden.

Es verwendet DMA zum Erfassen der GPIO-Pegel und DMA zum Zeitstempeln der Ereigniszeit von der 1-MHz-Systemuhr.

Die neuesten Proben werden den interessierten Prozessen in 1-Millisekunden-Blöcken gemeldet. Dies bedeutet, dass die durchschnittliche Latenz etwa 500 µs beträgt. Dies wäre jedoch normalerweise kein Problem, da jeder Bericht bereits mit einem Zeitstempel versehen wurde.

Wenn Sie die Interrupt-Route wählen, erwarten Sie eine durchschnittliche Latenz zwischen dem GPIO-Ereignis und der Prozessbenachrichtigung im Bereich von 50 bis 100 µs. Natürlich können Ausreißer viel mehr sein, leicht 10 ms, und Sie werden nicht wissen, welche welche ist.

pigpio wird mit 1Msps abtasten, aber ich würde es nicht empfehlen, wenn das System wahrscheinlich mit Netzwerkarbeiten beschäftigt ist. Sie erhalten DMA-Timing-Jitter, wenn der Speicherbus anfängt, beschäftigt zu werden. Ich würde mich an 500ksps oder weniger halten.

Ich sehe keinen Weg, um Ihr 1µs oder besseres Ziel unter Linux zu erreichen.

joan
quelle
Ich schätze, ich muss einen zusätzlichen Mikrocontroller verwenden, um die Eingabeerfassung zu verwalten, und einfach wie I2C oder so darüber sprechen.
AJMansfield
@AJMansfield Wie viele Leveländerungen erwarten Sie pro Sekunde? Selbst bei der schnellsten I2C auf dem Pi kann 1MHz nicht abgetastet werden. SPI könnte aber in jedem Fall der Pi der Busmaster sein. Was versuchst du zu erreichen?
Joan
Sie haben Recht, aber ich kann den größten Teil der Echtzeitverarbeitung auf dem externen MC ausführen, ohne den Pi einbeziehen zu müssen, da ich die Konfiguration nur in der Größenordnung von einmal pro Sekunde ändern muss und nur grundlegende Statistiken zurückmelden muss .
AJMansfield
Ich versuche, eine Reihe von Ausgangsimpulsen mit einem sehr genauen Zeitversatz vom Eingangs-Triggersignal zu erzeugen. Das Pulsmuster selbst ändert sich nicht so oft.
AJMansfield