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!