TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: IVANCHO20 en 15 de Mayo de 2004, 08:16:00
-
#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,xn;
int a0,a1,a2,xn_1,xn_2,yn,yn_1,kp,k1,kd,ts;
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=val1;
k1=val2;
kd=val3;
ts=0,01;
set_pwm1_duty(0);
lcd_gotoxy(1,1);
printf(lcd_putc,"p:%1.1u,i:%1.1u,
d:%1.1u",kp,k1,kd
);}lcd_putc("f"
;
while(true){
while((!input(pin_b0))){
set_adc_channel(0);
setp=read_adc();
delay_us(1);
set_adc_channel(0);
setp=read_adc();
kp=10;
ts=4.16;
xn=0.62;
while(true){
set_adc_channel(1);
val_med=read_adc();
lcd_gotoxy(1,1);
printf(lcd_putc,"v:%1.1u,
s%1.1u,kp:%u",val_med,setp,kp);
if(val_med<setp){
kp=kp++;
yn=kp*(1+1/ts+xn);
set_pwm1_duty(yn);}
if(val_med>=setp){
kp=kp-1;
yn=kp*(1+1/ts+xn);
set_pwm1_duty(yn);
}
}
}
}
}
ESTE ES EL CODIGO QUE ME DIO EL PROFE DE LA U NO SE SI ESTA BIEN ES SOLO PARA EL CONTROL PROPORCIONAL LO REVISAMOS ENTRE TODOS
-
le voy a dar un vistazo pero a primera vista parece que pierdes precision en las operaciones con enteros.
he montado un motor con encoder para hacer unas pruebasy parece que va perfecto con un IRF1104.
creo que es mas interesante hacer la regulacion usando la interrupcion fija para facilitar las operaciones o bien calculando el tiempo entre llamadas.....
parece recomendable comenzar solo con el proporcional y luego pasar a los demas....
voy a intentar adaptar el programa para poder representar la grafica del lazo y modificar los parametros desde VB.

