Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Altri Linguaggi - Arduino, come realizzare un variatore di potenza che regola la luminosità di una lampadina?
Forum - Altri Linguaggi - Arduino, come realizzare un variatore di potenza che regola la luminosità di una lampadina?

Avatar
nicol167 (Normal User)
Newbie


Messaggi: 2
Iscritto: 22/02/2010

Segnala al moderatore
Postato alle 20:28
Venerdì, 27/01/2012
questo è quello che ho fatto:
però lo dovrei gestire con degli interrupt! aiutatemi!
int plsRegolatore = 0,  rit.Luminosità= 0;

void setup()
{
    pinMode(2,INPUT);
    pinMode(3,OUTPUT);
}

void loop()
{
    potenza =2;
    rit.Luminosità = 10 - int plsRegolatore;
    if (digitalRead(3) && int plsRegolatore > 0)
    {
        delay(rit.Luminosità);
        digitalWrite(3,HIGH);
        delay(1);
        digitalWrite(3,LOW);
    }
}

PM
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Up
3
Down
V
Segnala al moderatore
Postato alle 21:17
Venerdì, 27/01/2012
Sostanzialmente hai realizzato un impulso a periodo/frequenza variabile, con un uptime fisso a 1 ms.

C'è un modo più semplice, e corretto, di ottenere lo stesso risultato ma con maggiore precisione.

Usa analogWrite(pin, valore), con un valore compreso tra 0 e 255.

In questo modo attiverai un generatore di impulsi PWM con frequenza fissa a 490Hz e duty cycle variabile tra 0 e 100%, proporzionale al valore nella scala da 0 a 255 (quindi ad esempio 64 equivale al 25%, 128 = 50% ecc...).

In uscita al pin metti un filtro bassa basso RC a due stadi, (R=1k e C=4.7uF dovrebbe andare bene), in modo da ottenere una tensione continua (con un ripple trascurabile) compresa tra 0V e 5V esattamente proporzionale al duty cycle, e quindi proporzionale al valore impostato con analogWrite.

Considerando che la tensione di uscita può variare da 0V a 5V, e che possiedi 256 possibili valori da impostare, la risoluzione che ottieni è uguale a:

5 / 256 = (circa) 0.0195 V

Quindi puoi impostare la tensione di uscita con una precisione di circa 20mV.

Una volta chiamata la funzione analogWrite, quel pin avrà la sua uscita PWM a tempo indeterminato, finchè non chiami nuovamente analogWrite su quel pin.

Questo ti consente di gestire facilmente il tutto dentro un interrupt, che si attiva in base ad un certo evento esterno.
Ad esempio se hai due pulsanti che hanno la funzione di alzare e abbassare la luminosità, connessi ai pin 2 e 3 (gli unici che generano Interrupt in Arduino), con resistenza di pull-up e logica negativa (il pulsante chiuso porta il pin a massa), puoi impostare una funzione:

Codice sorgente - presumibilmente C++

  1. int globalIntensity = 0;
  2. void aumenta()
  3. {
  4.   if (globalIntensity < 255)
  5.     globalIntensity += 10;
  6.  
  7.   analogWrite(10, globalIntensity);
  8. }
  9. void diminuisci()
  10. {
  11.   if (globalIntensity > 0)
  12.     globalIntensity -= 10;
  13.  
  14.   analogWrite(10, globalIntensity);
  15. }
  16.  
  17. void setup()
  18. {
  19.     pinMode(2, INPUT); // gli interrupt sono generati solo dai pin 2 e 3
  20.     pinMode(3, INPUT); // questi sono i tasti Up e Down
  21.  
  22.     pinMode(10,OUTPUT);
  23.  
  24.     attachInterrupt(0, aumenta, FALLING); // Si attiva la funzione "aumenta" quando il livello logico scende da 1 a 0
  25.     attachInterrupt(1, diminuisci, FALLING); // come sopra
  26. }



Ricorda che l'interrupt 0 si trova sul pin 2, e l'interrupt 1 si trova sul pin 3.
Ho usato il pin 10 per l'output perchè i pin compatibili con PWM sono 3, 5, 6, 9, 10 e 11, di cui il 3 è già occupato in input e i pin 5,6 sono connessi allo stesso timer usato per il delay, quindi il duty cycle del PWM è leggermente sballato. I pin 9,10 e 11 sono i migliori candidati per questa funzione.

Studia un po' queste fonti:
http://arduino.cc/en/Reference/AnalogWrite
http://www.arduino.cc/en/Reference/AttachInterrupt
http://it.emcelettronica.com/come-utilizzare-la-pwm-genera ...

PS: Volendo, potevi anche postare nella sezione C++, visto che Arduino si programma in questo linguaggio, però l'ideale sarebbe una sezione di elettronica, che qui non abbiamo :-)

Ah, dimenticavo una cosa importante!
Le lampadine non vanno alimentate direttamente dal pin di arduino perchè assorbono troppa corrente, bruciando il microcontroller.
Devi usare l'uscita PWM, dopo 2 stadi di filtraggio, per pilotare un buffer di corrente (un semplice OpAmp con l'ingresso invertente connesso direttamente alla sua uscita), il quale potrà alimentare la lampadina (scegli un opamp con adeguata capacità di dissipazione). Oppure puoi usare un transistor di potenza, o un MOSFET, ma devi polarizzarlo correttamente per funzionare da buffer di corrente.
In generale, se devi pilotare un carico superiore a qualche milliWatt (una lampadina dissipa diversi Watt) devi sempre usare un transistor o un amplificatore operazionale di potenza, invece che usare direttamente l'uscita del microcontroller.

Ultima modifica effettuata da TheKaneB il 27/01/2012 alle 21:39
PM