- Co to jest ADC (konwersja analogowo-cyfrowa)
- ADC w mikrokontrolerze AVR Atmega16
- Wymagane składniki
- Schemat obwodu
- Konfigurowanie rejestrów sterowania ADC w Atmega16
- Programowanie Atmega16 dla ADC
Jedną wspólną cechą, która jest używana w prawie każdej aplikacji wbudowanej, jest moduł ADC (przetwornik analogowo-cyfrowy). Te przetworniki analogowo-cyfrowe mogą odczytywać napięcie z czujników analogowych, takich jak czujnik temperatury, czujnik pochylenia, czujnik prądu, czujnik Flex itp. W tym samouczku dowiemy się, co to jest ADC i jak używać ADC w Atmega16. Ten samouczek obejmuje podłączenie małego potencjometru do pinu ADC Atmega16 i 8 diod LED jest używanych do wyświetlania zmieniającego się napięcia wartości wyjściowej ADC w odniesieniu do zmiany wartości wejściowej ADC.
Wcześniej wyjaśniliśmy ADC w innych mikrokontrolerach:
- Jak korzystać z ADC w ARM7 LPC2148 - Pomiar napięcia analogowego
- Jak korzystać z ADC w STM32F103C8 - Pomiar napięcia analogowego
- Jak korzystać z ADC w MSP430G2 - Pomiar napięcia analogowego
- Jak korzystać z ADC w Arduino Uno?
- Korzystanie z modułu ADC mikrokontrolera PIC z MPLAB i XC8
Co to jest ADC (konwersja analogowo-cyfrowa)
ADC oznacza przetwornik analogowo-cyfrowy. W elektronice ADC to urządzenie, które przekształca sygnał analogowy, taki jak prąd i napięcie, na kod cyfrowy (postać binarna). W rzeczywistości większość sygnałów to sygnały analogowe, a każdy mikrokontroler lub mikroprocesor rozumie język binarny lub cyfrowy (0 lub 1). Aby więc mikrokontrolery zrozumiały sygnały analogowe, musimy przekształcić te sygnały analogowe w postać cyfrową. ADC dokładnie to robi za nas. Dostępnych jest wiele typów ADC do różnych zastosowań. Niewiele popularnych przetworników ADC to flash, kolejne przybliżanie i sigma-delta.
Najtańszym typem ADC jest sukcesywna aproksymacja, aw tym samouczku będzie używany ADC sukcesywnego przybliżania. W przetwornikach ADC typu Successive-Approximation seria kodów cyfrowych, z których każdy odpowiada ustalonemu poziomowi analogowemu, jest kolejno generowana. Do porównania z konwertowanym sygnałem analogowym używany jest wewnętrzny licznik. Generowanie jest zatrzymywane, gdy poziom analogowy staje się tylko większy niż sygnał analogowy. Kod cyfrowy odpowiada poziomowi analogowemu i jest pożądaną cyfrową reprezentacją sygnału analogowego. To kończy nasze małe wyjaśnienie dotyczące sukcesywnego przybliżania.
Jeśli chcesz zgłębić ADC, możesz zapoznać się z naszym poprzednim samouczkiem dotyczącym ADC. Przetworniki ADC są dostępne w postaci układów scalonych, a także mikrokontrolery są obecnie dostarczane z wbudowanym ADC. W tym samouczku użyjemy wbudowanego ADC Atmega16. Porozmawiajmy o wbudowanym ADC Atmega16.
ADC w mikrokontrolerze AVR Atmega16
Atmega16 ma wbudowany 10-bitowy i 8-kanałowy przetwornik ADC. 10 bitów odpowiada temu, że jeśli napięcie wejściowe wynosi 0-5 V, to zostanie podzielone na 10 bitów, tj. 1024 poziomy dyskretnych wartości analogowych (2 10 = 1024). Teraz 8-kanałowy odpowiada dedykowanym 8 pinom ADC na Atmega16, gdzie każdy pin może odczytać napięcie analogowe. Kompletny PortA (GPIO33-GPIO40) jest przeznaczony do pracy z ADC. Domyślnie piny PORTA są ogólnymi pinami IO, co oznacza, że piny portu są multipleksowane. Aby użyć tych pinów jako pinów ADC, będziemy musieli skonfigurować określone rejestry przeznaczone do sterowania ADC. Dlatego rejestry są znane jako rejestry sterujące ADC. Omówmy, jak skonfigurować te rejestry, aby rozpocząć działanie wbudowanego ADC.
Piny ADC w Atmega16
Wymagane składniki
- Układ scalony mikrokontrolera Atmega16
- Oscylator kwarcowy 16 MHz
- Dwa kondensatory 100nF
- Dwa kondensatory 22pF
- Naciśnij przycisk
- Przewody połączeniowe
- Płytka prototypowa
- USBASP v2.0
- Led (dowolny kolor)
Schemat obwodu
Konfigurowanie rejestrów sterowania ADC w Atmega16
1. Rejestr ADMUX (rejestr wyboru multipleksera ADC) :
Rejestr ADMUX służy do wyboru kanału ADC i wyboru napięcia odniesienia. Poniższy rysunek przedstawia przegląd rejestru ADMUX. Opis jest wyjaśniony poniżej.
- Bit 0-4: bity wyboru kanału.
MUX4 |
MUX3 |
MUX2 |
MUX1 |
MUX0 |
Wybrano kanał ADC |
0 |
0 |
0 |
0 |
0 |
ADC0 |
0 |
0 |
0 |
0 |
1 |
ADC1 |
0 |
0 |
0 |
1 |
0 |
ADC2 |
0 |
0 |
0 |
1 |
1 |
ADC3 |
0 |
0 |
1 |
0 |
0 |
ADC4 |
0 |
0 |
1 |
0 |
1 |
ADC5 |
0 |
0 |
1 |
1 |
0 |
ADC6 |
0 |
0 |
1 |
1 |
1 |
ADC7 |
- Bit-5: Służy do dostosowania wyniku do prawej lub lewej strony.
ADLAR |
Opis |
0 |
Popraw wynik |
1 |
Lewo dostosuj wynik |
- Bit 6-7: Służą do wyboru napięcia odniesienia dla ADC.
REFS1 |
REFS0 |
Wybór napięcia odniesienia |
0 |
0 |
AREF, wewnętrzna wartość Vref wyłączona |
0 |
1 |
AVcc z zewnętrznym kondensatorem na pinie AREF |
1 |
0 |
Zarezerwowany |
1 |
1 |
Wewnętrzne napięcie odniesienia 2,56 z zewnętrznym kondensatorem na styku AREF |
Teraz zacznij konfigurować te bity rejestru w programie tak, aby uzyskać odczyt wewnętrznego ADC i wyprowadzenie go do wszystkich pinów PORTC.
Programowanie Atmega16 dla ADC
Kompletny program znajduje się poniżej. Wypal program w Atmega16 za pomocą JTAG i Atmel studio i obracaj potencjometrem, aby zmieniać wartość ADC. Tutaj kod jest wyjaśniony wiersz po wierszu.
Zacznij od zrobienia jednej funkcji, aby odczytać przekonwertowaną wartość ADC. Następnie przekaż wartość kanału jako „chnl” w funkcji ADC_read .
unsigned int ADC_read (unsigned char chnl)
Wartości kanałów muszą mieścić się w zakresie od 0 do 7, ponieważ mamy tylko 8 kanałów ADC.
chnl = chnl & 0b00000111;
Wpisując „40”, czyli „01000000” do rejestru ADMUX, wybraliśmy PORTA0 jako ADC0, gdzie wejście analogowe zostanie podłączone do konwersji cyfrowej.
ADMUX = 0x40;
Teraz ten krok obejmuje proces konwersji ADC, w którym zapisując JEDEN do bitu ADSC w rejestrze ADCSRA rozpoczynamy konwersję. Następnie poczekaj, aż bit ADIF zwróci wartość po zakończeniu konwersji. Zatrzymujemy konwersję, pisząc „1” w ADIF Bit w rejestrze ADCSRA. Po zakończeniu konwersji zwróć wartość ADC.
ADCSRA - = (1 <
Tutaj wewnętrzne napięcie odniesienia ADC jest wybierane przez ustawienie bitu REFS0. Następnie włącz ADC i wybierz prescaler jako 128.
ADMUX = (1 <
Teraz zapisz wartość ADC i wyślij ją do PORTC. W PORTC podłączonych jest 8 diod LED, które pokażą wyjście cyfrowe w formacie 8-bitowym. Przykład, który pokazaliśmy, zmienia napięcie w zakresie od 0 V do 5 V przy użyciu jednego potencjometru 1K.
i = ADC_read (0); PORTC = i;
Multimetr cyfrowy służy do wyświetlania analogowego napięcia wejściowego w pinie ADC, a 8 diod LED służy do wyświetlania odpowiadającej 8-bitowej wartości wyjścia ADC. Wystarczy obrócić potencjometr i zobaczyć odpowiedni wynik na multimetrze, a także na świecących diodach LED.
Pełny kod i działające wideo są podane poniżej.