Professional Documents
Culture Documents
PRESENTADO POR:
EDWIN ALONSO GONZALEZ QUERUBIN
MORGAN GARAVITO VASQUEZ - mor6an1@hotmail.com
ING. MECATRONICA
Ecuaciones mecánicas:
Jdw + bw=KI
dt
-V+RI(s)+SLI(s)+Kw(s)=0
JSw(s)+bw(s)=KI(s)
W = ___________K____________
V (JS+b)(LS+R) + K^2
θ / V = K /( S * (( J * S + b ) * ( LS + R ) + K 2
))
clc
clear
close all
ai=analoginput('nidaq',1);
% Canal 1 voltaje de excitación
% Canal 2 voltaje generado
chans=addchannel(ai,1:2);
% Frecuencia de muestreo
fs=2000;
set(ai,'SampleRate',fs);
% Tiempo que dura la adquisición
duration=10;
set(ai,'SamplesPerTrigger',fs*duration);
% Rango de entrada adquisición 0-10V
set(chans,'InputRange',[0 10]);
disp('Pulse ENTER para dar inicio de adquisición')
pause
% Inicio adquisición
start(ai)
[d1,t1]=getdata(ai);
u=d1(:,1);
y=d1(:,2);
% Gráfica de acción de control
figure(1)
plot(t1,u)
xlabel('Tiempo(seg)');
title('voltaje de excitación');
grid
%Gráfica 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 señal de entada
H1=filter(B,A,u);
figure(3)
plot(H1)
grid
%filtramos señal de salida
H2=filter(B,A,y);
figure(4)
plot(H2)
grid
Entrada 1 Salida 1
Entrada 2 Salida 2
Entrada 3 Salida 3
Entrada 4 Salida 4
Entrada 5 Salida 5
Obtención y validación de los modelos mediante la IDENT:
T = 4*300
------- = 0.3 milisegundos Tiempo de muestreo
4000000
Muestreamos el sistema:
num = 5.3859;
den =[0.0014 0.0749 1.0000 0]
G=Tf(num,den)
Gz=c2d(G,3e-4)
Respuesta al escalón
Controlador PD
Ingreso de datos:
Elementos utilizados
- PIC16F877A
- LCD
- Teclado matricial
- CD40106B
- L293B
- Encoder
- Motor de corriente continua
- Visualizador angular.
- Fuente de alimentación de 5V.
- Oscilador de 4MHz.
- Panel de visualización para el desplazamiento del
motor.
Programa del Microcontrolador
CODIGO C
#include <16f877A.h>
#byte porta=5
#byte portb=6
#byte portc=7
#byte portd=8
#byte porte=9
float I= 0.5;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
float err_ant,err_ant1,err_ant2,err_ant3,A;
//Definición de variables
float sum_int=0;
//Condicion inicial
float integral,proporcional,derivativo,
out_PID,out_PID2;
signed long err_act,set_point,realimentacion;
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%//%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
//====================================================================
byte atras()
{
output_bit(PIN_C0,1);
output_bit(PIN_C1,0);
return(0); //Asigna a la salida
un(0).
}
//====================================================================
//====================================================================
long get_bcd() {
long uno;
float ctte; //Define un registro flotante
ctte=0x00;
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();
//====================================================================
parte_decimal=modf(rta_controlador,&parte_entera);
if(parte_decimal>=0.5)
{
ciclo_pwm=ceil(rta_controlador);
//aprox al entero mayor más cercano
}
else
{
ciclo_pwm=floor(rta_controlador);
//aprox al entero menor más cercano
}
return (ciclo_pwm);
//Regresa el valor de ciclo_pwm,que es
} //un entero de 32 caracteres.
//====================================================================
//====================================================================
void main(void)
{
portb=portc=0; //Reset para los puertos
lcd_init();
//Inicializacion del LCD
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();
set_tris_b(0x01); //Configuracion
del puerto B
for(;;)
{
delay_ms(5);
err_act = set_point - realimentacion;
//Ecuacion para el error actual
//------------------PROPORCIONAL--------------------------------------
proporcional = kp*err_act;
//Ecuacion de parte Proporcional
//------------------INTEGRAL------------------------------------------
// sum_err=err_act;
sum_int=integral;
bit_ini=0xFF;
}
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;
//Memorización para la parte derivativa
err_ant2=err_ant1;
err_ant1=err_act;
//--------------------------------------------------------------------
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);
if(Duty>254){Duty=255;}
util=Duty;
set_pwm1_duty(util);
}
CONCLUSIONES