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?
Antworten:
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.
quelle
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.
quelle
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
quelle