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

Sygnały PWM

Dzięki pinom cyfrowym i analogowym, których możesz używać na swojej płycie Arduino, możesz odbierać lub wysyłać sygnały elektryczne do sterowania lub uzyskiwania danych z projektów elektronicznych. Poza tym w tego typu płytce są inne bardzo ciekawe sygnały i to są PWM, które mogą emulować sygnał analogowy, nie będąc w rzeczywistości analogiem. Oznacza to, że są to piny cyfrowe, które mogą działać podobnie (nie tak samo) jak sygnał analogowy.

Tego typu sygnały są bardzo praktyczne, gdy chcesz nie tylko używać cyfrowych sygnałów WYSOKI i NISKI, to znaczy 1 lub 0, WŁ. I WYŁ., Ale chcesz przejść dalej i opisać nieco bardziej złożone sygnały. Na przykład możliwe jest modulowanie prędkości silnik prądu stałegolub natężenie światła w przypadku elektrozaworu itp.

System analogowy vs cyfrowy

Sygnał analogowy vs cyfrowy

Obwody elektroniczne można podzielić na dwie duże rodziny lub kategorie: cyfrowe i analogowe. Mówiąc o elektronice cyfrowej, używamy wielkości o wartościach dyskretnych, to znaczy układu binarnego reprezentowanego przez sygnały elektryczne o niskim lub wysokim napięciu, aby zinterpretować stan tych bitów, które są obsługiwane. Z drugiej strony, gdy jest to obwód analogowy, używane są wielkości o wartościach ciągłych.

W systemach cyfrowych można z kolei znaleźć te typu kombinacyjnego i sekwencyjne. Oznacza to, że te pierwsze to te, w których wyjście systemu zależy tylko od stanu wejść. Z drugiej strony w sekwencyjnych uwzględnione są elementy pamięci, a wyjście będzie zależało od aktualnego stanu wejść i poprzedniego zapisanego stanu.

W przypadku analogów nie ma tych dwóch dużych grup lub wariantów, ponieważ tutaj są to ciągłe sygnały, od których zawsze będą zależeć sygnał aktualny system. Na przykład w głośniku dostarczany do niego sygnał będzie zależał od dźwięku, który chcesz odtworzyć. To samo z mikrofonem, który będzie generował sygnał analogowy w zależności od odbieranego dźwięku. Z pewnością widziałeś to również z wieloma innymi czujnikami, które opisaliśmy na tym blogu i które działają z sygnałami analogowymi (dlatego też należało stworzyć formułę, aby później wartości mogły być obliczane lub warunkowane w szkicach Arduino IDE ) ...

Te cechy jednego i drugiego sprawiają, że niektórzy mają swoje zalety i wady, jak to zwykle bywa w prawie wszystkim. Na przykład cyfrowe są zwykle tańsze, szybsze, łatwiejsze w opracowaniu, informacje można łatwiej przechowywać, mają większą dokładność, dają się zaprogramować, nie są tak podatne na działanie hałasu itp. Ale prawdą jest również to, że z analogiem można pracować z bardziej złożonymi sygnałami.

przez ejemplo, cyfrowy czujnik efektu Halla może wykryć tylko obecność lub brak pobliskiego pola magnetycznego. Zamiast tego, analogowy czujnik Halla może to zrobić, a także określić gęstość wspomnianego pola magnetycznego dzięki sygnałowi analogowemu, który generuje na swoim wyjściu. Wiedząc, jak dobrze zinterpretować ten sygnał o wyższym lub niższym napięciu, możesz łatwo poznać tę wielkość. Masz inne przykłady w wielu wielkościach natury, które możesz zmierzyć ilościowo za pomocą systemu analogowego, takie jak temperatura, czas, ciśnienie, odległość, dźwięk itp.

Sygnał analogowy vs cyfrowy

Biorąc to pod uwagę, a sygnał analogowy Będzie to napięcie lub prąd elektryczny, który zmienia się w czasie i w sposób ciągły. Na wykresie sygnał analogowy byłby sinusoidą o pojedynczej częstotliwości.

W sygnał cyfrowy, to napięcie, które zmienia się stopniowo w czasie. Oznacza to, że jeśli jest przedstawiony na wykresie, będzie to sygnał krokowy, który nie zmienia się w sposób ciągły, ale zmienia się w krokach lub dyskretnych przyrostach.

Powinieneś wiedzieć, że istnieją obwody, które przechodzą od sygnału analogowego do cyfrowego lub odwrotnie. Te konwertery są one znane jako DAC (Digital-to-Analog Converter) i ADC (Analog-to-Digital Converter). I są bardzo powszechne w wielu urządzeniach, z których dziś korzystamy, takich jak telewizor, komputery itp. Dzięki nim możesz konwertować sygnały cyfrowe używane przez te urządzenia na poziom elektroniczny, aby współpracować z innymi urządzeniami peryferyjnymi lub częściami, które działają analogowo.

przez ejemplo, głośnik lub mikrofon z sygnałami analogowymi współpracujący z kartą dźwiękową lub cyfrowe karty graficzne, które miały słynny układ RAMDAC dla portów analogowych monitorów ... W Arduino tego typu konwertery są również wykorzystywane do wielu projektów, jak zobaczymy ...

Co to jest PWM?

graficzny cykl pracy

Chociaż PWM (modulacja szerokości impulsu) lub modulacja szerokości impulsu, ma podstawę cyfrową, jego sygnał kształtem przypomina nieco „kwadratowy” sygnał analogowy. Pozwala za pomocą cyfrowych impulsów zmieniać sygnał w celu emulacji systemu analogowego, jak już wspomniałem. W rzeczywistości, jeśli spojrzysz na nazwę, już daje ona wskazówki na temat tego, co robi, poprzez szerokość cyfrowych impulsów.

Jest to korzystne dla Arduino ponieważ istnieje wiele automatów lub elementów elektronicznych, które możesz dodać do swoich projektów i tak dalej nie są w stanie zapewnić prawdziwego sygnału analogowego, ale używają tego PWM do działania. Nie mogą też używać zdyskretyzowanego sygnału analogowego, to znaczy, który przechodzi do skoków napięcia, aby przypominać sygnał cyfrowy. To, co mogą zrobić, to użyć wyjścia cyfrowego -Vcc lub Vcc typu cyfrowego do wygenerowania tego szczególnego sygnału ...

Dlatego PWM jest rodzajem „triku”, z którym Arduino i inne systemy mogą współpracować z tego typu sygnałami, które nie są one całkowicie analogowe ani konwencjonalne cyfrowe. Aby było to możliwe, utrzymują wyjście cyfrowe aktywne przez określony czas lub wyłączone, w zależności od zainteresowania przez cały czas. Jest to dalekie od tego, co byłoby cyfrowym sygnałem zegara lub kodem binarnym, którego impulsy mają tę samą szerokość.

W swoich projektach z Arduino możesz sprawdzić tego typu sygnały PWM, w których utrzymywana jest stała częstotliwość wyzwalania impulsów w czasie, ale szerokość tych impulsów jest zróżnicowana. W rzeczywistości nazywa się to cyklem pracy, gdy sygnał jest utrzymywany na wysokim poziomie w odniesieniu do całego cyklu. Dlatego cykl pracy jest podawany w%.

Pamiętaj, że w PWM nie pracujesz tak jak w sygnale analogowym, pomiędzy różnymi wartościami napięć i waha się między nimi. W przypadku PWM jest to sygnał kwadratowy w stylu cyfrowym i którego maksymalna wartość to Vcc. Na przykład, jeśli pracujesz z zasilaniem 3 V, możesz podawać impulsy 3 V lub 0 V, ale nie 1 V lub jakąkolwiek inną wartość pośrednią, jaka wystąpiłaby w prawdziwym analogu. W takim przypadku zmieniłaby się szerokość impulsu, którą możemy utrzymać 30% przy tej wysokiej wartości Vcc lub 60%, aby zwiększyć moc itp.

Ale bądź ostrożny, ponieważ jeśli urządzenie obsługuje limit Vcc i zostanie przekroczone przez PWM, może zostać uszkodzone. Dlatego zawsze konieczne byłoby przestrzeganie wartości zawartych w arkuszach danych dostarczonych przez producentów. Ponadto w niektórych urządzeniach, takich jak silniki prądu stałego, przekaźniki, elektromagnesów itp., zanik napięcia po cyklu pracy może oznaczać, że obciążenia indukcyjne mogą powodować uszkodzenia. Dlatego właśnie zabezpieczenia aktualny.

PWM na Arduino

Magistrala Arduino I2C

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

PWM: pinout na Arduino

Na płytkach Arduino można znaleźć kilka pinów realizujących sprzętowe PWM. Możesz je zidentyfikować na samej płytce drukowanej, ponieważ mają symbol ~ (mała głowa) wraz z numeracją pinów. Można to również zrobić za pomocą oprogramowania w kodzie Arduino, ale to przeciążałoby mikrokontroler pracą, coś absurdalnego, gdy można to zrobić natywnie i sprzętowo ...

  • 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 itp., W tego typu wyjściach PWM masz na myśli pole manewru, które masz. Z 8 bitów ma 256 poziomów pomiędzy którymi możesz się zmieniać, a 12 bitów dochodzi do 4096 poziomów.

Sterowanie za pomocą timerów

Do sprzętowego sterowania PWM, Arduino użyje timerów dla tego. Każdy obecny Timer może obsługiwać 2 lub 3 wyjścia PWM. Rejestr porównawczy dla każdego wyjścia uzupełnia ten system, tak że gdy czas osiągnie wartość rejestru, stan lub wartość wyjścia jest zmieniana, aby zatrzymać te cykle pracy. Chociaż istnieją dwa wyjścia sterowane tym samym timerem, oba mogą mieć różne cykle pracy, chociaż mają tę samą częstotliwość.

W przypadku timerów skojarzonych z każdym pinem PWM będzie się różnić w zależności od typu płyty Arduino które masz:

  • 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

Skalowany rejestr podzieli czas przez liczbę całkowitą, a Timer zajmie się resztą, aby kontrolować każde z powiązanych wyjść PWM. Modyfikacja wartości rejestru może zmienić częstotliwość. Plik częstotliwości Będą również różne w zależności od timera i płyty:

  • 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 związane z wyjściami nie jest tylko dla tej funkcji, jest również używany przez innych. Dlatego jeśli są używane przez inną funkcję, musisz wybrać jedną lub drugą, nie możesz używać obu jednocześnie. Na przykład, oto niektóre niezgodności, które możesz znaleźć 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 miejscu, jak działa PWM na Arduino, najlepszą rzeczą, jaką możesz zrobić, jest podłączenie przewodów pomiarowych woltomierz lub multimetr (w funkcji pomiaru napięcia) między pinem PWM, który wybrałeś, a pinem uziemienia lub GND płyty Arduino. W ten sposób na ekranie urządzenia pomiarowego będziesz mógł zobaczyć, jak zmienia się napięcie na wyjściu cyfrowym dzięki tej sztuczce PWM.

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 ...

Komentarz, zostaw swój

Zostaw swój komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

*

*

  1. Odpowiedzialny za dane: Miguel Ángel Gatón
  2. Cel danych: kontrola spamu, zarządzanie komentarzami.
  3. Legitymacja: Twoja zgoda
  4. Przekazywanie danych: Dane nie będą przekazywane stronom trzecim, z wyjątkiem obowiązku prawnego.
  5. Przechowywanie danych: baza danych hostowana przez Occentus Networks (UE)
  6. Prawa: w dowolnym momencie możesz ograniczyć, odzyskać i usunąć swoje dane.

  1.   Jose powiedział

    Cześć miłego dnia. Przede wszystkim chciałbym podziękować za czas poświęcony na to wyjaśnienie dla najnowszego.
    Chciałbym zadać ci pytanie. Próbuję uruchomić kod na emulatorze proteus 8 dla Arguino Mega. Podłączam woltomierz do pinu 6, Proteus jest podłączony do portu szeregowego, ale nie wiem jak ani czym się zmieniać, aby wyprowadzane były różne napięcia. Musiałem wprowadzić drobne poprawki w kodzie, aby się skompilował. Bardzo ci dziękuje za pomoc