środa, 16 marca 2011

AVR: Oscylatory kwarcowe i ceramiczne na przykładzie ATmega8 - część II


Autor: Dondu

Artykuł jest częścią: Kurs AVR - Spis treści

Temat oscylatorów podzielony jest na części:
  • część I,
  • część II (niniejszy artykuł),
  • część III (w trakcie redagowania)

AVR: Oscylatory kwarcowe i ceramiczne na przykładzie ATmega8 - część II
W poprzednim artykule (część I) wyjaśniłem sporo istotnych ogólnych spraw i definicji dot. modułów oscylatorów oraz rezonatorów kwarcowych i ceramicznych. Zanim zagłębisz się w lekturę niniejszego artykułu dobrze byłoby byś poznał część I.

W niniejszym artykule opisuję jeden z oscylatorów mikrokontrolerów AVR, którym jest:

Crystal oscillator

To podstawowy moduł oscylatora, gdy używamy zewnętrznego rezonatora kwarcowego lub ceramicznego.


AVR ATmega8 - Oscylator Cristal Oscillator


Ten moduł oscylatora wykorzystuje piny XTAL1 i XTAL2 jako wejścia oscylatora, do których należy podłączyć elementy stabilizujące jego pracę w postaci rezonatorów kwarcowych wraz z odpowiednimi kondensatorami, które muszą być podłączone, by moduł oscylatora działał stabilnie i prawidłowo w szerokim zakresie warunków użytkowania mikrokontrolera:




Wstępne (sugerowane) wartości kondensatorów określone są przez producenta w tabeli trybów pracy Crystal Oscillator-a, którą znajdziesz w dokumentacji, a którą załączam poniżej.

W dokumentacji mikrokontrolera znajdziemy schemat podłączenia rezonatorów:


AVR ATmega8 - Podłączenie rezonatora do oscylatora Cristal Oscillator


Rezonatory kwarcowe i ceramiczne podłączane są w taki sam sposób.

Moduł oscylatora Crystal Oscillator może pracować w czterech podstawowych trybach:


AVR ATmega8 - Ustawienia trybów oscylatora Cristal Oscillator


Pierwszy tryb (zaznaczony kolorem żółtym) dotyczy tylko i wyłącznie rezonatorów ceramicznych.

Przestawienie oscylatora w tryb rezonatorów ceramicznych (CKSEL3..1 = 101) z podłączonym rezonatorem kwarcowym spowoduje brak możliwości pracy mikrokontrolera (w tym także jego programowania przez interfejs ISP), którego powodem będzie brak sygnału taktującego, a przyczyną niedopasowanie tak ustawionego modułu oscylatora do rezonatora kwarcowego.


Pozostałe trzy tryby (zanznaczone kolorem czerwonym), to podstawowe tryby do pracy z zewnętrznymi rezonatorami kwarcowymi.

Zgodnie z tym co napisałem wcześniej projektując oscylator w mikrokontrolerze nie jest możliwe, by mógł on pracować z tak szerokim paśmie częstotliwości (np. od 0,032MHz do 16MHz) i jednocześnie dbał o oszczędzanie energii oraz zapewniał jednocześnie silny sygnał taktujący do środowisk silnie zakłócanych.

Wymagane jest więc podzielenie zadań i częstotliwości na pewne zakresy i takie przygotowanie oscylatorów,by zapewniały prawidłowe, stabilne i odpowiednio silne źródło sygnału taktującego, a także by były duże możliwości wyboru różnych trybów. Tak właśnie jest w przypadku mikrokontrolerów AVR, co jest pokazane w powyższej tabeli.

Uważny czytelnik po przyglądnięciu się powyższej tabeli powinien zapytać:


Jan Uważny
Jeżeli mam kwarc np. 4MHz, to który tryb ustawień mam wybrać? Są przecież dwie możliwości.


Zgadza się, dla przykładowego kwarcu 4MHz są dwie możliwości (dwa ostatnie wiersze wyżej zamieszczonej tabeli). Oba pozwalają bowiem na pracę z kwarcem o takiej częstotliwości. Czym więc się różnią?

Odpowiedź ukrywa się pod magicznym bitem CKOPT (pierwsza kolumna tabeli), a który posiadają niektóre mikrokontrolery AVR ...


Znaczenie CKOPT dla oscylatora Crystal Oscillator

W powyższej tabeli w pierwszej kolumnie znajduje się bit konfiguracyjny CKOPT. Zaglądamy do dokumentacji dla przypadku użycia modułu Crystal oscillator i znajdujemy informację, że w tym oscylatorze fuse bit CKOPT odpowiada za:


AVR ATmega8 - Cristal Oscillator - opis


... no to wyjaśnijmy dokładnie za co odpowiada.

Dowiadujemy się, że w przypadku wykorzystania oscylatora Crystal Oscillator fusebit CKOPT jest odpowiedzialny za:


AVR ATmega8 - Rola CKOPT dla Cristal Oscillator

przełączanie wzmacniacza modułu Crystal Oscillator w dwa różne tryby pracy.

Dla Crystal Oscillator, gdy CKOPT jest niezaprogramowany (jest jedynką):



czyli:
  1. na wyjściu modułu oscylatora sygnał ma niską amplitudę,
  2. zmniejszony jest pobór mocy przez moduł oscylatora,
  3. istnieje ograniczenie maksymalnej częstotliwości z jaką może pracować moduł oscylatora (w przypadku ATmega8 jest to 8MHz - patrz tabela trybów powyżej),
  4. sygnał wyjściowy modułu (pin XTAL2) nie może być używany do sterowania innych urządzeń.

Natomiast, dla Crystal Oscillator, gdy CKOPT jest zaprogramowany (czyli jest zerem):


AVR ATmega8 - Rola CKOPT dla Cristal Oscillator

czyli:
  1. sygnał na wyjściu ma wysoką amplitudę (praca rail-to-rail),
  2. tryb ten jest dedykowany do zastosowań dla pracy w zakłóconym środowisku,
  3. tryb ten pozwala wykorzystać sygnał zegarowy (pin XTAL2) do sterowania innych układów zewnętrznych np. drugiego mikrokontrolera w celu ich synchronizacji,
  4. nie występuje ograniczenie maksymalnej częstotliwości z jaką może pracować moduł oscylatora, czyli może pracować z kwarcami powyżej 8MHz (patrz tabela trybów powyżej lub poniżej),

Niska amplituda sygnału oscylatora vs rail-to-rail

Wróćmy więc do tabelki z ustawień oscylatora Crystal Oscillator:


AVR ATmega8 - Ustawienia trybów oscylatora Cristal Oscillator


Zauważ, że tryb rail-to-rail (CKOPT=0, czyli CKOPT zaprogramowany) umożliwia pracę z rezonatorami kwarcowymi  od 1MHz do maksymalnych 16MHz. Co jest oczywiste, ponieważ tryb rail-to-rail generuje po prostu silny sygnał taktujący.

Inaczej jest, gdy tryb rail-to-rail nie jest załączony (CKOPT=1, czyli CKOPT niezaprogramowany). W tym wypadku z tabeli jasno wynika, że tak ustawiony Crystal Oscillator może być wykorzystany do współpracy z rezonatorami kwarcowymi do maksymalnie 8MHz.

Ale kolega Uważny zada kolejne pytanie:


Jan Uważny
Czy oznacza to, że jeżeli ustawię tryb pracy inny niż rail-to-rail ale podłączę kwarc 16MHz, to mikrokontroler nie będzie działał?


Na to pytanie nie ma jednoznacznej odpowiedzi ponieważ oscylator jest urządzeniem stricte analogowym, a nie cyfrowym. Jest więc duże prawdopodobieństwo, że oscylator Crystal Oscillator będzie działał, generując sygnał taktujący mikrokontroler. Jednakże, w takim przypadku producent nie daje gwarancji na prawidłową jego pracę. Jest to związane z faktem, że sygnał taktujący może być zbyt słaby przez co dodatkowo podlegać zakłóceniom, itp., w związku z czym nieprawidłowo taktować mikrokontroler.


Cristal Oscillator z wyłączonym trybem rail-to-rail (CKOPT=1)

Rzućmy okiem na oscylogramy dla czterech różnych rezonatorów kwarcowych przy wyłączonym rail-to-rail, czyli CKOPT=1:


ATmega8 kwarc 3.6864MHz, CKOPT=1 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1

ATmega8 kwarc 7.3728MHz, CKOPT=1 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1

ATmega8 kwarc 12MHz, CKOPT=1 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1

ATmega8 kwarc 16MHz, CKOPT=1 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1


Z powyższych oscylogramów można zauważyć, że amplituda sygnału oscylatora na pinie XTAL1 zmniejsza wraz ze wzrostem częstotliwości podłączanych rezonatorów kwarcowych. Przedstawiłem to dokładniej na poniższej animacji:


ATmega8 - Zmniejszanie się amplitudy sygnału pinu XTAL1 w zależności od częstotliwości rezonatora przy CKOPT=1.


To zjawisko może się nasilać w szczególności przy niesprzyjających warunkach pracy jak np. ujemne temperatury, czy zewnętrzne zakłócenia, dlatego:

Producent nie daje gwarancji poprawnej pracy mikrokontrolera taktowanego zewnętrznym rezonatorem kwarcowym o częstotliwości większej od 8MHz z włączonym oscylatorem Crystal Oscillator, czyli CKSEL3..1 = 111 oraz CKOPT =1.



Cristal Oscillator z włączonym trybem rail-to-rail (CKOPT=0)

Sprawdźmy jaka amplituda będzie występować na pinie XTAL1 dla tych samych rezonatorów kwarcowych, ale z włączonym trybem rail-to-rail, czyli CKOPT=0 (zaprogramowany):


ATmega8 kwarc 3.6864MHz, CKOPT=0 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1 w czasie pracy rail-to-rail

ATmega8 kwarc 7.3728MHz, CKOPT=0 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1 w czasie pracy rail-to-rail

ATmega8 kwarc 12MHz, CKOPT=0 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1 w czasie pracy rail-to-rail

ATmega8 kwarc 16MHz, CKOPT=0 CKSEL3..1=111 - Obraz sygnału oscylatora na pinie XTAL1 w czasie pracy rail-to-rail


Jak widać rail-to-rail zapewnia sygnał o dużej amplitudzie przez co można go stosować w szerokim zakresie od 1Mhz do 16MHz bez obawy w skrajnych przypadkach temperaturowych, czy zakłóceń a także wtedy, gdy za pomocą pinu XTAL2 chcemy taktować inny układ, np. drugi mikrokontroler.


Koszt pracy oscylatora w trybie rail-to-rail

Niestety nie ma nic za darmo :-) Oscylator pracujący w trybie rail-to-rail jak już pisałem wcześniej generuje nam "koszt" w postaci zwiększonego poboru prądu. Jak duży jest to koszt?

Niestety w dokumentacji nie znajdziemy żadnych konkretnych wartości prądu o jaki zwiększa się jego pobór przez mikrokontroler z włączonym trybem rail-to-rail. Warto byłoby jednak taką wiedzę posiadać. Musimy więc doświadczalnie sprawdzić z jakimi wartościami mamy do czynienia. W tym celu zbudowałem prosty układ pomiarowy:

ATmega8 - Układ pomiarowy prądu mikrokontrolera.


oraz niezwykle skomplikowany program:

#include <avr/io.h>

int main(void)
{
   while(1);
}

Do testów przyjmiemy tryby zaznaczone na czerwono w tabeli poniżej:


AVR ATmega8 - Ustawienia trybów oscylatora Cristal Oscillator dla dokonania pomiarów prądu


Układ pomiarowy pozwala mierzyć prądy multimerami, które nie posiadają mikroamperowych zakresów amperomierza. Taki układ pozwala zmierzyć prąd liczony nawet w mikro, a nawet nanoamperach (po odpowiednim zwiększeniu wartości rezystora R2). Możesz więc zmierzyć różnice poboru prądu w różnych trybach uśpienia mikrokontrolera, jeżeli będziesz miał taką potrzebę. Skoro już wspomniałem o poborze prądu i trybach oszczędzania, to powinieneś zapoznać się z tym tematem: Bateria zasila mikrokontroler

W przypadku poniżej przedstawionych pomiarów można ich dokonać po prostu amperomierzem w miejscu rezystora R2. Ja dokonałem pomiarów woltomierzem, by pokazać jak takie pomiary wykonywać, co dla większości zapewne jest oczywiste :-)

Znając wartość rezystora pomiarowego R2 (którą zmierzyłem multimetrem i wynosiła 16,35Ω) oraz spadku napięcia na rezystorze R2 zmierzonego woltomierzem, policzyłem za pomocą Prawa Ohma :

Prawo Ohma.


prąd pobierany przez mikrokontroler ATmega8 oraz "koszt" wykorzystania trybu rail-to-rail (różnicę prądu z bitem CKOPT=0 oraz CKOPT=1, dla obu trybów CKSEL osobno) i otrzymałem następujące wyniki:


ATmega8 (kwarc 8MHz, Vcc=5V)
CKOPT CKSEL3..1 UR IR koszt trybu rail-to-rail
1 111 0,186 V 11,38 mA 0,79 mA
0 111 0,199 V 12,17 mA
1 110 0,181 V 11,07 mA 1,04 mA
0 110 0,198 V 12,11 mA


i dla porównania ATmega8A:


ATmega8A (kwarc 8MHz, Vcc=5V)
CKOPT CKSEL3..1 UR IR koszt trybu rail-to-rail
1 111 0,184 V 11,25 mA 0,61 mA
0 111 0,194 V 11,86 mA
1 110 0,187 V 11,44 mA 0,67 mA
0 110 0,198 V 12,11 mA

... czerwonym tłem zaznaczony tryb-rail-to-rail (CKOPT = 0).

Wyniki pomiarów pokazują o ile zwiększony jest pobór prądu (nasz "koszt"), gdy wykorzystujemy tryb rail-to-rail. To jest oczywiście bardzo istotne w przypadku projektów zasilanych z akumulatora, czy baterii.

Zapamiętaj, że:

W przypadku, gdy wykorzystujesz Crystal Oscillator i chcesz by mikrokontroler był taktowany rezonatorem kwarcowym o częstotliwości większej od 8MHz, MUSISZ włączyć tryb rail-to-rail jeśli chcesz być pewien poprawnej pracy mikrokontrolera w każdych warunkach.


1 komentarz:

  1. CKOPT ma inną funkcję w zależności od CKSEL. Np dla CKSEL 1001 (low freq crystal) ustawienie (CKOPT=0) załącza wewnętrzne kondensatory 36pF do linii XTAL. Strona 216 tabela 87 manuala.

    OdpowiedzUsuń