Komunikacja układów 3,3V i 5V

Wstęp

Podczas rozwoju podzespołów elektronicznych, wraz z ich przyśpieszaniem i zmniejszaniem poboru energii, zmieniały się też standardy w jakich te układy pracowały. Obecnie w elektronice amatorskiej (także w Arduino) panuje standard 5V. Oznacza to, że zasilanie układów scalonych i ich stany logiczne odnoszą się właśnie do tego napięcia. Wiadomo, że stan niski “LOW” to GND, a stan wyoki “HIGH” to napięcie w okolicach 5V.


Coraz częściej spotyka się układy scalone pracujące w standardzie 3,3V. Oznacza to, że ich zasilanie i stany logiczne nie pasują do obecnych rozwiązań. W tym wpisie dowiesz się jak sprawić, by urządzenia obydwu standardów mogły się ze sobą łączyć i komunikować.


W Arduino w grupie pinów “POWER” jest wyjście napięcia 3,3V. W nowszych wersjach Arduino grupy R3 pojawił się tam dodatkowy pin o nazwie “IOREF”. Jest na nim napięcie w jakim pracuje dana płytka Arduino. To taki wybieg jego projektantów dla przyszłych wersji płytek, które mogą pracować już w standardzie 3,3V. Ten pin pozwoli dopasowywać komunikację układów podczas okresu przejściowego.


Opisywane wcześniej układy PCF8574 i TLC5940 potrafią pracować w obydwu standardach. Jeśli zasilisz je napięciem 5V, to pracują w standardzie 5V. Jeśli zasilisz napięciem 3,3V, to będą pracować w standardzie 3,3V.


Są też jeszcze inne układy przejściowe, które mają opcję “5V Compilant”. Są zasilane napięciem 3,3V, jednak jeśli podłączysz do nich sygnały logiczne standardu 5V, to będą działały bez przeszkód. Przykładem takiego układu jest opisany niżej bufor 74AHC125.


Coraz częsciej spotykane są układy używające tylko standardu 3,3V. Podłączenie do nich innych stanów logicznych lub zasilania może spowodować ich uszkodzenie. Aby komunikowały się ze starszym standardem potrzebne są układy dopasowujące, które tu opiszę.

Zasilanie układów 3,3V

Pin 3V3 w Arduino ma ograniczoną wydajność do 40 mA. Często zdarza się, że zasilane tym napięciem układy pobierają znacznie więcej prądu.

Jeśli tak jest i w twoim przypadku, należy zbudować sobie odpowiedni układ zasilający.


Układ jest dość prosty. Składa się ze stabilizatora liniowego (o oznaczeniu MCP1700-3302E/TO) i dwóch kondensatorów ceramicznych 1µF. Stabilizator to rodzaj układu scalonego, który mimo różnych napięc na wejściu, zawsze ma cały czas takie samo napięcie na wyjściu. Ten typ stabilizatora wytrzymuje prąd do 250 mA. Jest on w obudowie typu TO-92 znanej z różnego rodzaju tranzystorów. Układ ma trzy wyprowadzenia. Patrząc od jego ściętej strony od lewej  – pierwsze to GND, kolejne to wejście napięcia (do 6V), a ostatnie to wyjście stabilizowanego napięcia 3,3V. Do wejścia i wyjścia należy podłączyć kondensatory jak na rysunku.

Układ można zasilić napięciem z pinu 5V Arduino.

Układ pochodzi z modułu Adafruit XBee Adapter v1.1 i został w nim sprawdzony.


Są też inne stabilizatory wytrzymujące prąd o natężeniu do 3A. Podłączenie ich jest podobne do tego na rysunku, jednak zawsze należy się tego upewnić zaglądając do ich noty katalogowej.

Podłączenie wyjścia układu 5V do wejścia układu 3,3V


Schemat przedstawia połączenie Arduino pracującego w standardzie 5V z modułem typu XBee, pracującym w standardzie 3,3V. Sygnał wyjścia szeregowego Arduino ma trafić do wejścia szeregowego XBee i być przystosowany do jego napięcia pracy.


Wyjście pinu arduino podłączone jest do 2 rezystorów połączonych szeregowo. Wyjście drugiego rezystora podłączone jest do GND. Połączenie między rezystorami trafia do wejścia XBee.

 

Tak połączone rezystory tworzą tzw. dzielnik napięcia, pozwalający zmniejszyć napięcie. Napięcie wyjściowe ustala się ze wzoru:


Uwy = Uwe * R2 / (R1 + R2)


W tym układzie są 2 rezystory o takim samym oporze 10 kΩ. Daje to dzielnik napięcia przez 2.


Uwy = 5V * 10 kΩ / (10 kΩ + 10 kΩ) = 5V * 10 / 20 = 5V * 1 / 2 = 2,5 V


Co sprawia, że stan wysoki wychodzący z pinu 1 Arduino zostanie zmniejszony do 2,5V i trafi do XBee.

Ponieważ napięcie 2,5V jest mniejsze niż 3,3V to nie zepsuje XBee. Takie napięcie mieści się też na granicy zakresu tolerancji stanu wysokiego układów na 3,3V. Układ pochodzi z modułu Arduino XBee Shield v1.1 i działa w nim poprawnie.`


Innym sposobem dopasowania wyjścia 5V do wejścia 3,3V jest zastosowanie różnego rodzaju dopasowujących układów scalonych (buforów). Jednym z nich jest układ 74AHC125, posiadający 4 takie bufory.

Układ zasilany jest napięciem od 2 do 5V. Od napięcia zasilania zależy to w jakim standardzie będą działały wyjścia. W tym przypadku zasiliłem układ napięciem 3,3V (czerwony przewód).

Układ posiada 4 bufory. Wejścia buforów (oznaczone kolorem niebieskim) tolerują napięcie do 5V. Wyjścia (oznaczone kolorem żółtym) mają w stanie wysokim w tym przypadku napięcie do 3,3V. Każde wejście bufora jest powiązane z wyjściem i oznaczone na rysunku cyfrą.

Układ pochodzi z modułu Adafruit XBee Adapter v1.1 i działał w nim poprawnie.

Podłączenie wyjścia układu 3,3V do wejścia układu 5V

Tutaj sprawa jest ułatwiona. Wyjścia standardu 3,3V można łączyć bezpośrednio do wejść standardu 5V. Tolerancja wejść tego standardu pokrywa się z zakresem napięć wyjścia 3,3V.

Połączenie dwukierunkowe standarów 5V i 3,3V

Sygnały magistrali I2C (TWI) mogą być przesyłane w obydwu kierunkach. To utrudnia sprawę z dopasowaniem sygnału dla obydwu standardów i wymaga trudniejszego schematu.


Układ składa się z tranzystora MOSFET typu N z wbudowaną diodą o oznaczeniu BSS138 i 2 rezystorów 10 kΩ.

LV to wejście zasilania 3,3V, a HV to wejście zasilania 5V. TX_LV to miejsce podpięcia sygnału w standardzie 3,3V, natomiast TX_HV to miejsce podłączenia sygnału w standardzie 5V.


Wysyłając sygnały, urządzenia magistrali TWI ustawiają się albo w stan niski, albo nieustalony. Zapobiega to przeciążeniu układu w przypadku gdyby 2 urządzenia na raz zaczęły nadawać różne sygnały (jeden HIGH drugi LOW). Dlatego magistrala we własnym zakresie musi zapewnić rezystory podciągające PullUp zapewniające na niej bezpieczny stan wysoki jako domyślny. Układ na schemacie zapewnia takie rezystory dla każdej ze stron standardu oznaczone jako R3 i R4.


Tranzystor MOSFET (Q1) składa się z trzech wyprowadzeń. Bramka (Gate) to wyprowadzenie podłączone do zasilania LV (3,3V). Źródło (Source) to wyprowadzenie podłączone do wyjścia TX_LV. Ostatnie wyprowadzenie o nazwie dren podłączono do wyjścia TX_HV. Tranzystor jest rodzajem przełącznika, który przewodzi prąd między drenem i źródłem w zależności od napięcia jakie znajduje się między bramką i źródłem. Jeśli to napięcie nie różni się to tranzystor nie przewodzi. Jeśli się różni o jakąś minimalną wartość, to zaczyna przewodzić.


W przypadku, gdy żaden z układów magistrali nie ustawił jej w stan niski, napięcie na źródle i drenie nie różni się i dla obydwu wynosi 3,3V.

Gdy układ po stronie standardu 3,3V ustawi magistralę w stan niski, wtedy na źródle pojawi się stan LOW czyli GND czyli 0V, a na bramce pozostanie dalej napięcie 3,3V. W ten sposób powstanie różnica napięć i tranzystor zacznie przewodzić prąd. Czyli ustawi stan niski LOW po stronie standardu 5V.


Po stronie standardu 5V, gdy panuje stan wysoki HIGH, dioda nie przewodzi prądu i po stronie standardu 3,3V napięcie stanu wysokiego ustala rezystor PullUp R3. Gdy po stronie 5V urządzenie ustawi magistralę w stan niski, wtedy dioda zacznie przewodzić stan niski, który jest taki sam dla obydwu standardów.

Moduł konwersji stanów logicznych z Nettigo

Sklep Nettigo oferuje gotową płytkę, która zawiera 2 kanały dwukierunkowej konwersji standardów 3,3V i 5V, oraz dwa kanały konwersji standardów opartych na dzielnikach napięcia.


  • HV – zasilanie 5V

  • LV – zasilanie 3,3V

  • GND – masa GND

  • TXO – strona standardu 5V dla dwukierunkowego połączenia

  • TXI – strona standardu 3,3V dla dwukierunkowego połączenia

  • RXI – wejście standardu 5V do dzielnika napięcia

  • RXO – wyjście standardu 3,3V z dzielnika


Przykład pokazuje jak wykorzystać moduł do konwersji standardu TWI w Arduino UNO R3. Wykorzystuje on 2 konwertery dwukierunkowe modułu.


Ten przykład jest kopią układu z początku artykułu. Pokazuje sposób podłączenie wyjścia szeregowego Arduino w standardzie 5V do wejścia szeregowego modułu typu XBee w standardzie 3,3V. Przykład wykorzystuje dzielnik napięcia kanału 1.


Oczywiście można wykorzystywać na raz dzielniki i 2 kanałowe połączenia.

Zakończenie

Na koniec wypada mi jeszcze wspomnieć o tym, że są też inne rodzaje Arduino, które pracują z różnymi standardami stanów logicznych. Arduino LilyPad można zasilać napięciami od 2,7 do 5 V. Zatem jego standard pracy zależy od tego jakim napięciem go zasilisz. Arduino Fio i Pro Mini (model 3,3V)  pracują już tylko w standardzie 3,3V.
Wpis ten jest wstępem do kolejnych, w których opiszę serię urządzeń pracujących tylko w standardzie 3,3V. Jakie to urządzenia? Przekonasz się o tym już za jakiś czas.

Linki

 

9 myśli nt. „Komunikacja układów 3,3V i 5V

  1. Wii

    Bardzo pomocny blog, szczególnie wpisy o podstawach elektroniki. Artykuł np. o PWM, przejrzysty i zrozumiały dla amatora.
    Moje pytanie dotyczy podłączenia Wii, zrobiłem to używając instrukcji z tej strony
    http://todbot.com/blog/2008/02/18/wiichuck-wii-nunchuck-adapter-available/
    udało się. Ale po jakimś czasie Wii przestał działać. Kupiłem nowy, ale proszę o radę. Znalazłem w sieci informacje, że elektronika Wii pracuje na 3.3V, sposób podłączenia z powyższej strony, jak i wielu innych korzysta z 5V. Czy to mogło być powodem spalenia Wii? W sieci znajduje sprzeczne informacje na ten temat.

    Odpowiedz
  2. sprae Autor wpisu

    Witaj :-)
    Bardzo ciekawe pytanie.
    Strony z opisem wyprowadzeń wii-nunchuck podają, że zasilanie ma wartość 3,3V.
    Strony hackerskie piszą, że jest co prawda 3,3V ale toleruje 5V.

    Ostatecznie dotarłem do strony ludzi poddających Wii odwrotnej inżynierii http://wiire.org i tam jest napisane, że zasilanie jego podzespołów (akcelerometru) to maksymalnie 3,6V.
    Nie wiem czy są one zabezpieczone jakimś układem. By trzeba to sprawdzić woltomierzem na płytce.

    Ostatecznie zaryzykowałbym stwierdzenie, że ta płytka powinna działać na 3,3V.

    Odpowiedz
  3. Wii

    Jeszcze jedno pytanie:) Czy niższe napięcie może uszkodzić układ, czy najwyżej nie będzie działał? Czy IC2 w Arduino pracującym na 5V, nie uszkodzi Wii, jesli jego elektronika pracuje na 3.3V?
    Przepraszam, jeśli te pytania mogą się wydać naiwne. To moje pierwsze kroki, z elektroniką, programowaniem. Arduino i Processing bardzo inspirujące narzędzia, ale czym dalej w las tym więcej pytań:)

    Odpowiedz
  4. sprae Autor wpisu

    Jak zasilisz niższym napięciem to raczej trzeba też skonwertować napięcie sygnałów i2c. Można to zrobić za pomocą płytki którą opisałem :-).

    Tylko czy to stare wii-numchuck na serio padło? Bo w tym adapterze, który opisałeś trzeba w „setup” najpierw ustawić piny zasilania przez „nunchuck_setpowerpins()”.
    Może tylko czegoś zapomniałeś.

    Co do pytań, to pytaj ile chcesz. W końcu po to jest ten blog :-). Problemy są po to, żeby je rozwiązać i się czegoś nauczyć.

    Powodzenia

    Odpowiedz
  5. sprae

    Piotr-e: Masz rację. 74AHC245 może działać jako 2 kierunkowy bufor. Wystarczy zasilić go 3,3 V I powinien działać. Bo jego wejścia mają tolerancję do 5.5V, a wyjścia w stanie wysokim mają wartość bliską napięciu zasilania.

    Gratuluję :-)

    Odpowiedz

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *

This site uses Akismet to reduce spam. Learn how your comment data is processed.