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
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?
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?
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ß
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
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).
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
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).