Arduino - Modulazione di larghezza di impulso
La modulazione di larghezza di impulso o PWM è una tecnica comune utilizzata per variare la larghezza degli impulsi in un treno di impulsi. PWM ha molte applicazioni come il controllo di servocomandi e regolatori di velocità, limitando la potenza effettiva di motori e LED.
Principio di base del PWM
La modulazione della larghezza di impulso è fondamentalmente un'onda quadra con un tempo alto e basso variabile. Un segnale PWM di base è mostrato nella figura seguente.
Esistono vari termini associati a PWM:
On-Time - La durata del segnale orario è alta.
Off-Time - La durata del segnale orario è bassa.
Period - È rappresentato come la somma dei tempi di accensione e spegnimento del segnale PWM.
Duty Cycle - È rappresentato come la percentuale del segnale orario che rimane acceso durante il periodo del segnale PWM.
Periodo
Come mostrato nella figura, T on indica l'ora di accensione e T off indica l'ora di spegnimento del segnale. Il periodo è la somma dei tempi di accensione e spegnimento ed è calcolato come mostrato nella seguente equazione:
$$ T_ {total} = T_ {on} + T_ {off} $$Ciclo di lavoro
Il ciclo di lavoro è calcolato come il tempo di attivazione del periodo di tempo. Utilizzando il periodo calcolato sopra, il ciclo di lavoro viene calcolato come:
$$ D = \ frac {T_ {on}} {T_ {on} + T_ {off}} = \ frac {T_ {on}} {T_ {total}} $$Funzione analogWrite ()
Il analogWrite()la funzione scrive un valore analogico (onda PWM) su un pin. Può essere utilizzato per accendere un LED a luminosità variabile o azionare un motore a varie velocità. Dopo una chiamata alla funzione analogWrite (), il pin genererà un'onda quadra costante del duty cycle specificato fino alla chiamata successiva ad analogWrite () o una chiamata a digitalRead () o digitalWrite () sullo stesso pin. La frequenza del segnale PWM sulla maggior parte dei pin è di circa 490 Hz. Sulle schede Uno e simili, i pin 5 e 6 hanno una frequenza di circa 980 Hz. Anche i pin 3 e 11 del Leonardo funzionano a 980 Hz.
Sulla maggior parte delle schede Arduino (quelle con ATmega168 o ATmega328), questa funzione funziona sui pin 3, 5, 6, 9, 10 e 11. Su Arduino Mega, funziona sui pin 2 - 13 e 44 - 46. Arduino precedente schede con supporto solo ATmega8 analogWrite() sui pin 9, 10 e 11.
L'Arduino Due supporta analogWrite()sui pin da 2 a 13 e sui pin DAC0 e DAC1. A differenza dei pin PWM, DAC0 e DAC1 sono convertitori da digitale ad analogico e agiscono come vere uscite analogiche.
Non è necessario chiamare pinMode () per impostare il pin come output prima di chiamare analogWrite ().
Sintassi della funzione analogWrite ()
analogWrite ( pin , value ) ;
value - il duty cycle: compreso tra 0 (sempre spento) e 255 (sempre acceso).
Example
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup() {
pinMode(ledPin, OUTPUT); // sets the pin as output
}
void loop() {
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023,
// analogWrite values from 0 to 255
}