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;
}
}
}
}