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?
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
@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...
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 !
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
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.
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...
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?
>>Einen Quadratur-Encoder-Signal an der Flanken einlesen, ist mumpitz.
verstehe ich nicht.
>>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
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.
Was ist ein Quadratur-Encoder, ein Inkrementalgeber mit 2, um 90° versetzten Ausgängen?
@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.
> 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...
@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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.