Estoy tratando de implementar un algoritmo PID básico en un Arduino Leonardo para mezclar agua corriente 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 sobrepase el punto de ajuste para proteger al usuario de quemaduras. Secundariamente importante es obtener la temperatura cerca del 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 baja temperatura 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 a 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 excede el punto de ajuste, debido a la espera de que el valor integral se reduzca a niveles normales. Por lo tanto, el resultado es agua a temperatura máxima durante varias (decenas) de segundos.
No estoy seguro de cómo dar cuenta de este posible largo retraso. En tal caso, ¿sería prudente establecer un límite superior (e inferior) en el valor de error integral para limitar el tiempo máximo de respuesta? Esto parece anular el propósito del componente integral y aún impondría cierto retraso después de alcanzar el punto de ajuste.
¿O hay una mejor manera de manejar los cambios rápidos de entrada después de un largo retraso?
Gracias por cualquier consejo!
fuente
Respuestas:
Su problema se llama Integral Windup , es un problema de control común. En una región no lineal o limitada, el controlador no puede rastrear el punto de ajuste 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 dedujo que es el problema.
La solución más simple es limitar el valor del integrador a un máximo sensible. Limitar la contribución integral no funcionará tan bien, ya que el integrador aún estará sujeto a un gran valor.
Mathworks tiene una página con algunas otras soluciones para el enrollamiento 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 obtenga un rendimiento aceptable con solo PD.
Como este es un caso muy especial y conocido, podría considerar tener un modo diferente para el controlador. Mida la temperatura de entrada caliente, y mientras está por debajo del punto de ajuste, simplemente ejecute 100% caliente, 20% frío. Cuando se calienta, cambie al PID, con buenas condiciones iniciales.
fuente
La clave para controlar este proceso de manera eficiente es darse cuenta de que los grifos calientes y fríos no funcionan simétricamente, y cualquier algoritmo óptimo tiene que tener esto en cuenta.
Cuando no usa 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, lo que sería increíble tener en los calurosos días de verano, pero estoy las apuestas son bastante raras en la práctica).
Por lo tanto, suponemos que no sabemos lo que obtenemos de la tubería de agua caliente, pero podemos depender de que la tubería de agua fría sea bastante constante a lo largo de una carrera.
Por lo tanto, a partir de la temperatura del agua mezclada, y al conocer la configuración de la válvula, y a partir de una estimación de la temperatura del agua fría, podemos estimar qué tan caliente está actualmente el agua que proviene de la tubería de agua caliente. Luego puede ajustar la válvula para obtener la temperatura de salida correcta sin PID, solo en función de la evaluación de una fórmula termodinámica.
Para obtener la "estimación de la temperatura del agua fría", puede correr agua fría por un corto tiempo (unos segundos tal vez) 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 calculo que entrará de manera confiable dentro del estadio sin la posibilidad de sobrepasar drásticamente. 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 restablezca el estado PID cuando tenga cambios significativos en la temperatura de entrada del agua caliente.
Son posibles soluciones más elegantes con múltiples sensores de temperatura.
fuente
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 ocurre en muchos procesos industriales y es un arte más que una ciencia.
Hay acciones típicas de libros de texto en contra de esto sin sacrificar la ganancia integral que realmente podría ser necesaria para la especificación de rendimiento.
Cada vez que cruza el nivel de error cero, reinicia el integrador. Esto hace que el integrador sea un integrador a pedido del elemento no lineal en lugar de un acumulador ciego.
Básicamente, conecta el bloque de entrada de acción integral a un elemento indicativo en el bucle. Esto podría ser el resultado del integrador para juzgar si comenzó la acumulación (lo que requiere una comprensión del proceso para hacer el juicio correcto). 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
fuente
A veces puede ser útil tener múltiples conjuntos de parámetros PID, para etapas de grano grueso del rango de operación del sistema, que puede cambiar 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 abre el grifo caliente y obtiene solo agua fría; luego, una vez que comience a ver subir la temperatura, cambie a otro conjunto de Kp, Ki y Kd. Luego sintonice los dos en consecuencia.
¿Está utilizando la Biblioteca PID en el Arduino Playground de Brett Beauregard? Este es bastante bueno. Y hay un ejemplo 'adaptativo' de esto allí también.
fuente
¿Has modelado el sistema?
¿Tiene algunos datos basados en el tiempo que muestran 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 integració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
Igualmente podría ser porque es muy alto y lleva tiempo disminuirlo.
Entonces, sí, el valor almacenado en el registro que pude haber terminado para decir ... 1000C porque el P + I no estaba configurado para la respuesta del sistema y luego tiene que apagarse.
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 alcanzara CASI MÁS la temperatura deseada (la teoría de control dice que no lo hará). El dependiendo de si
Comenzaría cambiando el código PID para una mejor implementación y luego agregaría un poco de I, solo para probar un punto.
Realmente necesitas determinar a qué se dirigen estas ganancias. La entrada es la temperatura, la salida es ... ¿flujo? entonces debería haber una transferencia de flujo / C y una función de transferencia de Flujo / Cs.
fuente
Una forma en que me gusta resolver el Windup integral es dejar de acumular el error cada vez que la salida de control está en su deflexión máxima . O escale por lo lejos que está de la desviación máxima. Por lo tanto, siempre que su controlador emita "agua caliente al 100%, agua fría al 0%", simplemente no acumule el error, pero tampoco lo restablezca a cero.
No me gusta limitar la integral al máximo porque hay un límite para el error sistemático que su PID puede compensar.
También sugeriría que, en lugar de hacer un PID "tonto" que solo tiene un parámetro que está tratando de controlar sin conocer el sistema subyacente, instale dos sensores de temperatura adicionales, tanto en la entrada de calor como en la de frío. 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), lo que depende no solo de las posiciones de las válvulas (conocidas) sino también de la presión del agua (desconocidas).
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 derivación correcto es generalmente el 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, de manera básicamente instantánea, sin ninguna necesidad del elemento derivado.
fuente