Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ikaro._18 en 13 de Marzo de 2010, 22:09:24
Título: Falla en PWM en CSS
Publicado por: ikaro._18 en 13 de Marzo de 2010, 22:09:24
Hola colegas, me encuentro haciendo un control PI para un motor de cd y trato de simularlo en el proteus, la cosa es que mi programa lee el Adc por el canal cero e internamente realiza el error que es dado por la retroalimentacion que coloco en el canal 1, esta retro es unitaria, la coloco de esta manera solo para hacerle pruebas, pero el pwm falla mucho y no reacciona como debiera, mi PI arroja una respuesta de 0 a 100% con el antiwindup, esa respuesta la multiplico por 5 de tal forma que me de 500 que corresponde al 100% del pwm, el css no me marca errores, pero en el proteus nada mas no funciona como debiera. No responde bien, aveces si saca pwm y aveces no, de momento se traba. He realizado PID en microcontroladores de freescale y no me genera tantos problemas. El algoritmo PI lo implemente en otro micro de la famia flexis y funciona bien, solo cambie la resolucion, en aquel micro es de 16 bits y 32 bits, se que aqui debe funcionar perfectamente.
Ojala me puedan ayudar. Ojala puedan detectar el error, pienso que es el proteus o algo asi. He hecho un programa en donde solo saco el pwm que es leido por el canal cero del AD y ni asi funciona, funciona cuando le mete directamente el valor pwm, por ejemplo cuando le meto 250 saca el 50% pero cuando le coloco que saque en pwm leido por el adc no mas no funciona. para sacar de 0 a 500 que es del 0 al 100% aplico una formulita: pwm=(long)2*ADC // siendo que AD varia de 0 a 255 con un AD= 8 bits, pero ¿por uqe no funcona? haaaaaaaaaa me vuelvo loco ayuda ayuda ayuda porfavor :shock:
#byte PORTB=0x06 #use fast_io(c) int lectura=0; int contador=0; long duty; float Set_Point, Sensor,Pwm_n,Pwm_aw, Error_n,Error_n_1,Pwm_n_1=0; float Set_Point_Real,Sensor_Real, Pb1,Pb2, Periodo_Muestreo=0.065,Ti=2.5,Tiempo; float V1,V2,Ki,Kp=10,Pwm_aws; int a=0;
#INT_timer0 void timer0(void) {
set_adc_channel(0); Set_Point=read_adc(); //delay_ms(100); portb=Set_Point; // set_pwm1_duty((long)250);//ciclo util de 0 a 500 que correspode aqui si saca bien el pwm set_adc_channel(1); // del 0% al 100% Sensor=read_adc(); //delay_ms(100); Sensor_Real=100*(Sensor/255); Set_Point_Real=100*(Set_Point/255); // set_timer0(0); Error_n=Set_point_Real-Sensor_Real; Ki=1/Ti; Pb1=100/Kp; Pb2=(Pb1*Set_Point_Real)/100; Tiempo=Periodo_Muestreo/2; V1=Periodo_Muestreo/Ti; V2=1/(1+V1); Pwm_n=(10/Pb2)*(Error_n+Error_n_1*(Ki*Tiempo-1))+Pwm_n_1; Error_n_1=Error_n;
Pwm_aw=Pwm_n; //antiwindup if (Pwm_aw>100) { //Salida PID si es mayor que el 100%.- Pwm_n=(Pwm_n + V1)*V2; Pwm_aw=100; } if(Pwm_aw<0) { //Salida PID si es menor que el 0% Pwm_n=Pwm_n*V2; Pwm_aw=0; }
Pwm_n_1=Pwm_n;
Pwm_aws=(long)5*Pwm_aw;
set_pwm1_duty((long)Pwm_aws);//¿por qué a qui ya no me saca bien el pwm? //no creo que sea mi PI porque he realizado un programa donde solo saco en pwm lo que le entra por el ADC aplicandole la for //mula pwm=(long) 2*ADC;
Título: Re: Falla en PWM en CSS
Publicado por: ikaro._18 en 13 de Marzo de 2010, 22:18:48
Deja lo checo y te informo
Título: Re: Falla en PWM en CSS
Publicado por: ikaro._18 en 13 de Marzo de 2010, 22:24:48
Nop, no funciona, estoy casi seguro que es el proteus, digo debe hacerlo en formato float, puesto que asi se le declaro,aun asi ya lo coloque y a mi parecer funciona menos :(
Alguna otra sugerencia?
En el primer mensaje adjunte los archivos para ver si le podian dar una checadita
Título: Re: Falla en PWM en CSS
Publicado por: Diego E. en 13 de Marzo de 2010, 23:01:16
Hola ikaro._18, a mi el modulo PWM de los PIC nunca me ha funcionado en proteus 7.4, no estoy seguro, pero me parece que en la versión 7.2 me funcionaba bien. para que no te enloquezcas prueba en un protoboard.
saludos.
Título: Re: Falla en PWM en CSS
Publicado por: ikaro._18 en 13 de Marzo de 2010, 23:19:40
pues voy armarlo en proto a ver si funciona. Pero que desepcion del proteus
Título: Re: Falla en PWM en CSS
Publicado por: Suky en 14 de Marzo de 2010, 08:51:06
Aparte de las operaciones que menciona MGLSOFT hay otras que tambien necesitan cast y puede ser ese el problema de que no estás obteniendo un resultado correcto.
Código: C
Pb1=100.0/Kp;
Pb2=(Pb1*Set_Point_Real)/100.0;
Tiempo=Periodo_Muestreo/2.0;
....
Con el debugger de Proteus podes ir viendo si el valor que tiene pwm es el correcto después de hacer todos los cálculos he ir viendo donde esta el inconveniente.