LinkedIn YouTube Facebook
Szukaj

Newsletter

Proszę czekać.

Dziękujemy za zgłoszenie!

Wstecz
Artykuły

Mikrokontrolery z rodziny Microchip AVR DB z zaawansowanymi peryferiami analogowymi

Microchip, producent 8-bitowych mikrokontrolerów z serii PIC16, PIC18, ATTiny i AVR, nie ustaje w poszukiwaniu coraz to nowych zastosowań tych układów. Idea, by wyposażyć 8-bitowe mikrokontrolery z relatywnie mało wydajnym rdzeniem w unikalne układy peryferyjne wydaje się być dobrym pomysłem. Wielokrotnie na łamach portalu opisywałem układy z rdzeniem PIC16F wyposażone w peryferia niezależne od pracy rdzenia takie jak generator NCO, COG, wzmacniacze operacyjne czy układy CLC. Z czasem takie peryferia implementowano także w wydajniejszych mikrokontrolerach z rdzeniem AVR. Inwencja inżynierów Microchipa w dziedzinie modyfikacji peryferii prostych mikrokontrolerów wydaje się być niewyczerpana, czego przykładem może być nowa rodzina mikrokontrolerów AVR DB.

Rodzinę AVR DB dość dobrze wyposażono 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 również szereg najczęściej spotykanych układów peryferyjnych: 16- i 12-bitowe liczniki, zegar RTC, układy komunikacyjne USART, SPI, TWI/I2C, 12-bitowy przetwornik ADC z wejściami różnicowymi i asymetrycznymi, 10-bitowy przetwornik cyfrowo-analogowy. Zestaw peryferiów uzupełniają układy analogowe – wzmacniacze operacyjne, komparator analogowy, układ wykrywania przejścia przez zero (ZCD) 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.

Różnice w napięciach stanów logicznych

Mikrokontrolery i większość układów peryferyjnych na początku swojej drogi 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. Standard zasilania 5 V utrzymywał się bardzo długo, ale potem na rynku pojawiły się mikrokontrolery, które mogły pracować z niższym napięciem 3,3 V. Obniżenie napięcia zasilania podyktowane było dwoma czynnikami: zwiększeniem szybkości działania układów cyfrowych, w tym rdzenia mikrokontrolera, a także zmniejszeniem poboru mocy. Ta ostatnia cecha ma szczególne znaczenie w układach zasilanych bateryjnie. Z kolei w zaawansowanych, wydajnych systemach ograniczanie zużycia mocy pozwala na panowanie nad temperaturą i ogranicza koszty chłodzenia.

Najnowocześniejsze 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ą także mikrokontrolery, które można zasilać napięciem z szerszego zakresu, od 1,8 V do 5,5 V.

Istnieją jednak rozwiązania, w których mikrokontroler musi współpracować z zewnętrznymi układami cyfrowymi o innym napięciu zasilania. Mogą wtedy pojawić się problemy z prawidłową identyfikacją poziomów napięć logicznych, co skutkuje 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 jest, gdy wszystkie elementy wykonane są w technologii mikrokontrolera (CMOS), gdyż ogranicza to możliwość błędów.

Rysunek 1. Połączenie układów zasilanych napięciem 3,3 V i 5 V

Jeszcze większe problemy pojawiają się, gdy 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 bowiem zabezpieczone parą diod spolaryzowanych zaporowo (rysunek 2).

Rysunek 2. Zabezpieczenia wejść cyfrowych CMOS

W tej sytuacji pojawienie się na wejściu napięcia wyższego niż napięcie zasilania plus 0,7 V powoduje spolaryzowanie górnej diody, przez którą zaczyna 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 rzecz jasna wejścia akceptujące napięcia do 5 V (+5V tolerant), ale nie jest to normą. Sprawy komplikują się jeszcze bardziej, jeśli chcemy użyć połączenia przez linię dwukierunkową, na przykład interfejs I2C, czy też linie danych magistral równoległych.

Problemy z kompatybilnością napięć można rozwiązać stosując specjalizowane konwertery poziomów logicznych. Dobrze dobrane układy usuwają wszystkie problemy systemów dwunapięciowych, ale jest to pewien koszt i komplikacja projektu.

Tryb MVIO w mikrokontrolerach AVR DB

Równie dobrym rozwiązaniem jest zastosowanie mikrokontrolerów AVR DB, które wyposażono w konfigurowalny zintegrowany konwerter poziomów napięć logicznych. Funkcja wielonapięciowych wejść/wyjść (MVIO) umożliwia zasilanie części portów przez napięcie dostarczane osobno do pinu VDDIO2. Poziomy logiczne wyjść i wejść MVIO są odnoszone do tego napięcia, nie zaś do napięcia zasilania VDD. Dla wybranych wejść napięcie stanu niskiego VIL będzie miało wartość nie większą niż 0,2*VDDIO2 (bufor Schmitt’a), lub nie większą niż 0,3*VDDIO2 dla I2C. Napięcie stanu wysokiego VIH jest nie mniejsze niż 0,8*VDDIO2 (bufor Schmitt’a) lub nie mniejsze niż 0,7*VDDIO2 (magistrala I2C). W przypadku sygnałów wyjściowych 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 nie objęte działaniem MVIO są zasilane napięciem VDD. Domeny VDD i VDDIO2 są niezależne od siebie, ale poziomy obu napięć muszą się mieścić w dopuszczalnym zakresie od 1,8 V do 5,5 V. Ideę tego rozwiązania pokazano na rysunku 3.

Rysunek 3. Idea działania MVIO w AVR DB

Obecnie wyprowadzenia z funkcją MVIO są zgrupowane w porcie PORTC – rysunek 4. Mogą mieć funkcję tylko cyfrowych linii I/O.

Rysunek 4. Przykład rozkładu wyprowadzeń AVR DB z wyprowadzeniami MVIO

Wyprowadzenia z funkcją MVIO zachowują się tak samo jak zwykłe cyfrowe wyprowadzenia I/O. Mogą więc pełnić rolę uniwersalnych linii GPIO, linii magistral szeregowych, w tym dwukierunkowych (USART, SPI, I2C) lub wyjść PWM.

Tryb zasilania MVIO jest programowany przez bit konfiguracyjny (fuse bit). Dostępne są dwa tryby pracy. Pierwszy to praca z pojedynczym napięciem. MVIO nie jest wtedy aktywny i wyprowadzenia VDDIO2 oraz VDD trzeba ze sobą połączyć. Drugi tryb to podwójne napięcie pracy, kiedy na VDDIO2 i VDD podawane są różne napięcia.

Na rysunku 5 pokazano schemat blokowy modułu.

Rysunek 5. Schemat blokowy modułu MVIO

Wykrycie poziomu napięcia VDDIO2 spoza dopuszczalnego zakresu sygnalizowane jest zmianą bitu w rejestrze stanu. Ustawienie tego bitu może wygenerować przerwanie. Napięcie VDDIO2 można także podzielić przez 10, a następnie zmierzyć przez wewnętrzny ADC o 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ą jednak niezbyt wygórowane parametry, chociaż wystarczające do podstawowych zadań, na przykład dopasowywania poziomu sygnału do zakresu napięć wejściowych przetwornika ADC. Na czym zatem polega wyjątkowość modułu wzmacniaczy OPAMP w rodzinie AVR DB?

Jest on zbudowany z aż trzech (w niektórych wersjach z dwóch) wzmacniaczy operacyjnych i może być elastycznie konfigurowalny programowo za pomocą serii multiplekserów. Programowa konfiguracja umożliwia pracę wzmacniaczy w różnych topologiach (wzmacniacz odwracający, nieodwracający, bufor, wzmacniacz kaskadowy itp.). Drugą bardzo ważną cechą jest to, że w wielu przypadkach użycia nie są potrzebne żadne elementy zewnętrzne. Nie trzeba więc stosować zewnętrznych układów i elementów biernych, co upraszcza płytkę drukowaną i obniża koszt urządzenia. Znacząco też przyspiesza proces projektowania i prototypowania urządzenia.

Schemat blokowy pojedynczego wzmacniacza pokazano na rysunku 6.

Rysunek 6. Schemat blokowy modułu pojedynczego wzmacniacza operacyjnego w AVR DB

Wzmacniacze operacyjne pracujące w układach odwracających, a także nieodwracających wymagają 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 za pomocą multipleksera. Pozwala to skonfigurować parametry takich wzmacniaczy bez konieczności dołączania rezystorów zewnętrznych. Moduł (moduły) OPAMP można skonfigurować jako np.:

  • Samodzielny wzmacniacz operacyjny,
  • Bufor (wzmacniacz o wzmocnieniu 1),
  • Wzmacniacz odwracający lub nieodwracający o wzmocnieniu określonym przez R1 i R2,
  • Integrator (układ całkujący),
  • Wzmacniacz różnicowy,
  • Ukad wzmacniacza kaskadowego,
  • Wzmacniacz pomiarowy.

Na wejściach każdego wzmacniacza znajdują się multipleksery, które umożliwiają dołączenie do odpowiedniego sygnału. Na wejściu nieodwracającym (+) do wyboru są: odpowiednie wyprowadzenie mikrokontrolera, „suwak” drabinki rezystorowej, wyjście przetwornika DAC, masa, a także połowa napięcia zasilania (VDD/2). Z kolei do wejścia odwracającego można podłączyć wejście mikrokontrolera, drabinkę rezystorową, wyjście DAC lub wyjście jednego z wzmacniaczy operacyjnego.

Dodatkową elastyczność konfiguracji zapewniają dwa multipleksery umożliwiające dobór sygnału podłączonego do górnego i dolnego bieguna drabinki. Natomiast ostatni multiplekser działa jako suwak i pozwala wybrać ustawienie podziału drabinki.

Konfiguracje modułu wzmacniaczy operacyjnych

Samodzielny wzmacniacz operacyjny

W tej konfiguracji oba wejścia: odwracające (-) i nieodwracające (+) oraz wyjście wzmacniacza podłączono do wyprowadzeń mikrokontrolera (rysunek 7).

Rysunek 7. Samodzielny wzmacniacz operacyjny

Jest to przydatna konfiguracja, jeśli użytkownik chce wykonać wszystkie połączenia z elementami wzmacniacza samodzielnie, poza mikrokontrolerem. Można go zastosować np. w układach filtrów, gdzie potrzebne są kondensatory oraz precyzyjne rezystory o ściśle określonych wartościach.

Układ bufora

Układ bufora pokazanego na rysunku 8 ma wzmocnienie równe 1, bardzo dużą impedancję wejściową, a także bardzo małą impedancję wyjściową. Taki układ stosuje się do separacji dwóch obwodów tak, by wyjście separowanego układu (na wejściu bufora) nie obciążało wejścia kolejnego układu (na wyjściu bufora).

Rysunek 8. Układ bufora

Układ wzmacniacza nieodwracającego

Wzmacniacz nieodwracający 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:

Rysunek 9. Układ wzmacniacza nieodwracającego

W tej konfiguracji wewnętrzne rezystory R1 i R2 dołączane są przez programowany multiplekser.

Układ wzmacniacza odwracającego

Wzmacniacz odwracający (rysunek 10) odwraca fazę sygnału wejściowego (przesuwa o 180 stopni).

Rysunek 10. Wzmacniacz odwracający

W klasycznym wzmacniaczu odwracającym wejście nieodwracające jest połączone z masą, natomiast wzmocnienie układu zależy tylko do stosunku oporności R2 do R1. Napięcie wyjściowe wzmacniacza jest liczone według zależności:

Tutaj do sygnału wyjściowego zdecydowano się jeszcze dodać składową stałą o wartości VDD/2, aby możliwe było wzmacnianie sygnałów symetrycznych względem masy. Sygnał wyjściowy wyliczamy więc z zależności:

Integrator (układ całkujący)

Na rysunku 11 pokazano wzmacniacz skonfigurowany jako integrator. Do prawidłowej pracy niezbędne jest dołączenie zewnętrznego rezystora i kondensatora

Rysunek 11. Układ integratora

Wzmacniacz różnicowy

Za pomocą dwóch wzmacniaczy można skonfigurować układ wzmacniający różnicę sygnałów podawanych na wejścia nieodwracające – rysunek 12. Wzmocnienie określają rezystory: R1 i R2 z układu wzmacniacza OP1.

Rysunek 12. Wzmacniacz różnicowy

Wzmacniacz kaskadowy

Wzmacniacze kaskadowe stosuje się w celu uzyskania dużego wzmocnienia. Składają się z identycznych stopni połączonych szeregowo. W naszym przypadku można skonfigurować wzmacniacze odwracające, a także nieodwracające zbudowane z dwóch lub trzech stopni. Przykładową konfigurację trzystopniowego wzmacniacza kaskadowego nieodwracającego pokazano na rysunku 13.

Rysunek 13. Trzystopniowy kaskadowy wzmacniacz nieodwracający

Wzmacniacz pomiarowy

Wzmacniacz pomiarowy ma wejście różnicowe i asymetryczne wyjście. Impedancja wejściowa jest bardzo duża, na przykład 1 GΩ, natomiast impedancja wyjściowa bardzo mała. Taki wzmacniacz ma często stałe wzmocnienie, lub też wzmocnienie ustalane za pomocą rezystora dołączonego do specjalnych wyprowadzeń. W naszym przypadku wzmocnienie można programować.

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).

Konfigurację wzmacniacza pomiarowego pokazano na rysunku 14. Wzmocnienie (również tłumienie) można zaprogramować tak, jak to pokazano na rysunku 15.

Rysunek 14. Wzmacniacz pomiarowy

Rysunek 15. Programowanie wzmocnienia wzmacniacza pomiarowego

Konfiguracja i programowanie modułu wzmacniaczy operacyjnych

W dokumentacji mikrokontrolerów rodziny AVR DB umieszczono dokładne opisy wszystkich rejestrów konfiguracyjnych modułów peryferyjnych, w tym również wzmacniaczy operacyjnych. Na podstawie tych informacji można dowolnie, zależnie od potrzeb, konfigurować każdy ze wzmacniaczy. Jest to jednak metoda pracochłonna i żmudna. Dużo lepszym rozwiązaniem jest skorzystanie ze środowiska projektowego IDE, a także wbudowanego konfiguratora peryferii. Mikrokontrolery AVR miały swoje własne środowisko IDE – Atmel Studio, które dziś nazywa się Microchip Studio. Można je także programować i debugować w znanym mi środowisku MPLAB IDE. Przykłady konfiguracji modułu OPAMP wykonam właśnie w MPLAB X IDE z zainstalowaną najnowszą wtyczką konfiguratora Microchip Code Configurator (MCC).

Przykład konfiguracji wzmacniacza pomiarowego w środowisku MPLAB X IDE za pomocą wtyczki MCC

Po stworzeniu projektu na mikrokontroler z rodziny AVR DB (w naszym przypadku AVR32DB48) możemy zacząć konfigurację. Rozpoczynamy od wybrania w oknie MCC modułu OPAMP z listy urządzeń Device Resources. Wybrany moduł pojawi się na liście Project Resources.

Okno konfigurowania modułu OPAMP ma cztery zakładki: OPAMP SYSTEM, OP0, OP1, a także OP2. W zakładce OPAMP SYSTEM ustawiamy:

  • Tryb pracy: pojedynczy wzmacniacz, podwójny oraz pojedynczy wzmacniacz i potrójny wzmacniacz. Ponieważ jak wiemy układ wzmacniacza pomiarowego wykorzystuje wszystkie trzy wzmacniacze operacyjne, to wybieramy opcję potrójnego wzmacniacza (triple OPAMPs)
  • Konfigurację wzmacniacza: Trzy wzmacniacze są wykorzystywane przez konfiguracje potrójnego wzmacniacza kaskadowego, a także przez wzmacniacz pomiarowy. Wybieramy zgodnie z założeniem wzmacniacz pomiarowy.

Konfigurację zakładki OPAMP SYSTEM dla wzmacniacza pomiarowego pokazano na rysunku 16.

Rysunek 16. Konfiguracja zakładki OPAMP SYSTEM za pomocą wtyczki MCC

W kolejnym kroku trzeba wybrać źródło sygnału różnicowego podawanego na wejścia wzmacniacza pomiarowego. W zakładce OP0 pojawia się schemat wzmacniacza z zaznaczonym na szaro wzmacniaczem OP0, a także rezystorami R1 i R2 przypisanymi do modułu OP0. Mierzone napięcie V2 jest podawane na wejście nieodwracające wzmacniacza OP0. W oknie Positive 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łą procedurę powtarzamy dla drugiego wejścia pomiarowego. Mierzone napięcie V1 jest podawane na wejście nieodwracające wzmacniacza operacyjnego OP1. W oknie Positive Input MUX wybieramy “Positive input for OPn”, natomiast konfigurator konfiguruje linię PD4 portu PORTD jako drugie wejście analogowe różnicowego wzmacniacza pomiarowego.

Ostatnią czynnością jest określenie wzmocnienia wzmacniacza w oknie System Gain.

Rysunek 17. Konfiguracja źródła sygnału i wzmocnienia wzmacniacza różnicowego

Po takim skonfigurowaniu pojawiają się ostrzeżenia o nie do końca dobrze skonfigurowanych wyjściach wzmacniacza połączonych z wyprowadzeniami mikrokontrolera. Żeby wszystko działało poprawnie, w oknie Pin Module konfiguratora MCC należy zablokować wejściowy bufor dla sygnałów cyfrowych tak, jak to pokazano na rysunku 18.

Rysunek 18. Prawidłowa konfiguracja wyjść wzmacniaczy operacyjnych

Efekt działania MCC

Na listingu 1 pokazano kod wygenerowany przez MCC. Inicjalizuje on moduł OPAMP do pracy jako wzmacniacz pomiarowy ze wzmocnieniem 3, zgodnie z wprowadzonymi parametrami.

Listing 1. Konfiguracja modułu OPAMP pracującego jako wzmacniacz pomiarowy ze wzmocnieniem 3

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();
}

Widać tu wyraźnie jak pożyteczną pracę wykonuje konfigurator i ile czasu można zaoszczędzić na skonfigurowaniu tylko jednego modułu peryferyjnego.

Absolwent Wydziału Elektroniki Politechniki Wrocławskiej, współpracownik miesięcznika Elektronika Praktyczna, autor książek o mikrokontrolerach Microchip i wyświetlaczach graficznych, wydanych nakładem Wydawnictwa BTC. Zawodowo zajmuje się projektowaniem zaawansowanych systemów mikroprocesorowych.