Dissolvenza led: il pin PWM varia la tensione o è effetto ottico ?

Ciao ragazzi
ho qualche dubbio in merito ai pin PWM (e allo sketch della dissolvenza del led). Allora, questo è lo sketch:

int ledPin = 9;    // LED connected to digital pin 9

void setup()  { 
  // nothing happens in setup 
  Serial.begin(9600);
} 

void loop()  { 
  // fade in from min to max in increments of 5 points:
  for(int fadeValue = 0 ; fadeValue <= 255; fadeValue +=1) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
    
    Serial.println(fadeValue);
    delay(100);    
  } 

  // fade out from max to min in increments of 5 points:
  for(int fadeValue = 255 ; fadeValue >= 0; fadeValue -=1) { 
    // sets the value (range from 0 to 255):
    analogWrite(ledPin, fadeValue);         
     
      Serial.println(fadeValue);  
    delay(100);                            
  } 
}

se ho capito qualcosa, credo che il pin PWM generi un'onda quadra detta "duty cycle" che altro non è che il rapporto tra la durata del segnale HIGH e il periodo totale del segnale.
Nel mio caso, credo che il periodo totale del segnale sia di 100 ms.
Quindi la mia onda dovrebbe avere una frequenza di 10hz.

Siccome nello sketch c'è un ciclo for non posso fare un esempio pratico....
Quindi consideriamo solo quando il ciclo for, incrementando la variabile fadeValue, arriva ad un valore pari a 192.

In questo caso io ho un duty cycle del 75% (perché appunto su T - che è il periodo del segnale - t (periodo in cui il segnale è high) è pari al 75%).

Il led, con un duty cycle a 75% non è "illuminato a pieno regime". Io non capisco se ciò avviene perchè:

  1. dal pin PWM (in questo caso il pin 9) esce una tensione pari al valore del duty cycle (in questo caso 3,75 V),

oppure

  1. se in quei 100 ms, per 75 ms arriva al led una tensione di 5V (in realtà non ne arriva tanta perché c'è la resistenza) e nei restanti 25 ms una tensione di 0V. Beh se fosse cosi, non mi spiego la dissolvenza....

Non mi spiego la dissolvenza e cosa avviene al led in quei 100 ms .

Gentilmente, potreste farmi capire ?

Se ho scritto qualche cavolata ditelo :slight_smile:

P.s: siate clementi e pazienti :smiley:

Il duty cicle non è il nome dell'onda quadra, ma il rapporto fra la parte "alta" dell'onda rispetto il periodo (ciclo completo della stessa).

Per il resto è come dici tu, un pwm al 75%, per il 75% del tempo hai un segnale alto (5V nel caso di arduino), il restante 25% uno basso (0V).

A tutti gli effetti tu continui ad accendere e spegnere quel led, nel vero senso della parola.
La dissolvenza è un effetto ottico che percepisce l'occhio umano.
L'occhio "campiona" (passami il termine) a circa 25/30 fps, pertanto non percepisce questo continuo cambio di stato come un'accensione e spegnimento, ma appunto come una luminosità media.

Pertanto, variando il duty cicle ottieni l'effetto della dissolvenza, anche se di dissolvenza non si tratta, vari solamente il rapporto fra acceso e spento. :wink:

Aggiungo: il led si illumina perché è percorso da corrente quindi la frase "in realtà non ne arriva tanta perché c'è la resistenza" riferita alla tensione non ha senso.

Aggiungo :

Nel mio caso, credo che il periodo totale del segnale sia di 100 ms.
Quindi la mia onda dovrebbe avere una frequenza di 10hz.

la frequenza e' fissa e data dal valore di prescaler usato. In questo caso sul pin9 abbiamo 490Hz
http://playground.arduino.cc/Main/TimerPWMCheatsheet

Brado:
Il duty cicle non è il nome dell'onda quadra, ma il rapporto fra la parte "alta" dell'onda rispetto il periodo (ciclo completo della stessa).

Per il resto è come dici tu, un pwm al 75%, per il 75% del tempo hai un segnale alto (5V nel caso di arduino), il restante 25% uno basso (0V).

A tutti gli effetti tu continui ad accendere e spegnere quel led, nel vero senso della parola.
La dissolvenza è un effetto ottico che percepisce l'occhio umano.
L'occhio "campiona" (passami il termine) a circa 25/30 fps, pertanto non percepisce questo continuo cambio di stato come un'accensione e spegnimento, ma appunto come una luminosità media.

Pertanto, variando il duty cicle ottieni l'effetto della dissolvenza, anche se di dissolvenza non si tratta, vari solamente il rapporto fra acceso e spento. :wink:

25/30 fps sarebbero ? :slight_smile:

comunque ho modificato lo sketch, mettendo nel ciclo for solo valori di "fadeValue" compresi tra 120 e 150 (quindi diciamo prossimi ad un duty cycle dle 50%) e ho aumentato delay a 5000

Prendiamo in considerazione fadeValue= 127

possibile che il mio occhio non percepisca i due cambi di stato, che avvengono in 5 secondi ? ciascuno ogni 2,5 secondi ????

@Brunello

Frequenza= 1 / s

io credevo che s = delay(100) cioe 0,1 s

è sbagliato ??

analogWrite è già di per sè l'onda quadra, il ciclo for è superfluo. Nel tempo che aspetti i 0,1s l'onda quadra continua ad essere generata tramite interrupt legato ai timer(quindi non è influenzata da eventuali delay).

No, non ti è chiaro qualcosa ....

Il cambio di stato non è ogni 5 secondi!
Essendo il tuo pin a 490Hz, hai 490 cambi al secondo ... forse con qualche telecamera highspeed riesci a vedere il cambio di stato del led. :wink:

Leggiti questo fantastico articolo, ti toglierà più di un dubbio.

Ps.
fps > frame per second > fotogrammi al secondo

Brado:
No, non ti è chiaro qualcosa ....

Il cambio di stato non è ogni 5 secondi!
Essendo il tuo pin a 490Hz, hai 490 cambi al secondo ... forse con qualche telecamera highspeed riesci a vedere il cambio di stato del led. :wink:

Leggiti questo fantastico articolo, ti toglierà più di un dubbio.
Arduino – lezione 06: modulazione di larghezza di impulso (PWM) | Michele Maffucci

Ps.
fps > frame per second > fotogrammi al secondo

Ahhhhhhhh forse ora ho capito :smiley:

Siccome la frequenza dell'onda e' di 490 hz, i cambi di stato avvengono ogni (circa) 2 ms.

Quindi se io ad esempio gli impostassi un delay(4)

con fadeValue= 127 Quindi duty cycle 50%
se avessi una telecamera ad altissima velocita', noterei 4 cambi di stato, uno ogni millisecondo.

Giusto??

Se ad esempio ho fadeValue= 192

Nei 2 ms dell'onda quadra avrei :

1.5 ms HIGH
0.5 ms LOW

Giusto?

Il delay non varia minimamente la frequenza del PWM.
Puoi mettere anche un delay(10000000), ma il tuo led fa sempre 490 impulsi al secondo.

Quello che cambia è il tempo di "HIGH" in quei 2 ms.
A fare un analogWrite(9,127); più o meno equivale a fare:

loop (){
digitalwrite(9,HIGH);
delay (1);
digitalwrite(9,LOW);
delay(1);
}

Rodrigoson6:
Se ad esempio ho fadeValue= 192

Nei 2 ms dell'onda quadra avrei :

1.5 ms HIGH
0.5 ms LOW

Giusto?

Giusto.
Questo ce l'hai anche con un delay(8000), diciamo che il clock dell'uscita pwm è separato dell'esecuzione dello sketch.

Brado:

Rodrigoson6:
Se ad esempio ho fadeValue= 192

Nei 2 ms dell'onda quadra avrei :

1.5 ms HIGH
0.5 ms LOW

Giusto?

Giusto.
Questo ce l'hai anche con un delay(8000), diciamo che il clock dell'uscita pwm è separato dell'esecuzione dello sketch.

E con delay(8000) avrei

4000 cambi di stato da HIGH a LOW . Con fadeValue= 127 Duty cycle 50%
1 ms per stato :wink:

Capito :slight_smile:

Grazie mille :))

In 8 secondi avresti 3.920 cambi di stato (8 secondi per 490 Hz - frequenza pwm del pin 9).


Come vedi il periodo (la linea sotto) è sempre uguale, nel caso del pin 9 di arduino 2,04 ms.
Quello che varia è la proporzione fra HIGH e LOW.

Con DC 50%, circa 1ms per stato, come dici tu.
Con DC 90% avresti 1,8 ms HIGH e 0,2 ms LOW, ad esempio, e così via ...

Questo indipendentemente dal tempo che arduino impiega a fare altre operazioni, delay compreso (non associare pwm a delay!).

Se volessi vedere il led che si accende e spegne, avresti bisogno di una telecamera con almeno 500 fps (frame al secondo).
Oppure ti basterebbe un oscilloscopio, dove vedresti che l'ampiezza dell'onda quadra varia al variare del valore di pwm (praticamente l'immagine qui sopra).
Si sta parlando di una velocità superiore alle 16 volte di quanto l'occhio umano riesce a percepire, stessa cosa vale per i motori, non solo per i led.