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.
Es wird Zeit, dass der TO seine Aufgabe präziser beschreibt, nicht seinen Lösungsansatz bzw. die Bauteile, die er zu verwenden gedenkt.
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.
:
Bearbeitet durch User
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).
Beitrag #5774163 wurde vom Autor gelöscht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.