Dissolvenza Incrociata Per Lampade a 230V A 2 Canali Con Pic 16F876A

Stampa
( 0 Votes ) 
Valutazione attuale:  / 0
ScarsoOttimo 
Categoria: Elettronica
Data pubblicazione
Scritto da Primok_V Visite: 2592

Dissolvenza Incrociata Per Lampade a 230V A 2 Canali

Con Pic 16F876A



IL seguente circuito permette di  accendere 2 lampade a 230V in modo incrociato e dissolvente utilizzando un pic della serie 16F876A.I 2 pulsanti P1,P2 permettono di aumentare e ridurre rispettivamente la velocità di dissolvenza.





+

SCHEMA ELETTRICO
+
Descrizion

e

Il circuito è relativamente semplice ed è formato da un pic 16F876A, 2 fotoaccoppiatori MOC 3020, 2 triac , 2 transistor ed altri elementi di contorno per il corretto funzionamento del sistema.La tensione pulsata a 100Hz in uscita al ponte raddrizzatore, viene squadrata dal fotoaccoppiatore HCPL 2200; è possibile a tal proposito usare anche un transistor NPN alimentato sul collettore con +5V con l'uscita sull'emettitore attraverso una resistenza.Il segnale a 100Hz una volta squadrato viene inviato al PIN B4 del pic e servirà per sincronizzare i 2 impulsi presenti ai pin A0,A1 con la rete.Quando la sinusoide passerà per lo zero si avrà un fronte di salita sul pin B4 che attiverà un interrupt del micro per la gestione dei ritardi degli impulsi e la sincronizzazione del timer1; quest'ultimo servirà per il calcolo del ritardo da associare ai 2 impulsi.La variazione della luminosità delle 2 lampade sarà automatica e la velocità dipenderà dal valore impostato attraverso i pulsanti P1 e P2.Con P1 si può aumentare la velocità di  dissolvenza mentre con P2 si puo diminuire.I dettagli sono descritti nel codice sorgente.Il quarzo utilizzato è da 20 MHz ed è stato scelto apposta per avere una risoluzione di 0.2 us.I 2 segnali presenti sui pin A0,A1 sono sfasati di 180° di modo che quando una lampada è a luminosita massima, l'altra è completamente spenta.Man mano che i 2 impulsi si spostano in direzione opposta avremo che in una lampada la luminosità comincerà a calare mentre nell'altra comincerà ad aumentare ottenendo appunto l'effetto della dissolvenza incrociata.Nel seguente grafico sono sintetizzati i processi dei segnali e gli impulsi di pilotaggio dei fotoaccoppiatori che a loro volta pilotano i gate dei triac.

 

Alcuni andamenti




+  

Alcuni video


Video 1

Video 2

Codici

Dissolvenza.hex

Sorgente

 

#include "C: Documents and SettingsPrimok_VDesktopdissolvenza.h"

/*Il seguente codice genera 2 impulsi incrociati per pilotare  i gate dei 2 triac per
accendere gradualmente 2 lampade a 230V;questi sono sfasati tra di loro di 180° di modo
che quando il primo impulso parte da zero , il secondo parte da 180° .Con i 2 impulsi opportunamente ritardati è
possibile tosare la sinusoide per avere un valore efficace più basso che dipende dal ritardo con cui questi si presentano
per eccitare i gate.
I 2 impulsi viaggiano in direzione opposta ottenendo un effetto ottico opposto e cioè mentre la prima lampada si accende
partendo dalla sua minima intensità luminosa , la seconda parte dalla sua massima intensità .
Con due pulsanti, P1 e P2, è possibile regolare la velocità dei 2 impulsi di dissolvenza.*/

/* Dichiarazione variabili globali
Le variabili y e vel gestiscono rispettivamente il ritardo degli impulsi e la velocità di dissolvenza mentre
il resto delle variabili sono impiegate per il controllo di altri eventi.*/


short int dbutton4=0, dbutton5=0,dbutton6=0,dbutton7=0;
int32 x=0,cont=0,y=1,vel=5;
boolean  indietro=FALSE;

/* Per sincronizzare i 2 impulsi con la rete elettrica e per aumentare/diminuire la velocità di dissolvenza ho
utilizzato gli interrupt sui pin B4 ,B5 e B6;in particolare i 2 impulsi si spostano in direzione opposta subito dopo
il passaggio per lo zero della sinusoide che viene rilevato dal pin B4.Infatti quando la sinusoide passa per lo zero ,
sul pin 4 si ha un fronte di salita che abilita l'interrupt e che a sua volta abilta il timer1 per iviare i 2 impulsi dopo 
un certo ritardo stabilto dalla variabile y che viene incrementata ed aggiornata ogni 10ms.Il valore massimo per y è pari a 400 che significa aver raggiunto circa 10ms (100Hz).La velocità con cui i 2 impulsi si spostano in direzione opposta invece viene impostata attraverso i 2 pulsanti P1,P2 che aumentano e diminuiscono rispettivamente il valore della variabile vel come accennato prima.

Per aumentare la velocità di dissolvenza, attraverso il pulsante P1, ho usato l'interrupt
del pin B5,mentre per diminuirla ho utilizzato il pulsante P2 ed l'interrupt del pin  B6 associato.

/* Questa funzione è evocata  dal microcontrollore ogniqualvolta si verifica una variazione
di stato ( un fronte di salita ) del pin B4 o B5 o B6 o B7.Il pin B7 è vincolato a +5V quindi non varia mai il suo stato logico.*/

#int_RB
void  RB_isr(void)
{
int current;

static int last;

set_tris_b(0xF0);

current=input_b();

/* Se si ha un fronte di salita sul pin B4 allora viene abiltato il Timer1 e il suo interrupt associato e si incrementa la variabile cont.
Se cont raggiunge la velocità impostata dai pulsanti allora si prendono 2 strade a secondo del valore raggiunto dalla variabile y.
Se y vale 400 allora l'impulso 1 deve tornare indietro poichè vuol dire che ha raggiunto il suo massimo ritardo cioè 10ms.
Ovviamente l'impulso 2 sarà invece nella posizione opposta cioè varrà 0 che vuol dire ritardo zero.
Se invece y è minore di 400 , allora si deve procedere a far spostare l'impulso 1 in avanti e l'impulso 2 indietro.*/

if ((!bit_test(last,4))&&(bit_test(current,4))) {
    
    setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
    enable_interrupts(INT_TIMER1); 
    set_timer1(65535);
     x=0;cont++;
 
 if((cont==vel))
 {
    
   if((y<400)&&(!indietro))
   {
     y+=5;
 
   }
   if((y>=400))
  
     indietro=TRUE;
  if((y>=0)&&(indietro))
    {
       y-=5;
   
     if(y<=5)
      {
       y=5;
        indietro=FALSE;
    
       }
     }
     cont=0;
 }
 
      }
// Se si pigia P1 allora si diminuisce la variabile vel ( che vuol dire che cont raggiunge più velocemente vel ) e gli
// impulsi si spostano più velocemente     

if ((!bit_test(last,5))&&(bit_test(current,5))) {
 
   {
  
    if((vel>=1))
     {
          --vel;      
     if(vel<=1)
           vel=1;
         
cont=0;
     }
}

dbutton5=1;
 
   }

// Se si pigia P2 allora si aumenta la variabile vel ( che vuol dire che cont raggiunge meno velocemente vel ) e gli
// impulsi si spostano più lentamente    
  
if ((!bit_test(last,6))&&(bit_test(current,6)))
{
  
if(vel<=40)
   vel++;
  dbutton6=1;
 
   }
   if ((!bit_test(last,7))&&(bit_test(current,7)))
   {
  
   dbutton7=1;  
   }
 
   last=current;
}

// Con il timer1 si generano gli impulsi dopo un certo ritardo stabilto da y.
// Gli impulsi hanno un Ton pari a 100us e Toff pari a 100us
#int_TIMER1
void  TIMER1_isr(void)
{
x++;
   if(x==y)
 {  
     output_high(PIN_A0);
     delay_us(100);
      output_low(PIN_A0);
     delay_us(100);
 }


if(x==(400-y))
 {
     output_high(PIN_A1);
     delay_us(100);
      output_low(PIN_A1);
     delay_us(100);
 }

 set_timer1(65535);
}

void main()
{
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
// setup_spi(SPI_SS_DISABLED);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
 //setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
  enable_interrupts(INT_RB);
//enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
  
set_tris_b(0xF0);
set_tris_A(0x00);
output_A(0x00);

while(true)
   {
  
if(dbutton4)
                
           {   
        dbutton4=FALSE;
           }  
    if(dbutton5)
                
             {
                      
     dbutton5=FALSE;
              } 
      
    if(dbutton6)
                
             {   
  
      dbutton6=FALSE;
 
              }
   }             
           
}


Credo che non ci sia altro da aggiungere

 

Saluti

Primok_V
Joomla 1.7 Templates designed by College Jacke