この質問について
私は電子工学の経歴を持っていません。これは、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を並行してサンプリングし、干渉せずにそれらから読み取る方法についてアドバイスをいただけますか?