Forum: Mikrocontroller und Digitale Elektronik Lichtschranken Signale erfassen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Arnold (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe folgendes Problem. Ich habe insgesamt 16 Lichtschranken des 
Typs Sick KT2G-2B3711.

https://www.sick.com/de/de/kt2/kt2g-2b3711/p/p169171

Diese haben eine maximale Schaltfrequenz von 10 kHz bei Hell:Dunkel 
(1:1). Ich muss sicher die Zeiten zwischen den positiven Impulsen der 
Lichtschranken erfassen. Ich habe leider keine 16 Hardwareinterrupts im 
yC zur Verfügung. Die Zeiten zwischen den Impulsen muss ich per Bus pro 
Kanal weg senden. Wichtig ist, dass ich keine Signale verliere oder 
verpasse und das ganze muss deterministisch funktionieren.

Meint ihr es ist ausreichend die 16 Eingänge mit einem Timerinterrupt 20 
kHz abzufragen und die Zustände zu vergleichen? Mein Prozessor ist ein 
STM32.. mit 72 Mhz. Oder lieber mit einem externem Hardwarebaustein 
realisieren?

Gruß,
Arnold

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Arnold schrieb:
> Ich muss sicher die Zeiten zwischen den positiven Impulsen der
> Lichtschranken erfassen. Ich habe leider keine 16 Hardwareinterrupts im
> yC zur Verfügung.

Sind die Lichtschranken unabhängig, i.e. können mehrere auch 
gleichzeitig auslösen oder ist vom Aufbau her sicher gestellt, dass die 
nur nacheinander unterbrochen werden können?

von Stefan ⛄ F. (stefanus)


Bewertung
-1 lesenswert
nicht lesenswert
Wenn du 10.000 Impulse pro Sekunde 20.000 mal abfragst hast du nur zwei 
Abfragen pro Impuls. Das heisst, du kannst nur zwischen lang und kurz 
unterscheiden.

> Ich muss sicher die Zeiten zwischen den positiven
> Impulsen der Lichtschranken erfassen.

Das klingt eher danach, dass eine Unterscheidung zwischen lang und kurz 
nicht ausreicht.

Also: Wie genau muss denn die Zeit erfasst werden?

von Arnold (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo zusammen,

alle Lichtschranken sind unabhängig voneinander. Ich habe mich schlecht 
ausgedrückt es sind Lichttaster. Diese verfügen über einen 
Schaltausgang, welcher mir immer dann ein Signal zurückliefert (0V / 
24V), wenn der Lichttaster etwas erkannt hat. Ich will die Zeiten 
zwischen den positiven Schaltvorgängen des erzeugten Signals messen.

Gruß

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Wie genau muss denn die Zeit erfasst werden?

von Wolfgang (Gast)


Bewertung
1 lesenswert
nicht lesenswert
Arnold schrieb:
> Ich habe leider keine 16 Hardwareinterrupts im yC zur Verfügung.

Für ein paar Lichtschranken, die gerade mal mit 10kHz schalten können, 
reicht doch ein Interrupt.
Sobald sich bei irgendeiner der Lichtschranken der Zustand ändert, wird 
per Timer ein Capture für den Timestamp ausgelöst und in der zugehörigen 
ISR der Zustand aller 16 Eingänge parallel eingelesen. Welcher Eingang 
den ISR ausgelöst hat, sucht die Software dann durch Vergleich mit dem 
vorherigen Zustand raus.

von Carl D. (jcw2)


Bewertung
0 lesenswert
nicht lesenswert
Arnold schrieb:
> Hallo zusammen,
>
> alle Lichtschranken sind unabhängig voneinander. Ich habe mich schlecht
> ausgedrückt es sind Lichttaster. Diese verfügen über einen
> Schaltausgang, welcher mir immer dann ein Signal zurückliefert (0V /
> 24V), wenn der Lichttaster etwas erkannt hat. Ich will die Zeiten
> zwischen den positiven Schaltvorgängen des erzeugten Signals messen.
>
> Gruß

So wie ich das DB lesen, verwenden sie 10kHz getaktetes Licht für ihre 
Messung, brauchen dann aber ca. 0,35ms von der Erkennung bis zum 
Schalten des Ausgangs auf 24V. Wird nichts mehr erkannt fällt der 
Ausgang wieder auf 0V. Außer zu (internen) Fremdlichtausblendung werden 
die 10kHz wohl nirgends auftauchen.

von Stefan ⛄ F. (stefanus)


Bewertung
0 lesenswert
nicht lesenswert
Es wird Zeit, dass der TO seine Aufgabe präziser beschreibt, nicht 
seinen Lösungsansatz bzw. die Bauteile, die er zu verwenden gedenkt.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Es wird Zeit, dass der TO seine Aufgabe präziser beschreibt, nicht
> seinen Lösungsansatz bzw. die Bauteile, die er zu verwenden gedenkt.

Ich vermute mal, dass er den Abstand zweier Unterbrechungen der 
Lichtschranke messen möchte, und das ganze 16-kanalig.

von Arnold (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

@Wolfgang ganz genau. Ich will genau die Zeit zwischen zwei positiven 
Impulsen des Lichttasters erfassen. Es gibt eine drehende Scheibe. Diese 
dreht sich ungefähr 1,3 mal pro Sekunde. Pro Umdrehung der Scheibe 
liefert die Lichtschranke 8 positive Impulse. Ich will die Zeit zwischen 
den Impulsen erfassen. Das ganze parallel für 16 Scheiben (16 
unabhängige Lichttaster). Ich bin mir bei der Lösungsfindung eben nicht 
ganz sicher. Ich könnte auf dem Mikrocontroller eben ein RTOS laufen 
lassen und eine höchst priorisierte Task, welche z.B. mit 10 kHz intern 
die Eingänge pollt. Ich bin mir nur nicht sicher ob ich damit wirklich 
jeden Impuls erfasse. Die Umfangsgeschwindikeit ist nicht zwingend 
konstant, d.h. die Scheibe kann pro Umdrehung eben mal ein ganz bisschen 
schneller oder langsamer drehen. Man könnte das ganze ja auch sicherlich 
in Hardware realisieren Z´z.B. externer IC, welcher nur die 
Impulserfassung macht. Die Genauigkeit muss über sagen wir mal bei ca. 
30s Messzeit bei 0,01% liegen.

Gruß und schönen Sonntag.

von Stefan ⛄ F. (stefanus)


Bewertung
-2 lesenswert
nicht lesenswert
0,01% ∙ 1,3 U/sec ∙ 8 Löcher ∙ 16 Scheiben = 1,6 Millionen Abtastungen 
pro Sekunde.

Polling ist hierfür ein ganz schlechter Ansatz. Benutze besser die 
Capture-Funktion eines Timers und Pin-Change Interrupts.

Ich würde es mir hier gff. einfach machen und jeder Lochscheibe einen 
eigenen kleinen 8-Pin Mikrocontroller spendieren, der die Zeiten misst 
und über irgendeine serielle Schnittstelle (z.B. I²C) ausgelesen wird.

Die Dinger kosten immerhin weniger, als 5 Minuten Entwicklungsarbeit.

: Bearbeitet durch User
von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Arnold schrieb:
> Die Genauigkeit muss über sagen wir mal bei ca. 30s Messzeit bei
> 0,01% liegen.

Was hast du genau vor?
Bei 0,01% musst du dich schon fragen, ob der Takt deines µC dafür 
überhaupt genau genug ist.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> 0,01% ∙ 1,3 U/sec ∙ 8 Löcher ∙ 16 Scheiben = 1,6 Millionen Abtastungen
> pro Sekunde.
>
> Polling ist hierfür ein ganz schlechter Ansatz.

Du hast da einen Faktor 16 zu viel drin. Wenn man jeweils 8 Scheiben auf 
einen Port legt, kann man die 16 Scheiben mit zwei direkt 
aufeinanderfolgenden Portzugriff einlesen. Das reduziert die Sache schon 
mal kräftig.

von Stefan ⛄ F. (stefanus)


Bewertung
-2 lesenswert
nicht lesenswert
Wolfgang schrieb:
> Wenn man jeweils 8 Scheiben auf
> einen Port legt, kann man die 16 Scheiben mit zwei direkt
> aufeinanderfolgenden Portzugriff einlesen.

Dann sind es immer noch 100.000 Abfragen pro Sekunde - immer noch keine 
gute Idee. Bis das rund läuft, habe ich es schon lange auf eine Handvoll 
ATtinies verteilt.

von K. S. (the_yrr)


Bewertung
0 lesenswert
nicht lesenswert
Arnold schrieb:
> Mein Prozessor ist ein
> STM32.. mit 72 Mhz.

Stefanus F. schrieb:
> 100.000 Abfragen pro Sekunde

das macht ca. 720 Takte pro Abfrage, macht 45 Takte pro Scheibe (dann 
macht der µC aber nichts anderes mehr), also 16 mal :
Wert vergleichen, wenn nicht verändert counter hochzählen, sonst counter 
auf 0 und Wert speichern.
das geht vllt. mit Assembler oder hardware nahem C, aber kaum mit C++ 
und HAL Bibliothek.

da im Schnitt jede Scheibe 1.3*8 ca. 10 Pulse pro Sekunde liefert, 
könnte man die Signale zu Gruppen OR verknüpfen (in hardware) sodass du 
genügend Interrupts hast, oder halt auch für alle 16:
Wolfgang schrieb:
> Sobald sich bei irgendeiner der Lichtschranken der Zustand ändert, wird
> per Timer ein Capture für den Timestamp ausgelöst und in der zugehörigen
> ISR der Zustand aller 16 Eingänge parallel eingelesen.
Problem ist wenn ein zweiter Interrupt während dem ersten kommt, da darf 
für die 0.01% kein Interrupt länger als 720 Takte dauern, also wieder C 
oder Assembler.

Stefanus F. schrieb:
> Ich würde es mir hier gff. einfach machen und jeder Lochscheibe einen
> eigenen kleinen 8-Pin Mikrocontroller spendieren, der die Zeiten misst
> und über irgendeine serielle Schnittstelle (z.B. I²C) ausgelesen wird
ist einfacher zu realisieren, solange du keine µC (z.b. Attinys) nimmst 
die kein Hardware IIC/SPI haben, mit dem USI der Tinys wird die 
Kommunikation quasi blockierend, also entweder verpasst du Impulse oder 
bekomsmt Kommunikationsfehler.

: Bearbeitet durch User
von c-hater (Gast)


Bewertung
0 lesenswert
nicht lesenswert
K. S. schrieb:

> mit dem USI der Tinys wird die
> Kommunikation quasi blockierend

Ähem, nein. Das muss schon dramatisch schlecht implementiert sein, damit 
da was blockiert...

Nö. Natürlich ist USI-I2C weniger effizient als die TWI-Engine der 
Megas, weil man mehr mit der MCU erledigen muss und zwei ISRs 
beschäftigt werden, aber blockieren tut auch beim USI nix. Blockieren 
würde bedeuten, dass man in einer der beiden ISRs auf irgendwas warten 
muss. Das muss man aber zu keiner Zeit und unter keiner (legalen) 
Bedingung.

von Stefan ⛄ F. (stefanus)


Bewertung
-1 lesenswert
nicht lesenswert
Selbst wenn es blockierend wäre, ist doch egal, weil die interessanten 
Zeiten vom Timer erfasst werden.

Umgekehrt kann man mit blockierendem USI Code und Timer ja auch top 
saubere PWM Signale erzeugen. Zum Beispiel: 
http://stefanfrings.de/servocontroller/index.html

: Bearbeitet durch User
von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Stefanus F. schrieb:
> Dann sind es immer noch 100.000 Abfragen pro Sekunde - immer noch keine
> gute Idee.
Die Messung wird nicht genauer, wenn man den Lichtschrankenausgang mit 
einer höheren Frequenz abfragen, als die Lichtschranken ihren Eingang 
auswerten.

Bei den 0.01% muss man wohl Abstriche machen, wenn die Lichtschranken 
jeweils nur mir 10kHz abtasten.

von Dieter W. (dds5)


Bewertung
1 lesenswert
nicht lesenswert
Arnold schrieb:
> Mein Prozessor ist ein STM32.. mit 72 Mhz.

Damit sollten sich doch an einem 16 Bit Port alle Signale parallel 
einlesen lassen. Dann mit dem letzten Bitmuster vergleichen und 
entsprechend reagieren.

von Arnold (Gast)


Bewertung
-1 lesenswert
nicht lesenswert
Hallo zusammen,

die Anstiegszeit des Lichttasters beträgt 50 yS Signallaufzeit.

Mir ist einfach nicht ganz klar wie ich das ganze korrekt 
ausrechne/bestimme im Rahmen der Toleranz.

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Arnold schrieb:
> die Anstiegszeit des Lichttasters beträgt 50 yS Signallaufzeit.

Falls du 50µs meinst - wie kommst du von Anstiegszeit auf Signallaufzeit 
(und wo hast du die Zahl her)?

> Mir ist einfach nicht ganz klar wie ich das ganze korrekt
> ausrechne/bestimme im Rahmen der Toleranz.

Dein Sensor tastet mit 10kHz ab. Die 100µs sind deine Abtastunsicherheit 
(Jitter).

von Arnold (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Hallo Wolfgang,

das steht im Datenblatt / Link den ich ganz zu Anfang gepostet habe.

Dort steht:
- Schaltfrequenz: 10 kHz /hell/dunkel 50:50 also der Schaltausgang denke 
ich des Lichttasters.
- Signallaufzeit: 50 µs

von Wolfgang (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Arnold schrieb:
> - Schaltfrequenz: 10 kHz /hell/dunkel 50:50 also der Schaltausgang denke
> ich des Lichttasters.
> - Signallaufzeit: 50 µs

Da ist das Datenblatt für einen Normalelektroniker etwas schwer 
verständlich formuliert. Ich vermute, dass mit 10kHz die Blinkfrequenz 
der Lichtschranken-LED gemeint ist und 360µs die Zeit zwischen 
Unterbrechung des Strahls und Änderung des Ausgangssignals sind.
Falls du das Ding da hast, würden ein paar Messungen Licht ins 
Produktbeiblatt bringen (Datenblatt kann man das nicht so richtig 
nennen).

Beitrag #5774163 wurde vom Autor gelöscht.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.