You are on page 1of 29

DISEO E IMPLEMENTACIN DE UN SISTEMA DE CONTROL DIGITAL DE POSICIN PARA UN MOTOR DC

PRESENTADO POR: EDWIN ALONSO GONZALEZ QUERUBIN MORGAN GARAVITO VASQUEZ - mor6an1@hotmail.com ING. MECATRONICA

UNIVERSIDAD SANTO TOMAS BUCARAMANGA 2006

OBJETIVO GENERAL

Disear e implementar un sistema de control digital de posicin para un motor DC, utilizando el microcontrolador PIC16F877A.

OBJETIVOS ESPECFICOS

Reconocimiento y Anlisis del sistema. Establecer el modelo matemtico del sistema. Simular el sistema modelado diseando el controlador digital para una respuesta especfica (escoger overshoot y tiempo de asentamiento).

Implementacin del sistema.

DESCRIPCION

Uno para

de

los

objetivos el

para de

el

proyecto

que

se

quiere de la

realizar es que

lograr posicionar con precisin el motor D.C, error estado estacionario

as,

posicin del motor sea cero; adems se desea que el error de estado estacionario debido a una perturbacin tambin sea nulo. Otro requerimiento es que el motor alcance muy rpidamente su posicin final. En este caso, se desea disminuir el tiempo de establecimiento para que sea mnimo y sobrepaso considerable. Para lograr esto, dispondremos de un microcontrolador PIC que incorpora todas las funciones necesarias para realizar el diseo y control. La eficiencia del sistema va ligada a los parmetros de la planta, debido a que nuestro sistema es retroalimentado, es necesario disear un controlador digital de tal forma que el sistema se estabilice en la posicin deseada y en el menor tiempo posible. La retroalimentacin se har por medio al de un encoder tenga un

incremental acoplado al eje del motor, el cual enviar constantemente cdigos digitales microcontrolador indicndole su posicin. Ante estos cdigos el microcontrolador tomar una desicin relacionando la posicin actual con el Set Point o valor

deseado, enviando pulsos digitales a un integrado (L293B) para hacer girar el motor en el sentido indicado.

MODELO MATEMATICO DE LA PLANTA

Considerando que nuestro motor tiene un eje rgido, por medio de sus ecuaciones elctricas y mecnicas, al relacionarlas, podemos obtener el modelo del motor en el cul la entrada es el voltaje aplicado y la salida es la velocidad compuesto:

rotacional

del

eje,

para

esto

es

necesario

conocer los diferentes parmetros de los que se encuentra

momento de inercia del rotor J. coeficiente de amortiguamiento del sistema mecnico (b). constante de fuerza electromotriz K=Ke=Kt. resistencia elctrica (R). inductancia elctrica (L). entrada (V): Fuente de Tensin. salida (W): velocidad rotacional del eje.

Las ecuaciones elctricas: -V+RI+LdI+e=0 Dt Ecuaciones mecnicas: Jdw dt Relacionando ambas ecuaciones y expresndolas en el dominio s: Como e=Kw -V+RI(s)+SLI(s)+Kw(s)=0 JSw(s)+bw(s)=KI(s) Obtenemos la funcin de transferencia de la velocidad del rotor respecto al voltaje aplicado: W V = ___________K____________ (JS+b)(LS+R) + K^2 + bw=KI

Como nos interesa es la relacin del ngulo que se desplaza el rotor con respecto al voltaje aplicado integramos a ambos lados de la ecuacin multiplicando por 1/s:

/ V = K /( S * (( J * S + b ) * ( LS + R ) + K
Obtenido el modelo matemtico del motor nuestro controlador PID, pero para

))

podemos disear es necesario

esto

conocer el valor de los parmetros J, K, b, R, L del sistema los cuales desconocemos.

La

solucin

que

proponemos

para

la

obtencin

de

los

parmetros del sistema, consiste en acoplar dos motores con similares caractersticas.

los ejes de Uno actuara

como motor y el otro como generador. Esto se realizara con el fin de obtener por medio de una tarjeta de adquisicin de datos (DAQ) y Matlab, dos seales que seran el voltaje aplicado al motor uno y el voltaje generado por el motor dos, y por medio de la toolbox de Matlab ident relacionar estas dos seales para obtener un modelo aproximado al del motor. Adquisicin de las seales de entrada y salida Para la adquisicin se uso de los el voltajes criterio de de excitacin estabilidad Tambin y de se

generado, el

segn con

Nyquist, una frecuencia de muestreo de 2000Hz debido a que sistema trabaja frecuencias bajas. defini un tiempo de adquisicin de 10 segundos suficientes para poder observar el comportamiento del sistema. Durante el tiempo de adquisicin voltaje de entrada o de excitacin del motor se varo de forma aleatoria en un rango entre 0V y 10V. presentaban alteracin Debido a que los datos adquiridos por ruido con una frecuencia con

aproximadamente de 30Hz, se implement un filtro Butter pasa bajos de orden 10 y frecuencia de corte de 60Hz seales originales. el fin de eliminar este ruido y as poder apreciar las

Seal de salida con ruido

Seal de salida filtrada

A continuacin se puede observar el algoritmo empleado para la adquisicin de datos por Matlab:
clc clear close all ai=analoginput('nidaq',1); % Canal 1 voltaje de excitacin % Canal 2 voltaje generado chans=addchannel(ai,1:2); % Frecuencia de muestreo fs=2000; set(ai,'SampleRate',fs); % Tiempo que dura la adquisicin duration=10; set(ai,'SamplesPerTrigger',fs*duration); % Rango de entrada adquisicin 0-10V set(chans,'InputRange',[0 10]); disp('Pulse ENTER para dar inicio de adquisicin') pause % Inicio adquisicin start(ai) [d1,t1]=getdata(ai); u=d1(:,1); y=d1(:,2); % Grfica de accin de control figure(1) plot(t1,u) xlabel('Tiempo(seg)'); title('voltaje de excitacin'); grid %Grfica del voltaje generado figure(2) plot(t1,y) xlabel('Tiempo(seg)'); title('voltaje generado'); grid

%filtro pasabajos [B,A]=butter(10,0.03,'low'); %filtramos seal de entada H1=filter(B,A,u); figure(3) plot(H1) grid %filtramos seal de salida H2=filter(B,A,y); figure(4) plot(H2) grid

Durante el proceso de adquisicin, se tomaron cinco muestras de entrada y salida del sistema con el fin de implementarlas en la IDENT, obtener diferentes modelos y as validarlos para obtener un modelo aproximado al real.

Entrada 1

Salida 1

Entrada 2

Salida 2

Entrada 3

Salida 3

Entrada 4

Salida 4

Entrada 5

Salida 5

Obtencin y validacin de los modelos mediante la IDENT: Importamos las seales de entrada y salida filtradas en la opcin import data, ponemos sus nombres en los edits input y output, as como el tiempo de muestreo que se empleo para la adquisicin (1/2000).

En la opcin estimate seleccionamos process model el cual hallar un modelo aproximado de la planta. En nuestro caso tomamos un sistema con 2 polos reales Tp1, Tp2 y una ganancia K, este sera un sistema de segundo orden. Luego de definir el tipo de sistema, seleccionamos la opcin estimate que hallar el modelo aproximado de ste.

Despus se obtiene el valor de la ganancia y de los polos de forma que el sistema sea similar al real. Para poder validar el sistema, se obtuvieron los cinco modelos de las diferentes seales adquiridas y se compararon las salidas de los modelos con cada una de las salidas reales adquiridas para observar el porcentaje de exactitud de cada salida de los diferentes modelos con la salida real.

Validacin con la primera seal de salida adquirida

Validacin con la segunda

seal de salida adquirida

Validacin con la tercera seal de salida adquirida

Validacin con la cuarta seal de salida adquirida

Validacin con la Quinta seal de salida adquirida

En la siguiente tabla se puede observar el porcentaje de exactitud de la salida de cada modelo respecto a cada salida real, adems resaltamos los porcentajes ms satisfactorios.
SALIDA MODELO 1 SALIDA REAL 1 SALIDA REAL 2 SALIDA REAL 3 SALIDA REAL 4 SALIDA REAL 5 94.68% 88.45% 85.55% 78.49% 82.54% SALIDA MODELO 2 92.37% 91.78% 90.72% 87.62% 90.99% SALIDA MODELO 3 91.93% 91.66% 90.78% 88.05% 91.16% SALIDA MODELO 4 90.16% 90.55% 90.18% 88.24% 90.34% SALIDA MODELO 5 91.66% 91.44% 90.65% 88.17% 91.44%

Tabla comparativa de los diferentes modelos

En las grficas anteriores as como en la tabla comparativa, observamos que el modelo ms aproximado al real, es el segundo modelo, por lo tanto, este va a ser el modelo de nuestro motor.

Funcin de transferencia: El modelo aproximado obtenido en Matlab fue el siguiente:

Pero este no es completamente el modelo a analizar debido a que este representa K*W(s))/ V(s) y nuestro sistema debe representar (s) / V(s). Para solucionar este problema, debemos agregarle un integrador al sistema ya que este integra W(s) y la convierte en (s)y comparar el modelo obtenido en la Ident con el modelado con el fin de obtener los parmetros de la planta y as identificar el modelo real.

Primero que todo multiplicamos el modelo matemtico por el facto K(constante electromotriz) para que quede de la forma:

Ahora procedemos a comparar ambos sistemas:

Al comparar ambos sistemas se puede observar que:

Donde el parmetro K(constante electromotriz) es igual a la raz de 0.73482. Ya conocido el parmetro, K podemos expresar el sistema o funcin de transferencia de nuestro motor:

Otro inconveniente es que la variable teta, esta expresada en revoluciones debido a que W en el anlisis del circuito se da en revoluciones/segundo. Para esto es necesario convertir teta en radianes, para mayor comodidad multiplicando al sistema por el factor 2.

Funcin de transferencia del motor

Debido a que el sistema se encuentra en tiempo continuo es necesario discretizarlo. Para el microcontrolador se empleo un oscilador XT de 4MHZ. De acuerdo con esta frecuencia y los ciclos de mquina que efecta el microcontrolador durante la retroalimentacin con el encoder (300 aprox.), se obtiene el periodo de muestreo necesario para obtener la planta en formato de Zs. T = 4*300 ------- = 0.3 milisegundos 4000000 Muestreamos el sistema:
num = 5.3859; den =[0.0014 0.0749 1.0000 0]

Tiempo de muestreo

G=Tf(num,den) Gz=c2d(G,3e-4)

Nuestro sistema discretizado sera el siguiente:

El las grficas siguientes se puede observar la respuesta al escaln y el lugar de las races respectivamente: Se puede observar que el sistema alcanza su valor mximo en aproximadamente 0.7 segundos, por lo que el tiempo de establecimiento se debe disminuir.

Respuesta al escaln

En el lugar de las races se puede observar que el sistema tiene 3 polos; (z-1) (z-0.9923) (z-0.9917) y dos ceros (z+3.717) (z+0.2669).

Para el diseo del controlador PD debido a que nuestro sistema es tipo uno, se escogi un Overshoot del 16% y un tiempo de establecimiento de 1 segundo.

Controlador PD

Controlador obtenido mediante la SISOTOOL

Sistema con controlador

Salida del sistema controlado DESARROLLO CON EL MICROCONTROLADOR

El proyecto se fundamenta en el diseo de un controlador de posicin de un motor D.C basado en un PIC 16F877A. En una pantalla LCD se visualizar el set point o valor de posicin deseado, el error actual, el ciclo til, realimentacin y la constante del PID, junto con las constantes del controlador PID (Kp, Ki, Kd), que son ingresadas por el usuario por medio de un teclado matricial. Ingreso de datos: Al iniciar, el microcontrolador se visualiza el valor deseado de posicin y las constantes del controlador (Kp, Ki, Kd), despus de ingresar el ltimo valor de las constantes, el microcontrolador empieza a posicionar el motor comparando, si el valor actual es igual al ingresado. Esto se logra por medio de un encoder que est acoplado a uno de los engranes del motor (que en este caso es el de menor dimetro), este tiene la funcin de producir una seal cada vez que el engrane realiza dos vueltas.De esta forma se va corrigiendo la posicin actual con la deseada.

Elementos utilizados PIC16F877A LCD Teclado matricial CD40106B L293B Encoder Motor de corriente continua Visualizador angular. Fuente de alimentacin de 5V. Oscilador de 4MHz. Panel de visualizacin para el desplazamiento del motor.

Programa del Microcontrolador Para la programacin del PIC, fue necesario crear el cdigo a partir de lenguaje C, debido a que este cuenta con libreras para el control del LCD, teclado, interrupciones, etc., que facilitan el control de estos y adems reduce las lneas de cdigo. Una vez que se ha realizado el programa en C, procedemos al crear el archivo .hex, el cual es el que se guarda en la memoria del microcontrolador, esto se realiza por medio de un compilador llamado PCW C Compiler.

CODIGO C

#include <16f877A.h> #fuses //oscilador y frecuencia #use #use #use #use #use #use fast_io fast_io fast_io fast_io fast_io (A) (B) (C) (D) (E) XT,NOWDT,PUT,BROWNOUT,NOLVP,PROTECT delay //Tipo //de

(clock = 4000000, RESTART_WDT)

//Configuracin de puertos digitales

#byte porta=5 #byte #byte #byte #byte #include #include #include #include <kbd2.c> <lcd.c> <math.h> <float.h>

portb=6 portc=7 portd=8 porte=9 //Librerias

float //controlador PID float float float

kp; kd; ki; I=

//Se definen las constantes del

0.5;

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% float err_ant,err_ant1,err_ant2,err_ant3,A; //Definicin de variables float sum_int=0; //Condicion inicial float integral,proporcional,derivativo, out_PID,out_PID2; signed long err_act,set_point,realimentacion; int32 32 caracteres de longitud int byte Duty; //Se define como entero con

util; //Entero inc,bit_ini,j;

//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #INT_EXT signed int pulso() { //Interrupcion externa //Funcion pulso valor entero if(inc == 0x00){realimentacion--;} else{realimentacion++;} return(realimentacion);

} //====================================================================//====== ============================================================== void demor_1() { //Retardos

char i; for(i=0;i<30;i++) {delay_ms(5);} } void demor() //Retardos { char i; for(i=0;i<250;i++) {delay_ms(7);} }

//==================================================================== byte adelante() { //Cambio de giro del motor output_bit(PIN_C0,0); output_bit(PIN_C1,1); return(1); (1). } byte atras() { //Asigna a la salida un(0). } //==================================================================== //==================================================================== long get_bcd() { long uno; float output_bit(PIN_C0,1); output_bit(PIN_C1,0); return(0);

//Asigna a la salida un

ctte; ctte=0x00;

//Define un registro flotante

do { uno=kbd_getc(); } while ((uno<'0') || (uno>'9')); lcd_putc(uno); uno-='0'; ctte = uno*1000; demor_1(); do { uno=kbd_getc(); } while ((uno<'0') || (uno>'9')); lcd_putc(uno); uno-='0'; ctte += uno*100; do { uno=kbd_getc(); } while ((uno<'0') || (uno>'9')); lcd_putc(uno); uno-='0'; ctte += uno*10; demor_1(); do {

uno=kbd_getc(); } while ((uno<'0') || (uno>'9')); lcd_putc(uno); uno-='0'; ctte += uno; demor_1();demor_1();demor_1(); return(ctte); } //==================================================================== int32 aprox(float rta_controlador) //Funcion aprox { //Esta funcin aproxima el valor de la salida del controlador al entero ms proximo float parte_entera,parte_decimal; int32 ciclo_pwm; parte_decimal=modf(rta_controlador,&parte_entera); if(parte_decimal>=0.5) { ciclo_pwm=ceil(rta_controlador); //aprox al entero mayor ms cercano } else { ciclo_pwm=floor(rta_controlador); //aprox al entero menor ms cercano } return (ciclo_pwm); //Regresa el valor de ciclo_pwm,que es } //un entero de 32 caracteres. //==================================================================== //==================================================================== void main(void) { portb=portc=0; set_tris_a(0xFF); (E/S) set_tris_b(0xFF); set_tris_c(0x08); set_tris_d(0x00); set_tris_e(0x00); setup_timer_2(T2_DIV_BY_16, 255, 1); Periodo=255 Pos=1 setup_ccp1(CCP_PWM); //Configuracion contador PWM enable_interrupts(INT_EXT); //Int. sensor encoder ext_int_edge( L_TO_H ); //Interrupcion flanco Bajo a alto enable_interrupts(GLOBAL); //Activar interrupciones globales lcd_init(); //Inicializacion del LCD //Pre=1 //Reset para los puertos //Configuracion de puertos //Regresa el valor de (ctte).

lcd_putc("\f SANTO TOMAS\n"); //Mensajes de inicio lcd_putc("CONTROL II");demor(); lcd_putc("\f MORGAN\n"); lcd_putc(" EDWING ");demor(); lcd_putc("\fING\n"); lcd_putc(" MECATRONICA "); demor(); //Retardo lcd_putc("\f INICIANDO\n"); lcd_putc(" SISTEMA"); demor(); lcd_putc("\f VALOR : "); set_point = get_bcd(); //Obtiene el valor ingresado printf(lcd_putc,"\f ",set_point);demor(); //Visualiza lcd_putc("\f //Imprime mensaje 1-Kp en el LCD A=get_bcd(); //Obtiene valor de Kp kp = 0.001*A; //Multiplica valor ingresado por 0.001 printf(lcd_putc,"\f ",kp);demor(); 1-Kp :%2.4f set Point :%ld

1-Kp : ");

lcd_putc("\f 2-Ki : "); A=get_bcd(); ki = 0.001*A; printf(lcd_putc,"\f 2-Ki:%2.4f ",Ki);demor();//%demor(); lcd_putc("\f 3-Kd : "); A=get_bcd(); kd = 0.001*A; printf(lcd_putc,"\f 3-Kd :%2.4f ",kd);demor();//%demor(); /* set_point=20; kp=1; ki=0; kd=0; */ err_ant= err_act= err_ant1= err_ant2= err_ant3= out_PID= integral= proporcional= derivativo= 0x00; //Condicion inicial realimentacion= bit_ini=0; //Bandera de inicio set_tris_b(0x01); del puerto B for(;;) { //Ecuacion para el error actual //------------------PROPORCIONAL-------------------------------------//Configuracion

delay_ms(5); err_act = set_point - realimentacion;

proporcional = kp*err_act; //Ecuacion de parte Proporcional //------------------INTEGRAL-----------------------------------------if(bit_ini==0) condicion inicial 0 { integral = ki*err_act; integral // } else { // integral = I*(err_ant+err_act); integral += sum_err; integral *= ki; sum_int+=integral; //sum_err += err_act; err_ant =err_act; } //----------------DERIVATIVO-----------------------------------------derivativo = 3*(err_ant1-err_ant2); derivativo += err_act; derivativo -= err_ant3; derivativo *= kd; err_ant3=err_ant2; //Memorizacin para la parte derivativa err_ant2=err_ant1; err_ant1=err_act; //-------------------------------------------------------------------out_PID = proporcional + sum_int + derivativo; if(out_PID < 0x00){inc=atras();} salida del PID<0 increm. atras else{inc=adelante();} contrario adelante out_PID = abs(out_PID); del PID positivo lcd_putc('\f'); printf(lcd_putc,"\fe: %ld D: %U \nR:%U PID:%f",err_act,util,realimentacion,out_PID); for(j=0;j>=170;j++) //Retardo delay_ms(1); out_PID*=60; Duty = aprox(out_PID); //si la //De lo //Salida sum_err=err_act; sum_int=integral; bit_ini=0xFF; //Ecuacion //Si est en

if(Duty>254){Duty=255;} util=Duty; set_pwm1_duty(util); } }

CONCLUSIONES

Para la obtencin de modelos matemticos por medio de datos adquiridos, es necesario la obtencin de diferentes modelos a partir de varios datos, con el fin de validarlos y as obtener un sistema que satisfaga las caractersticas de comportamiento del sistema real. Los datos que se adquirieron fueron filtrados con el fin de eliminar el ruido que alteraba la seal de salida del generador. Para el proceso de discretizacin del modelo, la frecuencia de funcionamiento del microcontrolador es la frecuencia de muestreo. El controlador que se diseo fue un PD debido a que el PID no es aconsejable implementarlo debido a que el sistema ya posee un integrador.

ANEXOS

Circuito diseado en Proteus

You might also like