.. Aber beiden Drehrichtungen macht "Direction" zwischendurch Pegelwechsel. Ist das richtig und wie würde man das im µC auswerten? ..
Es gibt sicher mehrere Lösungswege. Meine Lösung benutzt den Interrupt 0 oder 1 (evtl. bei mehreren Motoren/Encoderspuren zusätzliche Interrupts). Getriggert wird auf "jede Flanke" - und dann guckt man eben: ist das triggernde Signal high und das der zweiten Encoderspur low, oder hh, ll oder lh, und reagiert darauf. Ausserdem wird natürlich der Zeitablauf zwischen zwei Interrupts festgehalten und daraus die momentane Geschwindigkeit errechnet. Fehler durch verzögerten Interrupt entstehen natürlich. Siehe auch das Schema (vom Motortreiber archie):
......Bild hier
Meine Auswerteroutine sieht dann z.B. so aus (mega1284) :
Code:
// ============================================================================= =
// === Nicht unterbrechbare ISR für EXT_INT0 auf mega1284 ================ =
// Der Timer tmrE0 für Laufzeit des EXT_INT0 wird ausgelesen
ISR(INT0_vect) // INT0 triggert auf RISING edge =>
{ // => Wenn Aufruf, dann PORTD2 = high
// Encoderticks Iencdrx nur hochzählen, IencBx rauf- od runterzählen
Iz_diff0 = tmrE0; // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf
tmrE0 = 0; // Resetten ##>> IN der ISR ohne CLI/SEI möglich
Iencdr0 ++; // Incrementiere Encodercounter, zählt NUR aufwärts
if (IsBitSet (PINC, 2)) IencB0++; // Rad treibt vorwärts, math. negativ
else IencB0--; // Rad treibt rückwärts, math. positiv
} // Ende ISR(INT0_vect)
// ============================================================================= =
Aus dem Stand von Iencdr0 leite ich die Geschwindigkeit (Drehzahl bzw. Umfangsgeschwindigkeit Rad) ab. Der Stand IencB0 ergibt mir den aktuell zurückgelegten Winkel resp. Weg.
Lesezeichen