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
}