Wróć do informacji o e-podręczniku Wydrukuj Pobierz materiał do PDF Pobierz materiał do EPUB Pobierz materiał do MOBI Zaloguj się, aby dodać do ulubionych Zaloguj się, aby skopiować i edytować materiał Zaloguj się, aby udostępnić materiał Zaloguj się, aby dodać całą stronę do teczki

Przetwornik ADC

Układ pozwalający przetworzyć sygnał analogowy (w tym przypadku napięcie) na sygnał cyfrowy nazywany jest przetwornikiem ADCprzetwornik ADCprzetwornikiem ADC (ang. Analog‑Digital Converter). Przetwornik analogowo‑cyfrowy wbudowany jest w mikrokontroler ATmega328.

R1Ur3USjHpEDW
Układ ATmega328 z wbudowanym przetwornikiem ADC oraz złącza analogowe A0-A5
Źródło: Contentplus.pl Sp. z o.o., licencja: CC BY-SA 3.0.

Przetworniki ADC charakteryzują się różną dokładnością. W przypadku przetwornika umieszczonego na płytce Arduino mamy do czynienia z układem 10 bitowym. To oznacza, że przetwornik ten może odczytac 2Indeks górny 10 czyli 1024 różne poziomy (wartości) sygnału.

Piny analogowepiny analogowePiny analogowe Arduino pracują z maksymalnym napięciem 5 V. Oznacza to że podając napięcie maksymalne 5 V uzyskamy odczyt na pinie analogowym 1023, a jeżeli podamy 0 V na wejściu analogowym odczytamy 0. Wynika to z zakresu pracy od 0 do 1023, czyli 1024 poziomy.

Możemy również podzielić 5 V (maksymalne napięcie) przez ilość poziomów odczytu (dokładność) przetwornika i otrzymać wartość napięcia odpowiadającą jednemu poziomowi:

5 V   /   1024   =   0 , 0048828125   V   c z y l i   o k o ł o   4 , 9   m V

Aby otrzymać informację ile poziomów przypada na 1 V, dzielimy ilość poziomów przez napięcie maksymalne:

1024   p o z i o m y   /   5   V   =   204 , 8   p o z i o m ó w

czyli jeżeli napięcie na pinie analogowym zwiększy się o 1 V, to wartość odczytana z pinu wzrośnie o 204,5.

V

wskazanie ADC (po zaokrągleniu)

0

 0

205 

410 

615 

4

820

5

1025

Odczytywanie wartości z pinów analogowych

Sprawdźmy w praktyce, jak wyglądają odczyty z pinów analogowych.

W pierwszym kroku zbudujmy prosty układ, który zapewni nam sygnał 5 V na pinie analogowym A0.

RY3ODFSI19eXS

Przechodzimy do środowiska programistycznego Arduino IDE. Deklarujemy zmienną typu int o nazwie odczyt, w której będziemy przechowywać odczytaną wartość z pinu analogowego A0.

Linia 1. int odczyt znak równości 0 średnik.

Następnie w funkcji setup() rozpoczynamy transmisję szeregową z komputerem.

Linia 1. int odczyt znak równości 0 średnik. Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy.

W funkcji loop(), za pomocą instrukcji analogRead(), odczytujemy wartość z pinu A0 i zapisujemy ją w zmiennej odczyt.

Linia 1. int odczyt znak równości 0 średnik. Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy. Linia 7. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. odczyt znak równości analogRead otwórz nawias okrągły A0 zamknij nawias okrągły średnik. Linia 9. zamknij nawias klamrowy.

Następnie wyświetlamy pobraną wartość w monitorze portu szeregowego.

Linia 1. int odczyt znak równości 0 średnik. Linia 3. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 4. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 5. zamknij nawias klamrowy. Linia 7. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 8. odczyt znak równości analogRead otwórz nawias okrągły A0 zamknij nawias okrągły średnik. Linia 10. Serial kropka print otwórz nawias okrągły cudzysłów Odczytana wartosc dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 11. Serial kropka println otwórz nawias okrągły odczyt zamknij nawias okrągły średnik. Linia 12. delay otwórz nawias okrągły 500 zamknij nawias okrągły średnik. Linia 13. zamknij nawias klamrowy.

W rezultacie otrzymamy wynik 1023, czyli jak wiemy z powyższych obliczeń do pinu analogowego podpięte jest 5 V.

ROBdR63yCqqHd

Jeżeli teraz przepniemy przewód z pinu 5 V do GND, w monitorze portu szeregowego powinna wyświetlać się wartość 0.

RJoxCGfnDD9qA

Tinkercad

Zróbmy symulację przetwornika analogowo‑cyfrowego, za pomocą środowiska Tinkercad.

R1bez9hL5p7A3

Dodaj moduł Arduino Uno do okna symulacji.

REYFpN86Hl5rA

Połącz pin 5V z pinem A0.

R1Drnz6eYcl0E

Przejdźmy teraz do pisania kodu. W tym celu klikamy na przycisk Kod, z listy rozwijanej wybieramy Tekst, potwierdzamy chęć zmiany widoku i czyścimy zawartość.

Przepisz kod, otwórz Konsolę szeregową i uruchom symulację.

R3b6nqCvG49jE

Film z działania programu.

R191RINx2bjba
Film nawiązujący do treści materiału

Dzielnik napięcia

Wiemy już, jak odczytać wartości w przypadku 5 V oraz 0 V, ale przecież piny analogowe pozwalają odczytać wartości pośrednie. W tym celu użyjemy potencjometru w roli dzielnika napięcia. Dzięki temu na pinie A0 (lub innym analogowym) będziemy w stanie ustawić różne wartości.

Zbudujmy układ zgodnie ze schematem.

R1IrpDwxAgnjL

Kod zostaje taki sam, czyli otrzymujemy odczyt z pinu analogowego. Zmieniając nastawy potencjometru, uzyskujemy różne wartości odczytu z przedziału 0‑1023.

RKAf4GtaSKLkR

Aby podać otrzymany wynik w jednostce napięcia wolt, musimy tę wartość pomnożyć przez iloraz maksymalnego napięcia (5 V) oraz dokładność przetwornika, czyli 5 V/1024.

Modyfikujemy kod tak, aby wyświetlona wartość była wyrażona w woltach.

Definiujemy dodatkową zmienią do przechowywania obliczonego napięcia.

Linia 1. int odczyt znak równości 0 średnik. Linia 2. float napiecie znak równości 0 średnik.

Funkcja setup() pozostaje bez zmian.

Linia 1. int odczyt znak równości 0 średnik. Linia 2. float napiecie znak równości 0 średnik. Linia 4. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy.

Natomiast w funkcji loop() dopisujemy linię kodu odpowiedzialną za przeliczenie zmierzonej wartości na wolty oraz delikatnie modyfikujemy sposób wyświetlania wyniku.

Linia 1. int odczyt znak równości 0 średnik. Linia 2. float napiecie znak równości 0 średnik. Linia 4. void setup otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 5. Serial kropka begin otwórz nawias okrągły 9600 zamknij nawias okrągły średnik. Linia 6. zamknij nawias klamrowy. Linia 8. void loop otwórz nawias okrągły zamknij nawias okrągły otwórz nawias klamrowy. Linia 9. odczyt znak równości analogRead otwórz nawias okrągły A0 zamknij nawias okrągły średnik. Linia 10. napiecie znak równości odczyt asterysk otwórz nawias okrągły 5 kropka 0 prawy ukośnik 1024 kropka 0 zamknij nawias okrągły średnik. Linia 12. Serial kropka print otwórz nawias okrągły cudzysłów Napiecie dwukropek cudzysłów zamknij nawias okrągły średnik. Linia 13. Serial kropka print otwórz nawias okrągły napiecie zamknij nawias okrągły średnik. Linia 14. Serial kropka println otwórz nawias okrągły cudzysłów V cudzysłów zamknij nawias okrągły średnik. Linia 15. delay otwórz nawias okrągły 500 zamknij nawias okrągły średnik. Linia 16. zamknij nawias klamrowy.

Zauważmy, że zmienna napięcie jest typu float oraz że wartości napięcia maksymalnego oraz ilości poziomów odczytu zapisane są z kropką. Dzięki temu wiadomo, że są to wartości zmiennoprzecinkowe i taki też wynik chcemy otrzymać.

Po wgraniu szkicu do płytki Arduino i włączeniu monitora portu szeregowego otrzymamy następujący widok.

R1RcvrGTofjHE

Zróbmy symulację dzielnika napięcia, za pomocą środowiska Tinkercad.

Dodaj do głównego okna symulatora płytkę stykową.

R1Y13vZJKDTtw

Teraz znajdź i dodaj do płytki potencjometr.

RZ9J1xww1Zm2T

Dodaj moduł Arduino Uno.

RzxTstIRIlMrG

Podłącz pierwszą nóżkę potencjometru z pinem 5V Arduino.

RwuRauG6iGfYY

Środkową nóżkę potencjometru podłącz pod pin A0.

R10xKHhzeqlZF

Trzecią nóżkę potencjometru podepnij pod pin GND Arduino.

RMWYBs4dxl51Z

Przejdźmy teraz do pisania kodu. W tym celu klikamy na przycisk Kod, z listy rozwijanej wybieramy Tekst, potwierdzamy chęć zmiany widoku i czyścimy zawartość.

Przepisz kod, otwórz Konsolę szeregową i uruchom symulację.

R1WajDy9FsZKW

Film z działania programu.

RkVrIf8wPYwfu
Film nawiązujący do treści materiału

Prosty woltomierz

W taki oto sposób zbudowaliśmy prosty woltomierz. Aby zmierzyć wartość napięcia np: baterii AA wystarczy, że zamiast potencjometru, do pinu A0 podepniemy plus z baterii, a masy płytki Arduino oraz baterii połączymy ze sobą. Sposób podłączenia źródła napięcia przedstawia schemat:

R9WbTIriYKNhm

Podłączając baterię AA powinniśmy otrzymać wynik w wysokości ~1,5 V.

R11FFjyUKNXCB
Ważne!

Nie należy podłączać do płytki Arduino źródeł napięcia większych niż 5 V, gdyż grozi to uszkodzeniem Arduino.

Zróbmy symulację prostego woltomierza, za pomocą środowiska Tinkercad.

Dodaj do głównego okna symulatora płytkę stykową.

RVCFhKzraBKsa

Teraz dodamy dwie baterie.

RIkOcuUdcJmIx

Do płytki stykowej dodajmy przełącznik.

RMfAlynxwLmzt

Dodaj teraz moduł Arduino Uno do okna symulacji.

RIMcAbHuEB4dF

Połączmy teraz ujemne bieguny baterii i pin GND Arduino z ujemną szyną płytki stykowej.

RVDg667eOZxRm

Środkową nóżkę przełącznika podepnij pod pin A0 Arduino Uno.

R1HTtjUoe8y2v

Pod pierwszą nóżkę przełącznika podepnij jedną z baterii.

R1Hi7zPeUnG5h

Pod trzecią nóżkę podepnij drugą baterię.

R1CnGjZsYC2KX

Przejdźmy teraz do pisania kodu. W tym celu klikamy przycisk Kod, z listy rozwijanej wybieramy Tekst, potwierdzamy chęć zmiany widoku i czyścimy zawartość.

Przepisz kod, otwórz Konsolę szeregową i uruchom symulację.

R1CRb3V7jRkBU

Film z działania programu.

RIpnvujYI2nKf
Film nawiązujący do treści materiału

Słownik

przetwornik ADC
przetwornik ADC

układ przetwarzający sygnał analogowy na postać cyfrową

piny analogowe
piny analogowe

piny oznaczone symbolami A0 do A5 na płytce Arduino, służą między innymi do współpracy z różnego rodzaju czujnikami analogowymi

piny PWM
piny PWM

piny umożliwiające modulację szerokości impulsu (z ang. Pulse Width Modulation)