Ich habe aus einem Tintestrahldrucker eine Linienscheibe (oder wie auch immer die heißt) und die dazugehörige Doppellichtschranke ausgebaut. Also das Ding, mit dem der Drucker die Bewegung der Papierwalze bestimmen kann. Damit möchte ich jetzt herumexperimentieren. Ich habe das ganze mit ein bisschen Fischertechnik "umgeben" und über einen Motor angetrieben. Im Endeffekt möchte ich im Experiment die Geschwindigkeit der Scheibe, unabhängig von der Belastung, konstant halten, indem der µC dann wieder den Motor steuert. Die Lichtschranken sind so auf die Linienbreite abgestimmt, dass zwei um 90° versetzte Sinussignale herauskommen, was nach einer Umwandlung zu Rechteck einen 2-Bit-Graycode ergibt. Meine Frage ist jetzt: wie werte ich das Signal mit einem µC am besten aus? Bei der Suche habe ich sowohl die Methode mit internem Timer als auch mit externem Interrupt gesehen, wobei mir nicht klar geworden ist bei welcher Signalgeschwindigkeit, was besser ist. Anfangs hatte ich alle 2µs einen Pegelwechsel (die Scheibe hat 1800 Linien pro Umdrehung), aber da ist nichtmal der Komparator (LM393) mitgekommen der aus dem Sinus ein Rechteck macht (der Ausgangstransistor hat nicht schnell genug geschlossen). Auch für einen atMega mit 8MHz wäre das zu schnell gewesen (nur 16 Takte zwischen jedem Pegelwechsel). Der soll ja etwas anderes auch noch tun. Mit einer Übersetzung bin ich jetzt auf einen Pegelwechsel alle 20 bis 50µs gekommen (je nach Motorgeschwindigkeit). Da sieht jetzt die Komparatorausgabe auch schon fast rechteckig aus und der µC sollte auch genug Zeit zum Rechnen haben. Der Takt des Signals ist variabel, aber im Vergleich zu manuellen Drehgebern doch ziemlich gleichmäßig. Und wenigstens können die Lichtschranken nicht prellen, was bei der Verarbeitung auch einiges einspart. Welche Methode ist da die bessere? Timer oder Interrupt?
Mit externerm Interrupt: - Braucht immer nur so viel CPU-Leistung wie nötig, d.h. bei langsamen Drehzahlen weniger. Das bringt allerdings nicht viel, da man die CPU-Leistung sowieso vorhalten muss. - Bleibt der Drehgeber zufälligerweise exakt im Bereich einer Signalflanke stehen, können (je nach Aufbau) hohe Frequenzen im Signal entstehen, da der Pegel durch kleinste Vibrationen oder durch elektrischen Rauschen hin- und herwackeln kann. Das führt zur Bombardierung des µC mit Interrupts, die u.U. sämtliche CPU-Leistung auffrisst. Abhilfe schafft ein geeigneter Tiefpass mit nachgeschaltetem Schmitt-Trigger für jedes der beiden Signale, was aber zusätzlichen Aufwand bedeutet. - Vierfache Auflösung (d.h. Auswertung der steigenden und fallenden Flanken beider Signale) erfordert zwei Interrupteingänge, die auf steigende und fallende Flanken reagieren können müssen. Dafür wird kein Timer benötigt. Mit timergesteuertem Polling: - Hohe Frequenzen und Überschwinger an den Flanken (s.o.) und Prellen stören nicht und müssen weder hardware- noch softwaremäßig gesondert berücksichtigt werden. - Braucht immer konstant viel CPU-Leistung und zwar soviel, wie es der maximal zu erwartenden Drehzahl entspricht (bei geeignet gewählter Timer-Frequenz). - Vierfache Auflösung ist mit zwei gewöhnlichen Digitaleingängen möglich. Allerdings wird eben noch der Timer benötigt, wobei der natürlich noch anderweitig genutzt werden kann. Die klassischen Zählerbausteine für Inkrementalgeber (früher hießen sie 742000, gibt's aber auch unter anderen Namen) brauchen einen externen Takt, was darauf schließen lässt, dass sie ebenfalls im Polling-Betrieb arbeiten. Also: Polling im Timerinterrupt in den meisten Fällen die zu bevorzugende Lösung.
man nehme einen Timer. Pin change Interrupts sind nur bei wenigen Zustandswechseln zu gebrauchen wie beispielsweise bei diesen Drehencodern mit Achse als Potiersatz. Da brauchts dann aber elektrische Entprellung um sauber zu Funktionieren. Mit Timerintterruptauswertung faehrt man am besten. cu Tarzanwiejane
yalu wrote: > Also: Polling im Timerinterrupt in den meisten Fällen die zu > bevorzugende Lösung. Wenn du nur diesen einen Eingang hast, gebe ich dir recht. Anders sieht es meiner Meinung nach aus, wenn du auf mehrere Signale reagieren willst, besonders wenn sie mit stark unterschiedlicher Frequenz kommen. Ich habe mittlerweile 6 ext. Interrupts. Der schnellste ist der IR-FB Geber, der mit etwa 10KHz abgetastet wird. Der langsamste kommt aus dem DCF Empfänger, der max. 100Hz bräuchte. In dem Timer Interrupt müsste ich aber nun dauernd alle Eingänge abfragen und dann die entsprechenden Flags setzen. Da wird der Overhead schon recht groß. Bei mir geht das mit einem durchlaufenden 10KHz Timer und ext. Interrupts alles parallel. Gruß Rolf
Hi, mal ne blöde Frage, aber braucht's bei Lichtschranken eine Entprellung? Ich glaube nicht und gehe mal davon aus, dass die Signale "Licht" bzw. "kein Licht" deutlich genug erkannt werden können. Damit würde auch ich die Methode mit externen Interrupts favorisieren. Sollte ich mich in meinen Gedanken irgendwo verrannt haben wäre es schön, wenn mich da jemand korrigieren könnte. Gruß Fred
> Ich habe mittlerweile 6 ext. Interrupts. Der schnellste ist der > IR-FB Geber, der mit etwa 10KHz abgetastet wird. Der langsamste > kommt aus dem DCF Empfänger, der max. 100Hz bräuchte. Meine Antwort war auf das Einlesen Drehgebersignalen bezogen, wo es das Problem mit schnell pendelnden Pegeln (s. auch Link von Falk) geben kann. Bei anderen Signalquellen, die diese Probleme nicht haben, ist ein Interrupteingang natürlich ok und meist die bessere Lösung. > mal ne blöde Frage, aber braucht's bei Lichtschranken eine > Entprellung? Eine Entprellung nicht, aber: Zitat aus Drehgeber: Das Pendeln kann zwei Ursachen haben. - Der Encoder pendelt wirklich; das kann z.B. bei hochauflösenden Encodern ohne Rastung geschehen, welche an jeder beliebigen Stelle stehen bleiben können und durch geringe mechanische Erschütterungen dann zwischen zwei Codes pendeln; das kann z.B. bei hochauflösenden Encodern in CNC-Maschinen der Fall sein. - ... Geschieht das Pendeln mit zu hoher Frequenz, legt es dir den µC lahm.
Hallo nochmal, danke yalu für Erklärung und Link. Das Pendeln hatte ich gedanklich verdrängt, da ich bei der gewünschten Anwendung (Motorkontrolle) von einer relativ schnellen Bewegung ausgegangen bin, bei der (geschätzt) weniger als ca. fünf Pendelvorgänge pro High-Low Übergang auftreten. Bei langsamen Drehgeschwindigkeiten könnte das aber wirklich ein ernstes Problem werden. Gruß Fred
Danke an alle, die bis jetzt geantwortet haben, besonders yalu für die genaue Beschreibung. Da das ganze keinen speziellen Hintergrund hat sondern vorallem Übungszweck ist, muss ich nicht alles berücksichtigen. Das Pendeln wäre im stehenden Fall tatsächlich ein Problem. Das liegt nicht an den Lichschranken, die liefern ein stabiles Signal. Aber wehe man berührt nur irgendwie den Tisch, dann gibt es gleich ein paar Sprünge weiter. Bei 1800 Linen auf ca. 22cm Umfang (1800lpt bzw. 200lpi) ist das auch kein Wunder. Aber den stehenden Fall schließe ich sowieso aus. Da das Sinussignal der Lichtschranken eine Gleichspannung überlagert hat, die noch dazu Frequenzabhängig ist, ist das mit dem Vergleichswert für den Komparator nicht so einfach wenn man trotzdem noch ein 50-50-Rechteck herausbekommen möchte (das habe ich genauer hier beschrieben: http://forum.electronicwerkstatt.de/phpBB/topic73756_f26_bxtopic_timexDESC_by1_bz0_bs0.html). Die Lösung funktioniert bei Stillstand gar nicht erst. Ich werde jetzt erstmal die Timerlösung probieren.
DC wird man doch mit nem Kondensator recht bequem los
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.