Hola,
En realidad este post comienza
aquí, donde explico mis experiencias con el encoder magnético absoluto AS5600.
Os presento un control PID de posición convencional, al que le he añadido suavidad en el "marcha y paro" del motor. Lo hace de forma triangular, es decir, linealmente acelera o desacelera, según sea marcha o paro del motor.
El motor es un motor sin engranajes. Está alimentado a 12V.
Al comienzo le hago ir a la posición 1234567, y luego le hago ir a la posición -1234567, y finalmente le hago ir a la posición 0 (la misma posición en la que estaba al comienzo del vídeo).
Después pulso sobre "sw1" que es el pin "Homing", entonces va hacia atrás lentamente todo el rato y no parará hasta que pulse sobre "sw2" que es el reset, y en esa posición que se haya pulsado en reset, será la posición 0 del motor (es como el "homing" de una impresora 3D). Esta operación la hago varias veces para que se pueda comprobar el funcionamiento. En ocasiones trato de trolear al motor, pero como lleva un circuito muy inteligente :P es imposible que pueda ser troleado.
El circuito para Icestudio es este:
Le podría haber metido más opciones, pero significaría más consumo de recursos y dar la apariencia de complicado, y esto último lo quiero evitar a toda costa. Hay elementos que son completamente opciones, como los indicadores leds y la salida TX. La salida TX informa a través de un terminal serie la posición real en la que se encuentra el motor. Si eliminas esta parte, ganarás unos 300 y picos LCs.
El módulo principal (en la imagen tiene el icono de un motor DC) lo he diseñado de forma genérica, es por eso que he dejado fuera la entrada de datos, que en este ejemplo se hace a través del terminal serie.
Podrás comprobar que los marchas y paros del motor lo hace con suavidad, progresivamente acelera al ponerse en marcha, y progresivamente pierde velocidad al parar. Lo hace de forma lineal, por tanto este tipo de "suavidad" es triangular o trapezoidal; esto depende de la posición.
Tomé como filosofía de funcionamiento que el motor DC pudiera ser controlado como si fuese un motor de pasos. De hecho, la parte que controla la "suavidad" del motor la he tomado y adaptado de otro proyecto que hice para controlar
motores de pasos.
Pero al hacer esto (como si fuese de pasos) me di cuenta que tenía que limitar la velocidad máxima del motor, de otro modo no conseguía la parada suave. Internamente hay un circuito que se encarga de esto, aunque vaya más lento (está en el límite máximo pero no llega) sigue manteniendo toda la potencia. No se calcula la velocidad del motor en ningún momento, esto ahorra muchas matemáticas y complejidades. Esta parte la resolví diciéndole al motor en qué posición se ha de encontrar en cualquier momento, entonces, cuando ha de ponerse en marcha o parar, se le indica la posición en la que ha de estar y jugando con eso, se juega con la velocidad. Y vuelvo a repetir, que gracias a esto, la potencia del motor no varía, siempre está a máxima potencia, independientemente de la velocidad.
He hecho multitud de pruebas y no he tenido ningún problema, así que eso me da la confianza de decir que si lo probáis vosotros, os funcionará tan bien como a mí.
Sobre el control PID que tiene integrado, es un control PID muy muy simple. No hay que tocar ningún parámetro PID porque todo está diseñado para funcionar con el AS5600, con otro tipo de encoder, sí que habría que hacer modificaciones en este sentido. El único parámetro que dejo para configurar por el usuario es el "Sample Time" (tiempo de muestreo. En el caso (extraño) de que notes muchas vibraciones, has de subir o bajar ese parametro, lo puedes hacer de 500 en 500 (son microsegundos). Por otra parte, es completamente normal que el eje del motor tenga una tolerancia de +-5 posiciones. Esto se debe a que los imanes de un motor DC busca atraer el rotor metálico y llevarlo a una zona de equilibrio. Pero el PID se encargará de dejarlo siempre en la posición que le hayamos indicado.
Adjunto ICE. Quizás en siguientes post comente otros detalles que se me vayan ocurriendo.
Saludos.