プッシュプル/オープンドレイン; プルアップ/プルダウン


49

ARM Cortexチップのデータシート、特にGPIOの章を読んでいます。最終的に、SRAMへの読み取り/書き込みアクセスのために「代替機能」モードで使用するために、さまざまなGPIOピンを構成したいと思います。

:すべてのGPIOが利用できるレジスタの、私は2つを理解していないGPIO_PUPDRGPIO_OTYPE、それぞれ「プルアップ/プルダウンレジスタ」と「出力タイプレジスタ」です。

以下のためにGPIO_PUPDR私は3つの選択肢があります:

  • プルアップまたはプルダウンなし
  • プルアップ
  • 引き下げる

以下のためにGPIO_0TYPE私は2つの選択肢があります。

  • 出力プッシュプル
  • 出力オープンドレイン

すべての異なる構成の違いは何ですか?また、SRAM通信に最適な構成はどれですか?

私が取り組んでいるボードのドキュメントはここから入手できます(SRAM回路図については24ページを参照)。ARMチップのリファレンスマニュアルは、こちらから入手できます(GPIOレジスタについては、145および146ページを参照してください)。


使用しているSRAMおよびARM CPUのデータシートにモデル番号/リンクを提供できますか。
ディーン

@ディーン:確かに。2つのリンクで質問を更新しました。
ランダムブルー

回答:


54

この回答はプロセッサおよび周辺機器に一般的であり、最後にSRAM固有のコメントがあります。これはおそらく特定のRAMおよびCPUに関連しています。

出力ピンは、3つの異なるモードで駆動できます。

  • オープンドレイン -トランジスタはLowにのみ接続します
  • プルアップ付きのオープンドレイン -トランジスタをLowに接続し、抵抗をHighに接続
  • プッシュプル -トランジスタが高に接続され、トランジスタが低に接続されます(一度に1つだけが動作します)

入力ピンは、以下を備えたゲート入力にすることができます。

  • プルアップ -ハイに接続された抵抗
  • プルダウン -ローに接続された抵抗
  • プルアップとプルダウン -高に接続された抵抗と低に接続された抵抗の両方(まれな場合にのみ有用)。

また、シュミットトリガー入力モードがあり、入力ピンが弱いプルアップで初期状態にプルされます。そのままにしておくと、その状態のままになりますが、最小限の労力で新しい状態に引き上げることができます。

オープンドレインは、複数のゲートまたはピンが(外部または内部)プルアップで接続されている場合に便利です。すべてのピンがハイの場合、それらはすべてオープン回路であり、プルアップがピンをハイに駆動します。いずれかのピンが低い場合、それらは一緒に接続されるとすべて低くなります。この構成は効果的にANDゲートを形成します。

SRAMを駆動するときは、データ線またはアドレス線のいずれかを可能な限り高速度または低速度で駆動し、アクティブな上下駆動が必要になるようにプッシュプルを示します。複数のRAMを使用する場合は、別のモードの方が適している場合があります。

SRAMからのデータ入力を備えたSRAMでは、RAM ICが常にデータをアサートしている場合、RAMは常にレベルを設定し、これにより負荷を最小限に抑えるため、プルアップのないピンでもおそらく問題ありません。RAMデータラインが時々断線またはトライステートになる場合、入力ピンが有効な状態を設定できるようにする必要があります。非常に高速通信では、あり並列実効抵抗は終端抵抗で、バスのアイドル電圧は二つの抵抗によって設定されているが、これはややスペシャリストですので、プルアップとし、AAのプルダウンを使用します。


明確にするために、「低に接続されているトランジスタとそれ以外のトランジスタ」とはどういう意味ですか トランジスタには3つのピンがあります。各ピンはどのように接続されていますか?
ランダムブルー

@Randomblue-申し訳ありません-出力として動作するときのトランジスタコレクタまたはドレイン
ラッセルマクマホン

「プルダウン」に関する回答を明確にするために、「グラウンド」、「ロー」、「-ve」の違いは何ですか?
ランダムブルー

あなたの質問に多くの編集を加えましたが、間違いを犯していないことを確認してください。
ランダムブルー

@Randomblue-編集は良いようです。最初に何を書いたのか不思議に思われますか?あなたは私が私が考えていたことを言ったようです:-)。
ラッセルマクマホン

17

私はこの答えをSTM32 GPIO設定の理解から見つけました

  • GPIO_PuPd(プルアップ/プルダウン)

デジタル回路では、信号線が「フロート」状態にならないことが重要です。つまり、常に高状態または低状態である必要があります。フローティングの場合、状態は未確定であり、いくつかの異なるタイプの問題を引き起こします。

これを修正する方法は、信号線からVccまたはGndに抵抗を追加することです。そうすることで、ラインがアクティブにハイまたはローに駆動されていない場合、抵抗により電位が既知のレベルにドリフトします。

ARM(および他のマイクロコントローラー)には、これを行うための回路が組み込まれています。そうすれば、回路に別の部品を追加する必要はありません。たとえば、「GPIO_PuPd_UP」を選択した場合、信号ラインとVccの間に抵抗を追加するのと同等です。

  • GPIO_OType(出力タイプ):

プッシュプル:これは、ほとんどの人が「標準」と考える出力タイプです。出力が低くなると、アクティブにグランドに「プル」されます。逆に、出力を高く設定すると、Vccに向かって積極的に「プッシュ」されます。簡略化すると、次のようになります。 ここに画像の説明を入力してください

一方、オープンドレイン出力は一方向にのみアクティブです。ピンをグランドに引き寄せることはできますが、それを高く駆動することはできません。前のイメージを想像してください。ただし、上側のMOSFETはありません。グランドに引き込まれていない場合、(下側の)MOSFETは単に非導通状態になり、出力がフロートします。

このタイプの出力では、回路にプルアップ抵抗を追加する必要があります。これにより、ローに駆動されていないときにラインがハイになります。これは、外部部品を使用するか、GPIO_PuPd値をGPIO_PuPd_UPに設定することで実行できます。

この名前は、MOSFETのドレインが内部で何にも接続されていないという事実に由来しています。MOSFETの代わりにBJTを使用する場合、このタイプの出力は「オープンコレクタ」とも呼ばれます。

  • GPIO_Speed

基本的に、これは出力信号のスルーレート(立ち上がり時間と立ち下がり時間)を制御します。スルーレートが速いほど、回路からより多くのノイズが放射されます。スルーレートを遅くし、特定の理由がある場合にのみスルーレートを上げることをお勧めします。


3

もう1つの小さなtidビット:AVRやUnoなどのArduino ATmega328ベースのボードなど、明示的な「オープンドレイン」モードを持たないマイクロコントローラーの場合、この「オープンドレイン」モードはラッパー関数を記述することでシミュレートできます。これは、送信時にピンを単に「出力LOW」に0設定し、送信時にピンを「入力LOW」(高インピーダンスモード、内部プルアップ抵抗がオンではない)に設定します1。これにより、同じ効果が得られます。これらの最新の32ビットARMコアマイクロコントローラーには、さらに多くのオプションがあります。

また、上記にリンクされSTM32リファレンスマニュアルの p146には、次のように記載されています[私の追加は角括弧で囲まれています]

–オープンドレインモード:出力レジスタの「0」はN-MOS をアクティブにします(これにより、ピンをGNDに接続することによりLOWをアクティブに駆動します)。出力レジスタの「1」はポートをHi-Z(P- MOSがアクティブになることはありません)[高インピーダンスモード-プルアップ抵抗またはプルダウン抵抗のないフローティング入力と同じ]

–プッシュプルモード:出力レジスタの「0」はN-MOSをアクティブにします(ピンをGNDに接続してLOWをアクティブにします)。出力レジスタの「1」はP-MOSをアクティブにしますVCCへのピン]


Arduinoコードでは、「ラッパー関数」は次のように実装できます。

digitalWriteOpenDrain(byte pin, bool state)
{
    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
        digitalWrite(pin, LOW);
    }
    // High impedance mode 
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
        digitalWrite(pin, LOW);
    }
}

または簡略化:

digitalWriteOpenDrain(byte pin, bool state)
{
    digitalWrite(pin, LOW);

    // Actively drive LOW
    if (state==LOW)
    {
        pinMode(pin, OUTPUT);
    }
    // High impedance mode
    // (note that an internal or external pull-up resistor can optionally be added if you like, according to your requirements)
    else //state==HIGH
    {
        pinMode(pin, INPUT);
    }
}

Arduinoで内部プルアップ抵抗をオンにするには、次の操作を実行できることに注意してください。

pinMode(pin, INPUT_PULLUP);

または(同じこと):

pinMode(pin, INPUT);
digitalWrite(pin, HIGH);

追加の読み物:

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.