TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: IVANCHO20 en 09 de Mayo de 2004, 15:19:00
-
este es un control pid que hace girar un motor segun el set point no funciona ni es proteus y otra presgunta como se sacan las simulaciones animadas en proteus
#include <16f877a.h>
#use delay(clock=2000000)
//#fuses hs
#include <lcd.c>
#byte portc=7
#byte portb=6
#use fast_io(b)
int val1,val2,val3,setp,val_med;
float a0,a1,a2,xn_1,xn_2,yn,yn_1,kp,k1,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))){
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;
k1=(float)val2;
kd=(float)val3;
ts=0,01;
a0=kp+k1*ts+kd/ts;
a1=kp+2*kd/ts;
a2=k1/ts;
lcd_gotoxy(1,1);
printf(lcd_putc,"p:%1.1f,i:%1.1f,
d:%1.1f",kp,k1,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;
}
}
}
}
-
es un tema muy interesante

quizas puedas comentar lo que pretendes con el codigo que pones....
habitualmente en un lazo PID digital (este es nuestro caso) hay que tener en cuenta el tiempo entre muestreos y habitualmente este ronda en torno a los 200 ms (mas que suficiente para la mayoria de las aplicaciones)
nunca intente hacer un PID en un pic pero me atrae la idea
sin embargo he programado y ajustado mas de uno
(y de dos......)
ahora no dispongo te tiempo (y quien lo tiene) pero me apuntaria a un equipo para implementarlo.
saludos y adelante con este tema que merece el intento
-
ra posicionar un motor segun el estado que se encuentre este del set point, pero no sale lo voy a intentar hacer para un control de velocidad
-
RE: control pid que pasa[/b]
<
-
Qu mas IVANCHO, pues estoy realizando un control PID para un motor DC Y para contolar temperatura tanto analogo como discreto, pero miro su codigo y en realidad me confunde cada vez mas, mi codigo lo estoy desarrollando en C18 y creo que es totalmente diferente al suyo, bueno si le interesa intercambiamos informacion, listo
nos vemos