Autor Tema: dimer simultaneo con ano an1 y an2  (Leído 3967 veces)

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

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
dimer simultaneo con ano an1 y an2
« en: 19 de Agosto de 2006, 22:23:24 »
Amigos :tengo andando un dimer que hice con un pìc 16f873 , y me pasa lo siguiente:

utilizo el read_adc para cargarla como variable del delay de disparo del triac a traves del moc, y uso 3 canales adc.

utilizo deteccion por cero a traves de un pin del pic , todo bien,

cuando quiero hacer el multiplexado de los 3 canales , se vuelve loco.

alguna sugerencia ? ( quizas lo que quiero hacer no se puede :lol:)

desde ya gracias!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dimer simultaneo con ano an1 y an2
« Respuesta #1 en: 20 de Agosto de 2006, 01:53:13 »
¿A qué te refieres con "multiplexado de 3 canales"?, imagino que quieres que cada canal tenga una intensidad de iluminación distinta.

No veo porqué debe volverse loco, quizás si pegas tu código podríamos intentar ayudarte.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: dimer simultaneo con ano an1 y an2
« Respuesta #2 en: 20 de Agosto de 2006, 10:18:47 »
te lo paso. mi idea es hacer que 3 lineas de lamparas esten comandadas  simultaneamente con los dimer del pic via adc,o sea potes en ao a1 a2 regulando el brillo de las mismas

void crescendo ( void )
{


       R = read_adc () ;
       set_adc_channel ( 0 ) ;
    delay_us ( 10 ) ;
      if ( sinc == 0 )
      {
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;
         IR = DR =  1 ; delay_us ( 30 ) ;
         IR = DR =  0 ;
      }

    R = read_adc () ;
       set_adc_channel ( 1 ) ;
       delay_us ( 10 ) ;
     if ( sinc == 0 )
      {
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;
         IB = DB =  1 ; delay_us ( 30 ) ;
         IB = DB =  0 ;
      }
       R = read_adc () ;
       set_adc_channel ( 2 ) ;
       delay_us ( 10 ) ;
        if ( sinc == 0 )
      {
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;delay_us ( R ) ;
        delay_us ( R ) ; delay_us ( R ) ; delay_us ( R ) ;
         IB = DB =  1 ; delay_us ( 30 ) ;
         IB = DB =  0 ;

      }

}

el motivo de tantos delay es que no toma variables de mas de 255 en su argumento :shock:

el if sinc== 0 es la deteccion de paso por cero, con ir  dr  ig dg ib db le doy el disparo al moc que lo transmite al triac.


con un solo canal anda barbaro, le agrego los otros y empieza a temblar

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dimer simultaneo con ano an1 y an2
« Respuesta #3 en: 20 de Agosto de 2006, 11:44:29 »
Es lógico que falle en cuanto le metes más de un canal. Fíjate que mientras el pic está ejecutando el bloque de un canal, está haciendo esperas para llegar a levantar ese canal, pero tiene a los otros dos desatendidos. Cuando ha levantado ese canal, se queda en el bucle que llegue el próximo paso por 0, pero cuando llegue se encargará del retraso asignado a otro canal, y sólo a ese.

Te tiro una idea de cómo lo haría yo, a ver qué te parece:
Código: Objective-C
  1. bucle infinito
  2.         retraso0 = lectura_adc0()
  3.         retraso1 = lectura_adc1()
  4.         retraso2 = lectura_adc2()
  5.         mientras no cruce por cero, esperamos aquí
  6.         retraso = 0
  7.         bucle_espera
  8.                 si retraso = retraso0
  9.                         levanta_canal0
  10.                 si retraso = retraso1
  11.                         levanta_canal1
  12.                 si retraso = retraso2
  13.                         leventa_canal2
  14.                 incrementa retraso
  15.                 espera miniretraso
  16.         fin bucle_espera
  17. fin bucle_infinito

El valor de la variable miniretraso te permitirá jugar con la resolución de los pasos del dimmer y, dado que sólo quieres tener 256 posiciones, tendrás que ir cambiándolo para que encajen dentro de los 10ms de distancia que hay entre cada dos pasos por cero de la alterna a 50Hz.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: dimer simultaneo con ano an1 y an2
« Respuesta #4 en: 20 de Agosto de 2006, 12:50:34 »
ok gracias !!!  no logro entenderlo muy bien pero me parece que es masticarlo un poco... :lol:

lo importante es saber si lo que yo quiero hacer es posible

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dimer simultaneo con ano an1 y an2
« Respuesta #5 en: 20 de Agosto de 2006, 12:59:09 »
La filosofía del código que te he puesto es estar continuamente girando esperando un paso por 0, y entonces se pone a dar vueltas incrementando una variable de retraso.
Cuando el valor de esta variable alcanza uno de los tres valores de los canales, levanta el canal que corresponda, pero sigue dando vueltas en el bucle para atender a los otros dos cuando llegue su turno.

El valor de microretraso te permite establecer la velocidad de esos bucles y la variable retraso es la que controla el tiempo transcurrido desde el último paso por 0.

No sé si me he explicado bien, tengo la impresión de que lo he liado más. En fin, si lo intentas y no te funciona ve pegando por aquí el código que seguro que lo sacamos adelante.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: dimer simultaneo con ano an1 y an2
« Respuesta #6 en: 20 de Agosto de 2006, 14:08:07 »
ok gracias .lo pruebo....

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: dimer simultaneo con ano an1 y an2
« Respuesta #7 en: 22 de Agosto de 2006, 12:18:51 »
estoy tratando de hacerlo pero algo no camina bien.

puse un for para la actualizacion del retraso y los canales, los canales los leo bien, es decir que cuando toco los potes en la terminal leo enseguida la variacion del read_adc , pero el for tarda un monton en increnmentar su variable i , la cual comparo para los retrasos.Teoricamente i tiene que ser lo suficientemente veloz com para dar por lo menos 255 vueltas antes que transcurran los 10 milisegundos del semiciclo de la onda de 50 hz,

aca va el codigo:
void dimer ( void )
{
            if ( sinc == 0 )                              // si hay un paso por cero....
             {
               for ( i = 0 ; sinc == 1 ; i++ )      // entra en el for hasta que sinc vuelve a ser cero

                {  printf ( " r0 , r1  es :%U  ,  %u\n\r" , r0,r1) ;
                   printf ( " i es :%lU\n\r" , i ) ;
                   set_adc_channel ( 0 ) ;                 // selecciono el canal para que lo lea
                   delay_us ( 10 ) ;
                   R0 = read_adc () ;

                   if ( i == R0 )                               // si coincide i con el retraso al disparo
                   {
                   
                   IR = DR =  1 ; delay_us ( 30 ) ;   // dispara el triac
                   IR = DR =  0 ;                            // cesa el comando del disparo,pero el triac sigue...
                   }
                   set_adc_channel ( 1 ) ;                // selecciono el canal para que lo lea
                   delay_us ( 10 ) ;
                   R1 = read_adc () ;

                   if ( i == R1 )                              // si coincide i con el retraso al disparo
                   {
                   IG = DG =  1 ; delay_us ( 30 ) ;  // dispara el triac
                   IG = DG =  0 ;                           // cesa el comando del disparo,pero el triac sigue...
                   }
                   set_adc_channel ( 2 ) ;              // selecciono el canal para que lo lea
                   delay_us ( 10 ) ;
                   R2 = read_adc () ;

                   if ( i == R2 )                             // si coincide i con el retraso al disparo
                   {
                   IB = DB =  1 ; delay_us ( 30 ) ; // dispara el triac
                   IB = DB =  0 ;                          // cesa el comando del disparo,pero el triac sigue...
                   }

                }
            }
}
« Última modificación: 22 de Agosto de 2006, 12:22:27 por fastyx »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dimer simultaneo con ano an1 y an2
« Respuesta #8 en: 22 de Agosto de 2006, 12:44:04 »
Es difícil modificar un código sin probarlo, pero a ver si con los cambios que le he hecho tenemos más suerte:
Código: CSS
  1. void dimer ( void )
  2. {
  3.         while (TRUE) { // bucle infinito
  4.                         set_adc_channel ( 0 ) ;                 // selecciono el canal para que lo lea
  5.             delay_us ( 10 ) ;
  6.             R0 = read_adc () ;
  7.            
  8.             set_adc_channel ( 1 ) ;                // selecciono el canal para que lo lea
  9.             delay_us ( 10 ) ;
  10.             R1 = read_adc () ;          
  11.    
  12.             set_adc_channel ( 2 ) ;              // selecciono el canal para que lo lea
  13.             delay_us ( 10 ) ;
  14.             R2 = read_adc () ;
  15.  
  16.             printf ( " r0 , r1  es :%U  ,  %u\n\r" , r0,r1) ;                
  17.            
  18.             retraso = 0;
  19.             while ( sinc != 0 );                             // permence aquí hasta cruce por 0
  20.  
  21.             while (retraso<255) {      
  22.                 if ( retraso == R0 )                               // si coincide i con el retraso al disparo
  23.                    IR = DR =  1 ;                                                // dispara el triac
  24.                    
  25.                 if ( retraso == R1 )                              // si coincide i con el retraso al disparo
  26.                    IG = DG =  1 ;                                                       // dispara el triac
  27.                
  28.                 if ( retraso == R2 )                             // si coincide i con el retraso al disparo
  29.                    IB = DB =  1 ;                                                       // dispara el triac
  30.                
  31.                 delay_us (30); // este es el retraso que habría que ajustar para apurar los 10ms
  32.                  
  33.                 retraso++;
  34.                  
  35.                 }
  36.             IR = DR = IG = DG = IB = DB = 0;
  37.         }
  38. }

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: dimer simultaneo con ano an1 y an2
« Respuesta #9 en: 22 de Agosto de 2006, 21:00:45 »
Anduvo: me saco el sombrero. :D

ya que estamos : hay alguna forma de cargarle al argumento del delay con una variable que pueda ser mayor que 255 , o sea engañarlo de alguna manera?

desde ya gracias!!!

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re: dimer simultaneo con ano an1 y an2
« Respuesta #10 en: 23 de Agosto de 2006, 01:36:10 »
No veo porqué necesitas tanto retraso. Hagamos unos cálculos.

Tenemos que conseguir dividir un periodo de 10ms en 255 trocitos, que será la máxima resolución de tu dimmer. Cada uno de esos trocitos o miniperiodos será, por tanto, de 39us.

Incluso en el supuesto que todo el código de tu programa no ocupase ningún ciclo de reloj, tu delay llevaría un parámetro de 39us, cifra que es perfectamente manejable.

A pesar de eso, si te quedas corto con el delay_us, siempre puedes intentarlo con el delay_ms, que es igual que si lo multiplicas por 1000. No obstante, y como digo arriba, no entiendo para qué necesitas tanto retraso.

Desconectado fastyx

  • Colaborador
  • PIC18
  • *****
  • Mensajes: 353
Re: dimer simultaneo con ano an1 y an2
« Respuesta #11 en: 23 de Agosto de 2006, 08:13:23 »
tenes razón , el tema es que lo necesité para otra aplicacion y no sabia como resolverlo...