Hardware Interrupt ohne Jitter

OP #7421859
Lesenswert?

Hallo zusammen,

ich möchte ein PWM-Signal (28.57Hz, 2.857% Tastgrad) ausgeben, sobald ein Sensor eingeschaltet wird (siehe Abbildung). Bisher habe ich mit Arduino und Tiva C LaunchPad experimentiert. Dass Problem ist, dass die Δt Zeitspanne nicht konstant ist, bei den beiden Mikrocontrollern variieren die Δt-Werte innerhalb eines Taktzyklus, 62,5ns und 12,5ns (etwa wie oben dargestellt).

Gibt es eine Möglichkeit, Δt konstant zu halten? Gibt es eine effektivere Lösung für dieses Problem (vielleicht mit analogen ICs)?

Vielen Dank im Voraus.

Angehängte Dateien:
#7421884
Lesenswert?

Andreas M. schrieb:

Was für ein Arduino soll das sein? Bei den üblichen 16MHz sind die 62,5 ns gerade mal ein CPU Takt. Ein geringerer Jitter geht schon aufgrund der Zeitquantisierung gar nicht.

Ganz genau.

Falls du es nicht bemerkt hast: das in ein klassischer Traffic-Troll-Thread. Und Leute wie du sorgen dafür, dass er sich wirklich zu eine Thread entwickelt...

#7421987
Lesenswert?

Andrew P. schrieb:

Gibt es eine Möglichkeit, Δt konstant zu halten? Gibt es eine effektivere Lösung für dieses Problem (vielleicht mit analogen ICs)?

Ja sicher. Man muss den Timer passend laden und dann den Timer mit der PWM starten. Analog muss man da gar nichts fummeln. Allerdings kann es auch da Jitter geben, denn der Intzerrupt zum Erkennen der Sensorflanke ist im Normalfall nicht ganz jitterfrei, eben weil das normale Programm ja läuft und unterschiedlich lange BEfehle bearbeitet. GGf. besitz dein Controller ein Eventsysten, wo das alles IN hardware erledigt werden kann, dann wird es besser. Aber selbst mit Jitter könne es ausreichend gut sein, denn die CPU mit sehr hohem Takt läuft.

Dein Oszilloskopbild ist reichlich sinnlos, wenn man keine Zeiteinheit sieht. Als Physiker, so du denn wirklich einer bist, ein neudeutsches "FAIL".

#7422015
Lesenswert?

Andrew P. schrieb:

Gibt es eine Möglichkeit, Δt konstant zu halten?

Nein.

Man müsste wenigstens den Prozessortakt synchron halten mit dem möglichen Sensoreinschaltzeitpunkt, per PLL oder so, also als externen Takt einspeisen was auf einem Arduino nicht vorgesehen ist, und selbst dann stört das laufende Programm mit Befehlen die mehr als 1 Takt benötigen und nicht unterbrochen werden können

Gibt es eine effektivere Lösung für dieses Problem

Um etwas xx ns nach Start eines Signals beginnen zu lassen, muss man erst mal dieses Signal auf ns genau erfassen. Was ist der Zeitpunkt, da wo die Signalspannung 10, 50 oder 90% des Nennwertes hat ? Wie schnell steigt die Signalflanke von 10 auf 90%, in 1us oder 1ns ?

Wenn man eine analoge PWM Erzeugung mit Beginn der Signalflanke startet, hat man zwar nicht das Problem, dass diese nicht taktsynchron erfolgt, weil es keinen Takt gibt, aber man hat das Problem, dass die analoge Startphase der PWM eventuell nicht nanosekundengenau nach dem Signal beginnt, sei es dass die Versorgungsspannungsabhängig ist, temperaturabhängig oder davon wie lange zuvor Ruhe war.

Du müsstest also schon sagen, WIE genau der PWM Startpunkt vom Signal abhängen muss, und wenn das 10ns ist, dann könnte man das mit Digitaltechnik, z.B. einem FPGA mit 200MHz Takt hinbekommen.

Ich denke allerdings, 28.5Hz und Nanosekunden passen nicht zusammen, du hast dich um Grössenordnungen vertan.

#7422028
Lesenswert?

Ihr denkt mal wieder viel zu kompliziert. Kennt denn keiner mehr das Ei des Columbus? Einfach das PWM-Signal durchlaufen lassen und das Sensor-Signal damit synchronisieren. Mit ein paar Logik-ICs das PWM-Signal dann nach aussen freigeben. Der Jitter zwischen sync. Sensor und PWM sollte je nach verwendeter Logik < 1 ns betragen.

#7422048
Lesenswert?

Kannst Du mal erzählen, welches Problem Du eigentlich lösen möchtest?

Falls die PWM tatsächlich bei 28.57 Hz läuft brauchst Du Dir über Nanosekunden wirklich keine Gedanken machen. Selbst falls Du kHz gemeint haben solltest, kann das eigentlich kein Problem sein. Wenn das wirklich eine PWM ist, dann hängt dahinter ein Tiefpass um einen DC Pegel zu erzeugen und der ist um Größenordnungen langsamer.

Oder benutzt Du die PWM-HW, um spezielle Pulsfolgen zu erzeugen?

#7422115
Lesenswert?

Hallo,

wenn es nur auf den zeitlichen Abstand zwischen Sensorsignal und PWM Flanke ankommt, dann geht das theoretisch ganz einfach. Praktisch sehe ich erstmal kein Problem. Sensorsignal wird per Interrupt erkannt und in diesen Interrupt wird der Timer gestartet. Weil im Interrupt nichts dazwischen funkt bleibt der zeitliche Abstand immer konstant. Der Timer wird vorher passend konfiguriert mit Hardwareausgang zum "OCRn"/"WO" Pin. Dann kann er unbekümmert und unbeeinflusst vor sich hintakten.

Aber ich befürchte c-hater könnte recht haben. Ist bestimmt ein Fake Account, denn einen User "Andrew P". o.ä. gibt es schon und nicht erst sein 15.05.2023. Um das zu entkräften müßte der TO in seinem Thread aktiv mitmachen.

#7422129
Lesenswert?

Veit D. schrieb:

Sensorsignal wird per Interrupt erkannt und in diesen Interrupt wird der Timer gestartet. Weil im Interrupt nichts dazwischen funkt bleibt der zeitliche Abstand immer konstant.

Die Anzahl der CPU-Takte zwischen Interrupt und Ausführung der Interruptroutine kann je nach unterbrochenem Befehl schwanken. Außerdem möchte der TO ja sogar genauer als ein CPU-Takt sein.

LG, Sebastian

#7422162
Lesenswert?

an Veit Devil:

Das Problem ist: das Sensorsignal trifft irgendwo innerhalb eines uC-Taktes ein, und die Reaktion (in Gestalt des PWM-Beginns) kann frühestens mit dem nächsten Takt erfolgen. Folglich haben wir prinzipiell eine Unbestimmtheit von der Dauer eines uC-Taktes. Und wie, umgekehrt, der Sensor auf den uC synchronisiert werden soll, muss uns Mi N. erstmal erklären, ohne ihn zu kennen. Es könnte sich ja auch z.B. um einen analogen Sensor handeln.

OP #7422177
Lesenswert?

S. L. schrieb:

Das Diagramm ist arg irreführend: es suggeriert eine PWM-Frequenz von 11.6 MHz.

Ja, ich weiß. Ist nur eine grobe Darstellung, damit man vom Problem irgendeine Ahnung hat.

Bei genauerer Betrachtung (und als Physik-Laie) wüsste man gerne den Grund, warum die 62.5 ns bei 28.57 Hz (entspricht 1.8 ppm) stören.

Das Signal ist Triggersignal für einen Radar. Die Interrupt-Latenz muss immer gleich groß sein (egal ob ns oder μs), damit sie die Messergebnisse nicht verfälscht.

#7422185
Lesenswert?

Andrew P. schrieb:

Das Signal ist Triggersignal für einen Radar. Die Interrupt-Latenz muss immer gleich groß sein (egal ob ns oder μs), damit sie die Messergebnisse nicht verfälscht.

Mensch Meier, lies mal was über Netiquette!! Und fasse dein Ziel man in Zahlen! Kleiner Tipp. 0ps Jitter sind nicht möglich! Wenn man alle Register der Digitaltechnik zieht, kommt man vielleicht auf +0/-1 Takt. Und wenn der hoch genug ist (100MHz++), reicht es dann vermutlich auch praktisch aus.

#7422190
Lesenswert?

Die Interrupt-Latenz muss immer gleich groß sein (egal ob ns oder μs)

Reicht dann nicht ein Jitter von, sagen wir, 2 ns (es wurde ein "Teensy 4 mit 600 MHz" vorgeschlagen)? Ich meine, die anschließende PWM-Impulsfolge auf 2e-9 genau zu halten, stelle ich mir auch etwas aufwändig vor.

#7422286
Lesenswert?

Sebastian W. schrieb:

Die Anzahl der CPU-Takte zwischen Interrupt und Ausführung der Interruptroutine kann je nach unterbrochenem Befehl schwanken. Außerdem möchte der TO ja sogar genauer als ein CPU-Takt sein.

S. L. schrieb:

Das Problem ist: das Sensorsignal trifft irgendwo innerhalb eines uC-Taktes ein, und die Reaktion (in Gestalt des PWM-Beginns) kann frühestens mit dem nächsten Takt erfolgen. Folglich haben wir prinzipiell eine Unbestimmtheit von der Dauer eines uC-Taktes. Und wie, umgekehrt, der Sensor auf den uC synchronisiert werden soll, muss uns Mi N. erstmal erklären, ohne ihn zu kennen. Es könnte sich ja auch z.B. um einen analogen Sensor handeln.

Hallo,

ja stimmt, ihr habt wie immer recht. Ich hatte völlig außer acht gelassen das die Takte unbestimmt sind wann die zugehörige ISR überhaupt aufgerufen wird. Das ist die Unbekannte in der Betrachtung. Aber da das vom TO nur theoretische Betrachtung ist und alle Bilder von ihm aus dem Internet sind, seine Hardware nicht bekannt ist, ist das für mich uninteressant geworden.

#7422521
Lesenswert?

Wenn ich das Timing im Griff haben will (und es sich nicht um einen einfachen Timer handelt), dann greife ich zu einem FPGA.

Und bei Radar, wo jede Zeitungenauigkeit einen direkten Fehler in die Ortsbestimmung o.ä. bringt will man das Timing komplett im Griff haben...

#7423650
Lesenswert?

Andrew P. schrieb:

Bisher habe ich mit Arduino und Tiva C LaunchPad experimentiert. Dass Problem ist, dass die Δt Zeitspanne nicht konstant ist, bei den beiden Mikrocontrollern variieren die Δt-Werte innerhalb eines Taktzyklus, 62,5ns und 12,5ns

Wie hast du eigentlich den Δt-Jitter auf einem Atmega328P auf nur einen Taktzyklus beschränkt? Der Atmega328P hat doch gar keinen Eingang der einen Timer zurücksetzt. Was übersehe ich?

LG, Sebastian

#7423677
Lesenswert?

Sebastian W. schrieb:

Wie hast du eigentlich den Δt-Jitter auf einem Atmega328P auf nur einen Taktzyklus beschränkt? [...] Was übersehe ich?

Du übersiehst genau das, was C-hater schon vor Tagen geschrieben hatte:

C-hater schrieb:

Falls du es nicht bemerkt hast: das in ein klassischer Traffic-Troll-Thread. Und Leute wie du sorgen dafür, dass er sich wirklich zu eine Thread entwickelt...

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren