czwartek, 20 sierpnia 2015

[5] Arduino - Generacja sygnału PWM

W tym wpisie chciałbym opisać PWM (ang. Pulse Width Generation). Przedstawię krótki opis teoretyczny wraz z praktycznymi przykładami.

PWM może zostać zastosowany np. do regulacji prędkości obrotowej wiatraka komputerowego. Przez co będzie możliwe podawanie napięcia zmiennego bardzo niskiego jak i wysokiego. 

Wstęp


PWM czyli modulacji szerokości impulsu. Polega na zmianie sygnału prądowego bądź napięciowego na sygnał impulsowy o stałej amplitudzie i częstotliwości.

Głównym parametrem sygnału PWM jest współczynnik wypełnienia, który można określić na podstawie wzoru:


Rys. 1.1. Przebieg PWM dla współczynnika wypełnienia 10%, 30% 50% oraz 90%.

Współczynnik wypełnienia = Szerokość impulsu * 100 / Okres sygnału

Okres sygnału = Czas stanu wysokiego + Czas stanu niskiego

Napięcie w trybie PWM podawane jest z przerwami czasowymi, co pozwala w łatwy sposób sterować prącą różnego typu urządzeń.

Przykład 1


Każda płytka Arduino wyposażona jest w wyjścia posiadające PWM. W wersji Uno są to piny 3,5,6,9,10 oraz 11.

W celu generacji takie sygnału wykorzystuje się komendę analogWrite(). Akceptuje na dwie wartości, pin na który ma być generowany sygnał, oraz wartość.

PWM jest 8 bitowy to znaczy, że można do niego wprowadzić wartości z zakresu od 0 do 255.

Wartość PWM może wahać się od 0 do 100%. Czyli na jeden procent przypada 2,55 ustawionej wartości.

Sygnał PWM generowany jest z pinu 10. Do niego podpiąłem diodę przez rezystor 1k.  Po generacji sygnału o wypełnieniu 0% następuje opóźnienie i generacja kolejnych sygnałów o większy wypełnieniach.

  1. const int PIN = 10;
  2. void setup()
  3. {
  4.   pinMode(PIN, OUTPUT);  //Ustawienie pinu 10 jako wyjście
  5. }
  6. void loop()
  7. {
  8.   analogWrite(PIN, 0);    //Wypełnienie 0
  9.   delay(2000);            //Opóźnienie
  10.   analogWrite(PIN, 64);   //Wypełnienie 25%
  11.   delay(2000);
  12.   analogWrite(PIN, 128);   //Wypełnienie 50%
  13.   delay(2000);
  14.   analogWrite(PIN, 192);   //Wypełnienie 75%
  15.   delay(2000);
  16.   analogWrite(PIN, 255);   //Wypełnienie 100%
  17.   delay(2000);
  18. }



Przykład 2


W przykładzie drugim wykorzystam pętle for pozwalające na dynamiczne przechodzenie pomiędzy stanem świecenia diody. Działanie programu opiera się na tej samej zasadzie co dla przykładu 1.
Wartości PWM będą się dynamicznie zmieniać od wartości 0 do 100%, następnie od 100% do 0.

  1. const int PIN = 10;
  2. int i=0;
  3. void setup()
  4. {
  5.   pinMode(PIN, OUTPUT);  //Ustawienie pinu 10 jako wyjście
  6. }
  7. void loop()
  8. {
  9.   for(i=0; i<256; i++)
  10.   {
  11.     analogWrite(PIN, i);
  12.     delay(50);
  13.   }
  14.   for(i=255; i>=0; i--)
  15.   {
  16.     analogWrite(PIN, i);
  17.     delay(50);
  18.   }
  19. }

Bibliografia:


[1]      https://www.arduino.cc/en/Tutorial/PWM
[2]      http://www.mikrokontrolery.org/artykuly/elektronika/130-pwm-modulacja-szerokoci-impulsu
[3]      https://www.arduino.cc/en/Tutorial/PWM