mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Counter fuer Encoderauswertung


Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich moechte mit meinem Atmega32 zwei Motoren ueber Inkrementalgeber
steuern. Nun dachte ich mir ich stoepsle die an einen Counter an und
kann dann aus 2 Registern die Zahl der zwischenzeitlich eingegangenen
Ticks auslesen (war zumindest bei C-Control 2 so). Die Counter
Architekur des Atmel schein dies aber nicht so komfortabel herzugeben
...

Also wollte ich Fragen ob meine Ueberlegung grundsaetzlich richtig ist.

Eigentlich dachte ich der Counter waere mein Ding, aber da habe ich nur
einen und die Frequenz des Signals interessiert mich ja nicht ... Also
verbinde ich die Inkrementalgeber mit INT1 und INT2 und lasse die
Interuptfunktionen eine globale Variable um 1 erhoehen. Nach dem
Auslesen von einem anderen Programmteil muss diese dann auf 0 gesetzt
werden.

Richtig so?

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Machs doch nicht so kompliziert. ein int reicht völlig aus.


e1=int0
e2=pinx.y
e1,e2 ->pullup aktiv

on int0 chk

hilfsbit=e2
wenn e1=1 dann int0=falling;hilfsbit=1
else int0=rising;hilfsbit=0

chk:

'Rising edge check
if e2=1 and hilfsbit=0 then decr zähler 'in diesem fall wäre e2 schon
eher betätigt worden
if e2=0 and hilfsbit=0 then incr zähler 'in diesem fall ist e2 noch
nicht betätigt

'falling edge check
if e2=0 and hilfsbit=1 then decr zähler 'in diesem fall wäre e2 schon
eher betätigt worden
if e2=0 and hilfsbit=1 then incr zähler 'in diesem fall ist e2 noch
nicht betätigt

if hilfsbit=0 then hilfsbit=1;int0=rising
if hilfsbit=1 then hilfsbit=0;int0=falling
(sonst geht nur jeder zweite step)
return

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rahul Der trollige (rahul)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Poseidonis:
Deine Idee ist schon praktikabel. Eigentlich sollte es aber auch mit
dem Counter gehen. Wie hast du es denn versucht zu realisieren?

@Peter: es geht um Inkremental-Geber an Motoren (zur Drehzahlregelung
etc). Ich weiß jetzt nicht, ob man deinen Code (Inkrementalgeber per
Hand gesteuert) auch auf die anderen Inkremental-Geber übertragen
kann.
Zur Drehzahlbestimmung kann man ja entweder die Menge von Impulsen in
einer bestimmten Zeitspanne messen, oder die Zeitspanne zwischen zwei
Impulsen...

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Abhängig von der Eingangsfrequenz kann man entweder zwei Portleitungen
(eines Ports) in konstanten Abständen einlesen und auswerten (bequem
bis 10kHz bei AVRs), zwei INTx Eingänge mit beiden Flanken verwenden
(bequem 100KHz) oder bei noch höheren Frequenzen zusätzlich Hardware
anbauen (z.B. Encoder-GAL). Bei den beiden ersten Vorschlägen werden
die Zähler in Software realisiert; beim letzteren durch Hardware
(up/down-Zähler !)intern oder extern.

Alle Optimierungen mit nur einem INT-Eingang und Bit zwischenspeichern
usw. funktionieren letzlich nicht !

Autor: Peter Dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, wenns nur für die Drehzahlregelung ist, brauchst Du die
Richtungserkennung natürlich nicht.

Hängt nun ganz von der maximalen Impulszahl ab, ob die externen
Interrupts ausreichen, oder ob Du T0 und T1 als Counter benutzen mußt.


Peter

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen Quadratur-Encoder-Signal an der Flanken einlesen, ist mumpitz.

Das Encoder-Signal kann prellen. Auch optische Encoder können prellen
(mechanische Vibrationen!). Und dann kann ein Zähler mit externen
Interupt ganz schönen Käse zählen. (Ganz davon abgesehen, dass ein
externer Interupt die CPU dicht machen kann.)

Quadratur-Encoder immer mit ausreichend hoher Frequenz samplen und
mit einer State-Maschine auswerten.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem an der Stelle ist - meiner Erfahrung nach - das Datenblatt!
Dort wird immer (ist mir jedenfalls noch nicht anders untergekommen)
die Auswertung mittels Interrupt und externem Tiefpass beschrieben.

Da kann ich mich nur dem Unbekannten anschliessen: Mumpitz...

Autor: Poseidonius (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich noch mal ...

Zunächst danke für Eure Antworten. Meine Aufgabe besteht darin einen
kleinen Roboter mit zwei Motoren geregelt durch die Gegend fahren zu
lassen. Da mir die Drehrichtung aus der Motorsteuerung bekannt ist
möchte ich also nur wissen wieviele Ticks in einer bestimmten Zeit
zurückgelegt wurden.
Mein Problem ist nun, dass ich mit einem furchtbar unpraktisch
verlinktem und nicht veränderbaren Board diese Aufgabe bewältigen
soll.

Kann ich also da ich nur einen Interups-steuerden PIN zur Verfügung
habe einen digitalen IO Port hinzuziehen - einen Inkrementalgeber mit
beiden Eingängen verbinden und den anderen nur mit dem Interupt PIN.
Dann könnte ich doch über die zweifache Abfrage klären zu welchem
Inkrementalgeber der Interupt gehört?

Machbar oder Unfug?

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Einen Quadratur-Encoder-Signal an der Flanken einlesen, ist mumpitz.

verstehe ich nicht.

Autor: Jan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Quadratur-Encoder-Signal an der Flanken einlesen, ist mumpitz.
Ein bischen hart formuliert, aber sachlich richtig.

Durch Pollen der beiden Encode-Signale mit geeigneter Frequenz
ergibt sich automatisch eine Entprellung, und es lässt sich einfach
eine komplette Auswertung der Signale erreichen, was die 4-fache
Auflösung gegenüber dem Nennwert ergibt.
Also - Interrupt ist schon richtig, aber Timer-Interrupt - für
das Polling.

Gruß Jan

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Offensichtlich beherrsche ich die hiesige Sprache nicht. Ist das
vielleicht ein Adelstitel 'an der Flanken' oder 'von der Flanken'.

Ich finde es nicht elegant, z.B. mit 100kHz die Signale zu pollen und
damit den µP permanent dicht zu machen, anstatt die Ereignisse zu
bewerten, die tatsächlich stattfinden.

Autor: Lernender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist ein Quadratur-Encoder, ein Inkrementalgeber mit 2, um 90°
versetzten Ausgängen?

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Lernender:

Ja


@Michael:

Stell dir folgendes vor:

Der Ausgang des Encoders der am Interupt-Pin hängt, geht auf High, der
Interupt wird ausgelöst. Noch während die Interupt-Routine läuft und
den Zählerstand um eins hochzählt, prellt der Encoder-Ausgang und er
geht auf Low. Die Interupt-Routine bekommt davon nichts mit und das
Hauptprogramm läuft weiter. Kurz drauf ist das Prellen zu ende und der
Encoder-Ausgang geht wieder auf den korrekt High-Zustand. Durch diese
Flanke wird der Interupt wieder ausgelöst und die Interupt-Routine wird
nochmals aufgerufen und erhöht den Zähler wieder um eins.

 Bingo, Fehler.

Autor: Läubi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich finde es nicht elegant, z.B. mit 100kHz die Signale zu pollen und
> damit den µP permanent dicht zu machen, anstatt die Ereignisse zu
> bewerten, die tatsächlich stattfinden.

Also 100khz ist bei einem mit 1mhz doer mehr getaktetem uC doch wol
lachhaft!
Du hast zwischen zwei "ticks" 1009995 Takte Zeit was anderes zu
machen... (naja oder etwas weniger ist ja egal) ich glau bda langweilt
sich dein Controlelr trozdem noch...

Autor: Unbekannter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Läubi:

Falsch gerechnet.

Wenn du 1 MHz Taktfrequenz hast, und mit 100 kHz abtastet, hast Du bei
nur 10 Zyklen pro Abtastung die komplette Rechenleistung
aufgebraucht...

Aber die Frage ist ja, ob man überhaupt so schnell Abtasten braucht.
Der Witz beim Abtasten eines Quadratur-Encoders ist ja der, dass es der
Statemachine egal ist, falls das Signal prellt.

Die Abtastfrequenz muss nur mindest viermal so hoch sein, wie die
maximale Pulsfrequenz des Encoders.

Angenommen, Encoder liefert 100 Pulse pro Umdrehung und die Achse dreht
mit maximal 2000 Umdrehung pro Minute, ergibt das eine maximale
Encoder-Frequenz von:

  f = 100 * 2000 / 60 = 3.3 kHz

Also mit mindestens 15 kHz, besser 20 kHz abtasten, und gut ist.

Wenn Du nun ca. 20 Taktzyklen für die Abtastung annimmst, benötigt das
bei 16 MHz Taktfrequenz 2.5% der Rechenleistung. Bei 1 Mhz Taktfrequenz
gehen dafür allerdings 40% der Rechenleistung drauf.

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.