Encoder incremental. cruce por la posición cero

Hola como estan, tengo un problema con un encoder que estoy utilizando y me gustaria saber si alguno de ustedes me puede ayudar.
Estoy utilizando un ecoder de 1024pulsos, tengo el canal a conectado A una interrupcion externa en el micro, y el canal B lo leo cada vez que sucede la interrupción asi puedo determinar la direccion, y aumento o decremento el contador, por lo tanto hasta ahi esta bien, el problema es que cuando el encoder regresa a su posicion de equilibrio, debido a que este tiene un movimiento pendular, por lo general no regresa el contador hasta cero, o si llega a cero con tan solo darle un golpe suabe a la mesa donde lo tengo el encoder me genera una cuenta, pero B no ocurre entonces el contador incementa o decrementa segun alla sido el ultimo estado de B y se queda ahi.
el problema creo que esta en que el encoder es muy sensible al movimiento y cualquier golpe genera que la señal A marque pero no alcansa a marcar B por el desface, intente solucionarlo agregando un contador de tiempo algo asi como un filtrado digital, para frecuencias bajas entre cada interrupcion, y si se mejoro pero no a sido suficiente.
espero me puedan entender, y alguno de ustedes me pueda ayudar un poco con este problema
 
El problema es que el metodo de conteo que estas usando.
Siempre que el encoder este detenido o moviendose muy despacio vas a tener ese problema, que haya cambios en un canal mientras el otro este quieto.

Eso se soluciona haciendo un conteo x2. En lo que vos tenes se consigue generando la interrupcion cuando A cambia.
Si fue un flanco ascendente --> Si B==0 suma else resta
Si fue un flanco descendente--> Si B==0 resta else suma

De esa manera, si tenes oscilacion en A la cuenta va a quedar loca entre N y N+1 pero no tenes deriva. Y de paso duplicas la resolucion del encoder.

AGREGO:
Ojo con la demora en el servicio de la interrupcion. Si es alta vas a tener que agregar algo de hardware porque si antes de terminar la interrupcion te llega otro pulso se pudre igual.
 
Eduardo, muchas gracias por su respuesta, hoy lo estuve ensayando y funciono muy bien, no hay inconveniente con el tiempo de la interrupción porq el movimiento es generalmente más lento, le agradezco mucho su atención, fue de mucha ayuda para mí.

Agrego como quedo implementado el servicio de interrupción por si alguna otra persona lo puede necesitar.

Código:
ISR(INT0_vect){
	encoder[0].direccion = (PIND & 0x08)>>3;	//leo la señal de cuadratura B
	if(PIND & 0x01 == 1){				        //pregunto en qué valor esta A	
		if(encoder[0].direccion==1){
			encoder[0].posicion--;
			}
		else{
			encoder[0].posicion++;
			}
		}
	else{
		if(encoder[0].direccion==1){
			encoder[0].posicion++;
			}
		else{
			encoder[0].posicion--;
			}

		}
	}
 
que onda un saludo a todos los de este foro...

empiezo a trabajar con encoders y tengo una duda... como puedo saber cual es la configuracion de un encoder, ya que este tiene cuatro cables, me imagino que dos son de alimentacion y los otros dos son del canal a y b respectivamente.... pero para no dañarlo... quiero saber como puedo saber como saber su congifuracion de canales y alimentacion ...
 
Encontraste el encoder en algun circuito? Si es asi mide las tensiones con el encoder montado en el circuito. El encoder lleva marca, codigo ?.... busca en internet.
Si el encoder no lleva marca ni codigo ni nada.... y esta "suelto"... mas complicado.
 
Atrás
Arriba