Autor Tema: Dimmer con ADC  (Leído 2866 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Dimmer con ADC
« en: 31 de Julio de 2011, 22:27:47 »
Hola espero que me puedan ayudar, lo que estoy tratando de hacer es un pulso que dispare a un SCR, el pulso se tiene que mover de 0 a 8.33ms y necesito hacerlo con el ADC del micro y la reslocion es de 10 ( 1024 valores ), la forma de sincronizarlo con la linea es con cruce por cero y con una interrupcion externa, el pulso debe tener una duracion de 100useg, creo que lo forma de tener 100useg es con el timer, una duda que tengo es como puedo hacer que los 1024 valores del ADC puedan corresponder a 8.33ms y otra es que si estoy utilizando bien la interrupcion externa y la del timer, en foro leei que se tendria que dividir 8.33ms / 1024 que serian 8,1347useg pero eso no lo he entendido, dejo mi codigo para que me puedan ayudar a corregir. GRACIAS.

Código: [Seleccionar]
#include <16F886.H>
#device ADC = 10
#fuses HS, NOWDT, NOLVP, PUT, MCLR
#use delay( clock = 20M )

int16 CAD;
int CamFlag, Cont = 0;

#INT_EXT
void ext0_isr( void )
   {
      if( CamFlag == 0 )
         {              
            enable_interrupts( INT_TIMER0 );
                        
            ext_int_edge( 0, H_TO_L );
            CamFlag = 1;
         }
        
      else if( CamFlag == 1 )
         {
            output_low( PIN_B1 );
            output_low( PIN_B2 );
            
            ext_int_edge( 0, L_TO_H );
            CamFlag = 0;
         }
   }
  
#INT_TIMER0
void TIMER0_isr( void )
   {  
      Cont++;
      
      if( Cont < CAD )
         {
            output_low( PIN_B1 );
         }
      else if( Cont == CAD )
         {
            output_high( PIN_B1 );
            
            Cont = 0;
         }
      
      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_128 );
      set_timer0( 60 );
      
      CamFlag = 0;
      ext_int_edge( 0, L_TO_H );
      
      disable_interrupts( INT_TIMER0 );
      disable_interrupts( INT_TIMER1 );
      enable_interrupts( INT_EXT );
      enable_interrupts( GLOBAL );
      
      while( 1 )
         {
            CAD = read_adc();
         }        
   }

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dimmer con ADC
« Respuesta #1 en: 31 de Julio de 2011, 22:51:56 »
  La idea es que según el valor leído en el ADC se genere un delay. Si sabes que el máximo delay es de 8.33ms, entonces lo dividís en 1023 (que es el valor máximo capaz de leer el ADC) para saber cuanto delay generará cada paso que sumes en el ADC. Así se obtiene que cada paso del ADC debe incrementar el delay en 8.1427us .

  Cuando el ADC lee 0, el delay será 0 * 8.1427us -> delay 0
  Cuando el ADC lee 512, el delay será 512 * 8.1427us -> delay 4.1690ms
  Cuando el ADC lee 1023, el delay será 1023 * 8.1427us -> delay 8.3299ms
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Dimmer con ADC
« Respuesta #2 en: 31 de Julio de 2011, 23:06:15 »
 :( pero ese retardo lo tengo que generar con eltimer?, entonces cada que se mueva el ADC se tendra que cargar con un nuevo valor el timer o entendi mal?

CAD = rea_adc();

Carga = CAD * 8.1347ms; <------ con este valor tendria que cargar el timer?

set_timer0( CAD );

otra duda si estoy utilizando bien al #INT_EXT y la #INT_TIMER0?

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Dimmer con ADC
« Respuesta #3 en: 31 de Julio de 2011, 23:13:58 »
  Hay unas cosas que no entiendo... en el primer mensaje decís que tenés que generar un pulso de 0 a 8.33ms para disparar a un SCR, pero más avanzado en dicho mensaje hacés referencia a un pulso de 100us. No termino de entender de cuanto tiene que ser el pulso que necesitas generar.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Dimmer con ADC
« Respuesta #4 en: 31 de Julio de 2011, 23:16:33 »
podrias configurar tu timer1(porque es de 16 bits) para que en 10 bits te genere una interrupcion cada 8.3 ms y des el puslo para el scr. asi cada que tengas la interrupcion por cruce por cero, le cargas al timer el valor del ADC, de esa manera, entre mas grande sea el valor del ADC tardara menos tiempo en generarte el puso
"Nada es imposible, no si puedes imaginarlo"

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Dimmer con ADC
« Respuesta #5 en: 31 de Julio de 2011, 23:17:20 »
por lo que le entiendo cada 8.3 ms tiene que generar un pulso de 100 us para prender el triac
"Nada es imposible, no si puedes imaginarlo"

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Dimmer con ADC
« Respuesta #6 en: 31 de Julio de 2011, 23:41:05 »
GRACIAS por contestar.
Lo que Necesitoes que el pulso de 100useg se mueva en el intervalo del cruce por cero que es de 0 a 8.33ms

Desconectado MexaTronko

  • PIC10
  • *
  • Mensajes: 38
Re: Dimmer con ADC
« Respuesta #7 en: 31 de Julio de 2011, 23:44:16 »
El pulsito se necesita desplazar, cada que el ADC se mueva.

Desconectado rivale

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1707
Re: Dimmer con ADC
« Respuesta #8 en: 31 de Julio de 2011, 23:47:39 »
podrias configurar tu timer1(porque es de 16 bits) para que en 10 bits te genere una interrupcion cada 8.3 ms y des el puslo para el scr. asi cada que tengas la interrupcion por cruce por cero, le cargas al timer el valor del ADC, de esa manera, entre mas grande sea el valor del ADC tardara menos tiempo en generarte el puso
"Nada es imposible, no si puedes imaginarlo"