Forum: Compiler & IDEs Zähler für Encoder-Daten ATmega8


von Horst (Gast)


Lesenswert?

Hallo zusammen,

da ich noch blutiger Anfänger in der Mikrocontroller-Welt bin, bitte ich 
euch um Ratschläge.

ich habe mir eine Schaltung gebastelt, die mir von 24 V auf 5 V über 
Optokoppler meine Eingangssignale wandelt.
Bis an den konfigurierten Eingangspin kommt ein Rechtecksignal (0V-5V) 
an. Die Frequenz des Signals liegt bei max. 600 Hz.
Ich möchte nun die Impulse über einen Zähler hochzählen und ab einem 
bestimmten Wert ( je nach Fall) diesen zurücksetzen.
Noch existiert kein Programm für den Controller.

Meine Frage an euch betrifft nun folgende Punkte:

1. wäre das Signal für einen normal als PINC2 konfigurierten Eingang zu 
hochfrequent, um dieses zu verarbeiten?

2. würde ein Capture-Eingang hier mehr Sinn machen?

3. der Zähler soll bis etwa 8000 zählen können. Wie kann ich hier einen 
Zähler richtig einsetzen? Muss ich zwangsläufig über Interrupts gehen?

4. hat jmd eine andere Idee, die Zählung umzusetzen?

Danke im Voraus!
Horst

von Uwe (de0508)


Lesenswert?

Naja,

ich gehe mal von einem AVR µC aus, dort gibt es sogannte T0 und T1 
Eingänge, die die Zählerwerte der Timer0 oder Timer1 direkt 
beeinflussen.

Das wäre mein Ansatz.

von Falk B. (falk)


Lesenswert?

@ Horst (Gast)

>an. Die Frequenz des Signals liegt bei max. 600 Hz.
>Ich möchte nun die Impulse über einen Zähler hochzählen und ab einem
>bestimmten Wert ( je nach Fall) diesen zurücksetzen.
>Noch existiert kein Programm für den Controller.

>1. wäre das Signal für einen normal als PINC2 konfigurierten Eingang zu
>hochfrequent, um dieses zu verarbeiten?

Nein, das ist eher langsam.

>2. würde ein Capture-Eingang hier mehr Sinn machen?

Kann man machen, bringt aber als Zähler nicht so viel.

>3. der Zähler soll bis etwa 8000 zählen können. Wie kann ich hier einen
>Zähler richtig einsetzen?

Man kann einen der Hardwarezähler nutzen, um das Eingangssignal zu 
zählen, im einfachsten Fall Timer 1, der hat 16 Bit und läuft nicht zu 
schnell über.

>Muss ich zwangsläufig über Interrupts gehen?

Nein. Man kann sogar die Output COmpare Funktion nutzen, um bei einem 
bestimmten Zählerstand einen Interrupt auszulösen und die entsprechende 
Reaktion auszuführen.

von Peter D. (peda)


Lesenswert?

Horst schrieb:
> 1. wäre das Signal für einen normal als PINC2 konfigurierten Eingang zu
> hochfrequent, um dieses zu verarbeiten?

Nein.
Allerdings mußt Du beim PCINT beachten, daß er auf beide Flanken feuert.


Horst schrieb:
> 2. würde ein Capture-Eingang hier mehr Sinn machen?

Überhaupt keinen.
Der ist nur für Zeit- oder Frequenzmessung gut.
Du willst aber die Anzahl.

von Horst (Gast)


Lesenswert?

ersteinmal vielen Dank für die Antworten!

ich habe die Erfassung der Pulse nun über einen Timer mit CTC geregelt.

Über den 8-Bit-Timer 0 des Controllers wird Encoder 1 ausgewertet und 
funktioniert wie gewünscht.

Über den 16-Bit-Timer 1 des Controllers wird Encoder 2 ausgewertet und 
funktioniert nicht ganz synchron.

Ich habe die Funktion des Timer1 im AVR Studio getestet und es dauert 
trotz gleicher Konfiguration des Timers eine Ewigkeit, bis die 
ISR(TIMER1_COMP1A_vect) aufgerufen wird. Diese verschafft mir bei jedem 
neuen Aufruf keine vergleichbaren Werte da diese mal wesentlich größer 
oder mal wesentlich kleiner als bei vorherigem Aufruf sind.

Ich habe mein Programm so geregelt, dass bei Aktion A nur Timer0 
"freigegeben" wird (TIMSK |= 1<<OCIE0) und dieser nach der Aktion wieder 
"gesperrt" wird.

Gleiches gilt für Timer1 bei Aktion B.

Meine Fragen sind nun:

Gibt es wesentliche Unterschiede zwischen dem 8-Bit und dem 16-Bit Timer 
bezüglich der CTC-Funktion?
Benutze ich dann für den Vergleich nur COMP1A oder muss ich COMP1B 
ebenfalls einbinden?

von Horst (Gast)


Lesenswert?

das Problem hat sich gelöst, das Programm funktioniert jetzt 
einwandfrei.

Die Zähler werten die Daten von Encodermotoren aus, die zwei 
Achsantriebe eines Dreiachsroboters mit verschiedenen Werkzeugen 
darstellen.

Somit kann dieser optimal mit einer Genauigkeit von etwa 0,5 Grad eine 
entsprechend angegebene Position anfahren.

Danke!

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.