Estoy tratando de implementar un algoritmo PID básico en un Arduino Leonardo para mezclar agua del grifo caliente y fría usando válvulas servocontroladas. El objetivo es mantener la temperatura lo más cerca posible de un punto de ajuste. Es especialmente importante evitar que la temperatura de salida supere el punto de ajuste para proteger al usuario de quemaduras. Secundariamente importante es lograr que la temperatura se acerque al punto de ajuste lo más rápido posible.
Para pequeños cambios de temperatura, una implementación estándar del algoritmo PID parece funcionar bien. Pero no sé cómo explicar los largos retrasos que pueden ocurrir cuando se espera que el agua caliente llegue a la válvula, ya que estos retrasos son mucho más largos que los retrasos estándar después de cambiar las posiciones de la válvula.
Obviamente, dependiendo de la longitud de la línea de agua caliente y el tiempo transcurrido desde el último uso de agua caliente, el agua caliente puede tardar varias decenas de segundos en llegar a la válvula, por lo que durante este tiempo, la temperatura del agua permanece bastante constante a una temperatura baja. y la válvula de agua caliente pronto se abre al 100%. El componente integral comienza a acumular un gran valor de error.
Cuando el agua caliente finalmente llega a la válvula, la temperatura detectada aumenta muy rápidamente hasta la temperatura máxima del agua caliente. Debido al gran error integral, la válvula de agua caliente se mantiene al 100 % durante mucho tiempo después de que la temperatura exceda el punto de referencia, debido a la espera de que el valor integral se reduzca a los niveles normales. Así, el resultado es agua a temperatura máxima durante varias (decenas) de segundos.
No estoy seguro de cómo explicar este posible retraso prolongado. En tal caso, ¿sería prudente establecer un límite superior (e inferior) en el valor del error integral para limitar el tiempo de respuesta máximo? Esto parece anular el propósito del componente integral y también impondría cierto retraso después de alcanzar el punto de ajuste.
¿O hay una mejor manera de manejar cambios de entrada rápidos después de un retraso prolongado?
¡Gracias por cualquier consejo!
Su problema se llama Integral Windup , es un problema de control común. En una región no lineal o limitada de otro modo, el controlador no puede rastrear el punto de referencia y la integral aumenta a un valor grande. Esto provoca un gran sobreimpulso cuando finalmente se alcanza el punto de ajuste, que es exactamente lo que ha deducido que es el problema.
La solución más simple es limitar el propio valor del integrador a un máximo razonable. Limitar la contribución integral no funcionará tan bien, porque el integrador aún tendrá un gran valor.
Mathworks tiene una página con algunas otras soluciones para la liquidación integral.
En un controlador PID, generalmente desea el menor término integral posible. En una válvula de control de temperatura mecánica estándar, solo se usa el control proporcional y funcionan bien. Mantenga el término integral lo más pequeño posible: el usuario no notará un pequeño error en la temperatura final. Es posible que descubra que obtiene un rendimiento aceptable solo con PD.
Como este es un caso conocido muy especial, podría considerar tener un modo diferente para el controlador. Mida la temperatura de entrada de agua caliente y, mientras esté por debajo del punto de referencia, simplemente ejecute caliente al 100 %, fría al 20 %. Cuando se caliente, cambie al PID, con buenas condiciones iniciales.
La clave para controlar este proceso de manera eficiente es darse cuenta de que los grifos de agua caliente y fría no funcionan simétricamente, y cualquier algoritmo óptimo debe tener esto en cuenta.
Cuando no usas el agua caliente por un tiempo, se enfría en la tubería.
Cuando no usa el agua fría durante un tiempo, permanece igual que antes (a menos que el agua fría provenga de un tanque de agua fría con un enfriador, que sería increíble tener en los días calurosos de verano, pero estoy las apuestas son bastante raras en la práctica).
Por lo tanto, asumimos que no sabemos lo que obtenemos de la tubería de agua caliente, pero podemos confiar en que la tubería de agua fría será bastante constante durante una ejecución.
Así, a partir de la temperatura del agua mezclada, y conociendo el ajuste de la válvula, y a partir de una estimación de la temperatura del agua fría, podemos estimar qué tan caliente está el agua que sale actualmente de la tubería de agua caliente. Luego puede ajustar la válvula para obtener la temperatura de salida correcta sin PID, solo con base en la evaluación de una fórmula termodinámica.
Para obtener la "estimación de la temperatura del agua fría", puede dejar correr el agua fría durante un tiempo breve (quizás unos segundos) al comienzo del ciclo y leer la temperatura. Luego suponga que no cambiará a partir de entonces, ya que no tiene suficientes datos para resolver ambas temperaturas.
Este esquema no será perfectamente preciso, pero estimo que se aproximará de forma fiable al estadio de béisbol sin la posibilidad de un exceso drástico. Luego, ejecuta PID sobre este esquema para ajustar los resultados, pero limita el cambio a la configuración de la válvula que PID puede producir. Y posiblemente restablecer el estado de PID cuando tenga cambios significativos en la temperatura de entrada del agua caliente.
Son posibles soluciones más sofisticadas con múltiples sensores de temperatura.
Solo quería agregar un detalle a las buenas respuestas anteriores sobre lo que hacen los ingenieros de control para las posibilidades integrales de liquidación. Esto también sucede en muchos procesos industriales y es más un arte que una ciencia.
Hay acciones típicas de libros de texto contra esto sin sacrificar la ganancia integral que podría ser realmente necesaria para la especificación de rendimiento.
Cada vez que cruza el nivel de error cero, restablece el integrador. Esto convierte al integrador en un elemento no lineal de tipo integrador bajo demanda en lugar de un acumulador ciego.
Básicamente, conecta el bloque de entrada de acción integral a un elemento indicativo en el ciclo. Esta podría ser la salida del integrador para juzgar si inició la acumulación (lo que requiere una comprensión del proceso para hacer el juicio adecuado). O verifica si sus actuadores están saturados o no y forma un circuito de retroalimentación basado en esa información. Elegí al azar el primer enlace que salió de Google y al final de este video hay una explicación gráfica de mi último punto. https://www.youtube.com/watch?v=H4YlL3rZaNw
A veces puede ser útil tener múltiples conjuntos de parámetros PID, para etapas de granularidad gruesa del rango de operación del sistema, que se cambian sobre la marcha a medida que el sistema pasa de una etapa de comportamiento a otra. Por ejemplo, un conjunto de Kp, Ki y Kd para cuando abra el grifo de agua caliente y obtenga solo agua fría; luego, una vez que comience a ver que la temperatura aumenta, cambie a otro conjunto de Kp, Ki y Kd. Luego afine los dos en consecuencia.
¿Está utilizando la biblioteca PID en Arduino Playground de Brett Beauregard? Este es bastante agradable. Y también hay un ejemplo 'adaptativo' de esto.
¿Ha modelado el sistema?
¿Tiene algunos datos basados en el tiempo que muestren el sobreimpulso, especialmente la frecuencia?
Estas son dos preguntas que deben hacerse con cualquier consulta basada en control.
Por lo que ha descrito, su ganancia integral es demasiado alta, demasiado alta. Podría deberse a la liquidación del integrador: el código que se muestra tiene algunas preocupaciones prácticas reales, una de las cuales es que no es el mejor de los integradores discretos.
También puede deberse a que es muy alto y tarda en bajar.
Entonces, sí, el valor almacenado en el registro I podría haber terminado diciendo ... 1000C porque el P + I no se configuró para la respuesta del sistema y luego tiene que reducirse.
Lo primero que haría es capturar datos en tiempo real para el procesamiento posterior. A continuación, ejecutaría solo P y me aseguraría de que la ganancia proporcional alcance CASI la temperatura deseada (la teoría de control establece que no lo hará). El dependiendo de si
Comenzaría cambiando el código PID para que sea una mejor implementación y luego agregaría un poco de I, solo para probar un punto.
Realmente necesita determinar contra qué están destinadas estas ganancias. La entrada es temperatura, la salida es... ¿flujo? entonces debería haber una transferencia de flujo/C y una función de transferencia de Flujo/Cs.
Una forma en que me gusta resolver el Integral Windup es dejar de acumular el error siempre que la salida de control esté en su desviación máxima . O escálelo según la distancia a la que se encuentre de la deflexión máxima. Entonces, cada vez que su controlador emita "agua caliente 100%, agua fría 0%", simplemente no acumule el error, pero tampoco lo restablezca a cero.
No me gusta limitar la integral al máximo porque entonces hay un límite para el error sistemático que puede compensar su PID.
También sugeriría que en lugar de hacer un PID "tonto" que solo tiene un parámetro que está tratando de controlar sin conocimiento del sistema subyacente, instale dos sensores de temperatura adicionales, tanto en la entrada fría como en la caliente. Luego intenta encontrar una función que se aproxime a la posición deseada en función de las temperaturas de entrada, y solo usa el bucle PID para ajustar el error en la salida de esta función.
El error será significativo porque no mide el flujo (bueno, a menos que lo haga, por supuesto), que depende no solo de las posiciones de la válvula (conocidas) sino también de la presión del agua (desconocida).
Aún así, esto debería ayudar mucho con el problema de que el agua caliente finalmente llegue al grifo porque en un circuito PID bien amortiguado, debe confiar en que el elemento D esté bien calibrado para reducir rápidamente el flujo caliente. En mi experiencia, obtener el coeficiente de derivada correcto suele ser lo más difícil. Pero si tuviera los dos sensores adicionales, la salida principal cambiaría exactamente tan rápido como la temperatura del agua de entrada, por lo que básicamente sería instantáneo, sin necesidad del elemento derivado.
sanchises