Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PROYECTO
UNIVERSIDAD SURCOLOMBIANA
CONTROL DIGITAL
NEIVA HUILA
OBJETIVOS
Conocer e identificar el funcionamiento de la planta de
velocidad para poder relacionar la salida de dicho sistema con
los posteriores sistemas de control que se puedan implementar
en base al comportamiento de esta planta.
INTRODUCCION
Los datos arrojados por la planta son ledos por el programa Boris, el
cual nos muestra la siguiente respuesta del sistema:
t 0=Tiempo de cambio de u
comienza a responder
y y0
^
K= f ^ =t 63t
Parmetros de la transferencia estimada: f 0 , ,
T^r =t t 0
t 0=0 s ,t =0 s ,t 63=0.9 s
^ ( s )= 1.32 = 1.467
G
0.9 s+1 s+1.111
RESPUESTA A UN STEP DE 5
Step Response
7
4
Amplitude
0
0 1 2 3 4 5 6 7
Time (seconds)
0.1123
Con lo cual obtenemos : Gpz=
z0.915
DISEO DE CONTROLADOR PID
(1 z 1 )Gla
k v lim lim Gla * k i
z 1 T z 1
0.11216 ( z 0.001197)
k v lim * ki 1.3221288 * ki
z 1 z ( z 0.915)
k i 3.7817
z 2 Az B z ( z 0.915) z 2 Az B z 2 0.915 z
kp = 3.4080 ; kd = 0; k= 3.5592
MODELO EN SIMULINK
U (z ) 3.5592 ( 10.915 z 1 )
=
E ( z) 1z1
U ( z )U ( z) z1 =3.5592 E( z ) 3.256668 z1 E( z )
3500
3000
f(x) = 334x - 357.74
2500
2000
1500 Linear ()
1000
500
0
0 2 4 6 8 10 12
Se obtienen las siguientes ecuaciones para el valor en RPM y Voltaje.
RPM +357,47
V=
334
V = 0,003*RPM + 1,07
#INCLUDE <16F877A.h>
#DEVICE ADC=10
#FUSES NOWDT,XT,NOPROTECT,NODEBUG,NOLVP
#USE
DELAY(CLOCK=4000000)
#INCLUDE <stdlib.h>
//***************************************************************
#define LCD_RS_PIN PIN_B1
#define LCD_RW_PIN PIN_B2
#define LCD_ENABLE_PIN PIN_B3
#define LCD_DATA4 PIN_B4
#define LCD_DATA5 PIN_B5
#define LCD_DATA6 PIN_B6
#define LCD_DATA7 PIN_B7
#INCLUDE<LCD.C>
//*****************************************************************
// parametros del teclado
//******************************************************************
char d,*p;
int16 t=250; // Antirebote y retardo de teclado.
int puerto=0x08; // puerto usado para el treclado (puerto D)
int16 rpm = 0;
float step; // step en voltios
float Ek; // entrada de error
float Uk; // salida del controlador
float Uk1 = 0; // salida anterior del controlador
float Ek1 = 0; // entrada de error anterior
float Yk; // salida del sistema
int sal_binaria = 0;// salida del controlador en binario
float sal_float;
int16 adc;
//-----------------------------------------------------------------
// FUNCION PARA TECLADO
//--------------------------------------------------------
char teclado (int16 R,t) // R corresponde a la direccion del registro del
//puerto usado para
{ // el teclado, por ejemplo para el puerto D es
//0x08 o 8 en decimal
char teclas[4][4]={{'1','2','3','/'}, // valores correspondientes al
{'4','5','6','*'}, //teclado matricial
{'7','8','9','-'},
{'C','0','=','+'}};
int i,k;
while(1)
{
for(i=0;i<4;i++)
{
output_high(R*8+4+i);
for(k=0;k<4;k++)
{
delay_us(1000); // retardo para no recargar al proteus
if(input(R*8+k))
{
while(input(R*8+k)==1);
output_low(R*8+4+i);
delay_ms(t);
return teclas[k][i];
}
}
output_low(R*8+4+i);
}
}
}
//--------------------------------------------------------
void pide_rpm()
{
p = &d; // puntero a d
int i = 0;
int16 dato[]= {0,0,0,0};
while(true){
d = teclado(puerto,t); // llama al teclado y se recoge la tecla en d
dato[i] = atoi(p);
if(i==0){rpm = dato[0];}
if(i==1){rpm = dato[0]*10 + dato[1];}
if(i==2){rpm = dato[0]*100 + dato[1]*10 + dato[2];}
if(i==3){rpm = dato[0]*1000 + dato[1]*100 + dato[2]*10 + dato[3];}
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"CONTROL DE VEL.");
lcd_gotoxy(1,2);
printf(lcd_putc,"Ingrese RPM: ");
lcd_gotoxy(13,2);
printf(lcd_putc,"%Lu",rpm);
i++;
}
if((d=='C')&&(i!=0)){
return;
}
}
}
//*******************************************************************
void proceso() {
Ek = 0; // entrada de error
Uk = 0; // salida del controlador
Uk1 = 0; // salida anterior del controlador
Ek1 = 0; // entrada de error anterior
Yk = 0; // salida del sistema
int i =0;
while(true){
set_adc_channel(0); // seleccionamos el canal por donde se recibe la seal
adc =read_adc();
delay_us(30);
Yk = adc*5.0/512.0;
Ek = step - Yk;
Uk = 3.5592*Ek - 3.256668*Ek1 + Uk1;
if(Uk > 10)
{ Uk = 10;}
if(Uk < 0 )
{ Uk = 0; }
Ek1 = Ek;
Uk1 = Uk;
sal_float = Uk*25.5;
sal_binaria = sal_float;
output_c(sal_binaria);
output_high(PIN_D4);
if(input(PIN_D3)==1){
output_c(0);
return;
}
i++;
if(i==10)
{
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"I: %f O: %f",Yk,Uk);
lcd_gotoxy(1,2);
printf(lcd_putc,"R: %Lu S: %f",rpm,step);
i = 0;
}
}
}
//*******************************************************************
void main()
{
output_c(0);
lcd_init();
setup_adc_ports(AN0); // configuramos AN0 como entrada analgica
setup_adc(ADC_CLOCK_INTERNAL);// Escogemos el reloj interno RC para el
//conteo
while(true){
lcd_putc('\f');
lcd_gotoxy(1,1);
printf(lcd_putc,"CONTROL DE VEL.");
lcd_gotoxy(1,2);
printf(lcd_putc,"Ingrese RPM: ");
pide_rpm();
step = 0.003*rpm + 1.07; // rpm a voltios
proceso();
}
}
CONCLUSIONES
BIBLIOGRAFIA