Forum: Mikrocontroller und Digitale Elektronik IO Timing synchron zu Encoder (Verschleppung)


von Andreas T. (Firma: SIG) (andreast)


Lesenswert?

Hallo zusammen,

ich bin neu hier und ehrlich gesagt im Thema MikroController nicht so 
bewandert. Eher ist IIOT in Hochsprachen auf dem Pi (Siemens-IOT2000) 
mein Ding.
Ich habe aber ein Thema, bei dem es um exaktes Timing von digitalen IOs 
geht.
Ich suche daher nach einer "einfachen" Lösung digitale Signale von einem 
IOT2000 mit einem Drehgeber synchron einzulesen, zu verschleppen und 
wieder auszugeben.
Was ich bräuchte:
Drehgebereingang A/B: ~50-60 kHz
mindestens 16 IN
mindestens 16 OUT
Was ich mir auf vorstelle ist ein Arduino-Shield mit:
- Einem Zähler, der den Stand des Drehgebers wiedergibt.
  - Aktueller Wert jederzeit auf Pi abfragbar
  - Per Software und/oder digitalem Signal rücksetzbar
- Einer Eingangs-Queue von Events der digitalen Eingänge jeweils mit 
Info:
   - PinID, Value, Encoder zum Zeitpunkt des Statuswechsels
- Eine Ausgangs-Queue zur Steuerung der Out-Pins
   - PinID, zu setzender Wert, Encoder zu dem der Wert gesetzt wird.

Ich weiß, dass einige Framegrabber für Zeilenkameras genau diese 
Funktionalität über FPGA bieten, aber ich brauche einfach nur die IOs.
Gibt es einen entsprechenden FPGA/CPLD-Shield, den ich so nutzen könnte.

Über entsprechende Tipps würde ich mich sehr freuen.

Viele Grüße

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Andreas T. schrieb:
> Eher ist IIOT in Hochsprachen auf dem Pi
Das soll jetzt nicht irgendwie abwertend sein: so hört sich auch dein 
Vokabular an. Du verwendest Worte (Event, Queue, Statuswechsel, 
PinID...), die einem Hardwareentwickler nichts Verbindliches oder 
Realisierbares sagen. Denn für den hat ein Eingang natürlich keine 
"Eingangsevents", sondern ein Eingang ist ständig da und hat ständig 
Information.

> digitale Signale von einem IOT2000 mit einem Drehgeber synchron
> einzulesen, zu verschleppen und wieder auszugeben.
?? Häh? Du willst mit einem Drehgeber digitale Signale einlesen? Oder 
hast du da Quelle und Zeil vertauscht? Hast du einfach mal eine Skizze, 
was da wo wie mit wem verbunden ist und wo du dein Gerät siehst?

> Was ich bräuchte:
> Drehgebereingang A/B: ~50-60 kHz
> mindestens 16 IN
> mindestens 16 OUT
Und was soll damit wie lange "verschleppt" werden?
Kannst du da mal ein Timing-Diagramm oder irgendsowas malen?

Andreas T. schrieb:
> Was ich mir auf vorstelle ist ein Arduino-Shield mit ...
Kann es sein, dass du damit ein nicht echtzeitfähiges IOT-Gerät auf 
Echtzeit "ertüchtigen" willst, indem du für die Eingänge eine Art 
Logicanalyzer baust und für die Ausgänge eine "Todo"-Liste, wo 
eingetragen wird, zu welchem Zeitpunkt was ausgegeben werden soll?

Das wird im echten Leben nicht brauchbar funktionieren, weil ja die 
"Nichtechtzeit" des IOT-Geräts eine Reaktion der Ausgänge auf eine 
Eingangsbedingung beliebig verzögert. Also: sogar wenn du herausfindest, 
dass der Stop-Taster zum Zeitpunkt 100ms gedrückt wurde, du das dann 
aber erst zum Zeitpunkt 1700ms einliest und berechnest, dass zum 
Zeitpunkt 101ms  der Motor abgeschaltet werden müsste, wird der Motor 
frühestens bei 1701ms anfangen zu bremsen.

: Bearbeitet durch Moderator
von Andreas T. (Firma: SIG) (andreast)


Lesenswert?

Lothar M. schrieb:
> Kann es sein, dass du damit ein nicht echtzeitfähiges IOT-Gerät auf
> Echtzeit "ertüchtigen" willst, indem du für die Eingänge eine Art
> Logicanalyzer baust und für die Ausgänge eine "Todo"-Liste, wo
> eingetragen wird, zu welchem Zeitpunkt was ausgegeben werden soll?

Ja genau dass, aber ohne sicherheitsrelevante Themen und direkte 
Steuerung von Analagen ...
Es geht konkret darum Laufmeter (Encoderpulse) in einem 
Produktionsprozess von ca. 1000 m/min zu verfolgen. Dabei will ich 
verschiedene Sensoren (Digitale Eingänge) den Laufmetern des Materials 
zuordnen können, um diese später wieder aufzufinden. Am Ende des 
Prozesses gibt es eine Schleuse, die im richtigen Moment ausgelöst 
werden soll. Also die Gesamtanwendung hat tatsächlich eine Echtzeit- und 
eine IIOT-Ebene, die miteinander kommunizieren.

Auf dem IOT-Gerät hätte ich ausreichend Zeit (einige Sekunden) die Daten 
zu verarbeiten, und auch hier steht mir "Echtzeit" zur Verfügung 
(PREEMPT_RT).
Aber bei 60 kHz Pulsgenau? Das sollte Hardware übernehmen. Daher meine 
Frage welche Hardware (für den Echtzeitteil) dass leisten könnte. Bei 
50-60kHz Encoderfrequenz bräuchte ich für die gesamte IO-Loop eine 
Zykluszeit von < 20 µs.
Komme ich da mit einem aktuellen Microcontroller aus oder brauche ich 
einen FPGA/CPLD für das harte Timing?

von Falk B. (falk)


Lesenswert?

https://www.golem.de/news/bastelrechner-arduino-board-hat-fpga-integriert-1909-144114.html

Naja, da Overkill und mit Kanonen auf Spatzen schießen heute Volkssport 
ist, kann man auch einen fetten 32 Bit Controller mit 100MHz++ CPU Takt 
nehmen und die Kernroutine in einem sehr schnellen Interrupt abhandeln, 
ggf. sogar in Assembler. Das mache ich in einem Projekt in der Firma, 
dort läuft eine 100kHz ISR in einem PICCOLO, die handhabt den ADC 
und bis zu 5 digitale Regler.

: Bearbeitet durch User
von Veit D. (devil-elec)


Lesenswert?

Hallo,

das messen selbst ist nicht das Problem. 60kHz sind 16,7µs. Ich frage 
mit einem 20MHz getakteten AVR128DB64 3 Encoder innerhalb von 9,6µs ab 
und aktualisiere die Zählerstände. Eine Abfrage eines Encoders würde 
6,3µs dauern. Dabei werden die I/Os nur gepollt. Die Frage lautet eher 
wie kommt der Zählerstand von diesem dafür abgestellten µC in deinen Pi? 
Spielt die "langsame" Übertragungszeit eine Rolle? Per USART, I2C, SPI?
Du müsstest die Encoderabfrage dann sicherlich in einen Timer-Interrupt 
legen. Sonst wärest du während der Übertragung blind.
Wenn du dafür einen schnelleren µC verwendest, sehe ich keine Probleme. 
Das Abfrageintervall sollte ja bei dir unter 8µs bleiben inkl. ggf. 
weiterer Verarbeitungszeiten vor der Übertragung.

von N. M. (mani)


Lesenswert?

Andreas T. schrieb:
> Drehgebereingang A/B: ~50-60 kHz
> mindestens 16 IN
> mindestens 16 OUT

Es gibt uC mit dedizierter Encoder Hardware. Bei TI Piccolo heißt das 
glaube ich QEI (Quadrature Encoder Interface). Bei ST können das glaube 
ich bestimmte Timerzellen.
Damit könnte man den Encoder schonmal in die Hardware auslagern. Was 
schon einiges an unnötiger Last von der CPU nimmt.

Wenn man richtig Latenzarm sein will würde man vermutlich ein Controller 
mit ausreichend Pins suchen um die Daten nicht erst noch über SPI 
lesen/schreiben zu müssen. Also großes Package.
16xIN einlesen wäre dann in einer zyklischen Task? Entprellen wirst du 
trotzdem müssen um deine Input Queue nicht vollzurotzen.

Das setzen der Outputs sehe ich da schon kritischer. Gerade wenn es zu 
einem bestimmten Zählerstand (exakt zur Flanke des Encoders?) sein 
sollte. Hast du nicht gesagt, merke ich nur an.

Außerdem brauchst du noch eine Logik dass dir niemand Dinge in deine 
Output Queue schreibt die sich gegenseitig blockieren. Ich denke da an 
zu spät ankommende Aufträge (Zählerstand ist schon beim Eintreffen der 
Queue über/unterschritten) oder sich gegenseitig blockierende Jobs 
(Auftrag 2 in Queue ist eigentlich vor Auftrag 1 dran).

Dann noch ein schlankes Protokoll mit wenigen Bytes. Feste Länge. DMA 
kopiert die Daten vom Peripheral und löst nach X Byte den Empfangs-ISR 
aus.

Andreas T. schrieb:
> Ich weiß, dass einige Framegrabber für Zeilenkameras genau diese
> Funktionalität über FPGA bieten, aber ich brauche einfach nur die IOs.

Klar mit FPGA bekommst du das richtig Echzeitfähig hin. Die Frage ist ob 
du das wirklich brauchst und du dir das wirklich antun willst. Gerade 
wenn uC schon eine Hürde ist wird es mit FPGA nicht besser werden, oder?

Andreas T. schrieb:
> Gibt es einen entsprechenden FPGA/CPLD-Shield, den ich so nutzen könnte.

Eva Boards gibt's wie Sand am Meer. Max1000 oder DE0Nano wären so zwei 
was mir sofort einfallen. Da würde auch noch ein kleiner Softcore 
reinpassen falls man ihm braucht.
Aber wenn die Echtzeitforderungen nicht zu hoch sind sollte das auch mit 
einem uC machbar sein.

von Andreas T. (Firma: SIG) (andreast)


Lesenswert?

Danke für die vielen Infos. Vor allem der "Spartan Edge Accelerator" 
sieht spannend aus.
Habe noch zwei Arduino-Shields gefunden, die auch Hilfreich sein 
könnten:
- 
https://earthpeopletechnology.com/?wpsc-product=ept-570-ap-u2-usbpld-development-system-for-the-arduino-uno
- https://oe7twj.at/index.php?title=Arduino/Amani/64 - (da fehlt mir 
aber leider eine Bezugsquelle)

Mein Pi ist ein Siemens IOT-2040 und der hat einen Arduino-Shield 
kompatiblen Sockel. Aber spätestens wenn es an FPGA/CPLD Programmierung, 
geht werde ich mir wohl noch ext. Unterstützung suchen.

von Falk B. (falk)


Lesenswert?

Andreas T. schrieb:
> Danke für die vielen Infos. Vor allem der "Spartan Edge Accelerator"
> sieht spannend aus.
> Habe noch zwei Arduino-Shields gefunden, die auch Hilfreich sein
> könnten:
> -
> 
https://earthpeopletechnology.com/?wpsc-product=ept-570-ap-u2-usbpld-development-system-for-the-arduino-uno

Naja, ein CPLD mit 440 Macrozellen ist heute nicht mehr so dolle. Kann 
sein, daß man den Kram reinkriegt, kann aber auch eng werden. Ich würde 
damit nicht ins Rennen gehen. Selbst der kleinste FPGA kostet keinen 
Cent mehr als so ein CPLD und hat locker Faktor 10 und mehr 
Logikresourcen incl. RAM! Den brauchst du für deine Queues.

> - https://oe7twj.at/index.php?title=Arduino/Amani/64 - (da fehlt mir
> aber leider eine Bezugsquelle)

64 Macrozellen ist erst recht Spielzeug! Finger weg!

> Mein Pi ist ein Siemens IOT-2040 und der hat einen Arduino-Shield
> kompatiblen Sockel.

Vergiss den Sockel, nimm normale Schnittstellen wie UART, SPI oder I2C. 
Wenn die Zusatzlogik gescheit gebaut ist, kann man das recht locker von 
außen steuern. Ohne Zeitstress.

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.