Generierung eines Mikrosekundenimpulses

Ich möchte mit einem Arduino Due einen Impuls generieren, dessen Länge ab EINER Mikrosekunde in ebensolchen Schritten einstellbar ist. nehme an, dass dies nur an einem Digitalausgang möglich ist. Kann mir hier jemand sagen, ob und wie das programmierbar ist? Auslösung eines solchen einmaligen Impulses per Taster . . .

Im Prinzip geht das mit delayMicroseconds(t-TFIX), abzüglich der für das Umschalten des Ausgangs benötigten Zeit TFIX. Ob das beim Due schon ab 1µs mit ebensolcher Schrittweite funktioniert, und wie man TFIX auf ganze µs trimmt, entzieht sich meiner Kenntnis.

bitte um Verzeihung - bin Arduino-Anfänger - "t-TFIX" und "TFIX" finde ich nicht, "delayMicroseconds" erwartet doch rein numerischen Wert ab 1 - oder?

t ist eine Variable mit der gewünschten Zeit, und TFIX eine Konstante entsprechend Deinem System.

Vielleicht solltest Du besser mit BlinkWithoutDelay aus den IDE Beispielen anfangen und dann schrittweise optimieren.

Das geht sicher. Ist auch die Frage, wie genau diese 1µs-Schritte sein sollen.
Im µs-Bereich kommt die Standard-Arduino Umgebung, die ursprünglich für 8bit avr controller mit 16 MHz Takt ausgelegt war, allerdings in Grenzbereiche...
Das TFIX von @DrDiettrich versucht die Funktion delayMicroseconds schon zu berücksichtigen. Schau dir deren Code mal an, und miss mit einem LA oder Oszi, was passiert.
Musst vielleicht eine eigene Version von delayMicroseconds an deine Bedürfnisse anpassen, evtl. auch ohne digitalWrite- overhead.

Solltest evtl. bei Arduino Due - Arduino Forum auf Englisch fragen, um Due-spezifische Lösungen zu finden.

Ja, die DUE Timer.....
9 Stück hat er davon
mit 42MHz sie laufen können
viele viele Features sie haben
auch Ausgänge

Der kürzest mögliche, so generierte, Impuls könnte also 0,23... µs sein.
Aber wie genau, das ist schon eine Baustelle!
(wo ich auch nicht sattelfest bin)

Auch könnte man SPI dafür zweckentfremden. 35MHz(?)

Nein.
https://www.arduino.cc/reference/en/language/functions/time/delaymicroseconds/
" Notes and Warnings

This function works very accurately in the range 3 microseconds and up to 16383. We cannot assure that delayMicroseconds will perform precisely for smaller delay-times. Larger delay times may actually delay for an extremely brief time."

Außerdem mußt Du die Zeit für die Ansteuerung des Pins mitberechnen. Bein digitalWrite() sind das eining µS.

Meiner Ansicht ist nur direkte Verwendung und Ansprechen der Controllerhardware möglich, also ohne Arduino-spezifischen Funktionen und mit viel Kenntnis des Aufbaus und Funktin des ATmega's.

Grüße Uwe

Wenn ich bei einem ESP32 nur das minimalste in den Loop schreibe:

digitalWrite (Ausgang01, HIGH);     // Ausgang01 umschalten
delayMicroseconds(1);
digitalWrite (Ausgang01, LOW);     // Ausgang01 umschalten

Dann dauert der Impuls am Ausgang schon 1,6 micros

Der Loopdurchlauf, leerer Loop mit nur einer if Abfrage hat zwischen 1und 2 micros

sehr gut - so erhalte ich einen kürzesten Impuls von 3,2 microSec.
hätte gern einen halb so langen ;-/

Dann musst du digitalWrite vergessen.

Und das delayMicroseconds(1); durch was kürzeres ersetzen.
asm("nop"); // dauert 62,5 Nanosekunden auf einem 16 MHz avr-Arduino

Auf einem ESP32 läuft im Hintergrund ein Betriebssystem. Der ist daher sowieso ungeeignet für solche Spielereien.

OK danke für die Info, ich weiß noch sehr wenig von dem Ding. Ich dachte einfach, bei der Taktfrequenz muss der um Längen besser sein, als Uno, Mega, Due. War schon überrascht dass das Ergebnis nicht so toll war. :roll_eyes:

Hallo,

Wenn es präzise und einstellbar sein soll, dann wirst du dich wohl oder übel mit der Hardware und Manual beschäftigen müssen. Leider hast du dir mit dem Due gleich einen Brocken rausgesucht. Mit Geduld ist auch das machbar. Du musst einen Timer selbst konfigurieren. Es gibt sogar einen Timermode "Pulse Generation".
Den Taster musst du so programmieren das er je entprellten Tastendruck nur einmal auslöst. Also beim drücken nicht nochmal auslöst sondern erst bei erneuten drücken. Ansonsten löst er mehrere Impulse hintereinander aus.
Wenn gedrückt erkannt wurde dann Timer starten und nach Puls wieder stoppen und warten bis zum nächsten Tastendruck. Soviel zum Grundprinzip.
Du hast also 2 Aufgaben.
a) Taster nicht retriggerbar entprellen
b) Timer konfigurieren

Was ich so beim überfliegen des Manuals lese kann der Timer wohl den Coretakt von 84MHz mitgehen.
Du hättest eine Auflösung bis runter auf 11,9ns zur Verfügung. Für 1µs muss demzufolge er Timercount 84 betragen. Tipp. Auf der Seite des µC wo es das Manual gibt, gibt es auch eine Appnote für ein Timer Bsp.. Dieses erst durcharbeiten und dann eigene Versuche starten.
Das könnte auch ein Beispiel sein. Am Ende änderst du "nur" paar Registereinstellungen wenn du dich eingearbeitet hast.

Für die ESP Leute, auch bei diesem kann man einen Timer konfigurieren.

nop kann man machen für konstante Pulslängen. Wenn man das mit nop flexibel machen möchte und das in eine for Schleife packt wird es schon wieder ungenau. Ist aber alles in allen blockierend.

StateChangeDetection Beispiel.

Hallo,

kann man machen. Da wir wissen das es immer ausartet wenn man Blut geleckt hat :joy:, sollte der TO vielleicht das Bsp. BlinkWithoutDelay durcharbeiten und dann mit dem StateChangeDetection kombinieren. Wenn der TO danach gezielt eine Led umschalten oder einen Zähler ändern kann, dann hat er sicherlich eine gute Grundlage. Danach kann er sich in die Timergeschichte stürzen, dass wird am Längsten dauern. Je nachdem was sein Anspruch an die Pulsgenauigkeit ist.

ich bin wirklich begeistert von eurer qualifizierten hilfe - bravo!
es geht mir aber gar nicht so um die präzision. ich will einen snubber für eine ziemlich spannungs- und stromintensive Schaltanwendung dimensionieren und dafür mit ganz kurzen impulsen eine testreihe fahren. ich denke, die 3,2 mikrosekunden sind schon ein guter startwert, mit dem ich weiterkomme. danke euch allen !!!

Schade. (um die nutzlos verpuffenden Ressourcen)
Es brauchte #15 um die eigentliche Aufgabe darzulegen.

1 Like

Hallo,

ich bin auch davon ausgegangen es sollte genau werden, naja was solls. Dafür kannste auch nops in eine for Schleife packen. Die Genauigkeit ist sicherlich locker ausreichend. Das wären dann auch Vielfache von obigen 11,9ns + for Schleifendauer.

1 Like

Oder einen 74123, einen Kondensator und ein Poti.

Die hardwaremäßige Anpassung an die

dürfte dann das nächste Problem werden.

2 Likes

Hallo,

korrekt, oldschool analog wäre auch cool. :wink: Ein Oszi wird sicherlich sowieso dranhängen.

ich lerne gerne dazu - egal, ob ichs jetzt oder später brauche - sehe es positiv :wink: