mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Gray-Code Auswertung per Timer oder externem Interrupt?


Autor: Chris O. (lupin_iii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Thomas Otto (tarzanwiejane)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Rolf Im forum (for_ro)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> 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.

Autor: Fred (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Chris O. (lupin_iii)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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/topic737...). 
Die Lösung funktioniert bei Stillstand gar nicht erst.

Ich werde jetzt erstmal die Timerlösung probieren.

Autor: Hauke Radtki (lafkaschar) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DC wird man doch mit nem Kondensator recht bequem los

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.