Forum: Mikrocontroller und Digitale Elektronik Counter fuer Encoderauswertung


von Poseidonius (Gast)


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?

von Thomas (Gast)


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

von Peter Dannegger (Gast)


Lesenswert?


von Rahul D. (rahul)


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...

von Michael (Gast)


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 !

von Peter Dannegger (Gast)


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

von Unbekannter (Gast)


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.

von Patrick D. (oldbug) Benutzerseite


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...

von Poseidonius (Gast)


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?

von Michael (Gast)


Lesenswert?

>>Einen Quadratur-Encoder-Signal an der Flanken einlesen, ist mumpitz.

verstehe ich nicht.

von Jan (Gast)


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

von Michael (Gast)


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.

von Lernender (Gast)


Lesenswert?

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

von Unbekannter (Gast)


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.

von Läubi (Gast)


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...

von Unbekannter (Gast)


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.

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
Noch kein Account? Hier anmelden.