Autor Tema: Control de Fase con Interupciones  (Leído 18697 veces)

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

Desconectado brutto

  • PIC10
  • *
  • Mensajes: 44
Re: Control de Fase con Interupciones
« Respuesta #15 en: 18 de Julio de 2011, 09:02:37 »
no seria mejor hacer un flag con el timer0 y leer el adc en el bucle principal, asi no ocupas tiempo de interrupcion ya que el ADC tarda "bastante" y te puede colisionar con la interrupcion externa.

Por cierto, ¿que circuito usas de deteccion de cruce por cero? estuve mirando señales a traves de un transformador y en el osciloscopio solo "veo" bien la onda si le pongo una resistencia de carga.
Transformador + puente diodos + diodo = en el anodo del diodo tengo la resistencia de carga y con el osciloscopio veo bien la onda senoidal 100hz, de aqui lo paso a un comparador y tengo el cruce por cero. En el catodo pongo el circuito que hace de fuente de alimentacion de la placa. Si quito la resistencia de carga la señal del osciloscopio es bastante pobre, no se si es que siempre tiene que tener una carga o es que estoy haciendo algo mal.

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Control de Fase con Interupciones
« Respuesta #16 en: 18 de Julio de 2011, 18:12:37 »
¿Si esta bien la forma de usar la interrupcion externa y la interrupcion del timer0?, Entonces lo primero que tendria que hacer es detectar un flag de subida llamar al timer y saltar al primcipal para hacer el proceso, el pulso lo estoy haciendo con for y una variable auxiliar, no se si es la mejor manera de hacerlo.

ADC = read_adc();
PuMo = ADC + 1;

for( ADCUx = ADC; ADCUx <= PuMo; ADCUx++ )
{
  output_high( PIN_B2 );
}

¿esta bien hacerlo asi, y no se si esto me asegura que pueda tener angulos diferentes mientras el ADC va aunmentando?

en cuanto al cruce por cero lo hise con un optoacoplador pero tambien se puede hacer como dices con un comparador o con un transistor.

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Control de Fase con Interupciones
« Respuesta #17 en: 18 de Julio de 2011, 21:33:50 »
Hola.

Tal como esta, te puede tomar mas tiempo en la interrupción y la idea es demorarse lo menos posible en ellas ... mira el código que usé ... habría que asignar el valor de la conversión a la variable value y eso se puede hacer en el programa principal.

Saludos
El papel lo aguanta todo

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Control de Fase con Interupciones
« Respuesta #18 en: 19 de Julio de 2011, 23:49:24 »
hola que tal, ya cambie el proceso al principal pero sigue sin formarse el pulso creo que esta mal la forma de usar la interrupcion de timer0, ojala me puedan ayudar a corregir. GRACIAS.

#include <16F886.H>     
#device ADC = 10       
#fuses HS, NOWDT, NOLVP, PUT, MCLR 
#use delay( clock = 20M )   

int16 ADC, ADCI, ADCS;
int CamFlag, Pasa;

#INT_EXT
void ext_isr( void )
   {
      if( CamFlag == 0 )
         {
            Pasa = 0;
            ext_int_edge( 0, H_TO_L );
            CamFlag = 1;
         }
     
      else if( CamFlag == 1 )
         {
            Pasa = 1;
            ext_int_edge( 0, L_TO_H );
            CamFlag = 0;
         }
   }
   
#INT_TIMER0
void TIMER0_isr( void )
   {
      for( ADCI = ADC; ADCI <= ADCS; ADCI++ )
         {
            output_high( PIN_B2 );
         }
     
      disable_interrupts( INT_TIMER0 );
   }

void main( void )
   { 
      setup_adc_ports( SAN0 );     
      setup_adc( ADC_CLOCK_INTERNAL );
      set_adc_channel( 0 );
     
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_4 );
      set_timer0( 131 );

      while( 1 )
         {
            ADC = read_adc();
            delay_us( 10 );
            ADCS = ADC + 1;
     
            if( ADC == 1023 )
               {
                  ADCS = ADC;
                  ADC = ADC - 1;
               }
            if( Pasa == 0)
               {
                   enable_interrupts( INT_TIMER0 );
               }
            else if( Pasa == 1 )
               {
                  output_low( PIN_B2 );
               }
         }
   }

Desconectado MLO__

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 4581
Re: Control de Fase con Interupciones
« Respuesta #19 en: 19 de Julio de 2011, 23:56:18 »
Hola.

Mejor quita ese for dentro de la interrupcion del Timer0.

Saludos
El papel lo aguanta todo

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Control de Fase con Interupciones
« Respuesta #20 en: 21 de Julio de 2011, 02:32:08 »
HOLA que tal MLO, ya hise algo parecido a lo que tu hisite en tu codigo pero sigo sin resultado, ademastengo un problema en la simulacion de proteus me da un errorque dice: ADC conversion started before” wait “time has expired following previous conversion or channel change, no se por que pero creo que algo anda ma por ahi. Denuevodejo mi codigo para que me puedas corregir. GRACIAS.

#include <16F886.H>     
#device ADC = 10       
#fuses HS, NOWDT, NOLVP, PUT, MCLR 
#use delay( clock = 20M )   
#include <LCD_PORTC.C>

int16 ADC, ADCI, ADCS;
int CamFlag, Pasa, Cont = 0;

#INT_EXT
void ext_isr( void )
   {
      if( CamFlag == 0 )
         {
            Pasa = 0;
            ext_int_edge( 0, H_TO_L );
            CamFlag = 1;
         }
     
      else if( CamFlag == 1 )
         {
            Pasa = 1;
            ext_int_edge( 0, L_TO_H );
            CamFlag = 0;
         }
   }
   
#INT_TIMER0
void TIMER0_isr( void )
   {
      /*for( ADCI = ADC; ADCI <= ADCS; ADCI++ )
         {
            output_high( PIN_B2 );
         }*/
     
      Cont++;
      if( Cont == ADCS )
         {
            output_high( PIN_B2 );
         }
      disable_interrupts( INT_TIMER0 );
   }

void main( void )
   { 
      //lcd_init();
     
      setup_adc_ports( SAN0 );
      setup_adc( ADC_CLOCK_INTERNAL );
      set_adc_channel( 0 );
     
      setup_timer_0( RTCC_INTERNAL | RTCC_DIV_4 );
      set_timer0( 131 );
     
      CamFlag = 0;
      ext_int_edge( 0, L_TO_H );
      enable_interrupts( INT_EXT );
      enable_interrupts( GLOBAL );
     
         while( 1 )
            {               
              if( Pasa == 0 )
                 {   
                    ADC = read_adc();
                    delay_us( 10 );
                    ADCS = ADC + 1;
                     
                    if( ADC == 1023 )
                       {
                          ADCS = ADC;
                          //ADC = ADC - 1;
                       }
                   
                    enable_interrupts( INT_TIMER0 );
                 }
               
              else if( Pasa == 1 )
                 {
                    output_low( PIN_B2 );
                 }
            }
   }

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #21 en: 30 de Octubre de 2011, 18:42:00 »
hola gente, disculpen si los molesto este es mi primer post, no puedo crear un tema nuevo porq no tengo nivel suficiente y la mayoria de los temas relacionados no tienen actividad hace meses.
estoy intentado hacer un detector de cruce por cero por medio de la interrupciones por flanco, pero resulta que no me funciona no entra nunca a las interrupcion, los molesto para que me puedan dar una mano.

short band_flanco,band_cruce;

void interrupt() {
 if(INTCON.INT0IE){
 
  if (band_flanco==1)                    //aca me fijo cual semiciclo paso
  {
   band_flanco=0;
   }
   else
   {
   band_flanco=1;
   }
  band_cruce=1;
  INTCON.INT0IE=1;   
  INTCON.INT0IF=0;
 }
}

void main() {
unsigned conver=0,retardo=0;
TRISA=0b00000001;
TRISB=0b00000001;
PORTB=0b00000000;
 

delay_ms(200);     // retardo de 200 ms para esperar a que se estabilize la tension
INTCON.GIE=1;   // habilito las interrupciones globales
INTCON.INT0IE=1;  // habilito la interrupcion externa RB0
OPTION_REG.INTEDG=1;     //interrupcion en flanco positivo
band_flanco=1,band_cruce=0;
while(1){
PORTB.B4=1;                                                    // esto lo puse para saber si me entraba a la interrupcion
if (band_cruce)                                                  // significa q entro por una vez a la interrupcion
  {
  PORTB.B4=0;
    if (band_flanco==1)
   {
    INTEDG_bit=1;   //NO ESTOY SEGURO QUE SE PUEDA RE-CONFIGURAR LAS INTERRUPCIONES UNA VEZ FUNCIONANDO
    PORTB.B1=1;   // porq viene de detectar el flanco negativo
   }
   else
   {
   INTEDG_bit=0;
   PORTB.B2=1;          // vengo de detectar el flanco positivo, activo estas salida para saber donde estoy
   }
   delay_ms(5) ;              //lo coloque para probar
   PORTB.B3=1;                    //activo triac
   delay_ms(2);                        // lo mantengo para q se dispare el triac
   PORTB.B3=0;                       // desactivo triac
   band_cruce=0;
   }
 PORTB.B1=0;             //reinicio las salidas de indicacion de flanco
 PORTB.B2=0;
}
}

utilizo un 16f88, soy nuevo programando no tengo ninguna clase de base, la semana pasada gracias a uds aprendi a usar el converso a/d leyendo temas de diferentes foros, y ahora me puse con esto, segui los registro segun la hoja de dato del pic, pero capaz q me falte algo de experiencia.
saludos, gente y gracias.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Control de Fase con Interupciones
« Respuesta #22 en: 30 de Octubre de 2011, 19:00:59 »
con que lenguaje trabajas? CCS? C18?

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #23 en: 31 de Octubre de 2011, 11:48:00 »
disculpa mi ignorancia por lo poco que se, creo q utilizo el C18, porq utilizo el Micro C Pro y creo q fue microchip el q creo el C18.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Control de Fase con Interupciones
« Respuesta #24 en: 31 de Octubre de 2011, 12:06:45 »
entonces es mikroC lo que usas, el C18 es distinto.

en void interrup tienes que poner if(INTCON.INT0IF) no INT0IE

luego INTCON.INT0IF=0 y nada mas.

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #25 en: 31 de Octubre de 2011, 17:40:05 »
modifique lo me dijiste, ahora genere el .cof y lo utilizo en el proteus  y no me entra nunca a la interrupcion

se queda preguntando se band_cruce es uno, significa q no entra a la interrupcion. que puede ser debere configurar otros registros?

short band_flanco,band_cruce;
void interrupt() {
 if(INTCON.INTF){
   if (band_flanco==1)                    //aca me fijo cual semiciclo paso
  {
   band_flanco=0;
   }
   else
   {
   band_flanco=1;
   }
  band_cruce=1;
  INTCON.INTE=1;   
  INTCON.INTF=0;
 }
}

void main() {
unsigned conver=0;
retardo=0;
TRISA=0b00000001;
TRISB=0b00000001;
PORTB=0b00000000;
 
delay_ms(200);     // retardo de 200 ms para esperar a que se estabilize la tension
INTCON.GIE=1;   // habilito las interrupciones globales
INTCON.INTE=1;  // habilito la interrupcion externa RB0
OPTION_REG.INTEDG=1;     //interrupcion en flanco positivo
band_flanco=1;
band_cruce=0;
while(1){
PORTB.B4=1;                                                    // esto lo puse para saber si me entraba a la interrupcion
if (band_cruce)                                    <---aca se queda y salta a            // significa q entro por una vez a la interrupcion
  {
  PORTB.B4=0;
    if (band_flanco==1)
   {
    INTEDG_bit=1;   //NO ESTOY SEGURO QUE SE PUEDA RE-CONFIGURAR LAS INTERRUPCIONES UNA VEZ FUNCIONANDO
    PORTB.B1=1;   // porq viene de detectar el flanco negativo
   }
   else
   {
   INTEDG_bit=0;
   PORTB.B2=1;          // vengo de detectar el flanco positivo, activo estas salida para saber donde estoy
   }
   delay_ms(5) ;              //lo coloque para probar
   PORTB.B3=1;                    //activo triac
   delay_ms(2);                        // lo mantengo para q se dispare el triac
   PORTB.B3=0;                       // desactivo triac
   band_cruce=0;
   }
 PORTB.B1=0;          <---------aca para luego volver a preguntar por ban_cruce   //reinicio las salidas de indicacion de flanco
 PORTB.B2=0;
}
}



Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Control de Fase con Interupciones
« Respuesta #26 en: 31 de Octubre de 2011, 20:17:01 »
no hay mas registros para INT, como es tu circuito electrico?

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #27 en: 31 de Octubre de 2011, 22:25:04 »
Mil disculpa eso me pasa por simularlo en el proteus, anda perfecto este detector, lo grabe en el micro y lo puse en la placa. el unico problema es que detecta antes el cruce desde el semiciclo positivo al negativo. Pero sabiendo eso se le coloca un retardo de 2ms y se compensa, yo utilizo un trafo de 220 a 12 vac directo a RB0.

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Control de Fase con Interupciones
« Respuesta #28 en: 31 de Octubre de 2011, 23:31:17 »
12V AC directo a RB0????? Creo que dentro de poco te quedaras sin RB0

Desconectado gulafranco

  • PIC10
  • *
  • Mensajes: 7
Re: Control de Fase con Interupciones
« Respuesta #29 en: 01 de Noviembre de 2011, 09:42:48 »
si funciona bien, solo que le pongo una resistencia de 1 M, para limitar la corriente, pero funciona bien gracias a los diodos de sobretension que tienen los pines del pic, jejeej supongo q tambien se le podia poner directo los 220 vac con una resistencia de 5 M pero preferi aislar alta tension por las dudas.
Muchas Gracias, por contestar mis dudas, es la primera que me manejo en un foro y la verdad q me ayudaron mucho, asi q estoy dispuesta a ayudar en lo que pueda.
Un Abrazo