Rodzina mikrokontrolerów AVR DB jest dość dobrze wyposażona w standardowe zasoby. Najwyższa seria AVR128DB65 ma 128 kB pamięci programu Flash, 16 kB pamięci SRAM i 512 B EEPROM. Rdzeń może pracować z częstotliwością 24 MHz. Znajdziemy tu też szereg najczęściej spotykanych układów peryferyjnych: 16-bitowe i 12-bitowe liczniki, układ RTC, układy komunikacyjne USART, SPI TWI/I²C, 12-bitowy przetwornik analogowo-cyfrowy ADC z wejściem różnicowym i wejściem asymetrycznym, 10-bitowy przetwornik cyfrowo-analogowy DAC. Układy analogowe uzupełniają wzmacniacze operacyjne, komparator analogowy, układ wykrywania przejścia przez zero (ZCDs) i źródła napięć referencyjnych. O tym, że jest to układ wyjątkowy, świadczą dwie funkcjonalności: tryb pracy linii portów MVIO i rozbudowany konfigurowalny moduł wzmacniaczy operacyjnych współpracujący z wbudowanymi przetwornikami.
Tryb MVIO
Mikrokontrolery i większość układów peryferyjnych na początku swojej drogi rozwojowej były zasilane napięciem +5 V. Ze względu na taką samą wartość napięcia zasilania współpraca pomiędzy wszystkimi elementami systemu cyfrowego przebiegała w większości bez problemów i zakłóceń. Standard zasilania +5 V utrzymywał się bardzo długo, ale od jakiegoś czasu zaczęto oferować mikrokontrolery, które mogły pracować z niższym napięciem +3,3 V. Zmiana (obniżenie) napięcia zasilania była podyktowana dwoma czynnikami: zwiększeniem szybkości działania układów cyfrowych, w tym rdzenia mikrokontrolera, oraz zmniejszeniem poboru mocy. Ta ostatnia cecha ma szczególne znaczenie w układach zasilanych bateryjnie, bo wpływa na wydłużenie czasu pracy. W wysokowydajnych systemach ograniczanie zużycia mocy pozwala na panowanie nad temperaturą i ogranicza koszty chłodzenia.
Nowoczesne wydajne mikrokontrolery mają zasilanie wielonapięciowe, na przykład rdzeń jest zasilany napięciem +1,8 V, a układy peryferyjne napięciem +3,3 V. Istnieją też mikrokontrolery, które można zasilić napięciem z zakresu od +1,8 V do +5,5 V.
Niestety w układach, w których mikrokontroler (lub jego układy peryferyjne, w tym porty) jest zasilany określonym napięciem i musi współpracować z zewnętrznymi układami cyfrowymi zasilanymi innym (wyższym lub niższym) napięciem zasilania, mogą się pojawić problemy z prawidłową identyfikacją poziomów napięć odpowiadających stanom logicznym i w konsekwencji błędnym działaniem całego układu.
Na rysunku 1 pokazano przykład połączenia wyjścia układu cyfrowego zasilanego napięciem +3,3 V z wejściami układów cyfrowych wykonanych w technologii TTL (bipolarnej) i technologii CMOS. Oprócz różnicy napięć istotna jest też technologia wykonania układów.
Najlepiej, gdyby wszystkie elementy były wykonane w technologii mikrokontrolera (CMOS), bo ogranicza to możliwość błędnego działania.
Jeszcze większe problemy pojawiają się, kiedy wyjście układu zasilanego napięciem +5 V łączymy z wejściem układu zasilanego napięciem +3,3 V. Każde z wejść CMOS jest zabezpieczone parą diod spolaryzowanych zaporowo, tak jak pokazano na rysunku 2. Pojawienie się na wejściu napięcia wyższego niż napięcie zasilania VCC +0,7 V powoduje spolaryzowanie górnej diody i zaczyna przez nią płynąć prąd. Przy większej wydajności prądowej wyjścia może to spowodować uszkodzenie zarówno wyjścia, jak i diody zabezpieczającej wejście. Część układów mikrokontrolerów zasilanych napięciem +3,3 V ma wejścia akceptujące poziomy napięć do 5 V (+5 V tolerant), ale nie jest to normą.
Sprawy się jeszcze bardziej komplikują, jeżeli chcemy użyć połączenia przez linię dwukierunkową, na przykład linie interfejsu I²C czy linie danych wejścia/wyjścia magistral równoległych. Te problemy można rozwiązać, stosując specjalizowane konwertery poziomów logicznych. Dobrze dobrane usuwają wszystkie problemy systemów dwunapięciowych.
Równie dobrym rozwiązaniem jest zastosowanie mikrokontrolerów AVR DB wyposażonych w konfigurowalny zintegrowany konwerter/przesuwnik poziomu napięć logicznych. Funkcja wielonapięciowych wejść/wyjść (MVIO) umożliwia zasilanie podzbioru wyprowadzeń portów I/O przez napięcie VDDIO2. Poziomy logiczne wyjść i wejść MVIO są odnoszone do tego napięcia VDDIO2, a nie do napięcia zasilania VDD. Dla wejść napięcie stanu niskiego VIL będzie miało wartość nie większą niż 0,2 VDDIO2 (bufor Schmitta) lub nie większą niż 0,3 VDDIO2 dla magistrali I²C. Napięcie stanu wysokiego VIH jest nie mniejsze niż 0,8 VDDIO2 (bufor Schmitta) lub nie mniejsze niż 0,7 VDDIO2 (magistrala I²C). W przypadku wyjść napięcie stanu niskiego VOL jest nie większe niż 0,6 V, a napięcie stanu wysokiego nie mniejsze niż VDDIO2 – 0,7 V. Mikrokontroler i wyprowadzenia nieobjęte działaniem MVIO są zasilane napięciem VDD. VDD i VDDIO2 są niezależne od siebie, ale oba muszą się mieścić w tym samym dopuszczalnym zakresie od +1,8 V do +5,5 V. Idea tego rozwiązania została pokazana na rysunku 3.
Obecnie wyprowadzenia z funkcją MVIO są zgrupowane w porcie PORTC zasilanym przez wyprowadzenie VDDIO2 (rysunek 4). Mogą mieć tylko funkcję cyfrowych linii I/O (nie mogą być wejściami analogowymi). Wyprowadzenia z funkcją MVIO zachowują się tak samo jak zwykłe cyfrowe wyprowadzenia I/O. Mogą być uniwersalnymi liniami GPIO, liniami magistral szeregowych, w tym również dwukierunkowych (USART, SPI, I²C) oraz wyjściami PWM.
Tryb zasilania MVIO jest programowany przez bit konfiguracyjny (bezpiecznik – fuse). Dostępne są dwa tryby pracy. Pierwszy z pojedynczym napięciem pracy. MVIO nie jest aktywny i wyprowadzenia VDDIO2 oraz VDD muszą być ze sobą połączone. Drugi tryb to podwójne napięcie pracy, kiedy na VDDIO2 i VDD są podawane różne napięcia.
Na rysunku 5 pokazano schemat blokowy modułu. Wykrycie poziomu napięcia VDDIO2 spoza dopuszczalnego zakresu sygnalizowane jest bitem rejestru stanu. Ustawienie tego bitu może wygenerować przerwanie. Napięcie VDDIO2 podzielone przez 10 może też być mierzone przez wewnętrzny ADC przy wewnętrznym napięciu odniesienia 1,024 V.
Moduł wzmacniaczy operacyjnych OPAMP
Wzmacniacze operacyjne są wbudowywane w mikrokontrolery od jakiegoś czasu i nie jest to nic nowego. Zazwyczaj mają niezbyt wygórowane parametry, ale do podstawowych zadań, na przykład dopasowywania poziomu sygnału do zakresu napięć wejściowych przetwornika ADC, wystarczają. Na czym zatem polega wyjątkowość modułu wzmacniaczy OPAMP w rodzinie AVR DB? Jest on zbudowany z trzech (w niektórych wersjach z dwu) wzmacniaczy operacyjnych i może być programowo elastycznie konfigurowalny za pomocą analogowego multipleksera. Programowa konfiguracja umożliwia pracę wzmacniaczy w różnych topologiach (wzmacniacz odwracający, nieodwracający, bufor wzmacniacz kaskadowy). Druga bardzo ważna cecha to, że w dużej liczbie przypadków nie są do pracy wzmacniaczy potrzebne żadne elementy zewnętrzne (głównie rezystory – określające wzmocnienie). W takich przypadkach nie trzeba stosować zewnętrznych układów wzmacniaczy i elementów biernych, co upraszcza płytkę drukowaną i obniża koszt urządzenia.
Znacząco też może uprościć i przyspieszyć proces projektowania i prototypowania urządzenia.
Schemat blokowy jednego wzmacniacza został pokazany na rysunku 6. Wzmacniacze operacyjne pracujące w układach wzmacniaczy odwracających i nieodwracających wymagają dołączenia zewnętrznych rezystorów określających ich topologię i wzmocnienie. Jak widzimy na rysunku 6, w moduł peryferyjny wzmacniacza wbudowano drabinkę rezystancyjną (R1, R2) dołączaną do wejść/wyjść wzmacniacza analogowym multiplekserem. Pozwala to, jak już wiemy, skonfigurować takie wzmacniacze bez konieczności dołączania elementów (rezystorów) zewnętrznych. Moduł (moduły) OPAMP można skonfigurować jako:
- samodzielny wzmacniacz operacyjny,
- bufor (wzmacniacz o wzmocnieniu 1),
- wzmacniacz odwracający o wzmocnieniu określonym przez R1 i R2,
- integrator,
- wzmacniacz różnicowy,
- wzmacniacz kaskadowy,
- wzmacniacz pomiarowy.
Multiplekser na wejściu nieodwracającym (+) każdego wzmacniacza operacyjnego umożliwia podłączenie do zewnętrznego wyprowadzenia mikrokontrolera, przełącznika pozycji „suwaka” drabinki rezystorowej, wyjścia przetwornika cyfrowo-analogowego DAC, masy (GND), napięcia VDD/2 lub wyjścia z innego wzmacniacza operacyjnego. Drugi multiplekser na wejściu odwracającym (–) każdego wzmacniacza operacyjnego umożliwia podłączenie do zewnętrznego wyprowadzenia mikrokontrolera, przełącznika pozycji „suwaka” drabinki rezystorowej, wyjścia wzmacniacza operacyjnego lub wyjścia DAC.
Trzy dodatkowe multipleksery podłączone do każdej drabinki rezystorowej zapewniają dodatkową elastyczność konfiguracji. Dwa z tych multiplekserów wybierają górne i dolne połączenie wyprowadzeń wzmacniacza z drabinką rezystorową, a trzeci steruje pozycją przełącznika pozycji „suwaka”.
Konfiguracje modułu wzmacniaczy operacyjnych
Samodzielny wzmacniacz operacyjny
W tej konfiguracji oba wejścia: odwracające (–) i nieodwracające (+) oraz wyjście wzmacniacza są podłączone do wyprowadzeń mikrokontrolera (rysunek 7). Jest to przydatna konfiguracja, w której użytkownik chce wykonać wszystkie połączenia z elementami wzmacniacza na zewnątrz mikrokontrolera, na przykład w układach filtrów, kiedy potrzebne są precyzyjne rezystory o ściśle określonych wartościach i kondensatory.
Układ bufora
Układ bufora pokazanego na rysunku 8 ma wzmocnienie równe 1, bardzo dużą impedancję wejściową i bardzo małą impedancję wyjściową. Taki układ stosuje się do separacji dwu obwodów, tak by wyjście separowanego układu (wejście bufora) nie obciążało wejścia kolejnego układu (wyjście bufora).
Układ wzmacniacza nieodwracającego
Wzmacniacz nieodwracający (rysunek 9) nie zmienia fazy sygnału wzmacnianego. Wzmocnienie zależy od wartości rezystorów R1 i R2 i jest wyliczane według zależności:
W tej konfiguracji wewnętrzne rezystory R1 i R2 są dołączane przez programowany multiplekser analogowy.
Układ wzmacniacza odwracającego
Wzmacniacz odwracający (rysunek 10) odwraca fazę sygnału wejściowego (przesunięcie o 180°). W klasycznym wzmacniaczu odwracającym wejście nieodwracające jest połączone z masą, wtedy wzmocnienie układu zależy tylko od stosunku oporności R2 do R1. Napięcie wyjściowe wzmacniacza jest liczone według zależności:
Tutaj zdecydowano się do sygnału wyjściowego dodać składową stałą o wartości VDD/2 po to, aby możliwe było wzmacnianie sygnałów symetrycznych względem masy. Sygnał wyjściowy wyliczany jest z zależności:
Integrator
Na rysunku 11 pokazano wzmacniacz skonfigurowany jako integrator. Do prawidłowej pracy niezbędne jest dołączenie zewnętrznego rezystora i kondensatora.
Wzmacniacz różnicowy
Za pomocą dwu wzmacniaczy można skonfigurować wzmacniacz wzmacniający sygnał różnicowy sygnałów podawanych na wejścia nieodwracające (rysunek 12). Wzmocnienie określają rezystory R1 i R1 z układu wzmacniacza OP1.
Wzmacniacz kaskadowy
Wzmacniacze kaskadowe stosuje się w celu uzyskania dużego wzmocnienia. Są zbudowane z identycznych stopni połączonych szeregowo. W naszym przypadku można skonfigurować wzmacniacze odwracające lub nieodwracające zbudowane z dwu lub trzech stopni. Przykładowa konfiguracja trzystopniowego wzmacniacza kaskadowego nieodwracającego została pokazana na rysunku 13.
Wzmacniacz pomiarowy
Wzmacniacz pomiarowy ma wejście różnicowe i wyjście asymetryczne. Impedancja wejściowa jest bardzo duża, na przykład 109 Ω, a impedancja wyjściowa bardzo mała. Taki wzmacniacz ma często ustalone stałe wzmocnienie lub wzmocnienie ustalane za pomocą rezystora dołączonego do specjalnych wyprowadzeń. W naszym przypadku wzmocnienie jest programowane. Symetryczne, różnicowe wejście pozwala na wyodrębnienie z zaszumionego kanału przesyłowego użytecznych sygnałów różnicowych przy jednoczesnym silnym tłumieniu sygnałów wspólnych (tłumienie zależy od współczynnika CMR).
Konfiguracja wzmacniacza pomiarowego została pokazana na rysunku 14. Wzmocnienie (również tłumienie) można zaprogramować tak jak to pokazano na rysunku 15.
Konfiguracja i programowanie modułu wzmacniaczy operacyjnych
W dokumentacji mikrokontrolerów rodziny AVR DB są umieszczone dokładne opisy wszystkich rejestrów konfiguracyjnych wszystkich modułów peryferyjnych w tym modułu wzmacniaczy operacyjnych. Na podstawie tych informacji można dowolnie, zależnie od potrzeb skonfigurować każdy ze wzmacniaczy. Jednak jest to metoda pracochłonna i żmudna. Dużo lepszym rozwiązaniem jest skorzystanie ze środowiska projektowego IDE i wbudowanego konfiguratora peryferii. Mikrokontrolery AVR miały (i być może mają dalej) swoje środowisko IDE Atmel Studio. Po przejęciu Atmela przez Microchipa, IDE Atmel Studio został przemianowany na Microchip Studio, ale mikrokontrolery AVR można programować i debugować w znanym mi środowisku MPLAB IDE. Przykłady konfiguracji modułu OPAMP zostaną wykonane właśnie w środowisku MPLAB X IDE z zainstalowaną najnowszą wtyczką konfiguratora MCC.
Przykład konfiguracji wzmacniacza pomiarowego w środowisku MPLAB X IDE
Konfigurację rozpoczynamy od wybrania modułu OPAMP z listy urządzeń Device Resources. Wybrany moduł pojawi się w liście Project Resources. Okno konfigurowania modułu OPAMP ma cztery zakładki: OPAMP SYSTEM, OP0, OP1 i OP2. W zakładce OPAMP SYSTEM ustawiamy:
- Tryb pracy: pojedynczy wzmacniacz, podwójny lub pojedynczy wzmacniacz i potrójny wzmacniacz. Ponieważ, jak wiemy, wzmacniacz pomiarowy używa wszystkich trzech wzmacniaczy operacyjnych, wybieramy opcję potrójnego wzmacniacza (triple OPAMPs).
- Konfigurację wzmacniacza: trzy wzmacniacze są używane w układzie potrójnego wzmacniacza kaskadowego lub przez wzmacniacz pomiarowy. Wybieramy zgodnie z założeniem – wzmacniacz pomiarowy.
Konfiguracja zakładki OPAMP SYSTEM dla wzmacniacza pomiarowego została pokazana na rysunku 16.
W kolejnym kroku trzeba wybrać źródło sygnału różnicowego podawanego na wejścia wzmacniacza pomiarowego. Załóżmy, że będą to wyprowadzenia mikrokontrolera skonfigurowane jako wejścia analogowe. W zakładce OP0 pojawia się schemat wzmacniacza z zaznaczonym na szaro wzmacniaczem OP0 i rezystorami R1, oraz R2 przypisanymi do modułu OP0. Mierzone napięcie V2 jest podawane na wejście nieodwracające wzmacniacza OP0. W oknie Posistive input MUX z rozwijanej listy wybieramy źródło sygnału jako Positive input for OPn. Konfigurator automatycznie skonfigurował linię PD0 portu PORTD jako pierwsze analogowe wejście różnicowego wzmacniacza pomiarowego.
Cała procedura jest powtarzana dla drugiego wejścia pomiarowego. Mierzone napięcie V1 jest podawane na wejście nieodwracające wzmacniacza operacyjnego OP1. W oknie Posistive Input MUX wybieramy Positive input for OPn, a konfigurator konfiguruje linię PD4 portu PORTD jako drugie wejście analogowe różnicowego wzmacniacza pomiarowego.
Ostatnia czynnością jest określenie wzmocnienia wzmacniacza w oknie System Gain. Po takim skonfigurowaniu pojawiają się ostrzeżenia o nie do końca dobrze skonfigurowanych wyjściach wzmacniacza połączonych z wyprowadzeniami mikrokontrolera. Żeby wszystko poprawnie działało, trzeba w oknie Pin Module konfiguratora MCC zablokować wejściowy bufor dla sygnałów cyfrowych, tak jak to zostało pokazane na rysunku 18.
void OPAMP_Initialize(){
OPAMP_DisableSystem();
//TIMEBASE 23;
OPAMP.TIMEBASE =
OPAMP_TIMEBASE_VALUE << OPAMP_TIMEBASE_gp;
//DBGRUN disabled;
OPAMP.DBGCTRL = 0x00;
//IRSEL FULL;
OPAMP.PWRCTRL = 0x00;
//OP0 Configuration : Instrumentation Amplifier
//Instrumentation Amplifier Gain : 3
//MUXNEG OUT; MUXPOS INP;
OPAMP.OP0INMUX = 0x20;
//MUXWIP WIP2; MUXBOT GND; MUXTOP OUT;
OPAMP.OP0RESMUX = 0x55;
//RUNSTBY disabled; OUTMODE NORMAL;
//EVENTEN disabled; ALWAYSON enabled;
OPAMP.OP0CTRLA = 0x05;
//SETTLE 127;
OPAMP.OP0SETTLE = 0x7F;
//OP1 Configuration : Instrumentation Amplifier
//Instrumentation Amplifier Gain : 3
//MUXNEG OUT; MUXPOS INP;
OPAMP.OP1INMUX = 0x20;
//MUXWIP WIP0; MUXBOT OFF; MUXTOP OFF;
OPAMP.OP1RESMUX = 0x00;
//RUNSTBY disabled; OUTMODE NORMAL;
//EVENTEN disabled; ALWAYSON enabled;
OPAMP.OP1CTRLA = 0x05;
//SETTLE 127;
OPAMP.OP1SETTLE = 0x7F;
//OP2 Configuration : Instrumentation Amplifier
//Instrumentation Amplifier Gain : 3
//MUXNEG WIP; MUXPOS LINKWIP;
OPAMP.OP2INMUX = 0x16;
//MUXWIP WIP5; MUXBOT LINKOUT; MUXTOP OUT;
OPAMP.OP2RESMUX = 0xB1;
//RUNSTBY disabled; OUTMODE NORMAL;
//EVENTEN disabled; ALWAYSON enabled;
OPAMP.OP2CTRLA = 0x05;
//SETTLE 127;
OPAMP.OP2SETTLE = 0x7F;
OPAMP_EnableSystem();
}
Na listingu 1 pokazano inicjalizację modułu OPAMP do pracy jako wzmacniacz pomiarowy ze wzmocnieniem 3, wygenerowaną przez MCC. Widać tu wyraźnie, jak pożyteczną pracę wykonuje konfigurator i ile czasu pozwala zaoszczędzić tylko na skonfigurowaniu jednego modułu peryferyjnego.
Tomasz Jabłoński, EP