私はGPIOを理解しようと試みており、さまざまなブログ投稿をたくさん読んでいます。私はそれを理解するのに近づいていると思いますが、それでもいくつかのことに苦労しています。
私はGPIOへのいくつかの参照がバイナリ値でのみ機能することを確認しましたが、他の投稿では、値は0〜255であると述べています。これがアナログGPIOとデジタルGPIOの違いだと思います。あれは正しいですか?1つのGPIOピンがアナログとデジタルの両方として機能することは可能ですか?
私はGPIOを理解しようと試みており、さまざまなブログ投稿をたくさん読んでいます。私はそれを理解するのに近づいていると思いますが、それでもいくつかのことに苦労しています。
私はGPIOへのいくつかの参照がバイナリ値でのみ機能することを確認しましたが、他の投稿では、値は0〜255であると述べています。これがアナログGPIOとデジタルGPIOの違いだと思います。あれは正しいですか?1つのGPIOピンがアナログとデジタルの両方として機能することは可能ですか?
回答:
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コアで利用可能な産業用サブプロセッサへのマッピングなどですが、独立したプロセッサと見なされ、独自のピンマッピングが必要です。外の世界とつながる
ほとんどの場合、ソフトウェアPWMで GPIOピンを使用するArduinoのアナログ出力を参照しています。GPIOには通常3つの状態があります。高出力、低出力、および入力/高インピーダンス(高インピーダンス、出力に影響しない場合)。
PWMは、出力を出力ハイ(出力周期)から出力ロー(周期)にすばやく切り替えて、平均(デューティサイクル)を作成し、アナログ値のようなものを可能にします。バイナリGPIOを50%(または128)のデューティサイクルでトグルすることにより、出力はバイナリのままですが、平均するとHighとLowの中間になります。
電球を考えてみてください。オンかオフかがわかります。しかし、実際には1秒あたり60回オン/オフを繰り返すので、非常に速く点滅していることに気付かないほどです。しかし、電球を手動で非常にゆっくりとオンおよびオフにすると、その点滅に気づきます。255になると、100%オンを意味し、255未満は100%オンの端数になります。
これが、バイナリGPIOが255ステートのアナログピンのように機能する方法です。
GPIOビットは0または1です。8ビットの連続した8ビットで構成される8ビットGPIOポートは、00000000から11111111、または10進数の255の範囲で指定できます。これは「アナログ」の概念とはほとんど関係ありません