Przetwornik analogowo-cyfrowy

Przykłady stosowania przetwornika analogowo-cyfrowego
Przetwornik AC
Kilka słów o rejestrach przetwornika AC
Rejestry ADCL i ADCH
Rejestr ADMUX
Rejestr ADCSRA
Pojedyncze przetwarzanie wyzwalane przyciskiem
Seria przetworzeń wyzwalana przyciskiem

Przede wszystkim zapoznaj się z rozdziałem „Analog-to-Digital Converter” opisu Twojego ATmega nawet jeśli nie znasz angielskiego.

 W opisach będą się pojawiały odwołania do tabel lub ilustracji w dokumentacji producenta. O ile nie będzie zaznaczone inaczej, odnoszą się one do noty katalogowej kontrolera ATmega8. Tu jest w formacie pdf  lub jako skompresowane archiwum(rar). W tekście wielokrotnie będą używane terminy: ustawienie bitu  –  oznacza zapisanie jedynki zerowanie bitu – oznacza zapisanie zera.

Przetwornik AC

Przetwornik analogowo-cyfrowy w kontrolerach ATmega jest dziesięciobitowym przetwornikiem kompensacyjnym. Więcej o przetwornikach AC znajdziesz na podanych niżej stronach: http://www.forum.invisionresources.pl/topic/312-przetworniki-analogowo-cyfrowe-ac/ http://www.national.com/appinfo/adc/files/ABCs_of_ADCs.pdf http://www.dnp.fmph.uniba.sk/~kollar/je_w/el3.htmPort z wejściami analogowymi (dla ATmega8 port C) posiada osobne wyprowadzenia do podłączenia zasilania w sposób podany na stronie 200 (Figure 96) dokumentacji.
Do pracy przetwornika musi być podłączone żródło napięcia odniesienia. W ATmega8 są trzy możliwości:
  • Napięcie zasilania układu przetwornika dołączone do wyprowadzenia AREF i podłączenie kondensatora między AREF i GND.
  • Napięcie z wewnętrznego źródła napięcia odniesienia o nominalnej wartości 2,56V i podłączenie kondensatora między AREF i GND.
  • Dołączenie zewnętrznego źródła napiecia Vref do wyprowadzenia AREF. Połączenie to jest wykonywane przez klucz elektroniczny wewnątrz układu scalonego po wybraniu przez nas tej opcji.

Wiele osób z wygody wybiera napięcie zasilające 5V jako Vref. Należy pamiętać, że stabilizatory typu 7805 nie są najlepszymi źródłami napięcia odniesienia i uzyskanie wiarygodnego wyniku przy dziesięciobitowej rozdzielczości jest, moim zdaniem, wątpliwe. Z kolei trzeba mieć na uwadze, że wewnętrzne napięcie odniesienia, zgodnie z dokumentacją (tabela 103), może zawierać się w przedziale 2,3 do 2,7V. Stosowanie go zmusza nas do indywidualnej kalibracji każdego wykonanego układu. Zaletą jest, że jest ono bardzo stabilne (w porównaniu do napięcia zasilającego). Przy większych wymaganiach co do dokładności najlepszym wyjściem jest stosowanie zewnętrznego żródła Vref. W zależności od precyzji i stabilności układu jest to koszt kilku, kilkudziesięciu zł. Wszystko zależy od tego co mierzymy i jaka dokładność jest nam rzeczywiście potrzebna. Jeśli potrzebujemy naprawdę dziesięciobitowej dokładności to i tak należy zastosować specjalizowany przetwornik AC o rozdzielczości co najmniej dwunastobitowej. Należy pamiętać aby napięcie na wejściu przetwornika nie przekraczało wartości napięcia odniesienia, a w żadnym przypadku wartości napięcia zasilającego kontroler.

Kilka słów o rejestrach przetwornika AC.

Rejestry ADCL i ADCH.

Dziesięciobitowy wynik przetwarzania jest zapisywany w rejestrach ADCL i ADCH. Możliwe są dwa sposoby zapisu wyniku. Pierwszy to osiem młodszych bitów (0 do 7) do rejestru ADCL i pozostałe dwa (8 i 9) do rejestru ADCH. Jest to domyślny sposób. Pokazuje to poniższa tabelka.

ADLAR0 7 6 5 4 3 2 1 0
ADCH  ADC9 ADC8
ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0

Drugi to dwa najmłodsze bity do rejestru ADCL (0 i 1), a pozostałe osiem do rejestru ADCH. Tak jak w tej tabelce.

ADLAR1 7 6 5 4 3 2 1 0
ADCH ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2
ADCL ADC1 ADC0

Możliwy jest odczyt oddzielnie bajtów ADCL i ADCH jak również całego słowa ADC. Teraz przejdźmy do rejestrów sterujących zachowaniem się przetwornika. Mają one nazwy ADMUX i ADCSRA.

Rejestr ADMUX

ADMUX 7 6 5 4 3 2 1 0
REFS1 REFS0 ADLAR ——- MUX3 MUX2 MUX1 MUX0
  • MUX0 do MUX3  –  Bity wyboru wejścia analogowego. Wejście wybrane kombinacją tych bitów jest dołączone do przetwornika. Zobacz tabelę 75 w dokumentacji dla ATmega8.
  • ADLAR   – Bit wyboru sposobu zapisu wyniku w rejestrach ADCL i ADCH. Fabrycznie ustawiony na „0” czyli zapis jak w pierwszej tabelce.
  • REFS0 i REFS1- Wybór źródła napięcia odniesienia. Możliwe ustawienia są podane w tabeli poniżej. Jest to tabela 74 z dokumentacji ATmega8.
REFS1 REFS0 Wybór napięcia odniesienia
0 0 Zewnętrzne AREF, wewnętrzne Vref wyłączone
0 1 AVCC z zewnętrznym kondensatorem na wyprowadzeniu AREF
1 0 Zarezerwowane
1 1 Wewnętrzne napięcie odniesienia 2.56V z kondensatorem na wyprowadzeniu AREF

>

Rejestr ADCSRA

ADCSRA 7 6 5 4 3 2 1 0
ADEN ADSC ADFR ADIF ADIE ADPS2 ADPS1 ADPS0
  • ADPS0 do ADPS2   –  Tymi bitami definiujemy pożądaną relację między częstotliwością zegara sytemowego XTAL, a częstotliwością przebiegu taktującego przetwornik. Zobacz tabelę 76 dokumentacji ATmega8.
  • ADIE   –  Zezwolenie na przerwania od przetwornika AD.
  • ADIF   – Bit, który jest ustawiany po zakończeniu przetwarzania i po zapisaniu rejestrów ADCL i ADCH. Jeśli ADIE jest ustawiony i był ustawiony bit „I” rejestru SREG wówczas zakończenie przetwarzania wywołuje przerwanie „ADC Conversion Complete”.
  • ADFR   – Jeśli ten bit jest ustawiony, wówczas przetwornik pracuje w trybie, w którym ciągle obywa się próbkowanie, przetwarzanie i zapisywanie wyniku (Free Running mode). Wyzerowanie ADFR przerywa ten tryb pracy.
  • ADSC   –  W trybie jednokrotnej konwersji należy każdorazowo ustawić ten bit dla rozpoczęcia konwersji. W trybie ‚Free Running mode” również należy go ustawić dla rozpoczęcia pierwszej konwersji. Pierwsze przetworzenie po ustawieniu ADSC i zezwoleniu dla ADC, lub jeśli ADSC był ustawiony razem z zezwoleniem dla ADC zajmuje 25 cykli zegarowych przetwornika podczas gdy normalnie 13, ponieważ w tym czasie następuje inicjalizacja przetwornika. ADSC pozostaje w stanie wysokim dopóki trwa przetwarzanie. Po zakończeniu konwersji bit jest zerowany. Zerowanie tego bitu (jeśli konwersja jest w toku) nie daje żadnego rezultatu.
  • ADEN   – Ustawienie go zezwala na pracę przetwornika, a wyzerowanie wyłącza go. Wyłączenie ADC podczas wykonywania konwersji przerywa ją.

Pojedyncze przetwarzanie wyzwalane przyciskiem

W tym przykładzie zrobimy zupełnie podstawową operację przetwarzania. Do wejścia PD2 jest podłączony przycisk. Jego naciśnięcie wyzwala jednokrotne przetwarzanie. Wynik zapisywany jest zgodnie z porządkiem pokazanym w drugiej tabelce. W tym przykładzie odczytujemy tylko ADCH, co jest ekwiwalentem rozdzielczości ośmiobitowej. Wynik przetwarzania jest negowany i wystawiany na port B do którego są podłączone diody LED. Włączone diody pokazują wartość napięcia wejściowego. Jako napięcie odniesienia będzie zastosowane 2,56V wytwarzane przez kontroler.

Co trzeba zrobić?

  •   Wybrać wejście portu C (ATmega8), które będzie podłączone do przetwornika. Chcemy użyć PC0 czyli ADC0. Rejestr ADMUX bity MUX0 do MUX3. Jak podaje tablica 75 bity te są fabrycznie ustawione dla ADC0.
  •   Wybrać napięcie odniesienia. Chcemy użyć wewnętrznego żródła 2,56V. Rejestr ADMUX, bity REFS0 i REFS1. Zgodnie z tabelą 74 obydwa REFS powinny być ustawione.

ADMUX |= _BV(REFS0); ADMUX |= _BV(REFS1);

  •   Wybrać w jaki sposób zapisujemy wynik. Rejestr ADMUX bit ADLAR. Ponieważ będziemy odczytywać osiem najstarszych bitów wyniku, należy ustawić bit ADLAR.

ADMUX |= _BV(ADLAR);

  •   Wybrać dzielnik częstotliwości aby uzyskać częstotliwość zegara przetwornika w rekomendowanym przez producenta zakresie. Bity ADPS0 do ADPS2. Ponieważ, dla uzyskania maksymalnej rozdzielczości, częstotliwość zegara przetwornika powinna sie zawierać od 50kHz do 200kHz, a zegar nowego ATmega8 jest ~1MHz, więc dzielnik równy 8 będzie wystarczający dając 125kHz. Z tabeli 76 widać, że dla tego dzielnika bity ADPS powinny mieć wartości 011.

ADCSRA |= _BV(ADPS0); ADCSRA |= _BV(ADPS1);

  •   Zezwolić na pracę przetwornika. Rejestr ADCSRA bit ADEN. Powinien być ustawiony.

ADCSRA |= _BV(ADEN);

Kod jest tutaj. Schemat jest tutaj.  Naciśnij przycisk i zobacz co wyświetlają diody. Pokręć potencjometrem i ponownie wciśnij przycisk.

Seria przetworzeń wyzwalana przyciskiem. Wyliczenie średniej
Zasada pomiaru i ustawienia przetwornika jak w poprzednim przykładzie. Po naciśnięciu przycisku wykonywnych jest dziewięć pomiarów z których jest wyliczana średnia. Jest ona negowana i wystawiana na port B lub wysyłana do wyświetlacza LCD. Pomiary wykonywane są w trybie jednokrotnego przetwarzania.

Wyświetlenie wyniku na diodach

Schemat jak poprzednio. Kod jest tutaj. Spakowane pliki tutaj.

Wyświetlenie wyniku na LCD

W tym przykładzie są wykorzystane biblioteki Petera Fleury. Schemat jest tutaj. Kod jest tutaj. Pliki spakowane są tutaj.

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s

%d blogerów lubi to: