Przetwornik analogowo-cyfrowy
Mikrokontrolery AVR wyposażone są w przetwornik analogowo-cyfrowy (ADC, ang. Analog-to-digital Converter). Układ ADC umożliwia przetworzenie analogowego sygnału doprowadzonego do wejścia mikrokontrolera na postać cyfrową, nadającą się do wykorzystania w programie. Dzięki temu możemy do mikrokontrolera podłączyć różne źródła analogowe — np. przetworniki temperatury, ciśnienia, odległości. Napięcie przyłożone do pinu ADC mikrokontrolera zamieniane jest na liczbę z przedziału 0 – 1023 lub –512 – 511 w przypadku kanałów różnicowych.
Przetwornik oferuje 10-bitową rozdzielczość, przy czasach konwersji 13 – 260 μs, co umożliwia próbkowanie z częstotliwością 15 kSPS z maksymalną rozdzielczością lub większą przy redukcji rozdzielczości przetwornika. ADC może pracować w trybie różnicowym, w którym mierzona jest różnica napięć pomiędzy dwoma pinami procesora. Aby układ ACD mógł poprawnie pracować, niezbędne jest właściwie połączenie do zasilania masy i zasilania analogowego (w większości procesorów AVR są one wyprowadzone na osobne piny procesora) oraz wybranie napięcia referencyjnego. Mikrokontrolery AVR umożliwiają wybranie jako źródła napięcia referencyjnego napięcia zasilania (Vcc), wewnętrznego źródła napięcia referencyjnego (o napięciu zależnym
od konkretnego typu procesora; napięcie to mieści się zwykle w zakresie 1 – 2,54 V) lub zewnętrznego napięcia referencyjnego, podłączonego do pinu Vref procesora. W przypadku precyzyjnych pomiarów należy stosować zewnętrzne stabilne źródła referencyjne, jednak w większości przypadków wystarczającą dokładność uzyskamy, stosując wewnętrzne źródło napięcia referencyjnego. Mikrokontrolery AVR dysponują tylko jednym układem ADC, lecz dzięki wbudowanemu multiplekserowi analogowemu można wybrać jedno z kilku wejść, na którym odbywa się pomiar napięcia.
Przetwornik ADC może pracować w dwóch trybach — trybie pojedynczej konwersji (ang. Single Conversion Mode) oraz w trybie ciągłej konwersji (ang. Free Running Mode). W trybie pojedynczej konwersji przetwornik ADC dokonuje jednego pomiaru, rozpoczęcie kolejnego wymaga jego ponownej aktywacji. W trybie ciągłej konwersji zaraz po zakończeniu jednego pomiaru od razu rozpoczynany jest kolejny, co umożliwia próbkowanie z maksymalną prędkością przetwornika. Po zakończeniu pomiaru wynik odczytuje się z rejestru ADC przetwornika, dodatkowo zakończenie konwersji może być związane z wygenerowaniem przerwania. Dzięki temu można w prosty sposób gromadzić dane z przetwornika. Po tym skrótowym opisie przejdźmy do bardziej szczegółowego.
Wszystkie definicje związane z ADC znajdują się w pliku nagłówkowym <avrio.h>.
Wybór napięcia referencyjnego
Jak wspomniano, aby pomiar ADC mógł być wykonany, należy wybrać napięcie referencyjne, czyli napięcie, względem którego dokonywany będzie pomiar.
Mierzone napięcie nie może być wyższe od napięcia referencyjnego. Jeśli będzie większe, niezależnie od jego wartości z rejestru ADC zawsze odczytamy wartość maksymalną (0x3FF).
Zbyt wysokie napięcie referencyjne (pamiętajmy jednak, że nie może ono przekroczyć wartości napięcia zasilania przetwornika AVcc) ogranicza dostępną rozdzielczość przetwarzania. Jak pokazano w tabeli 15.1, źródło napięcia odniesienia można wybrać przy pomocy bitów REFS0 (ang. Reference Selection) i REFS1 rejestru ADMUX (ang. ADC Multiplexer Selection Register).
Tabela 15.1. Wybór napięcia referencyjnego przetwornika ADC
REFS1 | REFS0 | Źródło napięcia referencyjnego |
0 | 0 | Napięcie referencyjne pochodzi z pinu Vref, wewnętrzne źródło jest wyłączone. |
0 | 1 | Napięcie odniesienia pobierane jest z pinu AVcc. |
1 | 0 | Kombinacja zarezerwowana. |
1 | 1 | Wewnętrzne źródło napięcia odniesienia, o wartości zależnej od typu procesora. |
Znajomość napięcia referencyjnego niezbędna jest do przeliczenia wyniku z rejestru ADC na wartość mierzonego napięcia.
Domyślnie bity te mają wartość 0, co umożliwia przyłączenie zewnętrznego napięcia referencyjnego. Należy pamiętać, aby nie włączać wewnętrznego napięcia referencyjnego, jeśli do pinu Vref dostarczamy napięcie zewnętrze. Dobrym pomysłem jest też,
przy wykorzystaniu wewnętrznego napięcia referencyjnego, przyłączenie kondensatora 10-100nF pomiędzy pin Vref a masę. Jego obecność poprawia filtrowanie szumów źródła referencyjnego. Pinu tego nie należy podłączać do napięcia zasilającego — jeśli
chcemy, aby napięcie zasilające było jednocześnie napięciem referencyjnym, możemy je wybrać poprzez odpowiednią konfigurację bitów wyboru napięcia referencyjnego. Pamiętajmy też o odpowiednim połączeniu masy analogowej (AGND) i zasilania analogowego (AVcc). Nawet jeśli przetwornik ADC nie jest wykorzystywany, należy podłączyć te piny do zasilania — piny IO portu, który współdzieli wyprowadzenia z przetwornikiem ADC, są zasilane z tych źródeł.
Multiplekser
Po ustaleniu napięcia referencyjnego kolejną rzeczą jest wybór wejścia mikrokontrolera, na którym odbywać się będzie pomiar. Dokonuje się tego poprzez nadanie odpowiednich wartości bitom MUX0..4 wspomnianego rejestru ADMUX. Poszczególne mikrokontrolery AVR znacznie różnią się liczbą dostępnych wejść ADC, stąd też nie wszystkie kombinacje bitów MUX są prawidłowe dla każdego mikrokontrolera. Dodatkowo niektóre kombinacje bitów umożliwiają wybór specjalnych funkcji, np. pomiaru napięcia wewnętrznej diody umożliwiającej pomiar temperatury, lub włączenie dodatkowego wzmacniacza sygnału. Są to funkcje specyficzne dla konkretnego typu mikrokontrolera, tak więc przed ustawieniem bitów MUX należy dokładnie przejrzeć notę katalogową procesora.
Zmiana wartości bitów MUX odnosi skutek dopiero po zakończeniu aktualnie toczącego się pomiaru. Dopiero kolejny pomiar odbędzie się na wejściu wybranym nowymi wartościami bitów MUX.
Właściwość ta nie ma wielkiego znaczenia w przypadku pojedynczej konwersji — w takiej sytuacji najpierw nadajemy pożądaną wartość bitom MUX, a dopiero potem rozpoczynamy pomiar. Stwarza jednak problemy w przypadku trybu ciągłej konwersji —
w momencie odczytywania wartości aktualnie skończonej konwersji przetwornik ADC dokonuje już kolejnej. W efekcie zmiana stanu bitów MUX powoduje zmianę odczytywanego kanału dopiero przy kolejnej konwersji.
Wybranie danego pinu jako wejścia ADC nie powoduje zablokowania przypisanej mu funkcji jako pinu IO.
Taki pin ciągle znajduje się pod kontrolą rejestrów DDRx i PORTx, w związku z czym aby mierzyć napięcie analogowe doprowadzone do danego pinu, należy zadbać, aby był on ustawiony jako wejście bez podciągania. Możliwość sterowania wejściem ADC z poziomu programu ma także pewne zalety, można np. w ten sposób wykrywać niepodłączone wejścia ADC.
Przetwornik ADC
Po zainicjowaniu rejestru ADMUX możemy przystąpić do procesu konwersji. Aby rozpocząć proces konwersji, należy włączyć przetwornik ADC poprzez wpisanie 1 do bitu ADEN (ang. ADC Enable) znajdującego się w rejestrze kontrolnym ADCSRA (ang. ADC Control and Status Register A). Równocześnie z włączeniem przetwornika można ustawić tzw. preskaler. Jest to układ generujący sygnał taktujący przetwornik ADC. Preskaler dzieli zegar taktujący procesor przez wybraną wartość, co umożliwia uzyskanie zegara taktującego ADC. W tym celu należy odpowiednio skonfigurować bity ADPS0 – ADPS2 rejestru ADCSRA (tabela 15.2).
Tabela 15.2. Konfiguracja preskalera ADC
ADPS2 | ADPS1 | ADPS1 ADPS0 | Preskaler |
0 | 0 | 0 | 2 |
0 | 0 | 1 | 2 |
0 | 1 | 0 | 4 |
0 | 1 | 1 | 8 |
1 | 0 | 0 | 16 |
1 | 0 | 1 | 32 |
1 | 1 | 0 | 64 |
1 | 1 | 1 | 128 |
Dla uzyskania maksymalnej dokładności ADC częstotliwość jego zegara taktującego nie powinna przekraczać 200 kHz. Jeśli możemy się zadowolić mniejszą dokładnością przetwarzania, to możemy uzyskać większą prędkość działania przetwornika, taktując go szybszym sygnałem zegarowym, nawet do 1 MHz.
Po włączeniu ADC i ustawieniu preskalera możemy rozpocząć pomiar.
W zależności od wybranego preskalera pomiar rozpoczyna się po 2 – 128 cyklach zegara taktującego procesor.
W przypadku użycia zewnętrznego sygnału wyzwalającego rozpoczynającego konwersję opóźnienie jest stałe i niezależne od wybranego preskalera.