Saltar al contenido
Control Automático Educación

Controladores PID Discreto

En esta entrada estudiaremos como obtener la ecuación de un Control PID Discreto a partir de las ecuaciones continuas del controlador, veremos su representación en ecuaciones en diferencias y como este controlador es implementado en sistemas microcontrolados como Arduino, PIC, Matlab o Simulink.

Antes de comenzar, te hago la invitación para que veas nuestro curso sobre Control Realimentado, donde hemos tratado diferentes métodos y criterios para sintonizar controladores PID discretos y continuos.

Y que te suscribas al canal si te interesa la teoría del control, la programación y los microcontroladores:

Controlador PID

El controlador PID (Proporcional – Integral – Derivativo) es el controlador más popular a nivel industrial debido a su robustez y facilidad de entendimiento, por lo que es prácticamente usado en el 95% de los casos.

Existen diversas representaciones del controlador PID, dentro de ellas tenemos la representación del control Paralelo el cual viene dado por la siguiente ecuación matemática en el dominio del tiempo:

u(t)=k_ce(t)+\dfrac{k_c}{\tau_i}\int_0^te(t)dt+k_c\tau_d\dfrac{de(t)}{dt}

Y que puede ser representado en el dominio transformado de Laplace como:

C(s)=k_c\left(1+\dfrac{1}{\tau_is}+\tau_ds \right)

El diagrama de bloques de un controlador PID viene dado por:

PID ISA

La siguiente figura, nos muestra una analogía de como funciona el controlador PID el cual actua sobre la señal de entrada e(t) [Error del sistema], donde la Acción Proporcional es el presente, la acción integral el pasado y la acción derivativa el futuro.

Controladores PID discreto

A continuación vamos a describir como se obtienen los controladores discretos (P PI PD PID) a través de una discretización de un controlador PID continuo;

Aproximación discreta del modo P (Proporcional)

Este tipo de controlador genera una salida que es proporcional al error actuante.

La ecuación de un controlador Proporcional es:

u(t)=k_ce(t)+u_0

Su forma discreta:

u(k)=k_ce(k)+u_0

La salida del controlador en el instante k-1

u(k-1)=k_ce(k-1)+u_0

Restando las dos ecuaciones anteriores (un tiempo de muestreo)

u(k)-u(k-1)=k_c\left[e(k)-e(k-1)\right]

Aplicando la transformada Z

(1-z^{-1})U(z)=k_c(1-z^{-1})E(z)

función de transferencia de pulso del controlador proporcional es:

C(z)=\dfrac{U(z)}{E(z)}=q_0

donde:

k_c=q_0

Aproximación discreta del modo PI

En el controlador PI se adiciona el efecto de la acción integradora donde la señal de salida experimenta un salto inicial proporcional al error actuante y a continuación presenta una variación gradual a una velocidad proporcional al error.

La ecuación de un controlador PI es:

u(t)=k_ce(t)+\dfrac{k_c}{\tau_i}\int_0^te(t)dt

Para tiempos de muestreo pequeños, la ecuación anterior se puede llevar a una ecuación en diferencias por discretización, reemplazando la parte integral por una suma. La integración continua se puede aproximar utilizando integración rectangular o integración trapezoidal. Utilizando el método de integración trapezoidal [1]:

A=\left[ \dfrac{e(k)+e(k-1)}{2} \right]T_s

El área total bajo la curva del error es igual a la suma de las áreas de todos los trapecios en que se pueda subdividir dicha área

\int e(t)dt=\sum_{h=0}^k \left[ \dfrac{e(h)+e(h-1)}{2} \right]T_s

entonces a partir de la ecuación continua

u(t)=k_c\left[e(t)+\dfrac{1}{\tau_i}\int_0^te(t)dt\right]

llevándolo a la versión discreta:

u(k)=k_c\left[e(k)+\dfrac{T_s}{2\tau_i}\sum_{h=0}^k \left[ e(h)+e(h-1) \right]\right]

La salida del controlador en el instante k-1

u(k-1)=k_c\left[e(k-1)+\dfrac{T_s}{2\tau_i}\sum_{h=0}^k \left[ e(h-1)+e(h-2) \right]\right]

Restando las dos ecuaciones anteriores (un tiempo de muestreo)

u(k)-u(k-1)=k_c\left[e(k)-e(k-1)+\dfrac{T_s}{2\tau_i}\sum_{h=0}^k \left[ e(h)-e(h-2) \right]\right]

de la ecuación anterior, vamos inicialmente a analizar el término:

\sum_{h=0}^k \left[ e(h)-e(h-2) \right]

Para eso vamos a suponer que vamos a ir hasta la muestra k=4

\sum_{h=0}^{4} \left[ e(h)-e(h-2) \right]

Abriendo el sumatorio anterior y siempre considerando que todos los errores e(h) solo son válidos para instantes de tiempo h positivos.

[e(0)-e(-2)]+[e(1)-e(-1)]+[e(2)-e(0)]+[e(3)-e(1)]+[e(4)-e(2)]=e(4)+e(3)

por lo tanto:

\sum_{h=0}^{4} \left[ e(h)-e(h-2) \right]=e(4)+e(3)

Lo que muestra entonces que para un k cualquiera, puedo reescribir el sumatório inicial que estaba en términos de h a términos de k:

\sum_{h=0}^k \left[ e(h)-e(h-2) \right]=e(k)+e(k-1)

Volviendo a la ecuación del diseño del controlador PI discreto:

u(k)-u(k-1)=k_c\left[e(k)-e(k-1)+\dfrac{T_s}{2\tau_i}\left[ e(k)+e(k-1) \right]\right]
u(k)-u(k-1)=k_c\left[\left(1+\dfrac{T_s}{2\tau_i}\right)e(k)-\left( 1-\dfrac{T_s}{2\tau_i} \right)e(k-1)\right]

Esta última ecuación del controlador PI la Podemos reescribir como:

u(k)=u(k-1)+q_0e(k)+q_1e(k-1)

donde:

q_0=k_c\left[1+\dfrac{T_s}{2\tau_i}\right]
q_1=-k_c\left[1-\dfrac{T_s}{2\tau_i}\right]

la ecuación en el dominio transformado Z del controlador PI es:

C(z)=\dfrac{U(z)}{E(z)}=\dfrac{q_0+q_1z^{-1}}{1-z^{-1}}

Aproximación discreta del modo PID

La acción derivativa del controlador PID aporta la característica de anticipación dentro del sistema de control.

La ecuación de un controlador PID es:

u(t)=k_ce(t)+\dfrac{k_c}{\tau_i}\int_0^te(t)dt+k_c\tau_d\dfrac{de(t)}{dt}

Al aproximar el término integral mediante la sumatoria trapezoidal y el término derivativo mediante la diferencia de dos puntos, se obtiene:

u(k)=k_c\left[e(k)+\dfrac{T_s}{2\tau_i}\sum_{h=0}^k \left[ e(h)+e(h-1) \right] + \dfrac{\tau_d}{T_s} \left[ e(k)-e(k-1) \right]\right]

La salida del controlador en el instante k-1

u(k-1)=k_c\left[e(k-1)+\dfrac{T_s}{2\tau_i}\sum_{h=0}^k \left[ e(h-1)+e(h-2) \right] + \dfrac{\tau_d}{T_s} \left[ e(k-1)-e(k-2) \right]\right]
u(k)-u(k-1)=k_c\left[e(k)-e(k-1)+\dfrac{T_s}{2\tau_i}\sum_{h=0}^k \left[ e(h)-e(h-2) \right] + \dfrac{\tau_d}{T_s} \left[e(k)-2 e(k-1)+e(k-2) \right]\right]
u(k)-u(k-1)=k_c\left[e(k)-e(k-1)+\dfrac{T_s}{2\tau_i}\left[ e(k)+e(k-1) \right] + \dfrac{\tau_d}{T_s} \left[e(k)-2 e(k-1)+e(k-2) \right]\right]
u(k)-u(k-1)=k_c\left[\left(1+\dfrac{T_s}{2\tau_i}+\dfrac{\tau_d}{T_s}\right)e(k)-\left(1-\dfrac{T_s}{2\tau_i}+\dfrac{2\tau_d}{T_s}\right)e(k-1)+\dfrac{\tau_d}{T_s}e(k-2)\right]

Esta última ecuación del controlador PID la Podemos reescribir como:

u(k)=u(k-1)+q_0e(k)+q_1e(k-1)+q_2e(k-2)

donde:

q_0=k_c\left(1+\dfrac{T_s}{2\tau_i}+\dfrac{\tau_d}{T_s}\right)
q_1=-k_c\left(1-\dfrac{T_s}{2\tau_i}+\dfrac{2\tau_d}{T_s}\right)
q_2=\dfrac{k_c\tau_d}{T_s}

La ecuación del controlador PID discreto en la transformada Z es:

C(z)=\dfrac{U(z)}{E(z)}=\dfrac{q_0+q_1z^{-1}+q_2z^{-2}}{1-z^{-1}}

Controlador PID discreto en arduino o en cualquier microcontrolador

El diseño de un controlador PID discreto en dispositivos embebidos es muy sencillo de implementar, especialmente este que hemos tratado en la entrada, donde lo que haremos es representar el Control PID Discreto representado en sus ecuaciones en diferencias.

Sin embargo, tengo algunos cursos PREMIUM de más de 6 horas donde te explico como implementar todo tipo de sistemas de control en dispositivos embebidos como el Arduino o el microcontrolador PIC de Microchip.

  • Curso de Sistemas de Control en Dispositivos Microcontrolados en UDEMY (PIC y ARDUINO)
  • Certificado de Aprobación una vez finalices el Curso
  • DESCUENTO si accedes directamente con los siguientes botones de acceso.
  • NOTA: Si buscas el curso directamente en UDEMY o si lo adquieres en otra plataforma distintas a las mostradas anteriormente NO OBTENDRÁS NINGUN DESCUENTO sobre el valor final del Curso.

Accede a los cursos dando click a cualquiera de los dos botones de ARRIBA!! sin embargo también puedes darle un vistazo a nuestras entradas como:

En este sitio web también tenemos varias implementaciones y explicaciones del controlador PID digital:

A continuación vamos a ver un ejemplo de sintonización de un PID discreto con matlab & Simulink.

Controladores Discretos con Matlab

En matlab tenemos varias formas de realizar la implementación de controladores discretos, en este caso veremos como programar un controlador PID discreto, la más rápida e intuitiva es discretizando el controlador PID continuo, el cual puede ser calculado con técnicas clásicas como el Ziegler y Nichols.

O implementar directamente el controlador PID discreto que hemos visto en esta entrada

La discretización en matlab puede ser llevado a cabo con el comando c2d.

c2d Convierte el sistema dinámico de tiempo continuo en tiempo discreto.

SYSD = c2d (SYSC, TS, METHOD) 

Calcula un modelo de tiempo discreto SYSD con tiempo de muestreo Ts que se aproxima al modelo de tiempo continuo SYSC. El parámetro METHOD selecciona el método de discretización, por lo tanto el PID discreto con Matlab puede usar los siguientes métodos:

  • ‘zoh’ Retención de orden cero en las entradas
  • ‘foh’ Interpolación lineal de entradas
  • ‘impulse’ Discretización invariante del impulso
  • ‘tustin’ Aproximación Bilineal (Tustin).
  • ‘matched’ Método de emparejado de polos y ceros (solo para sistemas SISO).
  • ‘least-squares’ Minimización por mínimos cuadrados del error entre las respuestas frecuenciales (solo para sistemas SISO).
  • ‘damped’ Aproximación de Tustin amortiguada basada en la fórmula TRBDF2 (solo modelos dispersos).

El valor predeterminado es ‘zoh’ cuando se omite METHOD. El tiempo de muestreo Ts debe especificarse en las unidades de tiempo de SYSC. Cada uno de los métodos anteriores nos darán variantes del controlador PID discreto.

%% PID DISCRETO EN MATLAB
% Sergio Andres Castaño Giraldo
% https://controlautomaticoeducacion.com/


clc
clear 
close all

Ts=8; %Periodo de Muestreo
%Modelo del Proceso
k=1.175;tau=140;theta1=10;
theta = theta1 + Ts/2;

G=tf(k,[tau 1]);
G.iodelay = theta1;

%Discretización de la planta
Gd = c2d(G,Ts,'zoh');


%Control PID por Ziegler y Nichols
kp=(1.2*tau)/(k*theta);
ti=2*theta;
td=0.5*theta;
incontrolabilidad = theta / tau
C=tf(kp*[ti*td ti 1],[ti 0]); %Control PID Continuo
%Discretización del Control Continuo Bilineal
Cd=c2d(C,Ts,'tustin')
%Aprozimacion Trapezoidal
Cd2=kp+kp/ti*Ts/2*tf([1 1],[1 -1],Ts)+kp*td*1/Ts*tf([1 -1],[1 0],Ts)

%Tiempo de Simulación
nit = 30;
t=0:Ts:(nit-1)*Ts;
%Escalon
r = ones(1,length(t));

% Calculo do controle PID digital Trapezoidal
q0=kp*(1+Ts/(2*ti)+td/Ts);
q1=-kp*(1-Ts/(2*ti)+(2*td)/Ts);
q2=(kp*td)/Ts;
%Potencias negativas
% Cz = filt([q0 q1 q2],[1 -1], Ts);
%Potencias positivas
Cz = tf([q0 q1 q2],[1 -1 0], Ts)

% Lazo Cerrado
H = feedback(series(G,C),1);
H1 = feedback(series(Gd,Cz),1);
H2 = feedback(series(Gd,Cd),1);

%Respuesta al escalón
y1 = step(H1,t);
y2 = step(H2,t);


figure(1)
subplot(211)
plot(t,r,'--r',t,y1,'-k','linewidth',2),grid
xlabel('t(s)');
ylabel('T(C)');
title('PID Discreto Trapezoidal')
legend('Setpoint','Temperatura','location','southeast')
subplot(212)
plot(t,r,'--r',t,y2,'-k','linewidth',2),grid
xlabel('t(s)');
ylabel('T(C)');
title('PID Discreto Discretizado')
legend('Setpoint','Temperatura','location','southeast')

PID discreto en Simulink

Simulink también cuenta con el bloque directo del controlador PID discreto que puede ser encontrado en el blockset Simulink/Discrete. Donde se puede seleccionar el tipo de aproximación de la integral como Forward Euler, Backward Euler o Trapezoidal.

Puede ser implementado directamente con la planta en tiempo continuo o en tiempo discreto pues para simulink es indiferente.

Y el controlador PID Digital también puede ser implementado como una función de transferencia discreta (DiscreteTransfer Fcn) o un filtro (Discrete Filter)

La configuración del PID discreto en Simulink se muestra a continuación:

El siguiente esquema en simulink funciona después de haber ejecutado el Script de Matlab mostrado anteriormente.

📚 Bibliografía:

  1. Control Digital, Teoría y Práctica 2Ed – Luis Eduardo García Jaimes, Medellín 2009
  2. Ogata, Katsuhiko. Sistemas de control tiempo discreto. Prentice Hall, 1996 D. F. México, 2a Edición

Eso es todo por la entrada del dia de hoy, espero les haya gustado y hayan aprendido algo nuevo. Si te ha servido el contenido de esta entrada, de los videos y los códigos de implementación y deseas apoyar mi trabajo invitandome a un café super barato, puedes hacerlo en el siguiente link:

👉 Invitar a Sergio a un Café ☕️

Que esten muy bien, nos vemos en la siguiente entrada.

Entradas relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Comentarios (8)

Buenas, excelente material.
Me parece que hay algo extraño al declarar los valores de q0, q1 en las deducciones de los controladores discretos, posiblemente sea solo idea mía.
Igual muchas gracias por compartir este conocimiento.
Saludos

Responder

Hola Emmanuel, gracias por la observación, realmente estaba haciendo falta colocar el coeficiente q1 en el PI y PID, pero ya lo corregí. Saludos!

Responder

Buenas, muy buen contenido, pero no entiendo de donde sale el termino z elevado a la menos 2 en el simulink

Responder

Sale de discretizar la planta con un retenedor de orden cero (ZOH), ese termino es generado por el retardo de la planta que está en dominio continuo y el periodo de muestreo seleccionado, en otras palabras el z^{-2} es el retardo en tiempo discreto. Saludos.

Responder

Pero como concluyes que el exponente en discreto es 2?, porque parece que la planta de tu ejemplo es 10s de retardo

Responder

Si es 10segundos y el periodo de muestreo es de 8, en 2 periodos (16s) se hace la aproximación discreta del retardo.

Responder

Creo que entendí, yo tengo un sistema de retardo 100s, y coloque un muestreo de 10s, quiere decir que mi aproximación es de 10 periodos. Muchas gracias. Había escrito antes pero como que no le di a enviar.

Correcto Abelardo. Saludos!