Está en la página 1de 15

Fase 3: Implementación Controlador.

A partir del diseño del controlador PID de la fase 2 y el cálculo de las constantes Kp, Ti y Td,
realizar la implementación del controlador en un microcontrolador y analizar su comportamiento
ante diferentes perturbaciones.

Se sugiere el montaje de la figura 1 para la implementación del controlador

Figura 1. Implementación del controlador.


Nota: Ajustar fuentes de voltaje según lo indicado en la guía

La simulación se debe desarrollar en Proteus utilizando el modelo Heated Oven (LumpedModel)


con la siguiente configuración en parámetros:

 Temperature Ambient (°C)= 27


 Thermal Resistence to Ambient (°C/W)= 0.5
 Oven Time Constant (sec)= 10
 Heater Time Constant (sec)= 1
 Temperature coefficient (V/°C)= 1
 Heating Power (W)= 150

Para el análisis de la curva de reacción, se analizará la respuesta del sistema en lazo abierto ante
una entrada escalón, dicha entrada escalón es de 0v a 10v.
Se debe definir el modelo del sistema y analizar su comportamiento ante perturbaciones de tipo
escalón, teniendo en cuenta que la temperatura límite o set point es de 130°C.

Para ingresar las perturbaciones al sistema se debe hacer lo siguiente:

En el instante de tiempo t=0s se utiliza una de alimentación BAT1 de 30V, para el instante de
tiempo t=50s se conmuta otra fuente de alimentación BAT 2 de 15V y para el instante de tiempo
t=120s se conmuta nuevamente a la fuente de alimentación BAT1 de 30V.

Solución.

Diseño e implementación de Controladores PID Discretos.

Tenemos la ecuación característica:


K e− Ls
Gs =
τs+1

Tenemos la función de transferencia a trabajar:

81.6 e−4.05 s
Gs =
9.25 s+1
Dónde:
K=81.6
L=4.05
τ =9.25

según la tabla establecida por Ziegler y Nichols, tenemos que:


Los valores de Kp, Ti y Td para un controlador PID son:

K P=1.2 ( KLT )
9.25
K P=1.2 ( 81.6∗4.05 )=0.0335
τ i =2 L

τ i =2∗( 4.05 )=8.1

τ d=0.5 L

τ d=0.5 ( 4.05 )=2.025

τ0
Teniendo en cuenta que el periodo de muestreo debe obedecer el criterio: T =¿ =0.25
4
Se elige un número menor a 0.25 para lo cual elijo el número:T =0.1

Con los con estos datos, se procede a encontrar los parámetros del controlador:
a=K p=0.0335

K p T ( 0.0335 )( 0.1 )
b= = =0.0004135
τi 8.1
K p τ d ( 0.0335 )( 2.025 )
c= = =0.6783
T 0 ,1
#INCLUDE <16F877A.H>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOWDT
VOID MAIN(){
INT16 valor, control; //Variables para lectura de ADC y señal de Control a módulo CCP
FLOAT a,b,c; //Constantes para parámetros de controlador PID
FLOAT TEMPERATURA_LIMITE; //Referencia de Temperatura
FLOAT rt,eT,iT,dT,yT,uT,iT0,eT0; //Variables de controlador PID
FLOAT max,min; //Variables para anti-windup
min=0.0;
max=1000.0;
iT0=0.0;
eT0=0.0;
a=0.0335;
b=0.0004135;
c=0.678;
TEMPERATURA_LIMITE=1300.0; //Set Point r(kT)= 130°C
setup_timer_2(t2_div_by_4,249,1); //Configuracion de Timer 2 para establecer frec. PWM a
1kHz
setup_ccp1(ccp_pwm); //Configurar módulo CCP1 en modo PWM
setup_adc_ports(all_analog); //Configurar ADC
setup_adc(adc_clock_internal);
set_adc_channel(0); //Seleccionar Canal 0 para sensor de Temperatura
while(true){
valor=read_adc(); //Leer ADC
yT=5000.0*valor/1024.0; //Escalizar señal de salida y(kT)
rT=TEMPERATURA_LIMITE;
eT=rT-yT; //Calcular señal de error e(kT)
iT=b*eT+iT0; //Calcular termino integrativo i(kT)
dT=c*(eT-eT0); //Calcular termino derivativo d(kT)
uT=iT+a*eT+dT; //Calcular señal de control u(kT)
if (uT>max){ //Anti-windup
uT=max;
}
else {
if (uT<min){
uT=min;
}
}
control=uT;
set_pwm1_duty(control); //Transferencia de señal de control al actuador
iT0=iT;
eT0=eT;
delay_ms(100); //Periodo de muestreo T=0.1s
}
}
Figura 1: resultado PID inicial
En vista que el PID implementado no da una respuesta adecuada al sistema ya que su tiempo de
respuesta es muy lento, es necesario realizar algunos en las fórmulas para mejorar dicha
respuesta.
Se replantea nuevamente el sistema con un tiempo de muestreo diferente al inicial
Los valores de Kp, Ti y Td para un controlador PID son:

K P=1.2 ( KLT )
9.25
K P=1.2 ( 81.6∗1 )=0.136
τ i =2 L

τ i =2∗( 1 ) =2

τ d=0.5 L

τ d=0.5 ( 1 ) =0.5

τ0
Teniendo en cuenta que el periodo de muestreo debe obedecer el criterio: T =¿ =0.25
4
Se elige un número menor a 0.25 para lo cual elijo el número:T =0.1

Con los con estos datos, se procede a encontrar los parámetros del controlador:
a=K p=0.136

K p T ( 0.136 )( 0.1 )
b= = =0.0068
τi 2
K p τ d ( 0.136 )( 0.5 )
c= = =0.68
T 0 ,1

#INCLUDE <16F877A.H>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOWDT
VOID MAIN(){
INT16 valor, control; //Variables para lectura de ADC y señal de Control a módulo CCP
FLOAT a,b,c; //Constantes para parámetros de controlador PID
FLOAT TEMPERATURA_LIMITE; //Referencia de Temperatura
FLOAT rt,eT,iT,dT,yT,uT,iT0,eT0; //Variables de controlador PID
FLOAT max,min; //Variables para anti-windup
min=0.0;
max=1000.0;
iT0=0.0;
eT0=0.0;
a=0.136;
b=0.0068;
c=0.68;
TEMPERATURA_LIMITE=1300.0; //Set Point r(kT)= 130°C
setup_timer_2(t2_div_by_4,249,1); //Configuracion de Timer 2 para establecer frec. PWM a
1kHz
setup_ccp1(ccp_pwm); //Configurar módulo CCP1 en modo PWM
setup_adc_ports(all_analog); //Configurar ADC
setup_adc(adc_clock_internal);
set_adc_channel(0); //Seleccionar Canal 0 para sensor de Temperatura
while(true){
valor=read_adc(); //Leer ADC
yT=5000.0*valor/1024.0; //Escalizar señal de salida y(kT)
rT=TEMPERATURA_LIMITE;
eT=rT-yT; //Calcular señal de error e(kT)
iT=b*eT+iT0; //Calcular termino integrativo i(kT)
dT=c*(eT-eT0); //Calcular termino derivativo d(kT)
uT=iT+a*eT+dT; //Calcular señal de control u(kT)
if (uT>max){ //Anti-windup
uT=max;
}
else {
if (uT<min){
uT=min;
}
}
control=uT;
set_pwm1_duty(control); //Transferencia de señal de control al actuador
iT0=iT;
eT0=eT;
delay_ms(100); //Periodo de muestreo T=0.1s
}
}
Figura 2.1; código final en ccompiler

Figura 2.2; código 2 en ccompiler


Figura 3; Implementación del circuito en Proteus

Figura 4; Grafica resultante del sistema PID 2


Como se observa en la figura 4, la respuesta al sistema mejoro notablemente con respecto a la
figura 1, pero aun así se observa un sobreimpulso muy alto, lo cual puede resultar perjudicial para
nuestro sistema, por tal motivo es necesario aumentar un poco el valor de Kp para aumentar la
velocidad de respuesta y disminuir el error del sistema, y de este modo poder encontrar un punto
de equilibrio donde se logre rapidez con estabilidad del sistema.
Según lo anterior, se efectúan los cálculos nuevamente.

K P=1.2 ( KLT )
9.25
K P=1.2 ( 81.6∗1 )=0.136
Ya que se necesita aumentarla velocidad de respuesta, multiplicamos el resultado de Kp *2
K P=0.136∗2

K P 2=0.272

τ i =2 L

τ i =2∗( 4.05 )=8.1

τ d=0.5 L

τ d=0.5 ( 1 ) =0.5

τ0
Teniendo en cuenta que el periodo de muestreo debe obedecer el criterio: T =¿ =0.25
4
Se elige un número menor a 0.25 para lo cual elijo el número:T =0.1

Con los con estos datos, se procede a encontrar los parámetros del controlador:
a=K p 2=0.272

K p 2 T ( 0.272 ) ( 0.1 )
b= = =0.00335
τi 8.1

K p τ d ( 0.136 )( 0.5 )
c= = =0.68
T 0 ,1
Debido a que aumentar la constante derivativa disminuye la velocidad del sistema, y en vista de
que lo que se pretende es lo opuesto, el valor de c lo calculamos con la Kp anterior (0.136).

#INCLUDE <16F877A.H>
#DEVICE ADC=10
#USE DELAY(CLOCK=4000000)
#FUSES XT,NOWDT
VOID MAIN(){
INT16 valor, control; //Variables para lectura de ADC y señal de Control a módulo CCP
FLOAT a,b,c; //Constantes para parámetros de controlador PID
FLOAT TEMPERATURA_LIMITE; //Referencia de Temperatura
FLOAT rt,eT,iT,dT,yT,uT,iT0,eT0; //Variables de controlador PID
FLOAT max,min; //Variables para anti-windup
min=0.0;
max=1000.0;
iT0=0.0;
eT0=0.0;
a=0.272;
b=0.00335;
c=0.68;
TEMPERATURA_LIMITE=1300.0; //Set Point r(kT)= 130°C
setup_timer_2(t2_div_by_4,249,1); //Configuracion de Timer 2 para establecer frec. PWM a
1kHz
setup_ccp1(ccp_pwm); //Configurar módulo CCP1 en modo PWM
setup_adc_ports(all_analog); //Configurar ADC
setup_adc(adc_clock_internal);
set_adc_channel(0); //Seleccionar Canal 0 para sensor de Temperatura
while(true){
valor=read_adc(); //Leer ADC
yT=5000.0*valor/1024.0; //Escalizar señal de salida y(kT)
rT=TEMPERATURA_LIMITE;
eT=rT-yT; //Calcular señal de error e(kT)
iT=b*eT+iT0; //Calcular termino integrativo i(kT)
dT=c*(eT-eT0); //Calcular termino derivativo d(kT)
uT=iT+a*eT+dT; //Calcular señal de control u(kT)
if (uT>max){ //Anti-windup
uT=max;
}
else {
if (uT<min){
uT=min;
}
}
control=uT;
set_pwm1_duty(control); //Transferencia de señal de control al actuador
iT0=iT;
eT0=eT;
delay_ms(100); //Periodo de muestreo T=0.1s
}
}
Figura 5. Código final en Ccompiler

Figura 6. Resultado final.

Como se observa en la figura 6, los sobreimpulsos tan altos que presentaba el sistema inicial ya
no se presentan, y las perturbaciones que se generan en el sistema son rápidamente controladas
por el PID implementado, evitando que el error sea muy elevado, y de este modo el controlador
evita sobreimpulsos muy elevados que puedan dañar el sistema al que se le aplique.

También podría gustarte