Autor Tema: PID (arduino) Motor Paso a Paso con encoder rotacional  (Leído 21230 veces)

Desconectado lamartinada

  • Join Date: May 2013
  • Mensajes: 120
  • Ubicación: Alicante
Buenas, estoy estudiando la manera de retroalimentar el motor paso a paso de mi CNC mediante encoder incremental. He visto que ya hay abierto un tema al respecto, pero al querer implementar el sistema con arduino, es algo diferente, por ello dispongo aquí mis dudas.

En primer lugar, arduino puede contar el número de pulsos recibidos del encoder a través de un pin, he pensado en contar cada pulso mediante interrupciones, es decir, cuando cambia el pin de dirección del motor, comenzar a contar hasta que vuelva a cambiar la dirección. Entonces, verificar la posición del encoder y enviar los pulsos y la señal de dirección necesarios para que el motor se posicione de forma correcta.

El problema que se me plantea es la velocidad de muestreo que debo tomar para no perder pulsos en el contador, ya que no quiero que eso ocurra bajo ningún concepto, al igual que dudo en si debo colocar un buffer para ir almacenando valores o algo similar.

Alguien puede darme alguna idea de como implementar este sistema mediante encoder incremental absoluto y arduino?? Pienso que sería interesante añadir circuitería al encoder para aumentar la resolución de este, ya que mi motor, gracias al driver, tiene una resolución de 1600 pasos por revolución.

Muchas gracias por adelantado. Espero que podais ayudarme.

Desconectado jozsef

  • Join Date: Ago 2011
  • Mensajes: 983
  • Ubicación: san isidro buenos aires argentina
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #1 en: 02 Mayo 2013, 17:49 »
pregunta para saber, que problema trata de solucionar tu proyecto, desde ya muchas gracias

Desconectado dedalo1111

  • Join Date: Jul 2010
  • Mensajes: 918
  • Ubicación: Madrid
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #2 en: 02 Mayo 2013, 18:08 »
Los encoder de cuadratura se muestrean de tres modos posibles:

- x1: a cada flanco de subida del canal A, sumas/restas en función del estado de B
- x2: en ambos flancos de cambio del canal A, sumas/restas en función del estado de B
- x4: en cada flanco de los canales A/B se suma resta en función del otro canal

Si tiras un poco de Google, hay una rutina muy sencilla que hace esto simplemente con un array char[16] y compone el índice en función de los dos bits actuales de AB + los dos anteriores: old AB<<2+AB. Este array contiene la matriz de las 16 transiciones posibles y el +1/0/-1 resultante (ingenioso y simple... apenas 20 líneas de código).

El muestrear "a to-caña"  no es muy recomendable  ::) , siempre llegará un límite que pierdas flancos. No sé si el Arduino dispone de "interrupción por cambio de estado", algunos PIC lo tienen y es mucho más eficiente. Simplemente, cada vez que A/B cambian se llama a tu rutina, se incrementa el contador, dejando el 99% de la CPU libre para tareas "útiles".

Salu2 

PD. ojo a trabajar con flancos y señales "ruidosas" (cables, motores próximos, etc.)  ;)
Fresadora Wabeco F1200E CNC, Torno Warco WM-180, Sierra FEMI 780XL, cortadora porex FDC4

Desconectado lamartinada

  • Join Date: May 2013
  • Mensajes: 120
  • Ubicación: Alicante
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #3 en: 02 Mayo 2013, 19:23 »
Bueno, después de un dia entero navegando por google he llegado a la conclusión de dedalo1111. Arduino tiene servicios de interrupciones, por lo tanto, utilizando un encoder de dos salidas puedo saber cuánto ha girado el husillo. Con el mismo Arduino o bien con otro, cuento los pulsos que emite la breakout (C10 en mi caso, controlada por Mach3), hacia el motor paso a paso en cuestión. Una vez que tengo las dos posiciones, deseada y real, puedo enviar pulsos desde Arduino para compensar la desviación, si es que la hay. Ahora bien, una vez estás mecanizando, las rotaciones del motor y alternancias de direccion (digamos en una operación de Grabado), son bastante continuas, por lo tanto no se si debo usar un microcontrolador para cada proceso y asi no perder pulsos, de forma que la respuesta no falsee los resultados, o de que manera  hacer esto. El caso más crítico que se me plantea, es en una interpolación de tres ejes, si únicamente ha perdido pasos uno de los motores, el retraso de la retroalimentación, ¿afectará a las dimensiones del mecanizado? sabiendo que el chip trabaja a 16MHz, aunque los servos lo hacen y no ocurre nada...

Entendereis que la tarea no es sencilla y se plantean muchas dudas al respecto...

Gracias por vuestros aportes  :)

Desconectado agassichan

  • Join Date: Ago 2011
  • Mensajes: 139
  • Ubicación: Martorell
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #4 en: 02 Mayo 2013, 20:45 »
Como dice dedalo, estas cosas se tienen que hacer si o si por interrupciones. Cualquier otro metodo es mucho mas inexacto, y conlleva la poca precision o la sobrecarga en las tareas del procesador.

Si no leo mal en la referencia de arduino, necesitas un Mega Leornador o Due para poder tener interrupciones en las 3 entradas que necesitas monitorizar (suponiendo 3 ejes)

http://arduino.cc/en/Reference/AttachInterrupt

No estoy muy puesto en esto de Arduino, asi que miratelo bien no sea que haya otras opciones.

En cuanto a la interpolacion que comentas, tienes que analizar la precision del encoder vs la precision del motor. Si cada paso del motor es uno o mas del encoder, entonces no tendras demasiados problemas, ya que te daras cuenta del error instantaneamente y lo subsanaras relativamente rapido. Si pasan varios pulsos de motor antes de que te des cuenta del error, llevaras un retraso que quizas si que empiece a ser importante.

Desconectado lamartinada

  • Join Date: May 2013
  • Mensajes: 120
  • Ubicación: Alicante
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #5 en: 02 Mayo 2013, 21:12 »
Si agassichan, yo creo que lo mejor sería usar un micro para controlar cada motor, en lugar de gobernar los tres ejes con la misma placa, así optimizaré tiempos de procesamiento. Quizás, el aspecto que menos claro tengo es como gestionar la entrada de pulsos del microcontrolador. Si utilizo dos interrupciones (una para el encoder y otra para los pulsos que envia Mach3), es posible que en algún momento una interrupción solape a la otra y pierda pulsos por igual (siempre que no esté  equivocado en mi idea), por lo tanto no se si debo usar dos micros para contar pulsos de forma separada. Por otra parte, he visto que en muchos sitios se habla de un buffer para almacenar los datos recibidos, por lo que se me plantea la duda de como gestionar el envio de pulsos al motor. ¿Cuento pulsos mientras el giro sea en la misma dirección, calculo la diferencia entre la posicion deseada y la real, y luego envio los pulsos necesarios? o ¿testeo constantemente la diferencia entre la posicion deseada y la real y envio pulsos? porque de esta última forma creo k debería tener en cuenta inercia del motor, tiempo de reacción, etc... Por lo que se comenta en la red, la gente utiliza LabView o Matlab, y de ahí obtiene resultados, pero como en este caso es mach3 el que envia los datos, tengo mis dudas de como implementarlo

En cuanto pueda adjunto esquema y así me podéis decir si mi planteamiento es correcto.

Desconectado tio_gil

  • Global Moderator
  • ****
  • Join Date: Sep 2009
  • Mensajes: 3100
  • Ubicación: Madrid - España
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #6 en: 03 Mayo 2013, 08:53 »
Citar
agassichan wrote:
Como dice dedalo, estas cosas se tienen que hacer si o si por interrupciones. Cualquier otro metodo es mucho mas inexacto, y conlleva la poca precision o la sobrecarga en las tareas del procesador.

Hay otra forma, pero claro, el micro tiene que tenerlo: un decoder de cuadratura hardware ya hecho. Con ese ya no pierdes comba. Eso si, con filtrado de señal también incluído, que como dice dedalo1111, los ruidos dan mucha guerra
Torno Optimun D240x500 modificado, Fresa BF20L Vario modificada, mucha otra herramienta... y pocas ganas de trabajar !!

Desconectado agassichan

  • Join Date: Ago 2011
  • Mensajes: 139
  • Ubicación: Martorell
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #7 en: 03 Mayo 2013, 10:00 »
Yo conozco los STM8 que tienen un encoder de cuadratura, pero solo tienen uno. Tampoco tengo muy claro como se relaciona con las interrupciones.
Al final si dejas que el micro cuente mediante hardware el estado del encoder (o de los pulsos de entrada provenientes del codigo) tendras que tener un "servicio" corriendo a toda leche para que la precision sea suficiente.

Creo que la aproximacion por interrupciones es mejor, el tratamiento de cada flaco puede ser muy corto, y el solapamiento posible no creo que sea demasiado para ser considerado un problema.

Desconectado fleming

  • Join Date: Dic 2009
  • Mensajes: 737
  • Ubicación: BCN-A Coruña (cuando puedo)
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #8 en: 03 Mayo 2013, 13:49 »
Al final si dejas que el micro cuente mediante hardware el estado del encoder (o de los pulsos de entrada provenientes del codigo) tendras que tener un "servicio" corriendo a toda leche para que la precision sea suficiente.

 ???
La ventaja de hacerlo por hardware es que no necesitas ningún servicio que haga ese trabajo (y que te consume tiempo de proceso...) El hardware lleva la cuenta, y en tu algoritmo PID, consultas el registro de pulsos y actualizas tu regulador... el tiempo conque refresques tu PID no tiene nada que ver con el tiempo que tardes en calcular la nueva posición...

Desconectado agassichan

  • Join Date: Ago 2011
  • Mensajes: 139
  • Ubicación: Martorell
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #9 en: 03 Mayo 2013, 13:54 »
???
La ventaja de hacerlo por hardware es que no necesitas ningún servicio que haga ese trabajo (y que te consume tiempo de proceso...) El hardware lleva la cuenta, y en tu algoritmo PID, consultas el registro de pulsos y actualizas tu regulador... el tiempo conque refresques tu PID no tiene nada que ver con el tiempo que tardes en calcular la nueva posición...

Si, no necesitas tiempo de proceso para actualizar la posicion real y la posicion deseada. Ahi estoy de acuerdo, en memoria siempre tendras los valores en memoria actualizados a velocidad de hardware.

Pero igualmente tendras que hacer correr un programa que este mirando esos datos a una velocidad alta para no darte cuenta de que hay un error demasiado tarde. Si la velocidad de proceso del PID no es suficiente no sirve de nada que el hardware tenga los valores correctos.

Por eso a lo mejor es mas sencillo funcionar solo por interrupciones. Cada vez que cambia una linea de entrada ves que ha pasado, actualizas valores de salida. Si se puede hacer o no depende de la sencillez del trabajo a hacer.


Desconectado lamartinada

  • Join Date: May 2013
  • Mensajes: 120
  • Ubicación: Alicante
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #10 en: 03 Mayo 2013, 14:24 »
Agradezco vuestros aportes. Recapitulando, debo buscar un contador de pulsos por hardware que almacene la posición del eje, un micro que lleve la cuenta de pulsos enviados desde Mach3 (mediante interrupciones) y  otro micro que compare los valores anteriores, posicion deseada y posición real, de forma que cuando sean distintos, salte una interrupción cuyo cometido sea mandar los pulsos necesarios para igualar los valores de posición. Así, con dos microprocesadores reduciré al máximo el tiempo de procesamiento no? Pero desde que mi micro envia los pulsos para rectificar la posición hasta que el motor realmente lo hace pasa un tiempo no? no es posible que se cree un movimiento pendular del eje en ese caso? 

Desconectado fleming

  • Join Date: Dic 2009
  • Mensajes: 737
  • Ubicación: BCN-A Coruña (cuando puedo)
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #11 en: 03 Mayo 2013, 14:52 »
Pero creo que estás mezclando (perdona Lamartinada por salirnos un poco del asunto), porque por un lado está el sensor que te da el estado actual del sistema, el feedback (que es sobre lo que discutimos... si debe hacerse por software, mediante interrupciones o un decoder hardware en el micro)
Por otro lado está el uso que hagas de ese valor en tu algoritmo, y que tendrá que ver con lo bien-mal implementado/optimizado que tengas tu algoritmo PID.
Es decir, el estado (posición, en este caso) no es más que un valor que se le mete al sumador para obtener el error y actuar (P/I/D) en consecuencia.


Si eso se puede hacer por hardware, sin consumir una sola línea de software, será mucho mejor... pero bueno, la base es arduino que no tiene decoder de cuadratura, así que lo mejor es interrupción a cambio de flanco, leer el otro canal, incrementar decrementar el contador (tendrás que decidir como vas a tratar las unidades de ese contador, a la hora de meterlo en el sumador, lo mejor es hacerlo fuera de la interrupción). Si quieres optimizar mucho te recomiendo que lo hagas en ensamblador, ya que son 4 líneas... no sé lo bien optimizado que estará el compilador de arduino...


De todas maneras leyendo los dos post de Lamartinada, hay varias cosas.
En el primero preguntas por un PID para un servo, pero en el el último ya hablas de sincronizar 3 ejes de un CNC mediante 3 servos... eso son dos cosas distintas, y con problemas distintos... te recomiendo que te centres el servo PaP y después te rompas la cabeza en como sincronizarlos


Lo de poner dos micros para (A, para el Mach y B, para el driver) no resuelve el problema, lo complica, ya que esos dos micros se tienen que comunicar, y ahora tendrás la situación de que A tendrá que atender al Mach y las comunicaciones con B y B tendrá que atender al encoder para actualizar el estado y además atender a las comunicaciones con B.


Si quieres sincronizar los ejes, tendrás que pasar por el buffer (y si pierdes muchos pasos, disminuirá la velocidad de mecanizado). Pero el buffer tiene otros problemas... la gestión del Ovreflow...


Yo para este tipo de cosas, donde los tiempos de respuesta son tan críticos, soy más amigo de la lógica programable... pero bueno, ese es otro mundo donde el Tio_gil tiene mucho que decir. Un micro de 8 bits sobre un entorno de programación de muy alto nivel... es un buen reto.
Suerte!! y sobre todo, vete contándonoslo!! a mi me interesa.


Saludos.

Desconectado tio_gil

  • Global Moderator
  • ****
  • Join Date: Sep 2009
  • Mensajes: 3100
  • Ubicación: Madrid - España
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #12 en: 03 Mayo 2013, 15:54 »
Flemming, ahí les has dado .
Una cosa es saber donde estas y otra cosa es el lazo PID.

Aprendí a base de "sangre" y tirando el dinero, que si quieres hacerlo bien (digo bien, sin problemas y sobre todo cuando tienes chorropocientos pulsos por segundo), las lectura de cuadratura hay que hacerlo via hardware.

Otra forma de hacer la lectura del encoder (pero sólo sirve para funcionamiento en modo x1): dos contadores que vas leyendo periódicamente. Las señales A y B se meten en las entradas de reloj e inhibicion de los contadores. A es reloj en uno e inhibicion en el otro, B lo contrario. Una lectura de ambos contadores y restándolos te dan la cantidad de movimiento. Esto se lo sumas a tu contador y listo.
En LSI/CSI tienes chips para estos menesteres (hay otra casa que vende estos mismos perono recuerdo como se llama)

Para los que les guste el mundo analogico y digital (incluida parte de CPLD/FPGA), que hechen un vistazo a esto
Torno Optimun D240x500 modificado, Fresa BF20L Vario modificada, mucha otra herramienta... y pocas ganas de trabajar !!

Desconectado lamartinada

  • Join Date: May 2013
  • Mensajes: 120
  • Ubicación: Alicante
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #13 en: 03 Mayo 2013, 16:17 »
Bien, efectivmente puedo usar dos interrupciones para contar tanto los pulsos del encoder como los pulsos que provienen de mach3. Puedo calcular la maxima frecuencia a la que mach enviara los pulsos a mi motor paso a paso en concreto y asi cerfificar si arduino es capaz de contar,  sin perder pulsos por el camino, las señales provinientes de ambos, encoder y mach. Si esto es viable ( que espero que si ya que no voy a trabajar con avances mayores de 2m/min) fuera de las interrupciones hare la conversion de los pulsos a posicion, la.comparacion entre ambos resultados y posteriormente enviar los pulsos necesarios para el ajuste de la posicion. Hasta que no lo pruebe creo que sera dificil saber si obtengo buena respuesta en tiempo real. De no ser asi probaré de usar contadores como me recomiendas, tio_gil.

Por otro lado, para implementar el PID necesito los parametros derivativo e integral. El proporcional lo hallo en funcion del error, pero como averiguo los otros dos? Por ensayo y error? O hay alguna forma matematica?

Desconectado tio_gil

  • Global Moderator
  • ****
  • Join Date: Sep 2009
  • Mensajes: 3100
  • Ubicación: Madrid - España
Re:PID (arduino) Motor Paso a Paso con encoder rotacional
« Respuesta #14 en: 03 Mayo 2013, 19:33 »
deberías saber como "funciona" (la función de transferencia) tu sistema y luego aplicar las tipicas fórmulas. Como eso es casi un imposible, los valores P, I y D se suelen hacer "a ojo". Creo que tenemos algún prost al respecto.
Hay que decir que esto de hallar los valores de PID óptimos es un verdadero arte.
Torno Optimun D240x500 modificado, Fresa BF20L Vario modificada, mucha otra herramienta... y pocas ganas de trabajar !!

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20