Systemy wbudowane

Transkrypt

Systemy wbudowane
Systemy wbudowane - Laboratorium
Informatyka studia inżynierskie
Ćwiczenie nr 2:
Szeregowy przetwornik AC i CA
Cel ćwiczenia
Celem ćwiczenia jest zapoznanie się z działaniem i sposobami obsługi przetworników AC
i CA sterowanych w sposób szeregowy na przykładzie układu PCF8591.
Wymagane wiadomości
•
•
•
•
•
Budowa mikrokontrolera BasicStamp2
Zestaw edukacyjny StampInClass – budowa i obsługa
Język PBASIC.
Przetworniki AC i CA
Magistrala I2C. Warstwa fizyczna i protokół wymiany informacji.
Wykorzystywany sprzęt
Komputer PC z oprogramowaniem do obsługi zestawu BasicStamp.
Zestaw edukacyjny StampInClass firmy Parallax Inc. wraz z niezbędnym wyposażeniem
dodatkowym (przetwornik PCF8591).
Literatura
[1]
[2]
[3]
[4]
[5]
Mielczarek W.: Szeregowe interfejsy cyfrowe. Wyd. Helion 1993
Łakomy M., Zabrodzki J.: Scalone przetworniki analogowo-cyfrowe i cyfrowoanalogowe. PWN Warszawa 1985
Baranowski J., Kalinowski B., Nosal Z.: Układy elektroniczne cz. III Układy i systemy
cyfrowe. WNT Warszawa 1994.
Philips Semiconductors: PCF 8591 A/D and D/A converter Data Sheet [online].
[Dostęp 1.10 2009]. Dostępny w Internecie:
http://www.nxp.com/acrobat_download/datasheets/PCF8591_6.pdf
Parallax Inc: BASIC Stamp Syntax and Reference Manual 2.2 [online]. [Dostęp 1.10
2009]. Dostępny w Internecie:
http://www.parallax.com/Portals/0/Downloads/docs/prod/stamps/web-BSMv2.2.pdf
1
1. Wprowadzenie
Interfejs I2C [1] jest interfejsem szeregowym synchronicznym. W pierwotnym
opracowaniu częstotliwość pracy interfejsu wynosiła 100 kHz. W obecnej chwili
osiągalne są bez problemu układy I2C o częstotliwościach pracy 400 kHz a nawet 1MHz.
I2C w pierwotnym opracowaniu adresował do 128 urządzeń fizycznych (adres długości
7 bitów).
Fizyczny interfejs magistrali I2C składa się z linii danych i zegarowej.
Linia danych SDA służy do przesyłania danych i adresów między urządzeniem
nadrzędnym a urządzeniem podrzędnym. Jest to linia dwukierunkowa.
Linia zegarowa SCL zapewnia synchronizację danych przesyłanych poprzez linię SDA.
Synchronizację przesyłanych danych zapewnia urządzenie nadrzędne.
Dołączenie linii do magistrali jest obwarowane pewnymi warunkami. Należy do nich
budowa wyjścia typu OC (otwarty kolektor lub otwarty dren).
Poniżej został przedstawiony rysunek,na którym wyróżniono 4 charakterystyczne
odcinki przebiegu.
SDA
SCL
START
STABILNE
DANE
ZMIANA
DANYCH
STOP
Podstawowe warunki transmisji danych na magistrali I2C
Są to:
- START Warunek startu poprzedzający jakąkolwiek transmisję. Jego wykrycie przez
urządzenie podrzędne rozpoczyna odbiór danych;
- STABILNE DANE Pokazuje nam miejsce w trakcie przebiegu, w którym urządzenie
nadrzędne musi utrzymać stabilne dane, lub urządzenie podrzędne wystawia stabilne
dane do odczytu;
- ZMIANA DANYCH W tej części przebiegu może zostać dokonana przez urządzenie
nadrzędne zmiana danych przesyłanych do urządzeń podrzędnych lub następuje zmiana
danych odczytywanych z urządzenia podrzędnego;
- STOP Warunek stopu kończący transmisję do/z urządzenia podrzędnego.
Urządzenia dołączone do magistrali umownie nazywamy nadrzędnymi (master) i
podrzędnymi (slave). Urządzenie nadrzędne przesyła adresy, rozkazy, odbiera i wysyła
dane oraz synchronizuje przesyłane dane. Urządzenia podrzędne potwierdzają przyjęcie
rozkazów, adresów i danych oraz wykonują polecenia. Do magistrali może być
dołączonych wiele urządzeń nadrzędnych oraz wiele urządzeń podrzędnych. Dostęp do
magistrali w danym momencie może mieć tylko jedno urządzenie nadrzędne. W
przypadku konfliktu urządzenia przystępują do arbitralnego rozstrzygnięcia o dostępie.
Słowo transmitowanych danych ma długość 8 bitów. Każde przesłane słowo jest
2
potwierdzane przez docelowe urządzenie podrzędne. Potwierdzenie polega na
przytrzymaniu na linii SDA stanu niskiego przez czas równy jednemu okresowi sygnału
na linii SCL. Jeżeli urządzenie podrzędne nie potwierdzi z jakichś powodów odebrania
bajtu urządzenie nadrzędne powinno wysłać warunek stopu. Jeżeli następuje koniec
przesyłania danych z urządzenia podrzędnego do nadrzędnego (np. transmisja
ostatniego bajtu z bieżącej strony pamięci itp.) to urządzenie podrzędne nie wystawia
potwierdzenia sygnalizując, iż wystawiło właśnie ostatni bajt, który ma do wysłania. Na
Rys. 1 przedstawione zostały przebiegi sygnałów generowane przez urządzenia
podłączone do magistrali oraz ich wypadkowa na magistrali.
Rys. 1 Przebiegi generowane na magistrali I2C przez współpracujące urządzenia.
1.1 Protokół transmisji.
Każda transmisja rozpoczyna się od przesłania warunku startu, po którym następuje
przesłanie adresu, od którego zaczynamy dokonywać operacji zapisu/odczytu. Po
sekwencji rozpoczynającej następuje przesyłanie danych zakończone warunkiem stopu.
Podstawowe typy przesłań zostały przedstawione na rysunku poniżej
3
1.2 Przetwornik PCF8591
Układ PCF 8591 [4] jest scalonym przetwornikiem AC i CA sterowanym poprzez interfejs
I2C. Dzięki temu układ jest zamknięty w 16 nóżkowej obudowie. Przetwornik AC pracuje
w oparciu o zasadę kolejnych przybliżeń. W czasie pracy przetwornik AC wykorzystuje
przetwornik CA, nie jest wiec możliwe jednoczesne korzystanie z obu przetworników.
Na rysunku przedstawiono rozmieszczenie wyprowadzeń układu PCF891.
Z informacji wstępnych na temat interfejsu I2C wynika, ze każdy
układ podłączony do szyny powinien posiadać własny adres. Jak
w większości układów podłączanych do magistrali I2C adres
układu składa się z dwóch części: stałej zdefiniowanej przez
producenta ustalonej na binarna wartość 1001 i części zmiennej
ustalanej przez użytkownika poprzez podanie wybranych
stanów logicznych na linie A1, A1, A2. W zależności od inwencji
użytkownika układ może zajmować na magistrali lokalizacje
adresowe 48H do 4FH
Przetwornik posiada 4 konfigurowane wejścia sygnału
analogowego AIN0, AIN1, AIN2, AIN3.
Wyprowadzenia SDA i SCL służą do podłączenia układu do magistrali I2C. Układ może
pracować z zewnętrznym sygnałem zegarowym jak i w oparciu o własny oscylator.
Obsługa układu jest bardzo prosta. W trybie pracy jako przetwornik CA pierwszy
wysłany do układu bajt jest traktowany jako bajt konfiguracji. Kolejne odebrane bajty są
przekazywane do przetwornika i zamieniane na napięcie na wyjściu AOUT
proporcjonalne do wartości wysłanego słowa.
Aby korzystać z przetwornika AC należy wysłać do układu bajt konfiguracji a następnie
odbierać rezultaty przetworzenia ( pierwszy odebrany bajt jest wartością
przypadkową).
Szczegółowe informacje na temat przetwornika i sposobu jego programowania można
znaleźć w [4].
Dostępna na zajęciach (i w załączniku) biblioteka niskopoziomowych procedur obsługi
magistrali I2C składa się z 4 funkcji:
I2C_Start - wystawia na magistralę warunek startu,
I2C_TX_Byte
- wysyła na magistralę jeden bajt (wartość jest przekazywana przez
zmienną i2cWork),
I2C_RX_Byte
- odbiera z magistrali jeden bajt (odebrany bajt jest zwracany w
zmiennej i2cWork),
I2C_Stop - wystawia na magistralę warunek stopu.
4
2. Wykonanie ćwiczenia
Każdy zespół otrzymuje układ przetwornika, potencjometr 100kΩ, 2 rezystory 10kΩ
(oznaczone paskami: brązowym, czarnym, pomarańczowym, złotym) oraz przewody.
Wybrane podzespoły są umieszczone na płycie prototypowej w odpowiednich miejscach
i nie należy ich z niej usuwać lub przemieszczać.
2.1 Wykonanie niezbędnych połączeń:
Odłączyć zasilanie!
Wykonać przewodami następujące połączenia:
- podłączyć masę płytki prototypowej (VSS) do wyprowadzeń 5,6,7 (linie
adresowe A0,A1,A2) oraz 8 (ujemny biegun zasilania Vss).
- podłączyć napięcie zasilania (Vdd) do wyprowadzeń 16 (Vdd) i 14 (Vref)
przetwornika.
- podłączyć wyprowadzenie 9 (SDA) do portu P4,
- przy pomocy rezystora 10kΩ (oznaczonego paskami: brązowym, czarnym,
pomarańczowym, złotym) połączyć wyprowadzenie 9 (SDA) przetwornika do
Vdd.
- podłączyć wyprowadzenie 10 (SCL) do portu P5,
- przy pomocy rezystora 10kΩ (oznaczonego paskami: brązowym, czarnym,
pomarańczowym, złotym) połączyć wyprowadzenie 10 (SCL) przetwornika do
Vdd.
- wyprowadzenie AGND (13) przetwornika połączyć z masą (Vss).
- wejście wyboru oscylatora 12 (EXT) podłączyć do Vss wybierając jako źródło
sygnału zegarowego dla przetwornika wbudowany w niego wewnętrznym
oscylator.
Ustawić miernik uniwersalny do pracy jako woltomierz oraz wykonać dodatkowe
połączenia:
- za pomocą dłuższego, czerwonego przewodu z wtykiem bananowym podłączyć
dodatni zacisk miernika uniwersalny do wyprowadzenia 15 (AOUT).
- czarnym dłuższym przewodem z wtykiem bananowym połączyć ujemny zacisk
miernika z wyprowadzeniem 13 (AGND)
Zgłosić prowadzącemu gotowy układ do sprawdzenia połączeń i włączenia
układu. Nie włączać samodzielnie układu, gdyż przy błędzie w połączeniach może
nastąpić uszkodzenie przetwornika.
5
2.2 Badanie charakterystyki przetwornika CA
Aby sporządzić charakterystykę przetwornika, należy w oparciu o udostępnione
niskopoziomowe procedury obsługi magistrali I2C oraz dokumentację układu PCF 8591
przygotować odpowiedni program sterujący przetwornikiem CA.
Biblioteka niskopoziomowych procedur obsługi magistrali I2C składa się z 4 funkcji:
I2C_Start
- wystawia na magistralę warunek startu,
I2C_TX_Byte
- wysyła na magistralę jeden bajt (wartość jest przekazywana przez
zmienną i2cWork),
I2C_RX_Byte
- odbiera z magistrali jeden bajt (odebrany bajt jest zwracany w
zmiennej i2cWork),
I2C_Stop
- wystawia na magistralę warunek stopu.
Przed rozpoczęciem korzystania z przetwornika PCF8591 należy ustalić:
- wartość bajtu adresującego przetwornik
- wartość bajtu konfiguracyjnego przetwornika
Zgodnie z Fig. 4 str. 5 dokumentacji przetwornika [4], cztery najstarsze bity bajtu
adresującego są na stałe ustalone przez producenta na wartość 1001. Trzy kolejne bity
zależą od wartości logicznych podanych na wejścia A2-A0 przetwornika. W przyjętej
konfiguracji wejścia A2-A0 są połączone z Vss, co ustala stan tych wejść na 000.
Najmłodszy bit określa kierunek transmisji: 0 – dla zapisu do przetwornika, 1 dla
odczytu z przetwornika.
W tej części ćwiczenia jedyną wykonywaną operacją będzie zapis danych do
przetwornika, zatem wartość tego bitu pozostanie przez cały czas zerem.
Wartość bajtu konfiguracyjnego przetwornika można wyznaczyć na podstawie rysunku
5 str. 6 dokumentacji do układu PCF8591 [4]. Należy ustawić następujące parametry
pracy przetwornika:
- korzystać z zerowego kanału przetwornika AC (AIN0),
- wyzerowany bit autoinkrementacji,
- wejścia przetwornika A/C skonfigurowane jako 4 pojedyncze (single ended)
wejścia,
- odblokowany przetwornik C/A.
Aby wykonać cykl przetworzenia jednej wartości cyfrowej na postać analogową należy:
-
wystawić przy pomocy procedury I2C_Start warunek startu,
przy pomocy procedury I2C_TX_Byte wysłać na magistralę wyznaczony
wcześniej bajt adresujący. Wysłanie tego baju powoduje zaadresowanie
przetwornika. Wysyłane od tej pory na magistrale dane będą przeznaczone
wyłącznie dla zaadresowanego układu, aż do wysłania warunku stopu.
Przykładowe wywołanie procedury I2C_TX_Byte wysyłające na magistralę I2C
bajt o wartości szesnastkowej 55 HEX może w języku PBASIC przyjąć następującą
postać (użyta w przykładzie wartość nie jest poprawnym adresem przetwornika
na magistrali I2C, służy jedynie pokazaniu sposobu wywołania procedury
I2C_TX_Byte):
6
i2cWork = $55
GOSUB I2C_TX_Byte
-
-
-
-
-
sprawdzić stan bitu potwierdzenia przechowywany w zmiennej i2cAck. Jeśli
jest on równy 0 przetwornik został poprawnie zaadresowany i można wysyłać
kolejne bajty. Jeśli ma on wartość 1 oznacza to prawdopodobne błędy w montażu
lub w działaniu układu. W takiej sytuacji należy poprosić o pomoc prowadzącego.
przy pomocy procedury I2C_TX_Byte wysłać przez magistralę I2C wyznaczony
wcześniej bajt konfiguracji przetwornika oraz sprawdzić stan bitu i2cAck
potwierdzającego poprawny odbiór danej.
przy pomocy procedury I2C_TX_Byte wysłać na magistralę wartość przeznaczoną
do przetworzenia na postać analogową oraz sprawdzić stan bitu i2cAck
potwierdzającego poprawny odbiór danej.
(w celu łatwej oceny poprawności działania zmontowanego układu, proponuje
się, aby przy pierwszym uruchomieniu przetwornika, jako danej mającej zostać
zamienioną na postać analogową użyć wartości 128 (80H). Poprawnie działający
układ przetwornika powinien na wyjściu analogowym wystawić napięcie równe
połowie wartości napięcia referencyjnego podawanego na wejście VREF
przetwornika. W układzie badanym w trakcie ćwiczenia oznacza to pojawienie
się na wyjściu AOUT napięcia około 2.5V),
przy pomocy procedury I2C_TX_Byte wysłać na magistralę po raz drugi tę samą
wartość przeznaczoną do przetworzenia na postać analogową (wynika to z
opisanego w dokumentacji sposobu działania przetwornika),
wystawić przy pomocy procedury I2C_Stop warunek stopu, kończąc wymianę
danych z przetwornikiem.
Zaobserwować na woltomierzu, jaka wartość napięcia ustaliła się na wyjściu AOUT
przetwornika.
Po stwierdzeniu, że układ działa poprawnie przeprowadzić serie pomiarów, które
pozwolą sporządzić charakterystykę przetwornika.
Powtarzając opisaną wcześniej procedurę należy powtórzyć, aby uzyskać wartości
napięć dla:
- pierwszych 16 wartości słowa wejściowego (00-0F),
- wartości ze środka zakresu przetwarzania (7E-81)
- wartości z końca zakresu przetwornika (F8-FF)
Wyniki pomiarów zanotować. (Można również przygotować program, który pozwoli na
automatyczną
Na podstawie tych pomiarów wyznaczyć podstawowe parametry przetwornika:
- zakres przetwarzania
- rozdzielczość.
Sporządzić wykres charakterystyki Uwy(n).
Po zakończeniu pomiarów nie rozmontowywać układu. Po modyfikacjach zostanie on
wykorzystany w dalszej części zajęć.
7
2.3 Badanie charakterystyki przetwornika AC
Odłączyć zasilanie!
Potencjometr
Przetwornik
PCF 8591
Rys. 2 Rozmieszczenie wybranych
elementów na płycie prototypowej.
Przetwornik
PCF8591
oraz
potencjometr
wieloobrotowy o wartości 10 kΩ zostały
umieszczone w płytce prototypowej w sposób
przedstawiony na Rys. 2. Takie rozmieszczenie
sprawia, że wyjście suwaka potencjometru jest
podłączone do wejścia AIN0 przetwornika.
Potencjometr
ma
działać w konfiguracji
regulowanego dzielnika napięcia. Będzie służył do
zadawania
na
wejście
analogowe
AIN0
przetwornika PCF8591 różnych wartości napięcia z
przedziału <0,Vref>.
Oznaczenia
wyprowadzeń
potencjometru
przedstawiono na Rys. 3. Skrajne wyprowadzenia
potencjometru podłączyć odpowiednio do masy
(Vss) i zasilania (Vdd). Suwak potencjometru
(wyprowadzenie
środkowe)
podłączyć
do
wyprowadzenia 1(AIN0) układu przetwornika.
Dłuższy,
czerwony
przewód
miernika
uniwersalnego podłączyć do wyprowadzenia 1
(AIN0) przetwornika.
Czarny przewód miernika pozostawić podłączony
do wyprowadzenia 13 (AGND).
2
1
3
1
3
2
Rys. 3 Oznaczenie wyprowadzeń
potencjometru
Zgłosić prowadzącemu gotowy układ do sprawdzenia połączeń i włączenia
układu.
Korzystając z dołączonej biblioteki obsługi magistrali I2C obsłużyć przetwornik AC.
Przed rozpoczęciem przetwarzania A/C przetwornik powinien otrzymać odpowiedni baj
konfiguracyjny. Właściwa również dla tej części ćwiczenia wartość tego bajtu została
ustalona w części ćwiczenia związanej z przetwarzaniem C/A. Może zatem zostać
wykorzystana.
Wysłanie bajtu konfiguracyjnego wykonuje się w sposób identyczny jak w części
związanej z przetwarzaniem CA. Można wykorzystać używany wcześniej program,
ograniczając jego działanie do wysłania na magistralę I2C bajtu adresującego
8
przetwornik oraz bajtu konfiguracji. Po ich wysłaniu można zakończyć komunikację
wystawiając na magistralę warunek stopu.
W procesie przetwarzania A/C mikrokontroler musi odbierać od przetwornika dane
będące wynikiem przetworzenia analogowej wartości napięcia podanego na wejście
przetwornika na wartość cyfrową. Zgodnie ze specyfikacją magistrali I2C, urządzenie, z
którego odczytywane są dane jest widoczne na magistrali pod innym adresem
(najmłodszy bit bajtu adresowego jest ustawiony na wartość 1). Należy zatem w
podobny sposób jak przy przetwarzaniu C/A wyznaczyć ten adres, pamiętając przy tym
o ustawieniu najmłodszego bitu na 1.
Prawidłowa sekwencja uruchamiająca przetwornik PCF8591 do pracy w trybie A/C
może wyglądać następująco:
- wystawienie warunku startu (I2C_Start),
- wysłanie bajtu adresującego dla ustawienia konfiguracji przetwornika
(I2C_TX_Byte),
- wysłanie bajtu konfiguracji przetwornika (I2C_TX_Byte),
- wystawienie warunku stopu (I2C_Stop),
- wystawienie warunku startu (I2C_Start),
- wysłanie bajtu adresującego (innego niż wcześniej dla zapisu) dla odczytu danej z
przetwornika (I2C_TX_Byte),
- odczyt danej z przetwornika procedurą I2C_RX_Byte (wartość odczytanej danej
zostanie umieszczona w zmiennej i2cWork)
- ponowny odczyt danej z przetwornika procedurą I2C_RX_Byte – zgodnie z
dokumentacją przetwornika, proces przetwarzania jest wyzwalany operacją
odczytu danej z przetwornika. Zatem dopiero druga odczytana wartość jest
poprawnym wynikiem przetworzenia napięcia wejściowego na wartość cyfrową.
- wyświetlenie lub wykorzystanie w inny sposób uzyskanej danej z przetwornika
Otrzymaną z przetwornika daną można wyświetlić na konsoli komputera,
umieszczając w programie instrukcję:
DEBUG "Wartosc przetworzona ", DEC i2cWork,CR
-
kolejny odczyt wartości z przetwornika.
wystawienie warunku stopu (I2C_Stop) kończącego pracę przetwornika.
Zmieniając położenie potencjometru zarejestrować około 20 punktów pomiarowych w
całym zakresie zmian napięcia wejściowego.
Aby usprawnić pomiary można zapętlić program tak, aby wykonywał sekwencyjny
odczyt wyzwalając automatycznie kolejne cykle przetwarzania.
Obliczyć teoretyczną wartość napięcia odpowiadającą zmianie wartości słowa
wyjściowego o 1 bit. Na tej podstawie postarać się doświadczalnie wychwycić zmianę
napięcia na wejściu odpowiadającą różnicy na pozycji najmłodszego bitu.
Określić zakres i rozdzielczość przetwornika.
Z uzyskanych danych sporządzić wykres charakterystyki przetwornika.
9
Załącznik – procedury obsługi programowej emulacji interfejsu I2C dla BS2
' i2c.bs2
' procedury obslugi emulacji programowej magistrali i2c
' dla BasicStamp 2
'{$STAMP BS2}
'{$PBASIC 2.5}
' -----[ I/O Definitions ]------------------------------------------------SDA PIN 4 ' I2C serial data line
SCL PIN 5 ' I2C serial clock line
' -----[ Constants ]------------------------------------------------------Ack CON 0 ' jest bit podwierdzenia
Nak CON 1 ' brak bitu potwierdzenia
' -----[ Variables ]------------------------------------------------------i2cWork VAR Byte
i2cAck VAR Bit
' zmienna robocza dla procedur nadawania i odbioru
' bit Ack (potwierdzenie z urzadzenia)
' ------------------------------------------------------------------------'ponizej umieszczamy wlasny program
'wysylany lub odbierany bajt z i2c przekazywany jest przez zmienna i2cWork
END
' -----[ Niskopoziomowe procedury magistrali I2C]-------------------------' *** Warunek Startu ***
I2C_Start:
INPUT SDA
INPUT SCL
LOW SDA
Clock_Hold:
DO : LOOP UNTIL (SCL = 1) ' czekamy na zwolnienie zegara
RETURN
' *** Wysłanie bajtu na magistrale ***
I2C_TX_Byte:
SHIFTOUT SDA, SCL, MSBFIRST, [i2cWork\8] ' wysłanie bajtu do odbiorcy
SHIFTIN SDA, SCL, MSBPRE, [i2cAck\1]
' odbiór bitu potwierdzenia
RETURN
' *** Odbiór bajtu z magistrali***
I2C_RX_Byte_Nak:
i2cAck = Nak ' brak Ack = high
GOTO I2C_RX
I2C_RX_Byte:
i2cAck = Ack ' jest Ack = low
I2C_RX:
SHIFTIN SDA, SCL, MSBPRE, [i2cWork\8]
SHIFTOUT SDA, SCL, LSBFIRST, [i2cAck\1]
' odbior bajtu od nadawcy
' wystawienie potwierdzenia
' ack lub nak
RETURN
' *** Warunek Stopu ***
I2C_Stop:
LOW SDA
INPUT SCL
INPUT SDA
RETURN
' -----[ Koniec I2C.BS2]---------------------------------------------------
10