clear all; %cancella tutte le variabili nel workspace di MATLAB close all; %chiude tutti grafici aperti da MATLAB %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % parametri fisici del problema %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% m1 = 1.2; % massa pendolo 1 [kg] m2 = 0.3; % massa pendolo 2 [kg] l1 = 1.3; % lunghezza asta pendolo 1 [m] l2 = 0.5; % lunghezza asta pendolo 1 [m] b = 4; % attrito viscoso [N.m/(rad/s)] g = 9.8; % costante gravitazionale [m/s^2] k = 7; % costante molla torsionale [N.m/rad] J1 = m1*l1^2; % momento inerzia pendolo 1 [kg.m^2] J2 = m2*l2^2; % momento inerzia pendolo 2 [kg.m^2] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % punti di lavoro per posizione verticale dei pendoli %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% theta1_0 = pi; theta2_0 = pi; u0 = 0; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % funzioni di trasferimento sistema linearizzato %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % primo metodo di calcolo delle funzioni di trasferimento % T1 = tf([J1 b k-m1*l1*g],[1]); % T2 = tf([J2 b k-m2*l2*g],[1]); % T3 = tf([-b^2 -2*k*b -k^2],[1]); % T4 = tf([b k],[1]); % % P1_b = minreal(T2/(T1*T2 + T3)); % funzione di trasferimento. INPUT=u OUTPUT=theta1 % P2_b = minreal(T4/(T1*T2 + T3)); % funzione di trasferimento. INPUT=u OUTPUT=theta2 % secondo metodo di calcolo delle funzioni di trasferimento num1 = [J2 b k-l2*m2*g]; den1 = [J1*J2 b*(J1+J2) k*(J1+J2)-g*(m1*l1*J2+m2*l2*J1) -b*g*(m1*l1+m2*l2) m1*m2*l1*l2*g^2-k*g*(m1*l1+m2*l2)]; num2 = [b k]; den2 = den1; P1 = minreal(tf(num1,den1)); P2 = minreal(tf(num2,den2)); [theta_12,t12]=step(P2,2); % risposta a gradino unitario in catena aperta da t=0 a t=2 figure(1); plot(t12,theta_12*180/pi+180,'k'); % grafico colore nero in gradi xlabel('tempo t [sec]'); ylabel('\theta_2 [gradi]'); title('Risposta a ingresso u a gradino unitario'); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % progettazione compensatori %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% numC1 = [25 50]; % controllo PD denC1 = [0.001 1]; % aggiungo un polo molto negativo per rendere la funzione di trasferimento C1 propria C1 = minreal(tf(numC1,denC1)); Pc1 = minreal(feedback(1,P1*C1)); [theta_1,t1]=impulse(Pc1); % verifica al disturbo di tipo impulsivo theta_1=theta_1*180/pi; %conversione radianti --> gradi figure(2); plot(t1,theta_1,'b'); % grafico colore blue. xlabel('tempo t [sec]'); ylabel('\theta_1 [gradi]'); title('Risposta a disturbo impulsivo unitario'); hold on; % mantiene tutti i grafici nella figura Pc12 = minreal(P2*Pc1); % sistema a catena chiusa dopo inserimento controllore C1 [theta_2c,t2c]=step(Pc12,5); % verifica al disturbo di tipo impulsivo theta_2c=theta_2c*180/pi; %conversione radianti --> gradi figure(3); plot(t2c,180+theta_2c,'b'); % grafico colore blue. xlabel('tempo t [sec]'); ylabel('\theta_2 [gradi]'); title('Risposta a disturbo a gradino unitario dopo inserimento C_1'); numC2 = 108*[1 1]; % controllo PI denC2= [1 0]; C2 = tf(numC2,denC2); Pc=minreal(feedback(Pc12*C2,1)); %sistema a catena chiusa dopo inserimento controllore C2 [theta_2,t2]=step(Pc); figure(4); theta_2=10*theta_2*(pi/180); %risposta a gradino di 10 gradi, utilizzando la proprieta' di linearita' plot(t2,theta_2*180/pi,'r'); %grafico colore rosso xlabel('tempo t [sec]'); ylabel('\theta_2 [gradi]'); title('Risposta a riferimento a gradino unitario'); d0 = 10; %disturbo in ingresso in Nm d1 = 10; %ampiezza della sinusoide di disturbo r = 10; %riferimento desiderato theta2 in gradi