title | categories | subCategories | ||
---|---|---|---|---|
analogWrite() |
|
|
Scrive un valore analogico (onda PWM) ad un pin.
Può essere usato per illuminare un LED a luminosità variabile o pilotare un motore a diverse velocità.
Dopo una chiamata a analogWrite()
, il pin genererà un’onda quadra costante con il duty cycle specificato fino alla prossima chiamata a analogWrite()
( oppure digitalRead()
o digitalWrite()
) sullo stesso pin.
La frequenza del segnale PWM su molti pin è approssimativamente 490 Hz.
Sulla Uno e schede simili, i pin 5 e 6 hanno una frequenza di circa 980 Hz.
Sulla maggior parte delle schede Arduino ( quelle con ATmega168 o ATmega328P ), funziona sui pin 3, 5, 6, 9, 10, e 11.
Sull’Arduino Mega, funziona sui pin dal 2 al 13 e dal 44 al 46.
Le schede Arduino più vecchie con un ATmega8 supportano analogWrite()
solo sui pin 9, 10, e 11.
Arduino DUE supporta analogWrite()
sui pin da 2 a 13, oltre che sui pin DAC0 e DAC1.
Diversamente dai pin PWM, DAC0 e DAC1 sono convertitori digitale-analogico, e si comportano come veri output analogici.
Non hai bisogno di chiamare pinMode()
per impostare il pin come output prima di chiamare analogWrite()
.
La funzione analogWrite
non ha nulla a che vedere con i pin analogici o la funzione analogRead
.
analogWrite(pin, valore)
pin
: Il pin sul quale scrivere. Tipi di dato permessi: int.
valore
: il duty cycle: tra 0 ( sempre spento ) e 255 ( sempre acceso ). Tipi di dato permessi: int
Nulla
Imposta l’output del LED in modo proporzionale al valore letto dal potenziometro.
int ledPin = 9; // il LED connesso al pin 9
int analogPin = 3; // potenziometro connesso al pin A3
int val = 0; // variabile per conservare il valore letto
void setup()
{
pinMode(ledPin, OUTPUT); // imposta il pin come output
}
void loop()
{
val = analogRead(analogPin); // leggi il pin di input
analogWrite(ledPin, val / 4); // i valori di analogRead vanno da 0 a 1023, i valori di analogWrite da 0 a 255
}
Gli output PWM generati sui pin 5 e 6 avranno un duty cyle più alto di quello atteso. Questo a causa dell’interazione con le funzioni millis()
e delay()
, che condividono lo stesso timer interno usato per generare questi output PWM. Questo si noterà in particolare con impostazioni basse del duty-cycle (es. 0 - 10) e potrebbe risultare in un valore di 0 che non spegne completamente l’output sui pin 5 e 6.