MCP3424、チャネルを並行して読み取る方法は?


9

この質問について

私は電子工学の経歴を持っていません。これは、I2Cを介した通信とレジスタへの書き込みに関する最初の課題の1つなので、私の側からあまり多くの知識を推測しないでください。Arduinoをプログラミングしています。

特定の電子部品/チップについて尋ねるとき、私は人々が私に正しい答えを与えるために実験/テストを行うことができないと思います。また、人々がこのコンポーネントを知らないことも期待しています。したがって、私はこの質問に多くの情報を追加しようとします。

さらに情報が必要な場合はお知らせください。

コンポーネントには4つのADCがあります

4チャネルコンポーネントMCP3424(データシート)を使用しています。2つのパッケージで提供されます。MCP3422またはMCP3423 2チャネルバージョンではなく、MCP3424 E / SL、4チャネルSOICバージョンを使用しています。

ADCは4つあると思います。RS-Onlineでは、E / SLバージョンには4つのADC(ダイレクトリンク)があるようですが、E / STには1つ(ダイレクトリンク)しかないようです。 ここに画像の説明を入力してください

これは、複数のチャネルで同時にサンプリングできることを意味しているに違いないと思います。コンポーネントに複数のADCを配置する他の理由はありません。

私は正しいですか?

I2Cを介した通信

通信は、1つの構成バイトを送信してから、サンプリングが終了するのを待ち、結果を読み取ります。

構成バイトのフォーマット

ここに画像の説明を入力してください

興味深いものは次のとおりです。

  • 左からビット3、1から数えて:連続サンプリング
  • 左からビット1と2、1から数えて:アドレス

構成バイトの詳細については、18ページのデータシートを参照してください

読み取り結果のフォーマット

私の例では、18ビットの解像度(ビット5および6を1に設定)のみを使用します。リードバックの結果は4バイトになります。最初の3つは値を含み、4番目は構成バイトを含みます。

ただし、左端のビット!RDYは、値が「新しい」かどうか、つまり最後の読み取り以降の新しい読み取りかどうかを示します。初めて1つの結果を読み取る場合、値は0であり、ADCが新しいサンプル値で準備ができるまで、後続の結果は1です。

並行してサンプリングせずに使用する方法

私はこれを行う方法を完全によく知っています。そして、私がオンラインで見つけたすべての例、これも簡単です。構成バイトをコンポーネントに書き込んでから、値を読み取るだけです。

各チャネルを自動的に誤ってサンプリングするように設定し、チャネルを並行して読み取る方法

疑似コードは次のようになります

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

私の最善の試み

したがって、次のようにして、各ADCが継続的にサンプリングするように設定します。これはArduinoコードです。

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

次に、特定のチャネルを読み取るにはどうすればよいですか。コンポーネントに結果を要求するだけの場合、チャネルの結果がレジスタに返されます。上記の設定で、チャネル4の測定値を取得します。しかし、チャネル2からの測定値が必要だとします。ある意味で、チャネル2の結果が必要であることを伝える必要があるだけです。何かをサンプリングするように依頼してください。それは、継続的なサンプリングを行い続ける必要があります。自動サンプリング中に作成された最も最近のサンプルが欲しいだけです。

以下が私の推測です

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

ですから私の推測では チャネル2を読み取りたい場合は、サンプリングチャネル2の開始に使用したものとまったく同じ構成バイトを書き込みます。

ただし、これは機能しません。必要な375ミリ秒を超えていても、サンプルの準備はできていません。

どうすればこれを達成できますか?

私は望ましい結果と私が試みたものを説明するために最善を尽くそうとしましたが、それが読みにくいことはわかっています。

すべてのADCを並行してサンプリングし、干渉せずにそれらから読み取る方法についてアドバイスをいただけますか?


よいスタート。唯一足りないのは、追加したMCP3424のデータシートへのリンクです。
JRE 2016

MCP3424はバージョンではなく2つのパッケージで提供され、どちらも4チャネルです。STはTSSOP、SLはSoicです。MCP3422 2チャネル、固定アドレス、MCP3423、2チャネル、調整可能アドレス、およびMCP3424 4チャネルがあります。
通行人2016

+1非常に詳細な、よく書かれた質問。残念なことに、そのチップは単一のADCです。これは、「機能ブロック図」のデータシートに示されています。入力チャネルをADCとして読み取りました。多くの入力チャネルがあるため、1つのADCを使用して(順次に)さまざまな信号をサンプリングできます。ADCは(チャネルを選択する)アナログマルチプレクサーよりもはるかに高価であり、複数の信号のサンプリングが一般的な要件です。したがって、ADCチップはこのように機能することがよくあります。Andy akaはあなたの質問に回答しましたが、詳細情報が得られる可能性があるため、受け入れる前にお待ちください。
gbulmer 2016

RS-オンラインE / SLは4を持っていた、およびE / STは、私が説明に追加した1だったことを言ったので、私は、それが4個のADCを持っていたと信じ
マッズSkjern

2
@MadsSkjernはRS、Microchipを無視し、それらのデータシートは王様です。それはRSの誤りです。ディストリビューターのサイトでの間違いはかなり一般的です。
通行人2016

回答:


11

後者には4つのADCがあります。これは、複数のチャネルで同時にサンプリングできることを意味しているに違いないと思います。

残念ながら違います。ADCは1つだけで、複数のチャネルを変換するには、内部マルチプレクサをアドレス指定して別のチャネルを「読み取る」ことにより、これを順次実行する必要があります。残念ながら同時サンプリングはありません:-

ここに画像の説明を入力してください

入力マルチプレクサは、一度に4つのチャネルのうち1つだけを選択することに注意してください。これは複数のチャネルを読み取るために使用される非常に一般的な方法ですが、そこには同時サンプリングADCがあります。Linear tech、TIまたはADIのポートフォリオをご覧ください。


+1、ya beat me :-)さまざまなアナログ信号をサンプリングできるため、1つのADCが複数のチャネルをサンプリングすることはよくあることです。これはよくあることです。
gbulmer 2016

また、低いサンプリングレートが必要な場合は、多重化/インターリーブで十分なことがよくあります
Scott Seidman、2016

ささやかな改善、サー。
gbulmer 2016

@gbulmerありがとうございます
Andy別名

5

MCP3424は、フロントエンドにマルチプレクサを有する単一のADCです。

データシートのこの図は、これを非常に明確に示しています

MCP3424のアーキテクチャ

データシートはこれを紹介で裏付けています:

4.1一般的な概要

MCP3422 / 3/4デバイスは、I2Cシリアルインターフェースを備えた差動マルチチャネル低電力18ビットデルタシグマA / Dコンバーターです。これらのデバイスには、入力チャネル選択マルチプレクサ(mux)、プログラマブルゲインアンプ(PGA)、オンボード電圧リファレンス(2.048V)、および内部発振器が含まれています。

したがって、異なるチャネルを完全に同時に変換することはできませんが、チャネル間の遅延が比較的短い状態でチャネルを順次サンプリングできます。

デバイスを使用するときは、I2Cアドレスビットが安定していることを確認する必要があります。もう一度、データシートから:

MCP3423とMCP3424には、2つの外部デバイスアドレスピン(Adr1、Adr0)があります。これらのピンは、ロジックハイ(またはVDDに接続)、ロー(またはVSSに接続)、またはフローティングのまま(何にも接続されていない、またはVDD / 2に接続)に設定できます。2つのピンを使用したロジックレベルのこれらの組み合わせ8つの可能なアドレスを許可します。表5-3に、アドレス選択ピンのロジックステータスに応じたデバイスアドレスを示します。デバイスは、次のイベントでAdr0およびAdr1ピンのロジックステータスをサンプリングします。

a。デバイスの電源投入。

b。一般的なコールリセット

(セクション5.4「ゼネラルコール」を参照)。

c。ジェネラルコールラッチ

(セクション5.4「ゼネラルコール」を参照)。

デバイスは、上記のイベント中にロジックステータス(アドレスピン)をサンプリングし、新しいラッチイベントが発生するまで値をラッチします。通常の動作中(アドレスピンがラッチされた後)、アドレスピンは内部回路の他の部分から内部的に無効になります。

デバイスの電源が入った後、ジェネラルコールリセットまたはジェネラルコールラッチコマンドを1回発行することをお勧めします。これにより、デバイスが安定した状態でアドレスピンを読み取ることが保証され、電源の立ち上げ中にアドレスビットがラッチされるのを回避できます。これにより、アドレスピンの検出が不正確になる可能性があります。

この推奨事項に従って、実際にデバイスと通信していることを確認することをお勧めします。

特定のチャネルを読み取るには、構成レジスタでチャネルを選択し、変換を開始する必要があります。その変換の結果が出力レジスタで利用可能になると、RDYビットはローになります。

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