Cómo implementar un controlador tipo PID autoajustable

15

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 activada o desactivada, con frecuencias de ciclo fijas (~ 2-10 por hora)
  • La planta tarda en responder (los cambios medibles en la temperatura tardan mucho 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 en función de la demanda del usuario.

Estoy escribiendo un controlador que tiene como objetivo minimizar el error, así como cumplir con la tasa de ciclo proporcionada como entrada.

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

El uso de un PI o PID real no es un requisito. Estoy abierto al uso de 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 aprox.) 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 haría para implementarlo realmente en software / práctica.

No soy un EE, por lo que cualquier aportación sería muy apreciada.

MandoMando
fuente
1
Escribí una respuesta sobre el uso de un algoritmo simplex para sintonizar automáticamente los controladores PID en el Robotics SE que pueden ser de interés.
embedded.kyle
@ embedded.kyle genial, entiendo simplex / greatest-acent. ¿Puedes decir lo que solía hacer para x1, x2? Tengo problemas para relacionarlos con las constantes PID.
MandoMando
1
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 que sea más importante para usted. En mi aplicación, control de motor, teníamos dos bucles. El x0 de uno era la velocidad y el x0 del otro era actual. Mira aquí para más.
embedded.kyle
@ embedded.kyle ¿te importa convertir tu comentario en una respuesta? agregue cualquier información adicional si lo desea. -thx
MandoMando
Una recompensa? ¡Oh chico! Hecho y hecho.
embedded.kyle

Respuestas:

7

No iría tan lejos como para llamar a PID desactualizado. 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 simplex de escalada . Tiene la ventaja de poder converger y volver a converger en un parámetro objetivo que se mueve con el tiempo.

Método de Nelder-Mead alpinismo

De este documento :

Por ejemplo, en nuestro caso de ajuste de parámetros PID {K P , K I , K D } un simplex es tetraedro. Nelder – Mead genera una nueva posición de prueba de simplex extrapolando el comportamiento de la función objetivo medida en cada punto de prueba dispuesto como simplex. El algoritmo luego 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 del motor. Teníamos dos bucles, un bucle de control de corriente PID y un bucle de control de velocidad PI. Establecimos nuestros vértices en P, I y D, respectivamente, y ejecutamos estadísticas en la salida del bucle. Luego ejecutamos la reflexión, expansión, contracción y reducción una y otra vez hasta que los objetivos de control de velocidad o de corriente generados estuvieron dentro de algunas desviaciones estándar.

Con nuestro producto, el VP estaba muy preocupado por cómo "sonaba" el motor. Y resultó que "sonó" mejor cuando el objetivo actual rebotó un poco más de lo que era matemáticamente óptimo. Por lo tanto, nuestra afinación se realizó "en vivo", ya que dejamos que el algoritmo buscara mientras el motor estaba funcionando para que la percepción del usuario del sonido del motor también se tuviera en cuenta. Después de encontrar los parámetros que nos gustaron, fueron codificados y no cambiaron.

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

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

Embedded.kyle
fuente
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 burdo (¿espacio-estado?) En el microcontrolador basado en las mediciones del sensor. Luego ejecutaría su controlador PI 'shadow' propuesto a medida que se optimiza. No estoy seguro de esto, 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
@MandoMando Muchas gracias! Y realmente me gusta el término controlador PI 'shadow'.
embedded.kyle
3

Un controlador PID es útil en situaciones en las que el comportamiento del sistema que se controla puede aproximarse razonablemente como una 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 dicho criterio, si hay un objeto que se calienta de manera uniforme por el estímulo, y si ese objeto transfiere calor de manera uniforme a otro objeto a una velocidad 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 uniforme única. Para modelos térmicos más complicados que eso (por ejemplo, los que pueden involucrar gradientes térmicos dentro de un medio sólido),

Sugeriría que un buen enfoque podría ser tener el controlador, cuando el calentador está encendido, estimar continuamente qué tan caliente se calentaría el dispositivo que se regula si la salida se apaga inmediatamente, y la temperatura a la que terminaría enfriándose si el calentador se encendió tan pronto como se permitió después de eso. También calcule cuáles serían esos valores si el calentador se dejara encendido por otro segundo, dos segundos, tres segundos, etc. Apague el calentador cuando esos valores sean tan buenos como van a ser. Luego, una vez que el calentador esté apagado, comience a realizar cálculos similares, pero intercambie los roles de encendido / apagado, caliente / frío, 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ínimo / máximo' para mirar uno o dos pasos adelante.

Super gato
fuente
1

Poder cambiar el estado del control (activar o desactivar) de 2 a 10 veces por hora no se presta para el control del ciclo de trabajo. La salida de un bucle PI será una señal de control que varía en magnitud en función del error, y su planta solo puede aceptar (de manera realista) una entrada binaria (apagado o encendido), ya que la 'frecuencia' del control El ciclo de trabajo que puede aceptarse es una fracción de hertz.

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
Adam Lawrence
fuente
la idea es tomar la salida PI, decir: 60% y convertir a tiempo de encendido = 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 velocidad 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 sobrepase temporalmente durante un período de tiempo para equilibrar la pérdida durante el tiempo de inactividad.
MandoMando
1

Una forma típica (aunque ciertamente simplista de hacer esto) se llama programación de ganancia. Es un enfoque clásico para el control no lineal cuando tiene una variable observable (o variables) con las que su sistema cambia (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 a diferentes valores del parámetro de programación (temperatura) y a medida que el parámetro de programación cambie, 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 quieres ponerte elegante, puedes implementar un algoritmo de aprendizaje automático para generar tu matriz de ganancia. Esto daría como resultado el controlador de evolución y aprendizaje que parece estar describiendo. Sin embargo, podría ser excesivo si el sistema se puede caracterizar por completo.

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

Mate
fuente
0

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

Scott Seidman
fuente