Hallo,
ich stehe gerade vor dem Problem, dass ich einen Alps Drehimpulsgeber nicht ordentlich ausgewertet kriege. Bei einem Exemplar von Grayhill habe ich dagegen keine Probleme.
Der Grayhill zeigt exakt das Verhalten, das auch in der DSE-FAQ beschrieben ist. Der von Alps dagegen hat nur folgende moegliche Stellungen:
Rechtsdrehung: 00->10->01 Linksdrehung: 00->01->10
Die 11 fehlt also komplett. Die Stellung 00 ist zwischen 2 Rastungen untergebracht, soll also beim durchlaufen ueberhoert werden.
Der Fehler aeussert sich so, dass in Drehrichtung links nur jede 2. Rasterstellung gezaehlt wird und bei Rechtsdrehung wilde Spruenge in sowohl positive, als auch negative Richtung auftreten... *verzweifel*
Das ganze steckt mal wieder an einem Atmel Mega128 und soll Interrupt-gesteuert ausgewertet werden. Mein Quellcode fuer den Alps-Encoder sieht wie folgt aus: (AVR-GCC)
Danke fuer Eure Hilfe
Daniel
#include #include #include #include "src/global.h" #include "src/common/enc.h"
s08 encTable[16]={0,-1,+1,0,0,0,-1,0,0,+1,0,0,0,0,0,0}; s16 encPosition=0; u08 status=0; u08 quadrature_value = 0; s16 encMin=1; s16 encMax=6;
s16 encoderGetPosition(void) { return ( encPosition ); }
void encoderSetPosition(s16 position) { encPosition = position; }
void encoderInit(void) { // configure encoder direction pins for input cbi(DDRE, 6); cbi(DDRE, 7); // apply pullup resistors to direction inputs sbi(PORTE, 6); sbi(PORTE, 7);
cbi(EICRB, ISC61); cbi(EICRB, ISC71); sbi(EICRB, ISC60); sbi(EICRB, ISC70); quadrature_value=inp(PINE)>>6; //enable interrupts outp((1 encMax ) { encPosition = encMin; } else if (encPosition < encMin) encPosition = encMax; }