You are on page 1of 4

% CONTROL MANUAL Y AUTOMTICO DE PNDULO INVERTIDO % % Este script ejecuta la simulacin de un pndulo que puede ser controlado manualmente

(accionando % una barra deslizante o "slider") o de forma automtica, mediante lazos de control PID. El control % automtico incorpora un doble lazo incluyendo un lazo con control del ngulo del pndulo (para que se site en % posicin vertical) y otro lazo ms lento para hacer que la posicin de la base se site en un punto dado % en el estado de equilibrio. % % El script puede ser utilizado tanto como un "equipo de prcticas", en el que pueden % estudiarse diversos conceptos de control, as como servir de base para que el profesor (o el % alumno) elaboren otros ejemplos interactivos totalmente distintos mediante el procedimiento % de "cortar y pegar". % % % Fecha: 2006-11-02 % Autor: Ignacio Daz % Area de Ingeniera de Sistemas y Automtica % Universidad de Oviedo

clear; close all; clc; disp('Instrucciones:'); disp('- Pulsar ''0'' para desactivar el sistema de control'); disp('- Pulsar otra tecla para restaurar el sistema de control'); disp(' '); disp('Control manual: actuar sobre la barra deslizante para modificar la base del pndulo.'); pause(2);

% l m J B g

PARMETROS DEL PNDULO = 2; % Longitud del pndulo = 1; % Masa del pndulo = m*l^2; % Momento de inercia referido al eje = 1; % Coeficiente de friccin = 10; % Aceleracin de la gravedad

% ESTADO INICIAL DEL PNDULO x = [pi-0.1;0]; % Para que se vea el efecto del control, empezamos % con el pndulo casi vertical (theta = pi +/"algo")

% DEFINICIN DE UN "SLIDER" PARA CONTROLAR MANUALMENTE EL PNDULO f = figure(1); set(f,'pos',[200,200,700 700]); h = uicontrol('style','slider','pos',[20 20 680 20],'min',-4,'max',4);

Tm = 0.01;

% Perodo de muestreo

e0 = zeros(2,1); ep0 = zeros(2,1); x0 = [0;0]; a0 = [0;0]; xmin = -2; xmax = +2; y = x(1);

% Condiciones iniciales del control de ngulo % Condiciones iniciales del control de posicin % Condiciones iniciales del pndulo

% PARMETROS DEL CONTROL PID DEL NGULO Kp = 10; Ki = 100; Kd = .1; s = tf('s'); Cth = c2d(Kp + Ki/s + Kd*s/(0.01*s+1),Tm,'tustin');

% PARMETROS DEL CONTROL PID DE LA POSICIN DE LA BASE Cpos = c2d(.04 + 0.0001/s + s*0.0001/(0.01*s+1),Tm,'tustin');

pos = 0; % Valor inicial de la posicin de la base del pndulo k = 2; % Empezamos en k=2 para tener acceso al menos a dos muestras anteriores while 1, k = k + 1; % BUFFER CON LA POSICIN (X(3) TIENE LA POSICIN ACTUAL) % X(k) = get(h,'Value');

e(k) = pi-y; % RESTRINGIMOS EL VALOR DEL ERROR AL INTERVALO [-pi,pi] e(k) = mod(e(k)+pi,2*pi)-pi;

% CONTROL DE LA POSICIN DE LA BASE DEL PNDULO ep = 0-pos; [dpos,ep0] = filter(Cpos.num{1},Cpos.den{1},ep,ep0); e(k) = e(k) - dpos;

% SELECCIN DE CONTROL MANUAL / CONTROL AUTOMTICO tecla = get(f,'currentchar'); switch tecla case '0' pos = get(h,'value'); otherwise [pos,e0] = filter(Cth.num{1},Cth.den{1},e(k),e0); end

% Suavizado de la aceleracin (muy conveniente, porque el movimiento del % objeto "slider" con un ratn se produce a saltos, dando lugar a segundas % derivadas muy elevadas) [X(k),x0] = filter(.01,poly([.9 .9]),pos,x0); [a,a0] = filter((1/Tm^2)*[1 -2 1],[1 0 0],X(k),a0); A(k) = a;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % ECUACIONES EN ESPACIO DE ESTADOS (NO LINEALES) DEL PNDULO u = -a; % Asignamos la entrada % Ecuacin de x(1) = x(1) + x(2) = x(2) + % Ecuacin de y = x(1); estados Tm*x(2); Tm*(1/J*(-B*x(2)-m*g*l*sin(x(1))+m*u*l*cos(x(1)))); salida

th = y;

% Asignamos la salida

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% REPRESENTACIN GRFICA DE LA SIMULACIN figure(1); plot(X(k),0,'.'); hold on; p1 = X(k); p2 = X(k)+l*exp(j*(th-pi/2)); line(real([p1,p2]),imag([p1,p2])); plot(real(p2),imag(p2),'.','markersize',40); hold off; % Sugerencia: pueden dibujarse tambin otras flechas indicando en tiempo real las fuerzas reales % o de inercia que actan en cada elemento del sistema % Centrado automtico de la perspectiva sobre el objeto de control if X(k)>xmax-1 xmin = xmin + 0.1; xmax = xmax + 0.1; elseif X(k)<xmin+1 xmin = xmin - 0.1; xmax = xmax - 0.1; end grid on; axis([xmin-3 xmax+3 -5 5]); % Refresco de la imagen drawnow; end

You might also like