Cómo implementar un controlador tipo PID autoajustable

Estoy tratando de escribir un programa de microcontrolador para controlar la temperatura en un sistema con las siguientes características:

  • la salida solo puede estar encendida o apagada, con frecuencias de ciclo fijas (~2-10 por hora)
  • La planta responde lentamente (los cambios de temperatura medibles tardan más de 10 minutos).
  • La planta pierde temperatura en función de las condiciones ambientales.
  • el punto de ajuste puede variar en grandes pasos según la demanda del usuario.

Estoy escribiendo un controlador que tiene como objetivo minimizar el error, además de adherirse a la tasa de ciclo proporcionada como entrada.

Esto podría hacerse fácilmente con un controlador PI y su salida convertida al ciclo de trabajo. El problema es que el programa necesita sintonizarse automáticamente y elegir las constantes Kp y Ki correctas y adaptarse a las diferentes condiciones ambientales y cambios en la capacidad de calefacción. Por lo tanto, ajustar el controlador PI por adelantado no es demasiado útil.

El uso de un PI o PID real no es un requisito. Estoy abierto a usar Fuzzy-Logic si ayuda, también tengo un algoritmo de aprendizaje automático en el chip que modela la respuesta del sistema y la pérdida de calor (lineal aproximadamente) que sugiere información sobre la respuesta de paso medida . Simplemente no sé qué hacer con esa información.

Un par de publicaciones sugieren que podría usar los datos de modelado para ajustar el PI en línea, así como el manual de vista de laboratorio que sugiere que podría usar Fuzzy-Logic para ajustar el PI.

Mi pregunta es, cuál es el mejor enfoque para este tipo de escenario (por ejemplo, PID, fuzzy-pid, convolución, etc.) y cómo lo implementaría en el software/práctica.

No soy un EE, por lo que cualquier aporte sería muy apreciado.

Escribí una respuesta sobre el uso de un algoritmo simplex para ajustar automáticamente los controladores PID en Robotics SE que puede ser de interés.
@ embedded.kyle genial, entiendo simplex/greatest-acent. ¿Puedes decir lo que solía hacer para x1,x2? Tengo problemas para relacionarlos con constantes PID.
Ha pasado un tiempo, pero creo que usamos algo como x1 = P, x2 = I, x3 = D. x0, el centro de gravedad, es la medida de estabilidad más importante para ti. En mi aplicación, control de motores, teníamos dos bucles. El x0 de uno era la velocidad y el x0 del otro era la corriente. Ver aquí para más.
@ embedded.kyle, ¿te importaría convertir tu comentario en una respuesta? agregue cualquier información adicional si lo desea. -gracias
¿Una recompensa? ¡Oh chico! Hecho y hecho.

Respuestas (5)

No iría tan lejos como para llamar a PID obsoleto. Pero ciertamente hay margen de mejora. Una forma en la que tengo bucles de control PID autoajustados es usar el método Nelder-Mead, que es una forma de algoritmo símplex para escalar colinas . Tiene la ventaja de poder converger y volver a converger en un parámetro objetivo que se mueve con el tiempo.

Escalada en montaña con el método Nelder-Mead

De este papel :

Por ejemplo, en nuestro caso de ajuste de parámetros PID {K P , K I , K D } un símplex es un tetraedro. Nelder-Mead genera una nueva posición de prueba de símplex extrapolando el comportamiento de la función objetivo medida en cada punto de prueba dispuesto como símplex. Luego, el algoritmo elige reemplazar uno de estos puntos de prueba con el nuevo punto de prueba y así la técnica progresa.

Mi aplicación particular fue para el control de motores. Teníamos dos lazos, un lazo de control de corriente PID y un lazo de control de velocidad PI. Establecimos nuestros vértices en P, I y D respectivamente y ejecutamos estadísticas sobre la salida del bucle. Luego ejecutamos la reflexión, la expansión, la contracción y la reducción una y otra vez hasta que los objetivos de control de velocidad o corriente generados estuvieran dentro de unas pocas desviaciones estándar.

Con nuestro producto, el vicepresidente estaba muy preocupado por cómo "sonaba" el motor. Y resultó que "sonaba" mejor cuando el objetivo actual rebotaba un poco más de lo que era matemáticamente óptimo. Por lo tanto, nuestro ajuste se realizó "en vivo" en el sentido de que permitimos que el algoritmo buscara mientras el motor estaba funcionando para que también se tuviera en cuenta la percepción del sonido del motor por parte del usuario. Después de encontrar los parámetros que nos gustaban, se codificaron y no se modificaron.

Esto probablemente no sería ideal para usted, ya que afirma que "poner el sistema en oscilación, incluso como parte del ajuste automático, no es aceptable para los usuarios". Nuestro sistema seguramente oscilaría y haría otras cosas horribles mientras se sintonizaba automáticamente.

Sin embargo, podría ejecutar dos copias del controlador PID. Uno que estaba "en vivo" y realmente controlaba el proceso. Y un segundo que constantemente se ajustaba automáticamente mientras recibía las mismas entradas que el controlador "en vivo". Cuando la salida del controlador sintonizado automáticamente se vuelve "mejor" o más estable, puede intercambiar los coeficientes en el controlador "en vivo". El controlador luego realizaría correcciones al proceso hasta que se lograra el rendimiento deseado. Esto evitaría las oscilaciones que el usuario puede percibir durante el autoajuste. Pero si las entradas cambian drásticamente y el controlador PID ya no es óptimo, el ajuste automático puede intercambiar nuevos coeficientes a medida que estén disponibles.

El método NM requiere ejecutar sus puntos salvajes en la función objetivo (es decir, el mundo real del usuario). Sin embargo, creo que se puede construir un modelo crudo (¿estado espacial?) En el propio microcontrolador en función de las mediciones del sensor. Luego ejecutaría su controlador PI 'sombra' propuesto a medida que se optimiza. No estoy seguro de que esto sea una exageración, ya que es posible ajustar un PI a una configuración conocida y luego escalar el Kp y el Ki en función de las lecturas del sensor y la respuesta del sistema. De cualquier manera, bien hecho señor.
@MandoMando ¡Muchas gracias! Y me gusta mucho el término controlador PI 'sombra'.

Un controlador PID es útil en situaciones en las que el comportamiento del sistema que se controla se puede aproximar razonablemente como la suma del estímulo de control, la integral del estímulo de control y la integral de esa primera integral. Algunos sistemas de control de temperatura pueden satisfacer tal criterio, si hay un objeto que es calentado uniformemente por el estímulo, y si ese objeto transfiere calor uniformemente a algún otro objeto a un ritmo proporcional a la diferencia de temperatura entre ellos. Por ejemplo, el primer objeto podría ser un elemento calefactor y el segundo objeto podría ser el aire que circula en una habitación, si hay suficiente circulación de aire para que se considere que el aire tiene una temperatura única y uniforme. Para modelos térmicos más complicados que eso (por ejemplo, aquellos que pueden involucrar gradientes térmicos dentro de un medio sólido),

Sugeriría que un buen enfoque podría ser hacer que el controlador, cuando el calentador esté encendido, calcule continuamente qué tan caliente se pondría el dispositivo que se está regulando si la salida se apagara inmediatamente, y la temperatura a la que terminaría enfriándose si el calentador se encendió tan pronto como sea posible después de eso. También calcule cuáles serían esos valores si el calefactor se dejara encendido durante otro segundo, dos segundos, tres segundos, etc. Apague el calefactor cuando esos valores sean tan buenos como sea posible. Luego, una vez que el calentador esté apagado, comience a realizar cálculos similares, pero intercambiando los roles de encendido/apagado, frío/calor, etc., para decidir cuándo volver a encenderlo. Dependiendo del comportamiento térmico del sistema, puede ser necesario utilizar una estrategia de anticipación 'mín./máx.' para anticiparse uno o dos pasos.

Poder cambiar el estado del control (encendido o apagado) de 2 a 10 veces por hora no se presta al control del ciclo de trabajo. La salida de un lazo PI va a ser una señal de control que varía en magnitud en función del error, y su planta puede (siendo realistas) solo aceptar una entrada binaria (activada o desactivada), ya que la 'frecuencia' del control ciclo de trabajo que se puede aceptar es una fracción de un hercio.

Es posible que desee simplificar las cosas e ir con control histérico:

  • el sistema se enciende cuando la temperatura cruza un límite inferior
  • el sistema se apaga cuando la temperatura cruza un límite superior
  • hay suficiente distancia entre los límites superior e inferior para evitar el rebote de la salida de control
la idea es tomar la salida de PI, digamos: 60 % y convertirla a tiempo = 60 % del ciclo -> 0,6 x 30 minutos -> 18 minutos encendido y 12 minutos apagado durante el ciclo de 30 minutos. el controlador bang-bang que sugiere no garantiza mantener la tasa de ciclo requerida (por ejemplo, encender, no más de n veces por hora) y mantener un error bajo al mismo tiempo. puede ser necesario que el sistema se sobrepase temporalmente durante un período de tiempo para equilibrar la pérdida durante el tiempo de inactividad.

Una forma típica (aunque admitidamente simplista de hacer esto) se denomina programación de ganancias. Es un enfoque clásico para el control no lineal cuando tiene una variable observable (o variables) con las que cambia su sistema (parámetro de programación). En su sistema, esa variable probablemente sea la temperatura. La idea es que cree una lista de ganancias del controlador en diferentes valores del parámetro de programación (temperatura) y, a medida que cambia el parámetro de programación, use esas ganancias en su controlador (ya sea PI, PID, retroalimentación de estado o lo que sea). Si esto suena realmente simple, es porque lo es. Sin embargo, funciona y se usa en algunos sistemas muy complicados.

Si quiere ser elegante, puede implementar un algoritmo de aprendizaje automático para generar su matriz de ganancia. Esto daría como resultado el controlador de aprendizaje y evolución que parece estar describiendo. Sin embargo, podría ser excesivo si el sistema se puede caracterizar por completo.

Edit: Lo siento, leí un poco mal. Está tratando de controlar la temperatura para que las "condiciones ambientales" de las que habló sean su parámetro de programación.

Podría usar el controlador Recursive Least Squares completo, cf Astrom y Wittenmark , Adaptive Control, pero no sé si el microcontrolador tendrá suficiente empuje para hacer esto.