%% Control PID con dos actuadores de diferente ancho de banda: control en cascada con actuador extra
% © 2019, Antonio Sala Piqueras, Universitat Politècnica de València. Todos los derechos reservados.
% Presentación en vídeo en: http://personales.upv.es/asala/YT/V/dacta.html y http://personales.upv.es/asala/YT/V/dactcasc.html .
% Este código funcionó sin errores en Matlab R2018b
% Objetivo: comprender  las condiciones de uso y el comportamiento en simulación de una estructura de control en cascada con dos actuadores y una variable controlada (un sensor).
% Table of Contents
% 1.- Modelado y análisis controlabilidad entrada-salida
% 2.- Control PID en cascada con actuador extra
%     Simulación temporal ante varios escalones y rampa
%
%% 1.- Modelado y análisis controlabilidad entrada-salida
% Proceso con actuador 1 rápido pero de poca ganancia, actuador 2 de alta ganancia, pero de menor ancho de banda.

s=tf('s'); G=[1.5/(0.1*s+1)  6/(0.8*s+1)^2]; 

% Análisis preliminar de controlabilidad entrada-salida:

sigma(G,tf(1),tf(3)), grid on, axis([.04 100 -35 20]), legend('G','1','3')

% Con referencias de amplitud 1 (si la planta estuviera escalada a \pm 1 en entradas y salidas y se deseara evitar la saturación --formalmente en régimen permanente senoidal--):

anchobanda_lim_ref1=11;
semiperiodo_lim_act1=pi/anchobanda_lim_ref1

% Con referencia amplitud 3, entradas amplitud 1: ancho de banda alrdedor de 1.4 radianes.

semiperiodo_lim_ref3=pi/1.4

% Nota: controladores saturando un tiempo significativo del transitorio podrían ser más rápidos (no objetivo de este material).
%
%% 2.- Control PID en cascada con actuador extra
%
% Objetivos:
% (a) seguir refs de amplitud 3 lentas, suaves, sin saturar
% (b) de amplitud 1 rápidas, sin saturar
% (c) devolver al actuador 1 en régimen permanente a su punto de funcionamiento nominal (0 en incrementales).

Krapido=(1+11/s)*1/(0.01*s+1); %u1=Krapido(s)*(ref-salida)
Klento=.3+0.1/s; %u2=Klento(s)*(u1-0)

K=minreal([1;Klento]*Krapido);
BC=minreal(feedback(G*K,1));
sigma(1-BC,logspace(-1,2)), grid on
step(BC,3), grid on, axis([0 3 0 1.04])
BCu=minreal(feedback(K,G));
step(BCu,10), grid on, title('Control')

%% Simulación temporal ante varios escalones y rampa

Ts=0.04;
refprueba=[ones(100,1); 2*ones(100,1); 3*ones(300,1)];
tiempo=(0:(length(refprueba)-1)) * Ts;
lsim(BC,refprueba,tiempo), grid on
lsim(BCu,refprueba,tiempo), grid on
refprueba=min(1.15*tiempo,3);
tiempo_subida_ref=3/1.15
lsim(BC,refprueba,tiempo), grid on
lsim(BCu,refprueba,tiempo), grid on