# ¿como funciona este encoder?



## aitortxu85 (Abr 21, 2010)

Bueno días a todos. 

Quiero medir la velocidad de rotación de un eje y me han proporcionado un encoder incremental de 3000impulsos/vuelta. Pero este encoder, en vez de tener 12salidas digitales como esta acostumbrado tiene 6 salidas digitales.  Mirar la siguiente imagen






http://img504.imageshack.us/i/pulsosencoder.png/


Yo adquiero estas 6 señales. ¿Como puedo saber la posición del encoder?


Podeis descargar el manual del encoder en:  http://www.fagorautomation.com/pub/doc/File/Manuales/cast/man_encoder_ha.pdf


Muchas gracias por vuestra ayuda.

Un saludo


----------



## Eduardo (Abr 21, 2010)

Pero al final que es lo que querés conocer: Velocidad o posición?


----------



## aitortxu85 (Abr 21, 2010)

Buenos días eduardo.

Derivando esta posición respecto al tiempo, quiero conseguir la velocidad de rotación del eje. Pero para ello, primero necesito saber que posición es.

Un saludo


----------



## Eduardo (Abr 21, 2010)

Eso no hace falta ni aún con un encoder absoluto.
Usando solo la fase A o B medís la frecuencia de los pulsos. Esto es simplemente contar pulsos durante un intervalo de tiempo fijo.
Eligiendo astutamente el intervalo de conteo tenés lectura directa o "casi" directa.
Ej: Si 3000ppv --> con un intervalo de 50ms la cantidad de pulsos que entraron es numéricamente igual a las rpm.

Si además interesa el signo de la velocidad (pro si gira a derecha o izquierda) hay que hacer un pequeño refinamiento usando la otra fase, pero nunca hace falta conocer primero la posición.


----------



## Dr. Zoidberg (Abr 21, 2010)

Eduardo dijo:


> Eso no hace falta ni aún con un encoder absoluto.
> Usando solo la fase A o B medís la frecuencia de los pulsos. Esto es simplemente contar pulsos durante un intervalo de tiempo fijo.
> ...
> Si además interesa el signo de la velocidad (pro si gira a derecha o izquierda) hay que hacer un pequeño refinamiento usando la otra fase, *pero nunca hace falta conocer primero la posición*.



A menos que estés haciendo *control *de posición bajo un perfil de velocidad...ahí el intervalo de conteo lo fija el período de muestreo del controlador.


----------



## aitortxu85 (Abr 21, 2010)

Kaixo Eduardo. 

Solo que la rotación de mi eje se da en 15ms y un giro máximo de 29º, unos 241 pulsos. Realizo un muestreo cada 100usg para optener la posición de giro y quisiera calcular la media de tiempo entre dos grados 10º y 20º.

 El eje esta accionado con muelles y me han expecificado que tengo que medir la velocidad media entre 1/3 y2/3 de la rotación. Ellos, en las  pruebas que suelen hacer, suelen utilizar un potenciometro para medir  la desviación y mediante un osciloscopio visualizan esta rotación y calculan la velocidad manualmente. 

Ahora yo tengo que programar para que lo haga automaticamente y además el programa tiene que analizar la señal  para saber si la señal es aceptable o no. Esto lo hago haciendo una comparación punto a punto, conparando tiempo y posición del encoder con una señal de referencia.  Me han facilitado este encoder y por eso necesito saber como puedo transformar las 6 entradas digitales en pulsos o angulo.

Un saludo y muchas gracias por tu ayuda


----------



## Eduardo (Abr 21, 2010)

Si tu medición no era una típica medición de velocidad de un eje sino una bastante especial: Por qué no escribiste todo eso en el primer mensaje? 
- Buscabas adivinos?
- Creés que hay un solo procedimiento mágico y universal para todo?
- Pocas ganas de escribir y saliste a buscar una tormenta de ideas ?(y que escriban los otros)


----------



## aitortxu85 (Abr 21, 2010)

Diculpame Eduardo, pero no tengo ningun problema para escribir. No queria liar a la gente con una explicación complicada. Lo unico que necesito saber es como puedo transformar  las 6 entradas digitales en pulsos o angulo y me parece que eso es lo que he indicado en el primer post. 

Si obtengo el número de pulso o angulo de estas 6 señales, todo lo de más ya lo tengo programado. La tengo hecha la aplicación. Solo que el encoder que me an proporcionado no es del tipo de encoder que he utilizado otra vez y la optención de pulsos es diferente. 

Un saludo y disculpa las molestias.


----------



## Eduardo (Abr 21, 2010)

Hubieras buscado primero.

https://www.forosdeelectronica.com/f12/encoder-incremental-sensor-posicion-13584/#post80770


Por otro lado, muestreando a 100us vas a perder pulsos como loco --> por lo menos 10 veces mas rapido.


----------



## aitortxu85 (Abr 21, 2010)

Kaixo Eduardo. 

Muchas gracias por tu ayuda, pero sigo sin entender como puedo calcular los angulos.  ¿Tengo que conocer constantemente el valor anterior?  ¿tengo que utilizar el algoritmo N4 para poder calcular el valor de mi encoder?

​_IF Ao'·A = 1   (flanco ascendente)_
_     IF B = 0   --> Suma 1   (UP)                                _
_     ELSE       --> Resta 1  (DOWN)_​_   ELSE IF Ao·A' = 1  (flanco descendente)_ 
_     IF B = 0   --> Resta 1  (DOWN)_
_     ELSE       --> Suma 1   (UP)_​_   ELSEIF Bo'·B = 1   (flanco ascendente)_
_     IF A = 0   --> Resta 1  (DOWN)_
_     ELSE       --> Suma 1   (UP)_​_   ELSE IF Bo·B' = 1  (flanco descendente)_
_     IF A = 0   --> Suma 1   (UP)_
_     ELSE       --> Resta 1  (DOWN)_​_   ENDIF!_​​_¿Como consigo un pulso 1513 de un 1511? ¿Si la señales son Ao=1,Bo=1
necesitaria un A =0, un B =0? 

Un saludo. _


----------



## Eduardo (Abr 21, 2010)

aitortxu85 dijo:


> ... pero sigo sin entender como puedo calcular los angulos.  ¿Tengo que conocer constantemente el valor anterior?  ¿tengo que utilizar el algoritmo N4 para poder calcular el valor de mi encoder?


El valor anterior es es de la última lectura. O si usaras una máquina de estados, analizando sólo los valores presentes no podés saber en que dirección te estas moviendo.

El algoritmo x1 presenta deriva y falsas cuentas --> sólo sirve para velocidad.
Lo x2 y x4 son los utilizados para posición. La elección de uno u otro la determina la resolución que haga falta y el tiempo máximo tolerado entre interrupciones.



> ¿Como consigo un pulso 1513 de un 1511? ¿Si la señales son Ao=1,Bo=1
> necesitaria un A =0, un B =0?


*Nunca* pueden cambiar dos señales a la vez --> si lees eso es porque perdiste pulsos --> printf("Position Error: Speed too high or CPU too slow ;-) \r\n");


En notas de aplicacion de Microchip sobre el módulo QEI.  (Google microchip qei ) tenés mas detallado el tema.


----------



## aitortxu85 (Abr 22, 2010)

Kaixo Eduardo, entonces si que necesito leer con una resolución superior. Si no, perdere la valores del encoder. 

UNa ultima pregunta. Como puedo saber cuando esta en el angulo 0, o no lo necesito?

Un saludo.


----------



## Eduardo (Abr 22, 2010)

aitortxu85 dijo:


> UNa ultima pregunta. Como puedo saber cuando esta en el angulo 0, o no lo necesito?


Con encoders incrementales se acostumbra al encender la máquina ir a una posición conocida y ahí presetear el contador de posición con el valor que querramos.

Si vos decís que tenés que medir velocidad en distintas zonas, vas a tener que inicializar el contador con las cuentas correspondientes al ángulo en posición de reposo.


----------



## tecnogirl (Abr 22, 2010)

aitortxu85 escribio:"La rotación de mi eje se da en 15 ms y un giro maximo de
29°, unos 241 pulsos. Realizo un muestreo cada 100 µs"

Veamos, el evento dura 15 ms y lo muestreas cada 100 us, o sea, tomas 150 muestras, que es inferior al numero de pulsos que el encoder produce en el mismo tiempo, unos 241 pulsos. Claro que, por otro lado, tienes 2 canales (y sus complementos) lo que te permite "multiplicar" la resolucion del encoder. Pensaria que es apenas suficiente.

Quiero saber como estas leyendo las seis señales del encoder y dónde las procesas (micro o PC, etc) ?.

Saludos


----------



## aitortxu85 (Abr 27, 2010)

Kaixo Tecnogirl. Siento la tardanza pero he estado sin acceso a internet. 

Ya he realizado las primeras medidas y  los resultados son mejores de los que esperaba. 

Tengo una tarjeta de adquisicion de datos de National Instrument para realizar la captura de datos. La SbRio9631 exactamente.  He configurado la FPGA de la tarjeta de adquisición para que me haga la lectura de datos. 

Un saludo.


----------

