Forum: Mikrocontroller und Digitale Elektronik wie erzeuge ich von einem windows laptop aus einen 1 mikrosekunden puls mit 3.3 Volt


You were forwarded to this site from EmbDev.net. Back to EmbDev.net
von Mat. K. (matthias_kornfield)


Lesenswert?

Hi
ich will einen Puls variabler länge in Mikrosekunden bereich generieren 
und das aus Windows über python.
Wie mache ich das am geschicktesten?
Ich habe mir so ein USB Relay geholt. Aber da bin ich eher in 
Millisekunden Bereich.
Danke

:
von Jack V. (jackv)


Lesenswert?

Mat. K. schrieb:
> Wie mache ich das am geschicktesten?

Du schließt einen Microcontroller mit entsprechender Software und 
Schnittstelle an, und gibst diesem via Python die Anweisung, den Puls zu 
generieren.

von Wurstfachverkäufer (Gast)


Lesenswert?

Es geht nicht. Alleine schon die (Zwangs-)Latenzen der Schnittstellen 
und des Betriebssystems verhindern so etwas.

Da hier aber noch einige Salamischeiben runtergeschnitten werden müssen, 
werfe ich einfach mal als externe Lösung einen externen, über den PC 
angesteuerten Funktionsgenerator in den Raum.
Ob das jetzt eine Lösung von NI oder Agilebnt/Keysight ist, kann die 
Salami entscheiden.

Wurstfachverkäufer

von Iche (Gast)


Lesenswert?

Was ist entscheidend? Genaue Pulslänge oder genauer Pulszeitpunkt?
Wie genau muss es dann sein?
Wie oft muss sich der Puls wiederholen?
Fragen über Fragen…

von Mat. K. (matthias_kornfield)


Lesenswert?

Hi
was muss ich tun: ich habe eine STM32 PCB und habe einen PIN auf 
external interrupt geschlatet. Für testzwecke will ich auf diesem Pin PC 
gesteuert Pulse geben und einen Interrupt auslösen.
Aktuell generiere ich diesen Signal über einen USB Relay.
https://www.amazon.de/HALJIA-Module-Control-Switch-Intelligent/dp/B075F6J6WL
Über python mache ich kurz den relay auf/zu und generiere damit einen 
Puls. Das schmeisst dann den Interrupt in mein STM32 an.
Aber ein USb Relay erzeugt keinen saubereb Puls und der ist auch viel zu 
lang.
Was meint ihr?

von Olaf (Gast)


Lesenswert?

>  Über python mache ich kurz den relay auf/zu und generiere damit
> einen Puls.

Auf jedenfall prellt dein Relais und erzeugt vermutlich gleich mehre 
IRQs.

Olaf

von Jochen (Gast)


Lesenswert?

Löt das Relais aus und steuere ein Monoflop an, das Dir einen sauberen 
Puls macht.

von Anselm (Gast)


Lesenswert?

Nimm einen beliebigen µC, z.B.: Arduino xxx mit USB-Schnittstelle

von DanVet (Gast)


Lesenswert?


von Philipp K. (philipp_k59)


Lesenswert?

erzeuge den Takt auf einem anderen Pin und brücke die solange..

von PC-Freak (Gast)


Lesenswert?

Ein USB - Digital Wandler, z.B FTDI. Gibsts z.B bei Denkovi. Nach USB 
hast Du z.B ein RS232 Signal. Damit dann per Terminal, oder eben dann in 
VBA programiert einen NE555 triggern, der die eingstellte Impulsbreite 
hat. - fertig

von Dieter D. (dieter_dosenkohl)


Lesenswert?

Kann man Windows überhaupt echtzeitfähig machen? Unter Linux sollte es 
gehen. Mit spezieller Realtime Distro.

von Joachim B. (jar)


Lesenswert?

Dieter D. schrieb:
> Kann man Windows überhaupt echtzeitfähig machen?

https://kithara.com/en

von Falk B. (falk)


Lesenswert?

Dieter D. schrieb:
> Kann man Windows überhaupt echtzeitfähig machen? Unter Linux sollte es
> gehen. Mit spezieller Realtime Distro.

Wozu sollte der OP das brauchen? Die wirkliche Arbeit macht so oder so 
NICHT Windows und der PC sondern externe Hardware. Das hier war schon 
der richtige Tip. Einfach, preiswert und schnell.

Beitrag "Re: wie erzeuge ich von einem windows laptop aus einen 1 mikrosekunden puls mit 3.3 Volt"

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

Dieter D. schrieb:
> Kann man Windows überhaupt echtzeitfähig machen? Unter Linux
> sollte es
> gehen. Mit spezieller Realtime Distro.

Auch mit echtzeit-Linux kann man keine Mikrosekunden-Pulse erzeugen, und 
selbst RTOSe für Mikrocontroller bieten so eine Auflösung nicht. Daher 
muss man solche Pulse über einen Timer/PWM-Kanal erzeugen, das können 
praktisch alle Mikrocontroller.

Die Frage ist also: Wie kritisch ist das "wann", also wie viel Zeit darf 
vergehen von der "Anfrage" aus der PC-Software bis zur tatsächlichen 
Erzeugung des Pulses? Wenn das nicht allzu kritisch ist, ist ein 
Mikrocontroller mit USB-Anbindung wahrscheinlich die einfachste Lösung.

z.B. meine USB-Implementation nehmen, und in der Behandlung von 
SETUP-Paketen die beispielhafte Ansteuerung der LEDs durch ein Starten 
eines Timers ersetzen:

https://github.com/Erlkoenig90/f1usb/blob/e4c59124cb3ee5183861591dd7ed84101c703790/src/usb.cc#L602

Die STM32-Timer haben einen "One-Pulse-Mode", mit dem man bequem 
einzelne Pulse abgeben kann. An diese Stelle die entsprechenden 3 Zeilen 
einfügen sei als Übung überlassen :)

Hier ist zu sehen wie der Befehl vom PC aus gesendet wird:

https://github.com/Erlkoenig90/usbclient/blob/master/src/main.cc#L177

Als wValue (hier: "ledData") könnte man sogar noch die gewünschte 
Pulslänge übertragen (16bit-Wert). Das funktioniert dann u.a. mit den 
weit verbreiteten billigen STM32F103-Bluepill-Boards.

von weiter weg (Gast)


Lesenswert?

Toll was hier wieder geboten wird. Kaum vergehen Minuten schon
wird von Linux geredet was an der Anforderung des TO voll
vorbeigeht:

Mat. K. schrieb:
> ich will einen Puls variabler länge in Mikrosekunden bereich generieren
> und das aus Windows über python.

Dass die Anforderungen viel zu ungenau sind ist klar, und der
TO ist schon längst wieder eingepennt oder hat sich verzogen
weil er das alles eigentlich gar nicht wollte. Wenn er
wirklich was wollte würde er sich m.M. sehr kurzfristig wieder
melden.

... Windows über python .... Kommandozeile über Visual Basic ...

von Jester (Gast)


Lesenswert?

Mat. K. schrieb:
> was muss ich tun: ich habe eine STM32 PCB und habe einen PIN auf
> external interrupt geschlatet. Für testzwecke will ich auf diesem Pin PC
> gesteuert Pulse geben und einen Interrupt auslösen.
> Aktuell generiere ich diesen Signal über einen USB Relay.
> https://www.amazon.de/HALJIA-Module-Control-Switch-Intelligent/dp/B075F6J6WL
> Über python mache ich kurz den relay auf/zu und generiere damit einen
> Puls. Das schmeisst dann den Interrupt in mein STM32 an.
> Aber ein USb Relay erzeugt keinen saubereb Puls und der ist auch viel zu
> lang.
> Was meint ihr?

Ich meine, dass Dir mit einem Kasterl mit zwei AA-Zellen und einem 
sauber entprelltem Taster besser gedient wäre. Der Entprellung würde ich 
noch ein 1us-Monoflop nachschalten.
Wenn ich mir sowas basteln wollte, würde ich den zeitbestimmenden 
Kondenser austauschbar machen und Masse/0V sowie die Signale in original 
und invertiert nach außen legen.

von A. S. (Gast)


Lesenswert?

Der PC kann den Puls als UART seriell. Heute kaum selber, aber also USB 
zu RS232. Z.B. mit 1 MBaud und Zeichen von 0x00 bis 0xff kannst Du 1..9 
µs-Pulse erzeugen.

Je nach Ausführung brauchst Du dann noch eine Z-Diode, einen 
Spannungsteiler oder 2 Climb-Dioden an Deine Versorgung um daraus 0/3V 
zu machen.

von weiter weg (Gast)


Lesenswert?

A. S. schrieb:
> Der PC kann den Puls als UART seriell. Heute kaum selber, aber also USB
> zu RS232. Z.B. mit 1 MBaud und Zeichen von 0x00 bis 0xff kannst Du 1..9
> µs-Pulse erzeugen.

Und wann genau soll dein Puls daherkommen? Nach einer msec
oder nach zweien? Ist ja nicht so wichtig, gell?

Beitrag #7204777 wurde von einem Moderator gelöscht.
von (prx) A. K. (prx)


Lesenswert?

Mat. K. schrieb:
> ich will einen Puls variabler länge in Mikrosekunden bereich generieren
> und das aus Windows über python.

Wieviele Schritte? Von 1T bis 10T gibts per TxD eines FT232 bei 
passender Baudrate.

von (prx) A. K. (prx)


Lesenswert?

A. S. schrieb:
> Z.B. mit 1 MBaud und Zeichen von 0x00 bis 0xff kannst Du 1..9
> µs-Pulse erzeugen.

Du hast das Parity-Bit vergessen.

Beitrag #7204784 wurde von einem Moderator gelöscht.
Beitrag #7204786 wurde von einem Moderator gelöscht.
von (prx) A. K. (prx)


Lesenswert?

Jack V. schrieb:
> Du schließt einen Microcontroller mit entsprechender Software und
> Schnittstelle an, und gibst diesem via Python die Anweisung, den Puls zu
> generieren.

Der Bus Pirate könnte sich vielleicht dafür eignen.
http://dangerousprototypes.com/docs/Features_overview

: Bearbeitet durch User
von Steve van de Grens (roehrmond)


Lesenswert?

Wenn eine manuelle Bedienung OK wäre, dann nimm so ein Timer Modul:
https://de.aliexpress.com/item/32839042221.html

Da kannst du einstellen, wie lang der Impuls sein soll, wie viele 
Impulse zu haben willst und wie lang die Pause dazwischen sein soll. Per 
Tastendruck startest du dann den Durchlauf.

Die Bedienung ist ein bisschen Tricky, für einige Funktionen muss man 
Tasten gedrückt halten. Ich bin damals aus der Beschreibung keines 
Händlers nicht schlau geworden, hatte aber eine bessere (mit Bildern für 
Analphabeten) im Netz gefunden.

: Bearbeitet durch User
von Max M. (Gast)


Lesenswert?

Jeden Tag wird's schlimmer schrieb im Beitrag #7204786:
> Auch unter Windows ist eine Baudrate ein Baudrate!

Und der 'Puls', wenn man es denn so nennen will, der aus 0x00 bis 0xff 
und dem unvermeidlichen Start und Stopbit zusammengefriggelt ist, kommt 
irgendwann in den nächsten xxx ms, nachdem das Script sendet, der 
virtuelle Com Port Treiber das zu einer USB Übertragung zusammenbastelt 
und der USB-Uart das wieder zu einer Pulsfolge am TX gewandelt hat.

xxx ms ist nicht zuletzt davon abhängig wann das OS denn mal wieder 
einen Zeitschlitz zuteilt, was gerade im Hintergrund los ist und mit 
welcher Prio das läuft, und jittert mit mehreren ms vor sich hin.

>Jeden Tag wird's schlimmer
Ja, und die Vollidioten sind immer besonders laut.

von Steve van de Grens (roehrmond)


Lesenswert?

Mein Modul war das zweite (mit 1x MOSFET Ausgang) auf 
https://de.aliexpress.com/item/1005002413506830.html

Du brauchst aber eins mit Logik Ausgang

von Mat. K. (matthias_kornfield)


Lesenswert?

Hi
Vielen Dank. Ich habe aus eurer Diskussionen alle Probelme die es so 
geben kann verstanden und habe mich für ein Arduino board mit USB 
entschieden.
Danke

von Hans-Georg L. (h-g-l)


Lesenswert?

Wenn du einen STM32 hast hat der doch genug Timer die das locker können.
PWM out und one pulse mode setzen und über einen externen Taster 
starten. Wenn du den TIM1 nimmst kannst du zusätzlich den repetition 
zähler benutzen und  1.. 255 impulse ausgeben. Die Zeiten kannst du fest 
vorgeben oder über Uart/USB  einstellbar machen. Das geht schneller und 
genauer wie mit dem PC.

von A. S. (Gast)


Lesenswert?

(prx) A. K. schrieb:
> Du hast das Parity-Bit vergessen.

Nicht vergessen, aber es überfordert einen Anwender, der noch nie was 
mit Sios gemacht hat (sonst wüste er das), für 10 aufeinanderfolgende 
Bits dann die Sio umzustellen (auf ODD Parity) und 0xff zu senden.

Und sich dann zu überlegen, bei welchen anderen Werten er nicht 
zurückschalten muss (bei allen ungeraden µs-Impulsen, also 8, 6, 4, 2)

Beitrag #7204978 wurde von einem Moderator gelöscht.
Beitrag #7204986 wurde von einem Moderator gelöscht.
von Dieter D. (dieter_dosenkohl)


Lesenswert?

Falk B. schrieb:
> Dieter D. schrieb:
>> Kann man Windows überhaupt echtzeitfähig machen? Unter Linux sollte es
>> gehen. Mit spezieller Realtime Distro.
>
> Wozu sollte der OP das brauchen? Die wirkliche Arbeit macht so oder so
> NICHT Windows und der PC sondern externe Hardware. Das hier war schon
> der richtige Tip. Einfach, preiswert und schnell.
>
> Beitrag "Re: wie erzeuge ich von einem windows laptop aus einen 1 mikrosekunden puls mit 3.3 Volt"

Ja fein mein kleiner da hast du ja mal  wieder erfolgreich gezeigt wie 
schlau du bist. Dass man das mit extra uC nicht braucht weiß sogar meine 
Oma du Leuchte.

von Dieter D. (dieter_dosenkohl)


Lesenswert?

Niklas G. schrieb:
> Dieter D. schrieb:
>> Kann man Windows überhaupt echtzeitfähig machen? Unter Linux
>> sollte es
>> gehen. Mit spezieller Realtime Distro.
>
> Auch mit echtzeit-Linux kann man keine Mikrosekunden-Pulse erzeugen, und

Was wäre damit möglich?

von Niklas G. (erlkoenig) Benutzerseite


Angehängte Dateien:

Lesenswert?

Weil es heut eh nur regnet, hier eine Software für den STM32F103RB mit 
der das geht. Sie funktioniert mit dem STM32-Olimexino und sollte auch 
mit den diversen STM32F103-Bluepillboards gehen. Pin PC12 wird verwendet 
um den Pullup der USB-Verbindung zu aktivieren (nur auf dem Olimexino 
nötig, bei den BluePill-Boards offen lassen).

Das Pulssignal wird auf PA1 ausgegeben. Das Gerät meldet sich am PC als 
WinUSB Device an, somit ist keinerlei Treiber-Installation/Konfiguration 
nötig. Sollte ab Win8 direkt funktionieren. Die Ansteuerung erfolgt über 
den Control EP 0, über Pakete mit bmRequestType=0x40, bRequest=1, 
wValue=Periodendauer in μs. Man sollte die Befehle nicht schneller 
senden als der Puls dauert (also ggf. ein Sleep einbauen), sonst 
verheddert sich der Timer.

Über LibUSB kann man von Linux/Windows aus dann Puls-Befehle senden. Ein 
Beispiel für Python ist angehängt. Zuvor müssen die Abhängigkeiten 
installiert werden mit:
1
python -m pip install -r requirements.txt

Pulsdauern sind im Bereich 1-65534. Der Puls wird mit 1μs versetzt 
erzeugt, mir ist auf die Schnelle keine bessere Lösung eingefallen wie 
man im One Pulse Mode danach wieder automatisch auf "Low" geht (PWM Mode 
2).

Ich habe gerade kein Oszilloskop zur Hand, mag jemand prüfen ob die 
Pulslänge exakt richtig ist (Off-By-One-Errors bei der 
PWM-Konfiguration...)?

Dieter D. schrieb:
> Was wäre damit möglich?

Wahrscheinlich Zeiten in Millisekunden-Bereich, außer man nutzt eben 
eine Timer-Peripherie.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hab jetzt mit dem Oszilloskop festgestellt dass natürlich ein 
Off-By-One-Error drin war. Im Anhang ist eine aktualisierte Version 
welche den Puls µs-genau ausgibt.

Ich habe außerdem einen 2. Pakettyp hinzugefügt (bRequest=2) welcher das 
ACK erst nach Erzeugen des Pulses sendet, dadurch kehrt die 
Sende-Funktion auf dem PC auch erst danach zurück, sodass beim Senden 
weiterer Pulse keine Überschneidungen auftreten. Das entsprechend 
aktualisierte Python-Script ist im Anhang, über den "wait"-Parameter der 
send_pulse-Funktion kann man das nutzen. Etwas tricky wird der Timeout 
entsprechend gesetzt, damit es nicht zu früh abbricht.

Den Sourcecode hab ich bei GitHub hochgeladen: 
https://github.com/Erlkoenig90/f1usb/tree/pulsegen

von Sebastian W. (wangnick)


Angehängte Dateien:

Lesenswert?

Mat. K. schrieb:
> ich will einen Puls variabler länge in Mikrosekunden bereich generieren
> und das aus Windows über python.
> Wie mache ich das am geschicktesten?

Besorg die einen USB-TTL-Wandler (vielleicht hast du ja schon einen), 
und dann:

<code>
import serial
import time
com = serial.Serial("COM4",1000000)
while True:
    com.write(b'\xFF')
    time.sleep(0.001)
</code>

Dies erzeugt auf TXD Pulse mit 3.3V Hub und 1us Länge (bei mir min 
1.008us, max 1.024us, mean 1.015us, sigma 2.2ns). Der Puls entspricht 
dem Startbit, die acht Startbits und das Stopbit sind im Ruhezustand.

Allerdings sind die Pulse a) negativ (der Ruhezustand ist 3.3V und der 
Puls ist 0V) und b) nicht wirklich regelmäßig (die Zeit zwischen den 
Pulsen schwankt min 3.2ms, mean 15ms, max 17.8ms, sigma 490us).

Die Pulslänge kann man mit der Baudrate anpassen.

LG, Sebastian

von Falk B. (falk)


Lesenswert?

Sebastian W. schrieb:
> Allerdings sind die Pulse a) negativ (der Ruhezustand ist 3.3V und der
> Puls ist 0V)

Kann man leicht in der Konfiguration des Chips ändern, wenn er von FTDI 
ist.
Und selbst wenn nicht, Inverter wurden schon erfunden.

von Sebastian W. (wangnick)


Lesenswert?

Falk B. schrieb:
> Kann man leicht in der Konfiguration des Chips ändern, wenn er von FTDI
> ist.

Falk, wie geht das? Meiner ist von FTDI, der Treiber unter Windows 10 
ist FTDI 2.12.36.4 von 05.07.2021, und ich finde diese 
Konfigurationsmöglichkeit nicht auf Anhieb. In den Details der 
Treibereigenschaften sind allerdings einige kryptische UUIDs ...

LG, Sebastian

von Falk B. (falk)


Lesenswert?

Sebastian W. schrieb:
>> Kann man leicht in der Konfiguration des Chips ändern, wenn er von FTDI
>> ist.
>
> Falk, wie geht das?

Mit einem extra Programm, FT_PROG

https://ftdichip.com/utilities/

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.