Autor Tema: propulsor ca controlado por temperatura  (Leído 7461 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
propulsor ca controlado por temperatura
« en: 11 de Mayo de 2008, 03:27:09 »
hola, otra vez aqui exponiendo un tema, que para no fallar en la rutina no esta todavia del todo terminado, se trata de un propulsor de motor de ca, que tendra un voltaje de referencia, el cual pasando esta "temperatura" empezara a funcionar, y comforme vaya aumentando la temperatura aumentara la velocidad, con un lm35, he decidido utilizar un amplificador operacional para no tener que utilizar el vref, por que? bueno, se me hacia mas facil y menos procesamiento de datos, ya que el adc esta configurado en 8 bits, o sea que cada 20mV aumenta un bit, justo lo que necesitaba, a la salida del pic deberia ir un triac, o en su caso dos scr, el programa desplegara primero si b1 esta en cero, a que temperatura queremos que empiece a funcionar el motor, esto desplegado por un LCD, cuando ponemo a 1 el bit b1, entonces empieza a checar si el sensor lm35 tiene una temperatura igual a a la del set point (a0), el sensor estara conectado a A1, cuando las dos temperaturas sean iguales, o mayor la del sensor, aumentara su velocidad, tiene 5 velocidades, esto por que asi se planteo, espero que les sirva:
por cierto me gustaria que me dieran tips para quitar los retardos y poner en su lugar alguna funcion que haga lo mismo y no pare al micro, soy todo oidos, bueno, ojos  :) aqui va el codigo

Código: [Seleccionar]
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use standard_io(b)
#use standard_io(c)
#include "LCD.C"

int duty;
int contRTCC=0;

int1 flag=0;
int1 flag_extern=0;
int duty2;

int flag2=0;
int next=0;
int valor=0;
int1 flag3=0;
int change;

#int_ext
void int_extern(){

flag_extern=1;

}

#int_rtcc
void interruption(){
set_timer0(61);
++contRTCC;
if(contRTCC==10){
contRTCC=0;
flag=1;
}

}





void toma_adc(void){

set_adc_channel(0);
delay_us(10);
duty= read_adc();
delay_us(10);


set_adc_channel(1);
delay_us(10);
duty2= read_adc();
delay_us(10);


}

void ajusta_tiempo(void);

void calculo(void);

void main()
{

   setup_adc_ports(ALL_ANALOG);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0x50,1);
   setup_comparator(NC_NC_NC_NC);
   
   enable_interrupts(int_ext);
   ext_int_edge( L_TO_H );
   enable_interrupts(int_timer1);
   enable_interrupts(int_rtcc);
   enable_interrupts(global);
   
   set_tris_a(0x0B);
   set_tris_b(0xFF);
   set_tris_c(0x00);
    lcd_init();
   // TODO: USER CODE!!
   
   lcd_putc("init...");
   delay_ms(1000);
 
   do{
   toma_adc();
   
   
 
   
   
   
   
   
   if (input(pin_b1)){
   flag2=1;
   
   }else{
   flag3=0;
   if (flag==1){
   printf(lcd_putc,"Temp=%d",duty) ;
   flag=0;
   }
   }
   
   
   if (flag2==1){
   
   
   if(flag==1){
 
        //cursor para escribir mensaje
      printf(lcd_putc,"Temp=%d",duty2) ;   //muestra por pantalla el mensaje
   
      flag=0;
   
   }
   
   if (duty2>=duty){
   flag3=1;
   output_high(pin_c3);
   
   }else{
   output_low(pin_c3);
   }
   
   if (flag3==1){
   
   
   
   if (flag_extern==1){
   flag_extern=0;
   ++next;
   
   }else{
   if(next==1){
 delay_us(100);
 calculo();
  output_high(pin_c0);
  delay_us(100);
  output_high(PIN_c1);
    delay_ms(valor);
  output_low(PIN_c1);
 delay_ms(change);
 delay_us(133);
 
 }
 if(next==2){
delay_us(100);
 calculo();
  output_high(PIN_c0);
  delay_us(100);
  output_high(PIN_c2);
    delay_ms(valor);
  output_low(PIN_c2);
 delay_ms(change);
 delay_us(133);
 next=0;
 }
   }
   }
   }
   
    }while(true);

}
void ajusta_tiempo(void){
   if (duty2<duty){
   valor=0;
   }

   if (duty2==duty){
   valor=2;
   }
  if (duty2==duty+1){
  valor=3;
  }
  if (duty2==duty+2){
  valor=5;
  }
  if (duty2==duty+3){
  valor=6;
    }
  if (duty2==duty+4){
  valor=7;
  }
}

void calculo(void){
change=8-valor;
}


la funcion de las salidas es conmutar dos scr para controlar el periodo de la fase de AC, esto para variar la velocidad, aqui anexo lo que se hizo en proteus, pero se pone algo lento, las salidas son en c0, c1,c2,c3, mas adelante pongo la etapade potencia , que esta facil, solo dos scr en paralelo en serie con el motor de ac, o un triac, depende que tengas, lo checare hasta el lunes en el laboratorio, para estar mas seguros, ahi tambien esta el cruce por cero
« Última modificación: 11 de Mayo de 2008, 03:39:06 por scientist »
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: propulsor ca controlado por temperatura
« Respuesta #1 en: 11 de Mayo de 2008, 03:35:27 »
otro punto a exponer y se me olvido, el periodo del pwm que controla el disparo delos scr esta por la interrupcion externa, y me calibra exactamente con el cruce por cero, mmmm, ya es tarde y tengo algo de sueño, y si me equivoco en algo le hechare la culpa a esto,  :lol: y agradecer a los que hacen funcionar un foro tan extraordinario, cualquier duda, preguntar, y cualquier critica adelante
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: propulsor ca controlado por temperatura
« Respuesta #2 en: 16 de Mayo de 2008, 03:25:51 »
el amplificador que he utilizado:



lo utiice para no enredarme con lo de el voltaje de referencia,aunque lo pueden quitar y poner el voltaje de referencia en el programa

utlice para el set point, las interrupciones por rb, para aumentar o disminuir el set point, y al poner b1 en alto entre en el ciclo de testeo del sensor, aqui el programa mejorado,aunque sigo con el problema de los retardos  aqui anexo lo que termine, un pequeño aporte a la comunidad, el programa  en proteus ya tiene la parte de potencia, un humilde triac con la parte del opto,  el proyecto funcioa en la vida real, ya lo probe en el laboratorio,  lo anexo a continuacion

Código: [Seleccionar]
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT
#use delay(clock=4000000)
 #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use standard_io(b)
#use standard_io(c)
#include "LCD.C"
#byte portb=6

int contRTCC=0;

int1 flag=0;
int1 flag_extern=0;
int duty2;
int flag_not_do_it=0;
int val=0;
int flag2=0;

int valor=0;
int1 flag3=0;
int change;
int flag_rb4;
int flag_rb5;

#int_ext
void int_extern(){

flag_extern=1;

}

#int_rtcc
void interruption(){
set_timer0(61);
++contRTCC;
if(contRTCC==10){
contRTCC=0;
flag=1;
}

}


#int_rb
void lafuncion(){
if(input(pin_b4)){
flag_rb4=1;
}
if(input(pin_b5)){
flag_rb5=1;
}

}


void toma_adc(void){

set_adc_channel(0);
delay_us(10);
duty2= read_adc();
delay_us(10);


}

void ajusta_tiempo(void);

void calculo(void);

void main()
{

   setup_adc_ports(AN0);
   setup_adc(ADC_CLOCK_DIV_8);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);
   setup_timer_1(T1_DIV_BY_8);
   setup_timer_2(T2_DISABLED,0x50,1);
   setup_comparator(NC_NC_NC_NC);
   
   enable_interrupts(int_ext);
   ext_int_edge( L_TO_H );
   enable_interrupts(int_timer1);
   enable_interrupts(int_rb);
   enable_interrupts(int_rtcc);
   enable_interrupts(global);
   
   set_tris_a(0x0B);
   set_tris_b(0xFF);
   set_tris_c(0x00);
    lcd_init();
   // TODO: USER CODE!!
   
   lcd_putc("init...");
   delay_ms(1000);
 
   do{
   toma_adc();
   
 
 
   if(flag_rb4==1){
   delay_ms(400);
   val=val-1;
   flag_rb4=0;
   
   
   
   }
   if (flag_rb5==1){
   delay_ms(400);
   val=val+1;
   flag_rb5=0;
   }
   
   
   
   
   if (input(pin_b1)){
   flag2=1;
   
   }else{
   
   
   
   flag3=0;
   if (flag==1){
   
   printf(lcd_putc,"Temp=%d",val) ;
   flag=0;
   }
   }
   
   
   if (flag2==1){
   
   
   if(flag==1){
 
        //cursor para escribir mensaje
      printf(lcd_putc,"Temp=%d",duty2) ;   //muestra por pantalla el mensaje
   
      flag=0;
   
   }
   
   if (duty2>=val){
   flag3=1;
   output_high(pin_c3);
   
   }else{
   output_low(pin_c3);
   }
 
   if (flag3==1){
   
   
   
   if (flag_extern==1){
   flag_extern=0;
   
   
   
   ajusta_tiempo();
   
 delay_us(100);
 calculo();
  output_high(pin_c0);
  delay_us(100);
  output_high(PIN_c1);
    delay_ms(valor);
  output_low(PIN_c1);
 delay_ms(change);
 delay_us(100);
 if(flag_not_do_it==1){
 output_low(pin_c1);
 }
 }
 
   }
   }
   
   
    }while(true);

}
void ajusta_tiempo(void){
   if (duty2<val){
   flag_not_do_it=1;
   }else{
   flag_not_do_it=0;
   }

   if (duty2==val){
   valor=2;
   }
  if (duty2==val+1){
  valor=3;
  }
  if (duty2==val+2){
  valor=5;
  }
  if (duty2==val+3){
  valor=6;
    }
  if (duty2==val+4){
  valor=7;
  }
}

void calculo(void){
change=8-valor;
}
« Última modificación: 16 de Mayo de 2008, 03:34:02 por scientist »
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: propulsor ca controlado por temperatura
« Respuesta #3 en: 16 de Mayo de 2008, 12:50:15 »
Hola.

Muy interesante el poyecto.

Para los retardos .... yo utilizo las interrupciones que dan los timers (Timer0 para tiempos pequenos y Timer1 para tiempos mas largos) y los trabajo con banderas, es decir, cuando se quiere el retardo coloco una bandera en 0, sigo con el programa y la interrupcion del Timerx coloca la bandera en 1. En el main debo estar testeando un if (bandera_timer==1) para que cuando se active la interrupcion entre a la rutina. Obviamente el delay no es exacto, ya que se da que cuando el timer se desborda y coloca la bandera a 1, estoy antes del condicional y tiene que pasar cierto tiempo ( que depende del resto de la rutina ) hasta validar el condicional.

Si ese tiempo extra no es problema para ti, puedes hacerlo de esa manera. Si es muy crucial el tiempo entonces es mejor colocar la funcion dentro de la interrupcion, pero las funciones no deben ser muy largas, ya que tambien demora tiempo hacerlas y afectaran un poco la presicion del delay.

Saludos
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: propulsor ca controlado por temperatura
« Respuesta #4 en: 16 de Mayo de 2008, 15:12:06 »
gracias por el tip MLO, ya que asi lo estaba haciendo,pero no me salia,la condenada funcion, lo seguire intentando, pienso que seria bueno utilizar el timer1 para que sea mas exacto, por eso de los 16 bits, veo que tienes experiencia en esto de la electronica de potencia por otros hilos que he leido, sabes, he querido hacer un inversor, y adaptarle a este proyectito, asi que cuando se vaya la fase de los 120, el inversor de dc a ac alimente al motor de ac, pero nohe visto ningun hilo acerca de este tema, que crees, propongo en otro hilo la construccion de un inversor? nos estamos comunicando
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: propulsor ca controlado por temperatura
« Respuesta #5 en: 16 de Mayo de 2008, 17:52:12 »
Hola.

Pues seria genial proponerlo sabes?
Ahi el verdadero problema es que el sistema debe ser muy rapido ( un micro comun no se si serviria .... estoy pensando en el seguidor de fase ), claro que se podria tambien hacerse de la siguiente manera: Hacer el seguimiento continuo de la onda de fase y detectar la ausencia de ella para conmutar algun IRFP, de esta manera la reaccion seria mas rapida. Lo que involucra es mucho HW ( pero que inversor es lo suficientemente pequeno????), pero quedaria un sistema GENIAL!!!!

Si propones el tema nuevo .... por ahi estare husmeando!!!!  :mrgreen:

Saludos y una vez mas, muy bonito proyecto
El papel lo aguanta todo

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: propulsor ca controlado por temperatura
« Respuesta #6 en: 17 de Mayo de 2008, 01:23:16 »
entonces ya esta, lo propondre, lo unico es que no se en parte exponerlo, aqui o en proyectos? todo depende desde el punto en que se mire, ya que lo ideal seria para mi hacerlo completamente en C, pero no se si aqui como lo vean los jefes, bueno, mientras tanto recopilare suficiente informacion acerca de inversores, nos estamos comunicando
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
Re: propulsor ca controlado por temperatura
« Respuesta #7 en: 05 de Junio de 2008, 22:50:12 »
Hola Scientist!, muy interesante proyecto!, te propongo que lo sigas dentro de este sub foro (C), y cuando esté terminado, lo pasamos al area de proyectos ok?

Un abrazo!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado scientist

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 999
Re: propulsor ca controlado por temperatura
« Respuesta #8 en: 06 de Junio de 2008, 00:36:19 »
hola, un abrazo Todopic,  :D gracias por el cumplido,tomando en cuenta de quien viene,  :shock:, es un logro para muchos de nosotros, que los que crearon este hermoso foro se interesen en trabajos de los que inician y han aprendido muchisisisimo de este foro, con mucho gusto lo haré, saludos
NO le digas a DIOS que tienes un gran problema, dile a tu problema que tienes un GRAN DIOS!!
Alma mia y castillo mio, mi Dios en quien yo confiare....


 

anything