Comprendre GPIO analogique et numérique

11

J'essaie de comprendre GPIO, et j'ai lu un tas de différents articles de blog et je pense que je suis sur le point de l'obtenir, mais j'ai toujours du mal avec quelques choses.

J'ai vu quelques références à GPIO ne pouvant travailler qu'avec des valeurs binaires, mais d'autres articles qui disent que la valeur peut être comprise entre 0 et 255. Je suppose que c'est la différence entre GPIO analogique et numérique. Est-ce exact? Est-il possible qu'une seule broche GPIO puisse agir à la fois comme analogique et numérique?

pédale
la source
Pour donner suite à certaines des réponses ... La valeur binaire fait référence à une entrée ou une sortie numérique. Il peut s'agir d'un 1 (qui devrait être la tension de la source, appelé "hi" ou "on") ou 0 (ce qui signifie 0V, appelé "lo" ou "off"). C'est une résolution de 1 bit. Une entrée analogique peut être une plage, généralement de 0 V à VCC (la tension source). Une puce numérique avec une résolution de 8 bits convertira cette entrée analogique en un signal numérique de 8 bits de la plage 0 - 255 (binaire: 00000000 - 11111111), car 2 ^ 8 - 1 = 255 (binaire signifie base 2, le 8 provient du 8 bits partie, et "- 1" parce que les trucs numériques commencent à compter à 0, pas 1).
Kurt E. Clothier

Réponses:

14

Une broche GPIO est une broche «entrée / sortie à usage général». Ceci est par défaut uniquement élevé ou faible (les niveaux de tension, élevé étant la tension d'alimentation du micro-contrôleur, faible étant généralement la masse, ou 0 V). Mais les niveaux «élevé» et «bas» sont généralement donnés sous forme de tensions en proportion de la tension d'alimentation. Donc, tout ce qui dépasse généralement 66% de la tension d'alimentation est considéré comme un niveau logique `` élevé '', ce qui signifie que certains appareils à tension inférieure peuvent parler avec des appareils à haute tension tant que les niveaux se situent dans ce qui est considéré comme `` élevé ''. Un microcontrôleur à faible puissance de 1,8 à 2,7 V ou un récepteur GPS, par exemple, aura du mal à communiquer directement avec un microcontrôleur 5 V, car ce que l'appareil à basse tension considère comme «élevé», l'appareil à haute tension ne pensera pas du tout qu'il est élevé. C'est pour utiliser GPIO comme broche d'entrée,

Parfois, vous pouvez utiliser une broche SINGLE pour les valeurs `` analogiques '', en configurant la broche GPIO pour qu'elle soit utilisée par d'autres appareils embarqués comme un convertisseur `` analogique vers numérique '' (ADC). La broche est définie sur un canal sur l'ADC et cela agit maintenant comme une entrée pour l'ADC, pas une broche GPIO normale. Vous pouvez ensuite définir l'ADC pour prendre un échantillon et lire la valeur du registre de résultats de l'ADC pour des nombres comme 0-1024 s'il s'agit d'une résolution de 10 bits.

Comme quelqu'un l'a mentionné, une broche GPIO pourrait être utilisée dans le logiciel pour donner l'effet d'un signal de modulation de largeur pulsée (PWM), généralement à faible vitesse pour le basculement GPIO. La plupart des microcontrôleurs ont des générateurs PWM dédiés qui peuvent être configurés pour utiliser une broche GPIO comme broche de sortie, et ceux-ci sont très rapides et beaucoup plus stables que l'utilisation d'un logiciel pour contrôler GPIO pour générer un signal PWM. Le PWM est utilisé pour les signaux de style «moyen» ou «%» et vous permet de faire des choses comme des lumières tamisées et de contrôler la vitesse d'un moteur.

Les broches GPIO sont généralement organisées en groupes, appelés ports. Dans les petits contrôleurs, il peut s'agir d'une architecture 8 bits, de sorte que les ports sont souvent regroupés en lots de 8, et leurs valeurs peuvent être lues toutes en même temps en lisant un «registre de données» qui représente les valeurs logiques hautes / basses de celles-ci. broches. De même, vous pouvez définir des broches comme sorties, puis écrire 8 bits dans un registre de données, et le contrôleur GPIO des microcontrôleurs lira les valeurs modifiées du registre, et poussera la broche vers le haut ou tirera la broche vers le bas en fonction de la valeur que vous venez de définir.

Dans les contrôleurs plus récents tels que l'ARM Cortex A8 et A9 comme dans le Raspberry Pi et BeagleBone, leurs contrôleurs GPIO et différentes options sont très compliqués. Ils utilisent une architecture 32 bits, de sorte que la plupart des broches GPIO sont organisées en blocs de 32 broches, même si toutes ne sont pas réellement utilisables (certaines peuvent être dédiées ou non activées). Le BeagleBone (sur lequel j'ai travaillé auparavant) a des options vraiment impressionnantes pour sa grande quantité de broches, et parfois vous devrez utiliser un outil de «multiplexage de broches», qui vous permet de configurer les modes spéciaux de certaines broches pour des choses comme PWM, capture d'impulsions, sorties temporisées, entrées de canal analogique (ADC) et même (sur le BeagleBone de toute façon) mappage aux sous-processeurs industriels disponibles sur le cœur ARM, mais sont considérés comme des processeurs indépendants et ont besoin de leur propre mappage de broches pour être connecté au monde extérieur.

KyranF
la source
Pourriez-vous donner un exemple de la manière dont "une seule broche peut être utilisée pour des valeurs" analogiques ""?
Pavel
@ JimJim2000 juste un flux de PWM marche / arrêt ou approprié à travers un filtre RC pour produire une tension analogique "moyenne" douce sur la sortie.
KyranF
7

Vous faites probablement référence à la sortie analogique d'Arduino, qui utilise souvent une broche GPIO avec un logiciel PWM . GPIO a généralement trois états. Output High, Output Low et Input / High-Z (haute impédance, où cela n'affecte pas la sortie).

PWM bascule rapidement une sortie de Output High à Output Low (période), pour créer une moyenne (Duty Cycle), permettant quelque chose qui ressemble à une valeur analogique. En basculant un GPIO binaire à un rapport cyclique de 50% (ou 128), la sortie est toujours binaire, mais se situe en moyenne à mi-chemin entre Haut et Bas.

Pensez à une ampoule. Vous le voyez activé ou désactivé. Mais il s'allume et s'éteint vraiment 60 fois par seconde, si vite que vous ne remarquez pas son clignotement très rapide. Mais allumez et éteignez l'ampoule manuellement très lentement et vous remarquerez qu'elle clignote. En 255, cela signifie 100% allumé, et moins de 255 est une fraction de 100% allumé.

C'est ainsi qu'un GPIO binaire peut agir comme une broche analogique à 255 états.

Passant
la source
Merci @Passerby, c'est beaucoup plus clair. Je ne regarde pas spécifiquement l'arduino, mais le raspberry pi et le beaglebone. Est-ce que ce que vous dites signifie que n'importe quelle broche peut avoir une valeur comprise entre 0 et 255? Je suis confus entre la documentation qui dit qu'une valeur peut être binaire et d'autres qui disent qu'une valeur peut être 0-255.
pedalpete
1
@pedalpete le RPI et Arduino ont beaucoup de chevauchement dans la foule et les idées. Mais un PWM de 0 à 255 est arbitraire. Il peut être compris entre 0 et 65 535 ou entre 0 et 16. 0 à 255 correspond à 8 bits de précision. Où 255 ou 65535 ou quoi que ce soit est 100%. Un GPIO n'a que le binaire activé et désactivé, mais vous utilisez PWM pour prétendre qu'il peut avoir plus que simplement activé ou désactivé. C'est une illusion d'optique utile et intentionnelle.
Passerby
2
Une ampoule ne clignote pas à 60 fois par seconde. Le filament s'échauffe et reste chauffé
Scott Seidman
0

Un bit GPIO peut être 0 ou 1. Un port GPIO 8 bits, composé de 8 bits consécutifs, peut varier entre 00000000 et 11111111, ou 255 décimal. Cela a peu à voir avec le concept de "analogique"

Scott Seidman
la source
Merci Scott, même si je pense que je suis plus confus maintenant qu'avant. Qu'est-ce qu'un port GPIO? Si j'ai une broche GPIO (exemple sur un Raspberry Pi), chaque broche est-elle considérée comme un port? Si tel est le cas, chaque broche est-elle capable de fonctionner avec ladite plage décimale 0-255?
pedalpete
Ignore ma dernière question, je vois ce que tu veux dire à propos d'un port.
pedalpete