Zrozumienie analogowego i cyfrowego GPIO

11

Próbuję zrozumieć GPIO i przeczytałem kilka różnych postów na blogu i myślę, że jestem bliski zdobycia go, ale wciąż mam problemy z kilkoma rzeczami.

Widziałem kilka odniesień do tego, że GPIO może pracować tylko z wartościami binarnymi, ale inne posty mówią, że wartość może wynosić od 0-255. Zakładam, że taka jest różnica między analogowym a cyfrowym GPIO. Czy to jest poprawne? Czy to możliwe, że pojedynczy pin GPIO może działać zarówno analogowo, jak i cyfrowo?

pedalpete
źródło
Jako odpowiedź na niektóre odpowiedzi ... Wartość binarna odnosi się do wejścia lub wyjścia cyfrowego. Może to być 1 (które powinno być napięciem źródłowym, zwanym „hi” lub „on”) lub 0 (co oznacza 0 V, zwane „lo” lub „off”). To rozdzielczość 1 bit. Wejście analogowe może mieć zakres, zwykle od 0 V do VCC (napięcie źródła). Układ cyfrowy o rozdzielczości 8 bitów przekonwertuje to wejście analogowe na 8-bitowy sygnał cyfrowy z zakresu 0–255 (dwójkowy: 00000000–11111111), ponieważ 2 ^ 8–1 = 255 (dwójkowy oznacza podstawę 2, 8 pochodzi z 8 bitów część i „- 1”, ponieważ cyfrowe rzeczy zaczynają liczyć się od 0, a nie 1).
Kurt E. Clothier

Odpowiedzi:

14

Pin GPIO jest pinem „wejścia / wyjścia ogólnego zastosowania”. Jest to domyślnie tylko wysokie lub niskie (poziomy napięcia, wysokie to napięcie zasilania mikrokontrolera, niskie zwykle jest uziemione lub 0V). Ale poziomy „wysoki” i „niski” są zwykle podawane jako napięcia jako proporcja napięcia zasilania. Zatem wszystko, co zwykle przekracza 66% napięcia zasilania, jest uważane za poziom logiczny „wysoki”, co oznacza, że ​​niektóre urządzenia o niższym napięciu mogą komunikować się z urządzeniami o wysokim napięciu, o ile poziomy mieszczą się w granicach tego, co uważa się za „wysokie”. Na przykład mikrokontroler lub odbiornik GPS o niskiej mocy 1,8–2,7 V lub odbiornik GPS będą miały problemy z komunikacją bezpośrednio z mikrokontrolerem 5 V, ponieważ to, co urządzenie niskiego napięcia postrzega jako „wysokie”, urządzenie o wyższym napięciu w ogóle nie uzna, że ​​jest wysokie. Służy do używania GPIO jako wejścia,

Czasami możesz użyć SINGLE pin do wartości „analogowych”, konfigurując pin GPIO do użycia przez inne urządzenia pokładowe, takie jak konwerter „analogowo-cyfrowy” (ADC). Pin jest ustawiony na kanał w ADC i działa teraz jako wejście do ADC, a nie normalny pin GPIO. Następnie można ustawić ADC do pobierania próbki i odczytać wartość rejestru wyników ADC dla liczb takich jak 0-1024, jeśli jest to rozdzielczość 10-bitowa.

Jak ktoś wspomniał, pinu GPIO można użyć w oprogramowaniu, aby uzyskać efekt sygnału modulacji szerokości impulsu (PWM), zwykle przy niskich prędkościach do przełączania GPIO. Większość mikrokontrolerów ma dedykowane generatory PWM, które można skonfigurować tak, aby wykorzystywały pin GPIO jako pin wyjściowy, a te są bardzo szybkie i znacznie bardziej stabilne niż używanie oprogramowania do sterowania GPIO do generowania sygnału PWM. PWM są używane do sygnałów w stylu „przeciętnym” lub „%” i pozwalają robić rzeczy takie jak przyciemnione światła i kontrolować prędkość silnika.

Piny GPIO są zwykle ułożone w grupy, zwane Porty. W małych kontrolerach mogą to być architektury 8-bitowe, więc porty są często pogrupowane w partie po 8, a ich wartości można odczytać jednocześnie, czytając „rejestr danych” reprezentujący logiczne wysokie / niskie wartości tych szpilki. Podobnie, możesz ustawić piny jako wyjścia, a następnie zapisać 8-bitów w rejestrze danych, a kontroler GPIO mikrokontrolerów odczyta zmienione wartości rejestru i podnieśli pin wysoko lub pociągnie pin niski w zależności od ustawionej wartości.

W nowszych kontrolerach, takich jak ARM Cortex A8 i A9, jak w Raspberry Pi i BeagleBone, ich kontrolery GPIO i różne opcje są bardzo skomplikowane. Korzystają z architektury 32-bitowej, więc większość pinów GPIO jest ułożonych w 32-pinowe bloki, nawet jeśli nie wszystkie są w rzeczywistości użyteczne (niektóre mogą być dedykowane lub nieaktywne). BeagleBone (nad którym pracowałem wcześniej) ma kilka naprawdę niesamowitych opcji ze względu na dużą liczbę pinów, a czasami będziesz musiał użyć narzędzia „pin mux”, które pozwala ustawić specjalne tryby niektórych pinów dla rzeczy takich jak PWM, przechwytywanie impulsów, wyjścia timera, wejścia kanałów analogowych (ADC), a nawet mapowanie (w każdym razie na BeagleBone) do podprocesorów przemysłowych dostępnych na rdzeniu ARM, ale są uważane za niezależne procesory i potrzebują własnego mapowania pinów w celu być połączonym ze światem zewnętrznym.

KyranF
źródło
Czy możesz podać przykład, w jaki sposób „SINGLE pin może być użyty do„ analogowych ”wartości?
Pavel
@ JimJim2000 po prostu strumień włączania / wyłączania lub właściwego PWM przez filtr RC, aby wytworzyć gładkie analogowe „średnie” napięcie na wyjściu.
KyranF
7

Najprawdopodobniej masz na myśli wyjście analogowe Arduino, które często wykorzystuje pin GPIO z oprogramowaniem PWM . GPIO zazwyczaj mają trzy stany. Output High, Output Low i Input / High-Z (High Impedance, gdzie nie wpływa na sygnał wyjściowy).

PWM szybko przełącza wyjście z wyjścia wysokiego na wyjście niskie (okres), aby utworzyć średnią (cykl pracy), pozwalając na coś, co wygląda jak wartość analogowa. Przełączając binarne GPIO przy cyklu pracy 50% (lub 128), sygnał wyjściowy jest nadal binarny, ale średnio osiąga połowę między wartością wysoką a niską.

Pomyśl o żarówce. Widzisz to Włączone lub Wyłączone. Ale tak naprawdę włącza się i wyłącza 60 razy na sekundę, tak szybko, że nie zauważysz, że miga naprawdę szybko. Ale włączaj i wyłączaj żarówkę ręcznie bardzo powoli, a zauważysz, że miga. Przez 255 oznacza to 100%, a mniej niż 255 to ułamek 100%.

W ten sposób binarne GPIO może zachowywać się jak analogowy pin stanu 255.

Przechodzień
źródło
Dzięki @Passerby, to znacznie wyraźniejsze. Nie patrzę specjalnie na arduino, ale na malinowe pi i beaglebone. Czy to, co mówisz, oznacza, że ​​każdy pin może mieć wartość od 0 do 255? Czuję się zagubiony w dokumentacji, która mówi, że wartość może być binarna, w porównaniu z innymi, które mówią, że wartość może wynosić 0-255.
pedalpete
1
@pedalpete RPI i Arduino nakładają się na siebie w tłumie i pomysłach. Ale PWM od 0 do 255 jest arbitralne. Może wynosić od 0 do 65535 lub od 0 do 16. 0 do 255 to 8 bitów precyzji. Gdzie 255 lub 65535 lub cokolwiek to 100%. GPIO ma tylko binarne włączanie i wyłączanie, ale używasz PWM do udawania, że ​​może mieć więcej niż tylko włączanie i wyłączanie. Jest to użyteczne i celowe złudzenie optyczne.
Passerby
2
Żarówka nie miga z prędkością 60 razy na sekundę. Żarnik nagrzewa się i pozostaje rozgrzany
Scott Seidman
0

Bit GPIO może mieć wartość 0 lub 1. 8-bitowy port GPIO, złożony z 8 kolejnych bitów, może mieć zakres od 00000000 do 11111111 lub 255 miejsc po przecinku. Ma to niewiele wspólnego z koncepcją „analogu”

Scott Seidman
źródło
Dzięki Scott, choć myślę, że jestem teraz bardziej zdezorientowany niż wcześniej. Co to jest port GPIO? Jeśli mam pin GPIO (przykład na Raspberry Pi), czy każdy pin jest uważany za port? Jeśli tak, to czy każdy pin jest w stanie współpracować ze wspomnianym zakresem 0–255 po przecinku?
pedalpete
Zignoruj ​​moje ostatnie pytanie, rozumiem, co masz na myśli na temat portu.
pedalpete