Control PID con Arduino y PIC, preparándome para dar el salto a FPGA.

295 views
Skip to first unread message

Democrito

unread,
Aug 31, 2017, 9:40:46 AM8/31/17
to FPGAwars: explorando el lado libre
Hola!

Me he pasado todo el mes de agosto estudiando el controlador PID, haciendo observaciones minuciosas y tratando de deducir qué es exactamente lo que hace el control proporcional, integral y derivativo (o diferencial), y cómo se afectan mutuamente. He modificado el algoritmo original y aplicándole unas condiciones, consigo eliminar por completo los problemas que crea el control integral.

Si alguien le interesa el tema, especialmente para probarlo con sus motores con encoder (mejor si tienen una buena resolución) dejo aquí un enlace:
Es el segundo enlace (para Arduino) y tercer enlace (lo mismo pero para PIC)

Todo lo que he aprendido espero que dé sus frutos cuando lo aplique a la FPGA, es decir, un control PID digital puro. Ya tengo algunas ideas, me llevará meses sacarlo (si lo consigo), porque no quiero convertir a la FPGA en una calculadora, aunque sé que hay cosas que son inevitables.

Saludos!

Juan José Luna Espinosa

unread,
Sep 1, 2017, 9:03:06 AM9/1/17
to fpga-wars-explora...@googlegroups.com
Hola  Demócrito, impresionante lo que haces con el carro de la impresora.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/fpga-wars-explorando-el-lado-libre/1ef9739a-7511-4cc3-a05d-524a6e34c2ad%40googlegroups.com.
Para acceder a más opciones, visita https://groups.google.com/d/optout.

Jose Pico

unread,
Sep 1, 2017, 12:13:40 PM9/1/17
to FPGAwars: explorando el lado libre
Hola Democrito:

Yo estoy intentando hacer algún pinito con PID en la FPGA, en mi github  tengo un  módulo error (restador), proporcional y diferencial, puedes pegarle un vistazo por si te inspiran algo, el tema que me deja un poco parado es el como usar un número en coma fija para poder configurar los valores de Kp,Kd,Ki  con valores decimales ya que solo se usarlo comos números enteros y así creo que sería más dificil de ajustar el PID.

Saludos
Diferencial.ice
Error.ice
Proporcional.ice

Democrito

unread,
Sep 1, 2017, 4:06:44 PM9/1/17
to FPGAwars: explorando el lado libre
Hola José,

Me ha gustado mucho tus módulos! Los tendré presente, gracias! Al menos uno de ellos lo haré servir.

Lo de la coma flotante está el "truco del almendruco". Se trata de multiplicar todas las entradas por un número muy grande, operas de forma normal, como números enteros y en el resultado tiene la parte entera y decimal.

Por ejemplo tengo el número 25 (esta es la entrada) y quiero dividirlo entre 4. De antemano sabemos que 25/4=6.25 (spoiler)

Pero como sólo podemos hacer divisiones enteras hacemos lo siguiente.

Multiplicamos la entrada 25*100=2500

Ahora operamos de forma normal, haciendo la división entera: 2500/4=625.

Y ahora sólo falta poner el punto decimal, es decir, mover el punto tantas veces como el factor de multiplicación. Como multiplicamos por 100, desplazamos la coma dos veces a la izquierda y ya lo tenemos.

El control PID que yo haga, y si es que lo consigo, porque quiero evitar en lo posible hacer operaciones (sólo contemplo la resta) no sería el PID convencional, pero tendría que funcionar como tal. Todo lo tengo en mi cabeza y me falta darle estructura y convertirlo en módulos de Icestudio.

La idea es la siguiente:

* En un controlador PID tenemos una resolución de PWM. De forma estándar suele ser 256 (0..255). Vamos a tomar esa resolución.
* El PID no hace absolutamente nada interesante, más que ir hacia una dirección (a toda castaña) mientras la posición sea mayor de 255 (la resolución del PWM).
* Cuando la posición del motor es menor de 256 es justo cuando comienza a suceder las cosas interesantes, es cuando los cálculos son realmente necesarios, o al menos esto es lo que se hace convencionalmente.

Lo que no es convencional es lo siguiente. En vez de operar con números, jugamos con el tiempo en función del error que tengamos en esas últimas 256 posiciones.

* El controlador proporcional es simplemente una resta. Es el "error" y lo pondremos en función del tiempo para el control integral y derivativo.
* El controlador integral es simplemente un contador que por unidad de tiempo incrementa el valor del PWM. Los incrementos serán más lento a medida (o en función de) que el error se hace cero.
* El controlador derivativo hace justo lo contrario, decrementa el PWM y lo ha de hacer de tal manera que cuanto menor sea el error, más rápido ha de decrecer el PWM.
* Las contantes KI y KD han de "afectar" al tiempo, haciendo que incremente para el control integral más rápido o lento; y lo mismo para el control derivativo que sería decrementar más rápido o más lento.

A grandes rasgos eso es todo. Como en todo, seguro que habrá que añadir más historias que no se tiene presente hasta que no se hace pruebas. O simplemente mi idea no lleva a ninguna. Ya os contaré.

Saludos!

Juan José Luna Espinosa

unread,
Sep 1, 2017, 6:21:47 PM9/1/17
to fpga-wars-explora...@googlegroups.com
Es muy interesante lo que dices, y me parece que muy óptimo.

--
Has recibido este mensaje porque estás suscrito al grupo "FPGAwars: explorando el lado libre" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a fpga-wars-explorando-el-lado-libre+unsubscribe@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a fpga-wars-explorando-el-lado-li...@googlegroups.com.
Visita este grupo en https://groups.google.com/group/fpga-wars-explorando-el-lado-libre.

Jose Luis V

unread,
Oct 2, 2017, 2:28:06 AM10/2/17
to FPGAwars: explorando el lado libre
Hola +Democrito, por fin te encuentro.

Hace un año, buscando información sobre Cinemática di con tu página en Google Site https://sites.google.com/site/proyectosroboticos un trabajo impresionante que me sirvió de inspiración y de una gran ayuda para entender mejor la cinemática y trabajar con ella.

Con todo lo que aprendí con tu trabajo hice algunas entradas en mi blog http://robotstyles.blogspot.com.es/2016/11/alli-esta-ahora-falta-descubrir-como.html donde me hubiese gustado mencionarte, pero como no encotré en tu página quien o quienes estaban detrás, solo pude hacer referencia a ella.

Hoy, revisando el grupo FPGAWars he visto este hiloy me he llevado una grata sorpresa al descubrir que la persona que había iniciado el hilo era la misma que me había ayudado tanto con la Cinemática.

Muchas gracias por compartir tu conocimiento y hacerlo de una manera tan detallada, didáctica e ilustrativa.

Por cierto, incluye en tu pagina enlaces a tus redes sociales, por ejemplo Google+ o por lo menos, tu nombre y no nos niegues a los que aprendemos con tus conocimientos el poder reconcer tu trabajo y agradecertelo.

Gracias Democrito.


El jueves, 31 de agosto de 2017, 15:40:46 (UTC+2), Democrito escribió:

Democrito

unread,
Oct 2, 2017, 4:38:54 AM10/2/17
to FPGAwars: explorando el lado libre
Hola José Luis,

Soy el mismo Demócrito; uso dos cuentas dependiendo si estoy en el curro o en casa. Tengo remilgos en lo referente a la privacidad y por eso siempre voy con un nick o seudónimo. No utilizo redes sociales pese a que estoy registrado en todas ellas.

Di con tu web no hace muchos meses y me parece que has hecho un trabajo estupendo.

Gracias por tus comentarios!

Un abrazo!
Reply all
Reply to author
Forward
0 new messages