Control PID

Hola a todos.

Estoy tratando de controlar el ciclo de trabajo de un driver con un PI. Estoy empleando el código de:

http://brettbeauregard.com/blog/wp-content/uploads/2012/07/Gu%C3%ADa-de-uso-PID-para-Arduino.pdf

El código empleado para implementar el PID es el mostrado en la pág 16-17. Con la configuración de Setpoint y demás propios del uso que quiera darle.

Dentro del Loop de arduino lo que tengo es un polling que me imprima una serie de variables por pantalla según el tiempo que quiera. y que en cada ciclo ejecute el Compute(); comprobando que el tiempo para su ejecución, se cumpla y corra.

Pues bien, el problema que tengo es que pese a establecer un "SampleTime" de 20 (50hz). Para que el PID controle la salida 50 veces por segundo. Pero no actúa así. Se ejecuta cerca de 5 veces por segundo y por tanto el motor va a golpes. Pero si además elimino el control de tiempo del "SampleTime" y le obligo a ejecutarse en todos los ciclos del loop. La cosa no cambia.

La duda que tengo es que si ejecutando la función del PID por interrupciones funcionará o si mientras se ejecuta , la salida PWM que controla el driver se detendría y dejaría de funcionar cada vez que se ejecuta el PID.

Gracias.

Busca la librería Arduino-PID-Library esta disponible en el IDE Library Manager.

También puedes buscar en google Arduino PID y verás aplicaciones de todo tipo.

No encontré si es posible introducir anti-windup y no me hace gracia por ello esa librería sin saber que esta ocurriendo dentro.

Que es anti-windup ?

Y cual es la gracia de que? Miras la librería y aprendes de ella. Toda librería PID hace lo mismo.

El windup es el efecto que hay en la practica real que un sistema no actúe de forma lineal que es como trabaja el PID y puede llevar a un cierto retraso a la hora de actuar el control que hace que la parte proporcional del control PI o PID se dispare y no sea capaz de controlar el sistema.

Para mi es importante saber secuencialmente en todo momento que es lo que ocurre para poder ver que errores puedo tener y/o solucionarlos. Si pongo algo por ponerlo, para hacer alguna tontería sobra. Pero si necesito algo mas serio tengo que poder saber que ocurre en todo momento.

De todas formas muchas gracias por responder, estoy leyéndome toda la librería para ver que tiene. :)

marguial: El código empleado para implementar el PID es el mostrado en la pág 16-17. Con la configuración de Setpoint y demás propios del uso que quiera darle.

Pues si te fijas en el código de la pagina 16-17 no hay setup() mi loop().

Increíble tu respuesta, no has probado la librería y ya la desestimas!! Creo que es un grave error.

Si te hubieras tomado un momento y leyeras su documentación que dejo a continuación : Improving the Beginner’s PID – Introduction podrías entender mejor como trata tu problema.

En particular se refiere a

Reset Windup Mitigation –We’ll go into what Reset Windup is, and implement a solution with side benefits

y siguiendo el comentario llegas a esto Improving the Beginner’s PID: Reset Windup

Por lo que supongo tal vez tu duda se pueda resolver probándola.

Pues bien, el problema que tengo es que pese a establecer un "SampleTime" de 20 (50hz). Para que el PID controle la salida 50 veces por segundo. Pero no actúa así. Se ejecuta cerca de 5 veces por segundo y por tanto el motor va a golpes. Pero si además elimino el control de tiempo del "SampleTime" y le obligo a ejecutarse en todos los ciclos del loop. La cosa no cambia.

He leido superficialmente el pdf que mencionas. Me sorprende que la respuesta del código te de salidas cada 200 mseg o sea como errado en un factor de 10.

Veré tu código y analizaré que puede estar mal. Ahh no hay código. Sería bueno que lo postees para corroborar lo que dices.