TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: miguech1 en 23 de Mayo de 2004, 17:14:00
-
#include <16f877a.h>
#use delay(clock=2000000)
#fuses hs
#include <lcd.c>
#byte portc=7
#byte portb=6
#use fast_io(b)
//respueta rapida de puerto b
int val1,val2,val3,setp,val_med;
float a0,a1,a2,xn_1,xn_2,yn,yn_1,kp,ki,kd,ts,xn;
main(){
setup_adc_ports(all_analog);
setup_adc(adc_clock_div_32);
setup_ccp1(ccp_pwm);
setup_ccp2(ccp_pwm);
setup_timer_2(t2_div_by_1,255,1);
lcd_init();
while(true){
while((input(pin_b0))){ // si es un cero
set_adc_channel(2);
val1=read_adc();
delay_us(10);
set_adc_channel(3);
val2=read_adc();
delay_us(10);
set_adc_channel(4);
val3=read_adc();
delay_us(10);
kp=(float)val1;
ki=(float)val2;
kd=(float)val3;
ts=0,01;
a0=kp+ki*ts+kd/ts;
a1=kp+2*kd/ts;
a2=ki/ts;
lcd_gotoxy(1,1);
printf(lcd_putc,"p:%1.1f,i:%1.1f,d:%1.1f",kp,ki,kd);}lcd_putc("f"
;
while((!input(pin_b0))){
set_adc_channel(0);
setp=read_adc();
delay_us(1);
set_adc_channel(1);
val_med=read_adc();
xn=(float)(setp-val_med);
lcd_gotoxy(1,1);
printf(lcd_putc,"x:%1.1f,v:%1.1u,s%1.1u",xn,val_med,setp);
if(xn>0){
yn=a0*xn-a1*xn_1+a2*xn_2+yn_1;
set_pwm1_duty(yn);
xn_2=xn_1;
xn_1=xn;
yn_1=yn;
}
else{
yn=a0*xn-a1*xn_1+a2*xn_2+yn_1;
set_pwm2_duty(yn);
xn_2=xn_1;
xn_1=xn;
yn_1=yn;
}
}
}
}
-
Estiimado:
Me parece interesante, pero podrias agregar comentarios al codigo como una ayuda para lograr entenderlo.
Salu2
kruskal@hotmail.com
-
Mete los valores al P, I , D leyendolos por los canales del conversor.
Los escalas en algun momento??
Esto esta probado en la practica.?
parece interesante...
-
el problema que tengo es que en protus no puede cargar el valor de kd y me es imposible. este control es para un motor, cualquies inquietud o ayuda escriban. cuando funcione les aviso
-
Tengo una duda.
Me pudes decir entre que valores se mueve la variable yn?
salud2
kruskal@hotmail.com
-
tiene que variar de 0 hasta 255 para poder cargarle en el pwm
gracias
-
Me parece que la variacion no esta bien controlada ya que aplicando algebra a la ecuacion:
yn=a0*xn-a1*xn_1+a2*xn_2+yn_1
Y se concidera que no hay cambio por tiempo prolongado en las entradas analogicas el valor yn, creo, va aumentando. Por tiempo no he analizado bien la ecuacion.
.
salud2
kruskal@hotmail.com
-
No controlo mucho lo del PID, pero el signo menos de la ecuación yn=a0*xn - a1*xn_1 + a2*xn_2 + yn_1 ¿no debiera ser un más?
Si alguién tiene enlaces a proyectos de control PID resueltos en C o PBP se agradecería ... también valen ejercicios propios de cada uno.
-
Disculpa pero que "planta" o funcion de transferencia intentas controlar???.... Ademas podrias explicar un poco mas acerca de lo que representan cada una de las variables.
Saludos!
-
Hola,para ser un poco mas entendible el codigo deberias comentarlo un poco mas ...estaria bueno tb si lo simulaste en el proteus estaria bueno verlos para entender bien el codigo..saludos
-
Tal vez hace mucho que ya lo termino!!
Es un POST del 2004!!! :D :D :D
-
jaja..eso me pasa por metido ...lo vi en la lista y respondi ..falta de atencion ..:S