PWM: emulacja pinów analogowych z płytą Arduino

Sygnały PWM

Dzięki cyfrowym i analogowym pinom na płytce Arduino można wysyłać i odbierać sygnały elektryczne, aby sterować projektami elektronicznymi lub pobierać z nich dane. Ponadto płytki te udostępniają inne, bardzo interesujące sygnały, takie jak sygnały PWM, które mogą emulować sygnał analogowy, nie będąc w rzeczywistości analogowymi. Innymi słowy, są to piny cyfrowe, które mogą zachowywać się podobnie (ale nie identycznie) do sygnału analogowego.

Tego typu sygnały są bardzo praktyczne, gdy chcesz użyć czegoś więcej niż tylko cyfrowych sygnałów HIGH i LOW (1 lub 0, ON i OFF), a zamiast tego opisać bardziej złożone sygnały. Na przykład, możesz modulować prędkość silnika prądu stałego , jasność światła, sterować elektromagnesem itp.

System analogowy vs cyfrowy

Sygnał analogowy vs cyfrowy

Układy elektroniczne można podzielić na dwie główne rodziny lub kategorie: cyfrowe i analogowe . Elektronika cyfrowa wykorzystuje wartości dyskretne, czyli układ binarny reprezentowany przez sygnały elektryczne niskiego lub wysokiego napięcia, do interpretacji stanu przetwarzanych bitów. Natomiast układy analogowe wykorzystują wartości ciągłe.

W systemach cyfrowych możemy wyróżnić systemy kombinacyjne i sekwencyjne . Systemy kombinacyjne to takie, w których sygnał wyjściowy zależy wyłącznie od stanu sygnałów wejściowych. Systemy sekwencyjne natomiast zawierają elementy pamięci, a ich sygnał wyjściowy zależy zarówno od aktualnego stanu sygnałów wejściowych, jak i stanu uprzednio zapisanego.

W przypadku sygnałów analogowych te dwie główne grupy lub warianty nie istnieją, ponieważ są to sygnały ciągłe, zawsze zależne od aktualnego sygnału systemowego . Na przykład, w głośniku, dostarczany do niego sygnał będzie zależał od odtwarzanego dźwięku. To samo dotyczy mikrofonu, który generuje sygnał analogowy na podstawie odbieranego dźwięku. Prawdopodobnie widziałeś to również w przypadku wielu innych czujników, które opisaliśmy na tym blogu, a które działają z sygnałami analogowymi (i dlatego konieczne było stworzenie wzoru, aby następnie obliczyć lub dostosować wartości w szkicach Arduino IDE)…

Te cechy każdego typu dają im zarówno zalety, jak i wady , jak to zwykle bywa w przypadku niemal wszystkiego. Na przykład systemy cyfrowe są generalnie tańsze, szybsze, łatwiejsze w rozwoju, pozwalają na łatwiejsze przechowywanie informacji, oferują większą dokładność, są programowalne i mniej podatne na zakłócenia itp. Prawdą jest jednak również, że systemy analogowe mogą obsługiwać bardziej złożone sygnały.

Na przykład cyfrowy czujnik Halla może jedynie wykrywać obecność lub brak pobliskiego pola magnetycznego. Analogowy czujnik Halla natomiast potrafi to robić, a także określać gęstość tego pola magnetycznego dzięki sygnałowi analogowemu generowanemu na wyjściu. Prawidłowa interpretacja tego sygnału o wyższym lub niższym napięciu pozwala łatwo określić jego wartość. Inne przykłady można znaleźć w wielu wielkościach naturalnych, które można mierzyć ilościowo za pomocą układu analogowego, takich jak temperatura, czas, ciśnienie, odległość, dźwięk itd.

Sygnał analogowy vs cyfrowy

Oznacza to, że sygnał analogowy to napięcie lub prąd elektryczny, który zmienia się w sposób ciągły w czasie. Przedstawiony na wykresie sygnał analogowy byłby falą sinusoidalną o jednej częstotliwości.

Jeśli chodzi o sygnał cyfrowy , jest to napięcie, które zmienia się skokowo w czasie. Oznacza to, że jeśli zostanie on przedstawiony na wykresie, będzie to sygnał skokowy, który nie zmienia się w sposób ciągły, lecz skokowo lub skokowo.

Powinieneś wiedzieć, że istnieją układy konwertujące sygnał analogowy na cyfrowy i odwrotnie. Te przetworniki znane są jako przetworniki cyfrowo-analogowe (DAC) i analogowo-cyfrowe (ADC). Są one powszechnie stosowane w wielu urządzeniach, z których korzystamy obecnie, takich jak telewizory, komputery itp. Umożliwiają one elektroniczną konwersję sygnałów cyfrowych używanych przez te urządzenia, dzięki czemu mogą one współpracować z innymi urządzeniami peryferyjnymi lub komponentami działającymi w trybie analogowym.

Na przykład głośnik lub mikrofon z sygnałami analogowymi, który współpracuje z kartą dźwiękową, lub cyfrowe karty graficzne, które mają słynny układ RAMDAC dla analogowych portów monitora… Arduino również wykorzystuje tego typu konwertery w wielu projektach, jak zobaczymy…

Co to jest PWM?

graficzny cykl pracy

Chociaż PWM (modulacja szerokości impulsu) jest oparta na technologii cyfrowej, jej kształt sygnału przypomina nieco „kwadratowy” sygnał analogowy. Pozwala ona na zmianę sygnału za pomocą impulsów cyfrowych, emulując system analogowy, jak wspomniałem wcześniej. W rzeczywistości sama nazwa wskazuje na jej działanie poprzez szerokość impulsów cyfrowych.

Jest to korzystne dla Arduino , ponieważ wiele urządzeń automatyki lub komponentów elektronicznych, które można dodać do projektów, nie jest w stanie dostarczyć prawdziwego sygnału analogowego ; zamiast tego wykorzystują one modulację PWM. Nie mogą one również wykorzystywać dyskretnego sygnału analogowego – czyli takiego, który zmienia poziomy napięcia, aby przypominał sygnał cyfrowy. Mogą natomiast wykorzystać wyjście cyfrowe – Vcc lub cyfrowe Vcc – do generowania tego unikalnego sygnału.

PWM to zatem swego rodzaju „sztuczka”, która pozwala Arduino i innym systemom na współpracę z sygnałami, które nie są ani w pełni analogowe, ani konwencjonalnie cyfrowe . Aby to osiągnąć, utrzymują one wyjście cyfrowe aktywne przez określony czas lub wyłączone, w zależności od potrzeb w danym momencie. Różni się to od standardowego sygnału zegara cyfrowego lub kodu binarnego, którego impulsy mają jednakową szerokość.

W projektach Arduino można zaobserwować ten typ sygnału PWM, w którym stała częstotliwość impulsów jest utrzymywana w czasie, ale szerokość impulsu jest zmienna . W rzeczywistości czas, w którym sygnał pozostaje w stanie wysokim w stosunku do całkowitego cyklu, nazywa się współczynnikiem wypełnienia. Dlatego współczynnik wypełnienia jest wyrażany w procentach.

Należy pamiętać, że PWM nie działa jak sygnał analogowy, oscylując między różnymi wartościami napięcia. W przypadku PWM jest to fala prostokątna, podobna do sygnału cyfrowego, której maksymalna wartość wynosi Vcc . Na przykład, jeśli pracujesz z zasilaczem 3 V, możesz generować impulsy o napięciu 3 V lub 0 V, ale nie 1 V ani żadnej innej wartości pośredniej, jak w przypadku rzeczywistego sygnału analogowego. W takim przypadku zmienia się szerokość impulsu, którą możesz utrzymywać na poziomie 30% przy tej wysokiej wartości Vcc lub na poziomie 60%, aby zwiększyć moc, i tak dalej.

Należy jednak zachować ostrożność, ponieważ przekroczenie limitu Vcc urządzenia z modulacją PWM może spowodować uszkodzenie. Dlatego należy zawsze przestrzegać specyfikacji producenta zawartych w karcie katalogowej. Ponadto, w niektórych urządzeniach, takich jak silniki prądu stałego, przekaźniki , elektromagnesy itp., spadek napięcia po cyklu pracy może prowadzić do uszkodzenia przez obciążenia indukcyjne. Z tego powodu należy wdrożyć odpowiednie środki bezpieczeństwa.

PWM na Arduino

Magistrala Arduino I2C

Teraz, gdy wiesz, jak to działa, zobaczmy konkretny przypadek PWM w świecie Arduino ...

PWM: pinout na Arduino

Płytki Arduino posiadają kilka pinów, które implementują sprzętową funkcję PWM. Można je zidentyfikować na samej płytce PCB, ponieważ obok numeru pinu znajduje się symbol tyldy (~) . Można to również zrobić programowo w kodzie Arduino, ale przeciążałoby to mikrokontroler, co jest absurdalne, biorąc pod uwagę, że można to zrobić natywnie w sprzęcie.

  • Arduino UNO, Mini i Nano- Masz 6 8-bitowych wyjść PWM na pinach 3, 5, 6, 9, 10 i 11, które będą miały to ~ tuż przed numerem.
  • Arduino Mega- Na tej najpotężniejszej płycie Arduino masz 15 8-bitowych wyjść PWM. Znajdują się na pinach od 2 do 13 i od 44 do 46.
  • Duet Arduino: w tym przypadku jest 13 8-bitowych wyjść PWM. Znajdują się na pinach od 2 do 13 plus dwa inne wyjścia analogowe dyskretne przez przetwornik cyfrowo-analogowy o rozdzielczości 12 bitów.

Mówiąc o rozdzielczości 8-bitowej lub 12-bitowej itd. w tym typie wyjścia PWM, mamy na myśli dostępny zakres regulacji. Przy 8 bitach dostępnych jest 256 poziomów regulacji, a przy 12 bitach – 4096.

Sterowanie za pomocą timerów

Do sprzętowego sterowania PWM Arduino wykorzystuje timery . Każdy timer może obsługiwać dwa lub trzy wyjścia PWM. Rejestr porównawczy dla każdego wyjścia uzupełnia ten system, dzięki czemu po osiągnięciu wartości w rejestrze, stan lub wartość wyjścia zostaje zmieniona, aby zatrzymać cykle pracy. Nawet jeśli dwa wyjścia są sterowane tym samym timerem, mogą one mieć różne cykle pracy, mimo że mają tę samą częstotliwość.

W przypadku timerów powiązanych z każdym pinem PWM, będą się one różnić w zależności od typu posiadanej płytki Arduino:

  • Arduino UNO, Mini i Nano:
    • Timer 0 - 5 i 6
    • Timer 1 - 9 i 10
    • Timer 2 - 3 i 11
  • Arduino Mega:
    • Timer 0 - 4 i 13
    • Timer 1 - 11 i 12
    • Timer 2 - 9 i 10
    • Timer 3 - 2, 3 i 5
    • Timer 4 - 6, 7 i 8
    • Timer 5 - 44, 45 i 46

Rejestr preskalera dzieli czas przez liczbę całkowitą, a timer przetwarza resztę, sterując każdym z powiązanych wyjść PWM. Zmiana wartości rejestru zmienia częstotliwość. Częstotliwości będą się również różnić w zależności od timera i płytki.

  • Arduino UNO, Mini i Nano:
    • Timer0: umożliwia przeskalowanie 1, 8, 64, 256 i 1024. Częstotliwość 62.5 kHz.
    • Timer1: z ustawieniami wstępnymi 1, 8, 64, 256 i 1024. Z częstotliwością 31.25 kHz.
    • Timer2: równy Timer1, tyle że dodaje również przeskalowanie 32 i 128 oprócz poprzednich.
  • Arduino Mega:
    • Timer 0, 1, 2: tak samo jak powyżej.
    • Timer3, 4 i 5: z częstotliwością 31.25 kHz i przeskalowaną 1, 8, 64, 256 i 1024.

Niezgodności i konflikty

Timer powiązany z wyjściami nie jest przeznaczony tylko dla tej funkcji ; jest również używany przez inne. Dlatego jeśli jest używany przez inną funkcję, musisz wybrać między jednym a drugim; nie możesz używać obu jednocześnie. Na przykład, oto niektóre niezgodności, które możesz napotkać w swoich projektach:

  • Biblioteka serwo: Podczas korzystania z serwomotorów intensywnie używane są timery, co może prowadzić do konfliktów. W szczególności użyj Timer1 dla UNO, Nano i Mini, to znaczy nie możesz używać pinów 9 i 10 podczas używania szkicu z tą biblioteką. W Mega będzie to zależało od ilości serw ...
  • SPI: Jeśli komunikacja SPI jest używana na płycie Arduino, pin 11 jest używany do funkcji MOSI. Dlatego nie można użyć tego pinu PWM.
  • Ton: ta funkcja wykorzystuje Timer2 do działania. Więc jeśli jest używany, robisz piny 3 i 11 (lub 9 i 10 dla Mega) bezużyteczne.

Praktyczny test z Arduino

Schemat Arduino PWM z diodą LED

Jeśli chcesz zobaczyć na własne oczy, jak działa PWM w Arduino, najlepszym rozwiązaniem jest podłączenie sond woltomierza lub multimetru (ustawionego na pomiar napięcia) między wybranym pinem PWM a pinem masy (GND) na płytce Arduino. W ten sposób będziesz mógł obserwować zmiany napięcia na ekranie urządzenia pomiarowego, a dzięki technice PWM sygnał wyjściowy będzie cyfrowy.

Możesz wymienić woltomierz / multimetr na diodę LED, aby zobaczyć, jak zmienia się intensywność światła, za pomocą silnika prądu stałego lub dowolnego innego elementu, który chcesz. Uprościłem to na schemacie z Fritzingiem z diodą bez więcej, ale wiesz, że może to również reprezentować końcówki multimetru ...

Jeśli używasz diody LED, pamiętaj o oporze na katodzie i GND.

do kod źródłowy Aby sterować mikrokontrolerem płyty Arduino, aby wszystko działało, należy włożyć to do Arduino IDE (w tym przypadku użyłem pinu 6 PWM Arduino UNO):

const int analogOutPin = 6;
byte outputValue = 0;  
 
void setup()
{  
   Serial.begin(9600);        
   pinMode(ledPIN , OUTPUT); 
 
   bitSet(DDRB, 5);       // LED o voltímetro
   bitSet(PCICR, PCIE0);       
   bitSet(PCMSK0, PCINT3);     
}
 
void loop() 
{
   if (Serial.available()>0)  
   {
      if(outputValue >= '0' && outputValue <= '9')
      {
         outputValue = Serial.read();   // Leemos la opción
         outputValue -= '0';      // Restamos '0' para convertir a un número
         outputValue *= 25;      // Multiplicamos x25 para pasar a una escala 0 a 250
         analogWrite(ledPIN , outputValue);
      }
   }
}  
 
ISR(PCINT0_vect)
{
   if(bitRead(PINB, 3))
   { 
      bitSet(PORTB, 5);   // LED on 
   }
   else
   { 
      bitClear(PORTB, 5); // LED off  
   } 
} 
Radzę pobawić się wartościami i zobaczyć wyniki na lampce lub woltomierzu. Program może otrzymać wartości od 0 do 9, więc możesz zobaczyć, jak wszystko się zmienia. Aby uzyskać więcej informacji, radzę kurs arduino które mamy do pobrania za darmo ...

Dodaj jako preferowane źródło w Google