Conceptos básicos del controlador PID y tutorial: Implementación de PID en Arduino
Para aquellos que trabajan en controles industriales, la teoría proporcional, integral y derivada (PID) es probablemente un concepto familiar. Para la mayoría de las personas, el término es completamente desconocido, pero podrías estar más familiarizado con ello de lo que piensas. Cuando presionas el pedal del acelerador en un coche, no solo consideras qué tan lejos estás de tu velocidad ideal —la parte proporcional del PID—, también tomas en cuenta cómo acelera tu vehículo particular, así como condiciones como las colinas.
Para aquellos que trabajan en controles industriales, la teoría proporcional, integral y derivada (PID) es probablemente un concepto familiar. Para la mayoría de las personas, el término es completamente desconocido, pero podrías estar más familiarizado con ello de lo que piensas. Cuando presionas el pedal del acelerador en un coche, no solo consideras qué tan lejos estás de tu velocidad ideal —la parte proporcional del PID—, también tomas en cuenta cómo acelera tu vehículo particular, así como condiciones como las colinas.
Estos efectos más sutiles son los que los términos I y D consideran matemáticamente. En este ejemplo, evitarían que la velocidad de un coche oscile de un límite superior a uno inferior, y podemos aplicar el mismo concepto a una variedad de situaciones de control. Mientras que el control basado en límites puede llevarte al punto de referencia, tu sistema tenderá a actuar de manera algo errática.
Ecuación PID
Podemos expresar el control PID matemáticamente con la siguiente ecuación. P, I y D están representados por los tres términos que se suman aquí. Kp, Ki y Kd son constantes que ajustan cómo reacciona el sistema a cada factor:
También podemos reemplazar Ki y Kd con 1/Ti y Td, respectivamente. Este cambio proporciona a la ecuación una mejor relación con su significado físico y permite que las unidades se conviertan correctamente en un número sin unidad:
También podemos transponer la ecuación para extraer el valor de Kp y aplicarlo a toda la ecuación, en lo que se conoce como la forma estándar. Una ventaja de esta forma es que podemos ajustar la constante Kp general para toda la ecuación al mismo tiempo:
Todo esto puede parecer un poco intimidante, incluso para alguien que se haya graduado en ingeniería. La buena noticia es que no necesitas sacar tu libro de Modeling and Analysis of Dynamic Systems para entender lo que está ocurriendo aquí. Y, aunque nunca está de más, ni siquiera necesitas saber cálculo diferencial.
Desglosando la primera ecuación, obtenemos u(t)—la salida del controlador (sin unidades) en el lado izquierdo de la ecuación—sumando tres elementos matemáticos en el lado derecho del signo igual: P, I y D. Cada elemento tiene delante un valor constante K (Kp, Ki y Kd), que representa el peso de cada término al formar u(t), es decir, la salida de control en un momento específico. Podemos ajustar individualmente cada valor K para mejorar el rendimiento del sistema, como explicaremos a continuación:
Proportional (P—Kp)
El primer y más importante término en esta ecuación es e(t). Por ello, el valor Kp que lo precede suele ser mayor que los otros valores K en la ecuación. Aquí, e(t) es simplemente el error instantáneo en un momento dado: el valor real del dispositivo controlado menos el valor deseado. Al multiplicarlo por Kp, se obtiene su contribución a la salida total del controlador.
Integral (I—KI)
El segundo término en esta ecuación tiene que ver con el error acumulado a lo largo del tiempo. Es la suma de todos los errores experimentados por el dispositivo:
Cada vez que un controlador calcula u(t), añade el error instantáneo a un total acumulado.
Este valor luego se multiplica por Ki y se añade a u(t).
Considera una situación en la que una fuerza mantiene un motor en su lugar y no le permite volver al setpoint en condiciones normales. A medida que permanece fuera de especificación durante más tiempo, el término I seguirá aumentando, hasta superar esa fuerza o alcanzar los límites de capacidad del motor.
Derivative (D—Kd)
El tercer término en esta ecuación tiene que ver con la rapidez con la que cambia el error:
Teóricamente, si solo tuvieras un término D en esta ecuación y tu proceso mantuviera de forma constante un valor incorrecto, este término permanecería en cero y no contribuiría a la salida correcta. Por otro lado, si uno de los otros dos términos intenta hacer que la salida del dispositivo vuelva a su valor correcto demasiado rápido, el término derivativo puede ayudar a amortiguar ese efecto.
Aunque la expresión basada en cálculo de este concepto puede ser útil, la realidad del control PID es mucho menos “mágica” de lo que parece al principio. En la práctica, calculamos la salida utilizando solo sumas, restas y multiplicaciones, teniendo en cuenta el error y el tiempo entre mediciones. De hecho, se utilizaron sistemas neumáticos para implementar las primeras formas de control PID, empleando medios mecánicos para introducir cada “término”.
- Los controladores toman una lectura instantánea del error.
- Restan de ella la lectura instantánea anterior.
- Multiplican ese valor resultante por Kd para calcular su contribución a u(t).
Tutorial del controlador PID de Arduino
En muchas situaciones, resulta conveniente conectar un controlador PID dedicado a tu proceso, pero también puedes crear el tuyo propio utilizando un Arduino u otra placa de desarrollo similar. Incluso puedes escribir tu propio algoritmo PID. En tu código, puedes expresar cada término de una manera similar a la siguiente:
- P:instanteneousError = setpoint – input;
- I:cumulativeError = += error * elapsedTime;
- D:rateOfError = (error – errorLastCalculation)/elapsedTime
Para obtener la salida necesaria, multiplica cada uno de estos términos por su respectivo valor K y súmalos. Por otro lado, si deseas evitar reinventar la rueda, puedes utilizar la librería PID de Brett Beuregard. Esta librería se encarga de los detalles por ti y te permite concentrarte en ajustar los valores constantes de P, I y D según sea necesario.
Para demostrar la teoría PID en acción, saqué un Arduino Nano Every de mi caja de herramientas, junto con:
- Placa controladora de motor
- Sensor infrarrojo
- Motor recuperado de un dron Hubsan H107C
Imprimí un soporte para la protoboard para el motor junto con un "ventilador" que bloquea la luz el 50% del tiempo para evitar perder pulsos mientras gira. El controlador del motor es la entrada al motor (que de otro modo estaría sin control), y la retroalimentación se basa en el tiempo entre pulsos.
Cuando finalmente resolví el código y obtuve las piezas impresas en 3D, pude controlar el motor de una manera más sofisticada que operando el botón de encendido con una salida PWM (modulación por ancho de pulsos) constante.
Partes notables del código incluyen el uso de una rutina de interrupción para registrar cada pulso mientras el dispositivo de bloqueo gira y calcular el tiempo entre pulsos usando millis(). Configuré el PID en la primera parte del código fuera de las funciones con:
PID myPID (&difference, &driverOut, &setPoint, Kp, Ki, Kd, DIRECT)
Kp, Ki y Kd están definidos antes de esta línea en el código, y &difference controla &driverOut, con &setPoint modificado por el monitor serial. Podemos manipular esta matemática para transformar esta diferencia de tiempo en RPM, pero los ajustes del PID funcionan como salidas DIRECTAS porque este controlador en particular se enciende cuando la entrada se lleva a bajo. A medida que la salida analógica aumenta (motores apagados), el retraso entre pulsos también aumenta.
Una versión anterior de la rutina PID. Nota CH1 lee los pulsos de entrada, mientras que CH2 es la salida calculada usando la rutina PID—los pulsos bajos son las entradas al motor.
Este sencillo ejemplo de controlador PID fue impulsado por las piezas disponibles (incluido el nuevo Arduino Nano Every) y un motor con el cual estaba ligeramente familiarizado. Pero pude demostrar cómo aplicar el control PID en una amplia variedad de situaciones, incluso sin todos los datos. Ya sea el control de motor, el control de temperatura de un horno o el equilibrio de un robot, un pequeño ajuste y configuración PID te ofrece infinitas opciones de experimentación.
Etiquetas de artículo