# ¿Puedo leer un encoder de 2800 rpm con un microcontrolador?



## delilara (Ene 25, 2011)

hola, tengo la idea de realizar una tarjeta de adquisición de datos para poder leer las señales de un encoder de 2800rpm, mediante un pic 18f4550 y usando el puerto usb, así mismo sacar las señales pwm, para el control del motor, mi pregunta es, si el pic no se perdera ningun pulso del encoder, si puede ser lo suficientemente rápido, ustedes que opinan


----------



## Lord Chango (Ene 25, 2011)

Hola amigo, mira, si el encoder manda una señal por cada revolución, vas a tener unas 50 señales por seg, o sea 50Hz. Si manda 4 señales por revolucion, 200Hz. Teniendo en cuenta que un pic trabaja entre 4 y 20 MHz, creo que vas a andar sobrado.


----------



## delilara (Ene 25, 2011)

hola, gracias por responder, pero me equivoque al plantear mi pregunta, mi motor es el que me da 2800 rpm, y tengo un encoder de cuadratura de  8192 pulsos/rev, la verdad me estoy confundiendo conla frecuencia y si es posible que el pic lea los pulsos sin perderse ninguno

Adjunto informacion de mi motor y de mi encoder


----------



## gzaloprgm (Ene 25, 2011)

No hay que estar mirando todo el tiempo la pata del encoder. El truco es usar una interrupción externa por flanco y una ISR corta, así podés evitar perder pulsos...

En tu motor, son 47 rps, a 8192 pulsos/rev son 385 Khz... Va a estar medio difícil de medirlo directamente, porque tendrías que tener un contador de 32 bits... Seguramente convenga usar un par de flip flops T externos para dividir la frecuencia en 8 o por ahí...

Un saludo,
Gonzalo


----------



## delilara (Ene 25, 2011)

bien, creo ya me esta quedando claro, me gusta tu idea de dividir la frecuencia antes, tambien me recomendaban poner un contador entre el encoder y el pic, aunque no estoy muy segura


----------



## jorfre (Ene 25, 2011)

delilara ?qué tipo de encoder estás utilizando debilara?

es para hacerme una idea de que tipo de encoder he de utilizar 
en un proyecto. Tengos que utilizar 3 encoderes para medir los ángulos de
una mesa inercial  (tres ejes) y a partir de ellos determinar la posición ...
me podrías echar una mano....


----------



## delilara (Ene 26, 2011)

hola, mira la información del encoder que usare es esta:

http://www.krtproduct.com/krt_Pictu...onics/20. Rotary Encoder/20.5 E60H Series.pdf

supongo que la elección de tus encoders debera de ser según las caracteristicas de tu mesa y sobre todo de los motores que vas a usar


----------



## jorfre (Ene 26, 2011)

a lo que me quería referir con tipo era si incremental
o absoluto, pero viendo tu enlace sé que es el  primero. Yo aún 
no he dedicido que encoders utilizar, a priorí creo que los incrementales
serán una buena opción...además no necesesito una gran resolución,
tendrá que ser inferior a 1º así que con uno que me 360 pulsos es más
que suficiente....lo que te quería preguntar delilara es que la programación
del pic no será complicada no? ni el circuito que tienes que montar? 
perdona que te haga estas preguntas pero estoy empezando recién con el 
proyecto....


----------



## Beamspot (Ene 26, 2011)

¿Acaso los PIC no tienen contadores que pueden leer pulsos externos independientemente de la frecuencia a la que trabaja el pic (dentro de unos límites)? Yo lo que haría sería poner la salida del encoder a la entrada de un contador de 16 bits del micro, y usar otro temporizador para realizar la captura (y reseteo) del mismo cada cierto tiempo (fijo, más 'manejable', sin jitter a ser posible, perfectamente 'cronometrado', etc.), y pasar este dato al programa principal.

Con un Xmega se puede leer perfectamente un encoder a más de 1MHz, y realizar esta tarea cada milisegundo, sin intervención ninguna de la CPU. Con un ATmega seguramente haría falta algún truquillo HW (puentear la salida de un timer a la entrada de capture del otro, por ejemplo).

Como sólo hablo de los AVR porque son los que sí conozco, no puedo decir si esto se puede hacer con un PIC, pero me extrañaría que no se pudiese, aunque hiciese falta algún truqillo de HW como el semidescrito.


----------



## gzaloprgm (Ene 26, 2011)

Es verdad, en la mayoría de los microcontroladores modernos es posible hacer que la entrada de un timer esté conectada a una pata externa... Así no haría falta un contador externo, y se podría hacer un buen frecuencímetro.

Un saludo,
gOnzalo


----------



## delilara (Ene 27, 2011)

bien, creo que entiendo su idea, creo que probare un programa que tengo, gracias


----------



## Dr. Zoidberg (Ene 27, 2011)

Beamspot dijo:


> ¿Acaso los PIC no tienen contadores que pueden leer pulsos externos independientemente de la frecuencia a la que trabaja el pic (dentro de unos límites)? Yo lo que haría sería poner la salida del encoder a la entrada de un contador de 16 bits del micro, y usar otro temporizador para realizar la captura (y reseteo) del mismo cada cierto tiempo (fijo, más 'manejable', sin jitter a ser posible, perfectamente 'cronometrado', etc.), y pasar este dato al programa principal.


  
Esa es la idea correcta!!!! Al fin alguien que piensa, usa la cabeza y sabe lo que hace!!!

Sinceramente me enferma cuando alguien pretende leer los pulsos de un encoder usando una ISR, o peor aún...por polling al pin de entrada . Eso solo significa que *NO TIENE IDEA* de como se aprovechan los recursos de un microcontrolador...tipico de programadores novatos...y no es la primera vez que veo ese tipo de ideas ridículas aconsejadas en el foro... :enfadado: :enfadado:


----------



## cristian_elect (Ene 28, 2011)

En los Atmega es la frecuencia maxima de clock externo para timer es un poco memos de la mitad de la frecuencia de operacion del micro.
Algo parecido es con los PIC.
Con 8192 pulsos por rev y el motor da un max de 2800rpm entoces los pulsos por segundo
382.294Khz esta dentro del rango pic.


----------



## Beamspot (Ene 28, 2011)

En algunos ATmega y en los nuevos Xmega, la frecuencia máxima de entrada de los temporizadores ya no está limitada por la frecuencia de operación del micro. En los últimos, puede ser tan alta como 180MHz...

Aún así, para el caso sería raro que ninguna de las dos famílias puediesen trabajar con las frecuencias que se precisan. Más difícil lo puede tener el PC para digerir los datos que se le manden por USB según el datarate. Ojo, que la limitación la impone el arbitraje del bus, no la potencia de cálculo ni el ancho de banda del mismo.


----------



## mnicolau (Ene 28, 2011)

No te sirve usar el módulo CCP del PIC? Calculás así el período, luego la frecuencia y las revoluciones.

Saludos


----------



## pachonx (Ene 29, 2011)

SI, claro que puedes.



ezavalla dijo:


> :
> Sinceramente me enferma cuando alguien pretende leer los pulsos de un encoder usando una ISR, o peor aún...por polling al pin de entrada . Eso solo significa que *NO TIENE IDEA* de como se aprovechan los recursos de un microcontrolador...tipico de programadores novatos...y no es la primera vez que veo ese tipo de ideas ridículas aconsejadas en el foro... :enfadado: :enfadado:



Pues si te enferma ya no leas a los novatos, no quiero que mueras.

Un poco de tacto y de calidad en tu trato nos vendría muy bien. A tirar buen rollo y a explicar de un modo mas didáctico así aprendemos todos. Todo tranquilo, recuerda que todos fuimos novatos alguna vez.


----------



## Dr. Zoidberg (Ene 29, 2011)

pachonx dijo:


> Pues si te enferma ya no leas a los novatos, no quiero que mueras.
> Un poco de tacto y de calidad en tu trato nos vendría muy bien. A tirar buen rollo y a explicar de un modo mas didáctico así aprendemos todos. Todo tranquilo, recuerda que todos fuimos novatos alguna vez.



pachonx:
El problema es que todas esas recetas de usar interrupciones para leer un encoder están expuestas libremente en la web y quienes las han encontrado y usado *SIN EMPLEAR LA CABEZA* luego vienen y las recomiendan como la salvación a los problemas. Y el problema es serio, por que no conocen *NI INTENTAN CONOCER* las capacidades de un microcontrolador y pretenden hacer todo por software "por que es mas sencillo" y solo tienen que poner letras en un procesador de textos y compilar, en lugar de tomar el datasheet del microntrolador y analizar que capacidades tiene y como se utilzan...pero claro...hay mucho que leer y no les importa aprender....total...si lo pueden copiar de la web :enfadado: :enfadado: :enfadado:

Por otra parte, recuerdo haber recomendado y explicado ya un par de veces - en este foro - la utilización de los contadores/timers por hardware del uControlador para la interfaz con el encoder, incluso agregando lógica para evitar conteos en falso y para duplicar o cuadruplicar (esto ya depende del micro) la resolución aparente del encoder....pero tampoco se preocupan en usar el buscador....por que van a tener que leer...y leer los cansa :enfadado: :enfadado: :enfadado:...

PD: A los alumnos que hacen este tipo de cosas los trato peor...así que ahora he sido bastante suave en mis comentarios


----------



## pachonx (Ene 29, 2011)

Te entiendo perfectamente, y eso que tu mencionas si es bastante molesto e irritante.
Te felicito por querer expandir el conocimiento de esta noble ciencia, y por tu numero de mensaje veo que no eres ningún improvisado.
Te invito a repartir conocimiento en el marco de la tolerancia y a seguir colaborando con ese entusiasmo.
Para concluir mi participación  *delilara * te sugiero utilizar el buscador que de ese tema ya hay sobradas ideas y formas de hacerlo.
Cualquier comentario lo atenderé por MP.


----------



## delilara (Feb 1, 2011)

hola, gracias a todos por sus respuestas, hasta ahora solo habia programado micros de la famila 16f, y la verdad es que tenia algunas dudas sobre como abordar mi problema y no sabia como o mas bien por donde empezar,  leer todos sus comentarios me ha ayudado a ordenar mis ideas y como dicen me dedicare ahora leer un poco mas, ahora ya se que buscar , en cuanto tenga avances y posiblemente mas inquietudes las pondre


----------



## pandacba (Feb 6, 2011)

Existe un problema muy simple y es de muy vieja data y seguia seguramente asi.
Los grandes programadores de micros en general tiene conocimientos muy superficiales de electrónica, y los grandes conocedores de electrónica tienen limitados conocimientos de programación....
En sitios organizados contratan uno de cada uno y una persona que sea el enlace, es decir alguen con medianos conocimientos de programacion y medianos conociminetos de electrónica, con eso se consigue la mayor eficiencia y es la mejor forma de laborar...

Me ha tocado ver un dispositivo echo para unas máquina de ensayos, donde se necesitaba controlar con una tensión de 0-10V y quien hizo el proyecto le parecio que en el variador de velocidad no habia una fuente adecuada y tomo la fuente interna que utilizaba para el pic por considerarla estabilizada y porue se baso en un angiudo equipo que trabajaba de 0-5V al ponerlos y ensayarlos obvio no alcanzaban los regimenes previstos, en ese tiempo tenia un problema en una pierna y me tuve que hacer cien metros con muletas para entrar a la sala de ensayo y ver el problema que era más que obvio, informando que faltaban 5V, que se podian tomar perfectameante de los variadores ya que esta tensión era estbilizada ya que los mismos llevan un micro también....
Por otro lado le inidque, que los seteos estaba mal planteado ya que habia que descolgar la unida del gabinete para mover unos preset en la parte posterior, que eso se podia hacer perfectamente por sofware...
Nos terminaron dando el trabajo....

Es muy común este tipo de errores, como por ejemplo querer exitar un mosfet con optoacoplador y no funciona, claro no saben que hay que agregar un circuito externo al opto de dos transistores o adquirir el que viene expresamente para esa función.... también requiere estar al tanto de lo que hay en el mercado.

Asi que las criticas acidas en ese sentido estan demás porque es una realidad y no es de ahora ya lleva muchas decadas...


----------



## zxeth (Feb 6, 2011)

si es muy rapido no te conbiene poner un engranaje que reduzca la velocidad y tomar el enconder desde ahi y multiplicarlo por la reduccion que pusistes?


----------



## pandacba (Feb 6, 2011)

Eso es lo que se hace normalmente, poner por ejemplo dos poleas para correa sincrónica, en una relación de demultipicación adecuada y se soluciona el problema, asi lo hicimos en una guillotina para uso en gráfica, tenia un motor de dos velocidades con dos devanados, asi que se utilizo la parte de mayor velocidad y se puso un enconder y a la placa de control. Hace más de 10 años que esta funcionando


----------



## delilara (Feb 6, 2011)

Hola, si, de hecho tengo un par de poleas y banda acopladas al motor con un sin fin y corona, lo cual me proporciona una gran reducción, y tengo dos encoders, uno acoplado al motor antes de la reducción y el otro al eje de las varillas sujetas al carro que se mueve por la banda, es decir un pendulo invertido, para el control necesito leer ambos ecoders, si tal vez poner el encoder despues del sin fin y corona hubiera sido mas facil pero todo el montaje mecanico ya estaba dispuesto asi.

Mi duda inicial era que el pic ejecuta instrucción por instrucción y necesito lectura de los encoders en tiempo real precisa por lo que tenia la curiosidad de si el pic podia ser suficiente, este proyecto es mi tesis, y me gustaba la idea de controlarlo por usb y con un pic, ahora tengo otra opcion de leer los encoder con una tarjeta de adq con un FPGA, como ya tengo un poco de apuro por el tiempo, me parece que se hara así y despues seguire con el tema del pic pues la verdad me gustan mucho, como dije antes solo habia porgramado familia 16f y me era facil y divertido pero tiene un rato y al mudarme a la fam 18 y sin mucho tiempo para releer y recordar me vi en la duda de si los recursos del pic me eran suficientes.

Gracias por contestar a todos en mis ratos libres, ja los pocos que tengo, me gusta seguir aprendiendo sobre pics y programación, que como menciona pandacba a algunos nos falta un poco mas de una cosa que de otra.


----------



## DSP (Feb 16, 2011)

Hola, yo estoy trabajando en algo muy similar: Leer un encoder incremental de un motor con un PIC para determinar su posición absoluta. Lo intente hacer con interrupciones (si, quizas soy novato y que). Pero gracias a esa prueba entendi que no es la mejor manera de hacerlo (habia error acumulativo) creo que sucede en las transiciones que ocurren mientras entra a la rutina de interrupción.

Aun no tengo la solucion definitiva. Pensé en usar los contadores internos del PIC pero tengo entendido que solo puedo incrementar su valor con pulsos externos y no veo la manera de decrementarlo cuando gira al revés el motor.

Asi que busque y encontré este circuito:

Lo simule en proteus y funciona bien, pero todavia tengo la tentación de mandar las salidas de los FF al pic y utilizar interrupciones, o talvez utilizar unos JK para bajar la frecuencia...

Bueno, veamos si hay mas ideas

Saludos


----------



## pachonx (Feb 17, 2011)

Si quieres la posición absoluta usa un encoder absoluto,con incrementales la posición es relativa. saludos.
Como ya se menciono antes esta la forma por interrupciones (aceptable y suficiente para la mayoria de los casos), pero para mi mejor seria un uControlador con modulos para el tratamiento de encoders.


----------



## Beamspot (Feb 17, 2011)

Para estas cosas, los micros actuales como el Xmega tienen HW que viene que ni al pelo para el control de encoders, permitiendo el conteo hacia arriba y hacia abajo por HW, sin intervención de la CPU. Y sin HW externo.

O FPGA.

El control de cosas por Windows, en mi opinión, y peleando con estas cosas a diario, es lo mismo que el Sepukku. El tiempo real es el reino de los microcontroladores. Los PC y computadoras similares, pertenecen al mundo de las comunicaciones y el procesado en bruto en tiempo irreal. Para el procesado en bruto en tiempo real, sólo quedan los 'grandes' supercomputadores basados en computación masivamente paralela reconfigurable. Dicho en palabras llanas: FPGA(s, en cantidades industriales, incluso).


----------

