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.

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]
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_0=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_0=k_c\left(1+\dfrac{T_s}{2\tau_i}+\dfrac{\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}}

PID discreto 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!!

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

Controlador PID discreto Matlab

En matlab tenemos varias formas de realizar la implementación del 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 entre los siguientes:

  • ‘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.

%% 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)

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.