Genau. Das Arbeiten der Encoder sieht ungefähr so aus - klick. Meine Dokumentation zur Auswertung sieht so aus - nochnklick - die Farbenliste [White] bis [Red] bezieht sich auf das Kabel für den Motoranschluss!!.. das ich die Encoder noch nicht vernünftig auslesen kann .. Am Ende sind es doch 2 einfach digitale Eingänge pro Encoder? ..
Mit Java kann ich ja nu nicht helfen, aber vielleicht bietet Dir (m)ein C-Code-Schnippsel ne Hilfe oder zumindest nen Anhaltspunkt ? Wobei hier für Dich eher nur die IencdrX-Werte für die (Teil)Umdrehungen/Drehwinkel und die tmrEx-Werte für die Drehzahlmessung von Interesse sind.
Code:// ============================================================================= = // === Initialisierung der externen Interrupts bei m1284, doc 8272D-AVR-05/12 // EXT_INT0 auf PORTD2 Pin 16 -- Encoder IencB0 auf PINC 2 Pin 24 und // EXT_INT1 auf PORTD3 Pin 17 -- Encoder IencB1 auf PINC 3 Pin 25 // ============================================================================= = void XTI_0_1_init( void ) // Initialisiere beide Interrupts auf RISING edge { // => EICRA ISC00/~01 + ~10/~11 auf 1 doc S68 EICRA |= (1<<ISC01)|(1<<ISC00); // INT0 triggert auf RISING edge EICRA |= (1<<ISC11)|(1<<ISC10); // INT1 triggert auf RISING edge EIMSK |= (1<<INT0) | (1<<INT1); // erlaube INT0 und INT1 in EIMSK // Initialisierung der Zeiten: Iencdr0 = Iz_diff0 = Iz_yseci0 = Iz_ysecv0 = 0; Iencdr1 = Iz_diff1 = Iz_yseci1 = Iz_ysecv1 = 0; tmrE0 = tmrE1 = 0; // Timer für Drehzahlerfassung } // Ende von void XTI_0_1_init( void ) // ============================================================================= = // ============================================================================= = // === 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 // ToggleBit (PTLED, LCr); // rtLED toggeln // - - - - - - - - - - - - - - - - // 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) // ============================================================================= = // ============================================================================= = // === Nicht unterbrechbare ISR für EXT_INT1 auf mega1284 ================ = // Routine setzt einfach einen Zähler hoch. // Sonst wie ISR für EXT_INT0 für Motor li,re und PWM/Geschw. ISR(INT1_vect) // hiess mal: ISR(SIG_INTERRUPT1) { // // ToggleBit (PTLED, LCr); // rtLED toggeln // - - - - - - - - - - - - - - - - // Encoderticks Iencdrx nur hochzählen, IencBx rauf- od runterzählen Iz_diff1 = tmrE1; // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf tmrE1 = 0; // Resetten ##>> IN der ISR ohne CLI/SEI möglich Iencdr1 ++; // Incrementiere Encodercounter, zählt NUR aufwärts if (IsBitSet (PINC, 3)) {IencB1--;} // Rad treibt rückwärts (math. positiv) else {IencB1++;} // Rad treibt vorwärts (math. negativ) } // Ende ISR(INT1_vect) // ============================================================================= =







Zitieren


Lesezeichen