GPIOアナログとデジタルについて


11

私はGPIOを理解しようと試みており、さまざまなブログ投稿をたくさん読んでいます。私はそれを理解するのに近づいていると思いますが、それでもいくつかのことに苦労しています。

私はGPIOへのいくつかの参照がバイナリ値でのみ機能することを確認しましたが、他の投稿では、値は0〜255であると述べています。これがアナログGPIOとデジタルGPIOの違いだと思います。あれは正しいですか?1つのGPIOピンがアナログとデジタルの両方として機能することは可能ですか?


一部の回答のフォローアップとして...バイナリ値はデジタル入力または出力を指します。1( "hi"または "on"と呼ばれる電源電圧である必要があります)または0( "lo"または "off"と呼ばれる0Vを意味します)にすることができます。これは1ビットの解像度です。アナログ入力は、通常0V〜VCC(ソース電圧)の範囲にすることができます。2 ^ 8-1 = 255(バイナリはベース2を意味するため、8は8ビットからのものであるため)部分、および「-1」は、デジタルスタッフが1ではなく0からカウントを開始するためです。
カートE.クロチエ2014年

回答:


14

GPIOピンは「汎用入出力」ピンです。これは、デフォルトでは高または​​低のみです(電圧レベル、高はマイクロコントローラーの電源電圧、低は通常グラウンド、または0V)。しかし、「高」と「低」のレベルは通常、電源電圧の比率としての電圧として与えられます。したがって、通常電源電圧の66%を超えるものはすべて論理レベル「高」と見なされます。つまり、レベルが「高」と見なされる範囲内にある限り、一部の低電圧デバイスは高電圧デバイスと通信できます。たとえば1.8〜2.7Vの低電力マイクロコントローラーまたはGPSレシーバーは、5Vマイクロコントローラーと直接通信するときに問題が発生します。これは、低電圧デバイスが「高」と見なすものは、高電圧デバイスがまったく高と見なさないためです。これは、GPIOを入力ピンとして使用するためのものです。

GPIOピンを「アナログ-デジタル」(ADC)コンバーターなどの他のオンボードデバイスで使用されるように構成することにより、「アナログ」値にSINGLEピンを使用できる場合があります。ピンはADCのチャネルに設定され、これは通常のGPIOピンではなく、ADCへの入力として機能します。次に、ADCがサンプルを取得するように設定し、10ビットの解像度であれば、ADCの結果レジスタ値を0〜1024のような数値で読み取ります。

誰かが述べたように、GPIOピンをソフトウェアで使用して、通常は低速で、パルス幅変調(PWM)信号の効果をGPIO切り替えに与えることができます。ほとんどのマイクロコントローラーには、GPIOピンを出力ピンとして使用するように構成できる専用のPWMジェネレーターがあり、これらは非常に高速で、ソフトウェアを使用してGPIOを制御してPWM信号を生成するよりもはるかに安定しています。PWMは「平均」または「%」スタイルの信号に使用され、薄暗い照明やモーターの速度の制御などを実行できます。

GPIOピンは通常、ポートと呼ばれるグループに配置されます。小さなコントローラーでは、それらは8ビットアーキテクチャである可能性があるため、ポートは多くの場合8にグループ化され、それらの値の論理高/低値を表す「データレジスタ」を読み取ることにより、それらの値を同時に読み取ることができます。ピン。同様に、ピンを出力に設定してから8ビットをデータレジスタに書き込むと、マイクロコントローラーのGPIOコントローラーはレジスタの変更された値を読み取り、設定した値に応じてピンをHighに駆動またはLowにプルします。

Raspberry PiやBeagleBoneのようなARM Cortex A8やA9などの新しいコントローラーでは、GPIOコントローラーとさまざまなオプションが非常に複雑です。それらは32ビットアーキテクチャを使用しているため、すべてが実際に使用可能でなくても、ほとんどのGPIOピンは32ピンブロックに配置されています(一部は専用であるか、有効になっていない場合があります)。BeagleBone(私が以前に取り組んだもの)には、その大量のピンのための本当に素晴らしいオプションがいくつかあり、時々、特定のピンの特別なモードを設定できる「ピンマルチプレクサ」ツールを使用する必要があります。 PWM、パルスキャプチャ、タイマー出力、アナログ(ADC)チャネル入力のほか、(とにかくBeagleBoneで)ARMコアで利用可能な産業用サブプロセッサへのマッピングなどですが、独立したプロセッサと見なされ、独自のピンマッピングが必要です。外の世界とつながる


「SINGLEピンを「アナログ」値に使用する方法」の例を挙げていただけますか?
Pavel

@ JimJim2000は、RCフィルターを介したオン/オフまたは適切なPWMのストリームだけで、出力に滑らかなアナログ「平均」電圧を生成します。
KyranF 2015年

7

ほとんどの場合、ソフトウェアPWMで GPIOピン使用するArduinoのアナログ出力を参照しています。GPIOには通常3つの状態があります。高出力、低出力、および入力/高インピーダンス(高インピーダンス、出力に影響しない場合)。

PWMは、出力を出力ハイ(出力周期)から出力ロー(周期)にすばやく切り替えて、平均(デューティサイクル)を作成し、アナログ値のようなものを可能にします。バイナリGPIOを50%(または128)のデューティサイクルでトグルすることにより、出力はバイナリのままですが、平均するとHighとLowの中間になります。

電球を考えてみてください。オンかオフかがわかります。しかし、実際には1秒あたり60回オン/オフを繰り返すので、非常に速く点滅していることに気付かないほどです。しかし、電球を手動で非常にゆっくりとオンおよびオフにすると、その点滅に気づきます。255になると、100%オンを意味し、255未満は100%オンの端数になります。

これが、バイナリGPIOが255ステートのアナログピンのように機能する方法です。


@Passerbyに感謝します、それははるかに明確です。私は特にarduinoではなく、ラズベリーのパイとビーグルボーンを調べています。あなたが言っていることは、どのピンも0と255の間の値を持つことができることを意味しますか?値がバイナリである可能性があるというドキュメントと、値が0〜255である可能性があるという他のドキュメントとの間で混乱しています。
pedalpete

1
@pedalpete RPIとArduinoは、群衆とアイデアに多くの重複があります。ただし、0〜255のPWMは任意です。0〜65535、または0〜16を指定できます。0〜255は8ビットの精度です。ここで、255または65535などは100%です。GPIOにはバイナリオンとバイナリオフしかありませんが、PWMを使用して、オンまたはオフだけではないふりをします。それは便利で意図的な錯覚です。
通行人2014年

2
電球は毎秒60回点滅しません。フィラメントは加熱され、加熱されたままです
Scott Seidman 2014年

0

GPIOビットは0または1です。8ビットの連続した8ビットで構成される8ビットGPIOポートは、00000000から11111111、または10進数の255の範囲で指定できます。これは「アナログ」の概念とはほとんど関係ありません


スコットに感謝します。以前よりも混乱しているように思います。GPIOポートとは何ですか?GPIOピン(Raspberry Piの例)がある場合、各ピンはポートと見なされますか?もしそうなら、各ピンは前述の0から255の10進数の範囲で動作できますか?
pedalpete

私の最後の質問を無視して、私はあなたが現在ポートについて何を意味しているのか分かります。
pedalpete
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.