REGOLAZIONE AUTOMATICA LUMINOSITÀ

Schema con Microcontrollore Utile a Mantenere la Luminosità Costante in una Stanza Variando la Luminosità di alcuni LED…


 
 
 
 




 

INTRO

Il seguente schema realizza il controllo PWM di un gruppo di LED o di un faretto LED in modo tale da mantenere sempre costante la luminosità di una stanza. Se vi è la luce solare il PWM che controlla i LED è al minimo o spento del tutto, se invece non vi è il sole il PWM sarà regolato in modo tale da avere la luminosità desiderata.

Il sistema quindi regola il PWM in funziona della luminosità ambientale per avere la luminosità desiderata.

Il sistema ha anche un pulsante per accendere o spegnere la luce.

Con una modifica, il sistema può anche controllare luci a 230V.

 




 

CODICE

Il codice è il seguente:




char value;                                //valore per variare il pwm
bit on;                                    //variabile on off
unsigned int luminosita, set;              //valori da convertire

void EXT_INT() iv 0x0008 ics ICS_AUTO {    //Interrupt accensione spegnimento

  on =   ~ on;                             //Spegni se acceso o viceversa

  if(!on){
    CCP1CON = 0b00000000;                  //Spegni PWM
    PORTC.F2 = 0;                          //Spegni LED%
  }
  else CCP1CON = 0b00001100;               //se on=1 accendi PWM

  Delay_ms(100);                           //Delay anti-rimbalzo

  INTCON.INT0IF = 0;                       //reset del flag int0
}

void main() {
  TRISC.F2 = 0;                        //uscita pwm portc2
  PORTC.F2 = 1;                        //uscita pwm attiva
  TRISB.F0=1;                          //Ingresso switch
  TRISB.F1=0;                          //Ingresso switch

  RCON.IPEN = 0;                       //disabilito la priorità degli interrupt
  INTCON.GIE = 1;                      //attivo gli interrupt
  INTCON2.INTEDG0 = 1;                 //interrupt sul fronte di salita  int0
  INTCON.INT0IE = 1;

  PR2 = 125;                           //valore per garantire una frequenza di 20KHZ del pwm
  T2CON = 0b00000100;                  //setting tmr2: postascaler 1:1, tmr2 on, prescaler 1:1
  CCPR1L = value;                      //valore affinchè DC=1 ccpr1l=0001100 ccp1con=0011...
  CCP1CON = 0b00001100;                //utilizza pwm e setta il valore di comparazione con i due lsb = 11

  adc_INIT();                          //inizializza l'ADC
  
  on = 1;                              //Accendi controllo

  while(1){

    if(on){                                  //Controlla se il sistema è acceso
      luminosita = ADC_Read(0);              //Converti la partizione dell'uscita
      set = ADC_Read(1);                     //Converti la partizione dell'uscita

      if(luminosita < (set-1) && value > 0){ //se il DC  non è massimo e luminosita
        value--;                             //è minore del valore di setting aumenta il DC
        CCP1CON = 0b00001100;                //Riattiva PWM se spento
       }

      if(luminosita > (set+1)){              //Se luminosita maggiore del valore di setting
        if(value < 125) value++;             //Se il DC non è massimo incrementa DC
        if(value == 125){                    //Se DC massimo ma luminosità < set
          CCP1CON = 0b00000000;              //Spegni PWM
          PORTC.F2 = 1;                      //Mantieni DC=100%
        }
      }
      CCPR1L = value;                        //inserisci il valore per variare il DC
    }
  }
}

//Ricordare che la tensione ai capi della fotoresistenza è inversamente
//proporzionale alla luminosità


Prima di tutto si inizializzano le variabili di controllo del Duty Cycle e le variabili convertite di luminosità e del valore di setting e infine la variabile per accensione e spegnimento.

Per accendere e spegnere il sistema si usa un interrupt e nel ciclo di interrupt si inverte lo stato, se il sistema è acceso si spegne o viceversa. Inoltre se il sistema è spento si spegne il PWM e i LED, se invece il sistema è acceso invece si accende anche il PWM. Inoltre nel ciclo di interrupt vi è un ciclo anti rimbalzo prima di riattivare l’interrupt.

Nel programma principale si settano gli ingressi e le uscite, si abilita l’interrupt del pin esterno 0 , si settano le caratteristiche del PWM, si inizializza l’ADC e infine si accende il sistema.

Nel ciclo infinito while(1) se il sistema è acceso si vanno a convertire i valori di luminosità e il valore di setting. Se la luminosità reale è maggiore del valore voluto (meno una certa soglia) si va a ridurre il valore del duty cycle e si accende il PWM nel caso fosse stato spento precedentemente. Anche se nell’if vi è il segno minore, bisogna ricordare che il sistema con generatore di corrente e foto resistenza genera una tensione che è inversamente proporzionale alla luminosità reale. Quindi se il valore di luminosità convertito è minore del valore di setting vuol dire che la luminosità reale è maggiore.

Se invece la luminosità reale è minore del valore di setting (più una certa soglia) e il duty cycle non è massimo, si incrementa il valore del Duty Cycle. Se il Duty Cycle è vicino al 100% ma la luminosità reale è minore del valore voluti si va a spegnere il PWM e si accendono i LED.

La configurazione dei fuses è quella mostrata nell’immagine sovrastante.

 





 
SCHEMA

Lo schema è il seguente:

La tensione di alimentazione è 5V stabilizzati e il microcontrollore è alimentato con tensione positiva al pin 20 e GND ai pin 8 e 19. I componenti per il clock del microcontrollore sono C1, C2 e il quarzo da 8MHz. Il microcontrollore viene mantenuto nello stato di funzionamento grazie alla tensione positiva sul pin 1 che si ha grazie alla resistenza R2.

Il pulsante di on/off porta un livello logico alto sul pin21 quando è premuto o un livello logico basso altrimenti. La tensione di setting viene generata da RV1 e stabilizzata da C4.

Il transistor Q3 serve a realizzare un riferimento di corrente del valore di circa 0.4mA, questa corrente è specchiata da Q2 e fluisce nella foto resistenza, creando una tensione inversamente proporzionale alla luminosità ambientale.

Infine i LED vengono pilotati da Q1 mentre R1 è una resistenza di protezione e il suo valore dipende dalla corrente dei LED, dalla tensione dei LED e dal loro numero. Il segnale di controllo è così fatto:

Q1 può essere sostituito da un MOSFET con corrente appropriata o da un transistor NPN con resistenza sulla base. Se si usa un transistor vi sarà una corrente massima dei LED che non può essere superata per non bruciare il microcontrollore (corrente massima LED Imax=25mA*hfe(transistor).

 

DOWNLOAD

Potete scaricare la simulazione con PROTEUS al seguente LINK!!!



 

[Voti Totali: 0 Media Voti: 0]
Segui la Nostra Pagina Facebook: Facebook

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *