Grundlegendes zu GPIO analog und digital

10

Ich versuche, GPIO zu verstehen, habe eine Reihe verschiedener Blog-Beiträge gelesen und denke, ich bin kurz davor, es zu bekommen, habe aber immer noch Probleme mit ein paar Dingen.

Ich habe einige Hinweise darauf gesehen, dass GPIO nur mit Binärwerten arbeiten kann, aber andere Beiträge, die besagen, dass der Wert zwischen 0 und 255 liegen kann. Ich gehe davon aus, dass dies der Unterschied zwischen analogem und digitalem GPIO ist. Ist das korrekt? Ist es möglich, dass ein einzelner GPIO-Pin sowohl analog als auch digital fungiert?

Pedalpete
quelle
Als Folge einiger Antworten ... Der Binärwert bezieht sich auf einen digitalen Ein- oder Ausgang. Es kann eine 1 sein (dies sollte die Quellenspannung sein, die als "hi" oder "on" bezeichnet wird) oder 0 (dh 0 V, genannt "lo" oder "off"). Das ist 1 Bit Auflösung. Ein Analogeingang kann ein Bereich sein, typischerweise von 0 V bis VCC (die Quellenspannung). Ein digitaler Chip mit 8-Bit-Auflösung wandelt diesen analogen Eingang in ein digitales 8-Bit-Signal im Bereich von 0 bis 255 (binär: 00000000 bis 11111111) um, da 2 ^ 8 bis 1 = 255 (binär bedeutet Basis 2, die 8 ist vom 8-Bit Teil und "- 1", weil digitales Material bei 0 zu zählen beginnt, nicht bei 1).
Kurt E. Clothier

Antworten:

13

Ein GPIO-Pin ist ein Allzweck-Input / Output-Pin. Dies ist standardmäßig nur hoch oder niedrig (Spannungspegel, wobei hoch die Versorgungsspannung des Mikrocontrollers ist, niedrig normalerweise Masse oder 0 V). Die Pegel von "hoch" und "niedrig" werden jedoch normalerweise als Spannungen als Anteil der Versorgungsspannung angegeben. Alles, was normalerweise über 66% der Versorgungsspannung liegt, wird als logischer Pegel "hoch" angesehen, was bedeutet, dass einige Geräte mit niedrigerer Spannung mit Hochspannungsgeräten sprechen können, solange die Pegel innerhalb dessen liegen, was als "hoch" angesehen wird. Ein 1,8–2,7-V-Mikrocontroller mit niedriger Leistung oder ein GPS-Empfänger haben beispielsweise Probleme, direkt mit einem 5-V-Mikrocontroller zu kommunizieren, da das Hochspannungsgerät das, was das Niederspannungsgerät als „hoch“ ansieht, überhaupt nicht für hoch hält. Dies dient zur Verwendung von GPIO als Eingangspin.

Manchmal können Sie einen SINGLE-Pin für "analoge" Werte verwenden, indem Sie den GPIO-Pin so konfigurieren, dass er von anderen integrierten Geräten wie einem "Analog-Digital" -Konverter (ADC) verwendet wird. Der Pin ist auf einen Kanal am ADC eingestellt und dieser fungiert jetzt als Eingang für den ADC, nicht als normaler GPIO-Pin. Sie können den ADC dann so einstellen, dass er eine Probe entnimmt, und den Ergebnisregisterwert des ADC für Zahlen wie 0-1024 lesen, wenn die Auflösung 10 Bit beträgt.

Wie bereits erwähnt, kann ein GPIO-Pin in der Software verwendet werden, um den Effekt eines PWM-Signals (Pulsed Width Modulation) zu erzielen, normalerweise bei niedrigen Geschwindigkeiten für das Umschalten des GPIO. Die meisten Mikrocontroller verfügen über dedizierte PWM-Generatoren, die so konfiguriert werden können, dass ein GPIO-Pin als Ausgangs-Pin verwendet wird. Diese sind sehr schnell und weitaus stabiler als die Verwendung von Software zur Steuerung von GPIO zur Erzeugung eines PWM-Signals. PWM werden für Signale im "Durchschnitts" - oder "%" -Stil verwendet und ermöglichen es Ihnen, beispielsweise schwaches Licht zu erzeugen und die Motordrehzahl zu steuern.

GPIO-Pins sind normalerweise in Gruppen angeordnet, die als Ports bezeichnet werden. In kleinen Controllern kann es sich um eine 8-Bit-Architektur handeln, daher werden Ports häufig in viele 8 gruppiert, und ihre Werte können alle gleichzeitig gelesen werden, indem ein 'Datenregister' gelesen wird, das die logischen High / Low-Werte dieser Werte darstellt Stifte. In ähnlicher Weise können Sie Pins als Ausgänge festlegen und dann 8-Bit in ein Datenregister schreiben. Der GPIO-Controller des Mikrocontrollers liest die geänderten Werte des Registers und treibt den Pin hoch oder zieht den Pin niedrig, je nachdem, welchen Wert Sie gerade eingestellt haben.

Bei neueren Controllern wie dem ARM Cortex A8 und A9 wie dem Raspberry Pi und BeagleBone sind ihre GPIO-Controller und verschiedene Optionen sehr kompliziert. Sie verwenden eine 32-Bit-Architektur, sodass die meisten GPIO-Pins in 32-Pin-Blöcken angeordnet sind, auch wenn nicht alle tatsächlich verwendbar sind (einige sind möglicherweise dediziert oder nicht aktiviert). Der BeagleBone (an dem ich bereits gearbeitet habe) bietet einige wirklich großartige Optionen für seine große Anzahl an Pins. Manchmal müssen Sie ein Pin-Mux-Tool verwenden, mit dem Sie die speziellen Modi bestimmter Pins für bestimmte Dinge einrichten können wie PWM, Impulserfassung, Timer-Ausgänge, analoge (ADC) Kanaleingänge und sogar (ohnehin auf dem BeagleBone) Mapping auf die auf dem ARM-Kern verfügbaren industriellen Subprozessoren, werden jedoch als unabhängige Prozessoren betrachtet und benötigen in der Reihenfolge ihre eigene Pin-Mapping mit der Außenwelt verbunden sein.

KyranF
quelle
Können Sie ein Beispiel geben, wie "SINGLE Pin für 'analoge' Werte verwendet werden kann"?
Pavel
@ JimJim2000 nur ein Strom von Ein / Aus oder richtigem PWM durch ein RC-Filter, um eine glatte analoge "durchschnittliche" Spannung am Ausgang zu erzeugen.
KyranF
7

Sie beziehen sich höchstwahrscheinlich auf den analogen Ausgang von Arduino, der häufig einen GPIO-Pin mit Software-PWM verwendet . GPIO hat normalerweise drei Zustände. Ausgang hoch, Ausgang niedrig und Eingang / High-Z (hohe Impedanz, wo dies keinen Einfluss auf den Ausgang hat).

PWM schaltet einen Ausgang schnell von Output High auf Output Low (Periode) um, um einen Durchschnitt (Duty Cycle) zu erstellen, der etwas zulässt, das wie ein analoger Wert aussieht. Durch Umschalten eines binären GPIO bei einem Tastverhältnis von 50% (oder 128) ist der Ausgang immer noch binär, liegt jedoch im Durchschnitt auf halbem Weg zwischen hoch und niedrig.

Denken Sie an eine Glühbirne. Sie sehen es ein oder aus. Aber es schaltet sich wirklich 60 Mal pro Sekunde ein und aus, so schnell, dass Sie nicht bemerken, dass es sehr schnell blinkt. Schalten Sie die Glühbirne jedoch manuell sehr langsam ein und aus, und Sie bemerken, dass sie blinkt. Mit 255 bedeutet dies 100% an und weniger als 255 ist ein Bruchteil von 100% an.

So kann sich ein binäres GPIO wie ein analoger Pin mit 255 Zuständen verhalten.

Passant
quelle
Danke @Passerby, das ist viel klarer. Ich schaue nicht speziell auf Arduino, sondern auf Himbeer-Pi und Beaglebone. Bedeutet das, was Sie sagen, dass jeder Pin einen Wert zwischen 0 und 255 haben kann? Ich bin verwirrt zwischen Dokumentationen, die besagen, dass ein Wert binär sein kann, und anderen, die besagen, dass ein Wert 0-255 sein kann.
Pedalpete
1
@pedalpete das RPI und Arduino haben eine Menge Überschneidungen in Menge und Ideen. Eine PWM von 0 bis 255 ist jedoch beliebig. Sie kann 0 bis 65535 oder 0 bis 16 sein. 0 bis 255 sind 8 Bit Genauigkeit. Wobei 255 oder 65535 oder was auch immer 100% ist. Ein GPIO hat nur Binär Ein und Aus, aber Sie verwenden PWM, um so zu tun, als ob es mehr als nur Ein oder Aus haben kann. Es ist eine nützliche und absichtliche optische Täuschung.
Passant
2
Eine Glühbirne blinkt nicht 60 Mal pro Sekunde. Das Filament erwärmt sich und bleibt erwärmt
Scott Seidman
0

Ein GPIO-Bit kann 0 oder 1 sein. Ein 8-Bit-GPIO-Port, der aus 8 aufeinanderfolgenden Bits besteht, kann zwischen 00000000 und 11111111 oder 255 Dezimalstellen liegen. Dies hat wenig mit dem Konzept "analog" zu tun

Scott Seidman
quelle
Danke Scott, obwohl ich denke, ich bin jetzt verwirrter als zuvor. Was ist ein GPIO-Port? Wenn ich einen GPIO-Pin habe (Beispiel auf einem Raspberry Pi), wird jeder Pin als Port betrachtet? Wenn ja, kann jeder Pin mit dem genannten Bereich von 0 bis 255 Dezimalstellen arbeiten?
Pedalpete
Ignoriere meine letzte Frage, ich verstehe, was du jetzt mit einem Port meinst.
Pedalpete