0

dsPIC33f マイクロコントローラを使用して I2C スレーブ デバイスをサンプリングしようとすると問題が発生します。

PIC の内部 timer1 タイマーを使用して、定義されたサンプリング レートで「ティック」し、必要なデータを取得しています。残念ながら、結果が十分に速く得られていません。その理由はわかりません。私のスレーブ デバイスの 1 つは、最大出力データ レートが 3600Hz の ADXL345 加速度計です。これほど高い値は必要ありませんが、50Hz 付近ではうまくサンプリングできていないようです。

I2C は 400KHz の「高速モード」に設定されています。加速度計をサンプリングしたい絶対最大値は1KHzですが、これはやり過ぎですが、128Hzあたりにもっと興味があります。私が設定した加速度計のパラメータは次のとおりです。

  • データ形式 (0x31) - セルフ テスト オフ、割り込み反転オフ、フル分解能オン、ジャスティファイ ビット オフ、レンジ ビット +/-16g。
  • データレート (0x2C) - 低電力モードオフ (通常モード)、出力データレートモード 400Hz (400KHz I2C は 800Hz までしかサポートしないというデータシートを読んだので、400Hz で安全にプレイしています)。
  • 電力制御 (0x2D) - 自動スリープ オフ、測定モード オン、スリープ ビット オフ、スリープ モード サンプリング レート 8Hz (ただし、使用されていないため、無視できます)。
  • 割り込み (0x2E) - データレディ割り込みが有効、その他はすべてオフ。

指定されたサンプリング レートでサンプリングするために timer1 を使用しています。カウンターが 1 分に達した後にメッセージを出力するカウンターがあるため、サンプリング レートが十分に機能していることはわかっています。ストップウォッチを使って、それが正しいことを確認します。たとえば、100Hz のサンプリング レートでは、カウンターが 6,000 (100 * 60) までカウントされるのを待ってメッセージを表示します。そのメッセージが表示されたときにストップウォッチが 1 分である場合、少なくともある程度の精度でサンプリングしていることがわかります。

加速度計 (I2C 複数バイト読み取りモード、1 回の呼び出しで 6 バイトすべてを読み取る) からサンプリングしようとすると、十分な速度で実行されません。私のストップウォッチ法を使用すると、1 分かかるはずのジョブ (100Hz でのサンプリング) を実行するのに約 1 分 15 秒かかっているように見えます。つまり、I2C コマンドの処理速度が十分ではありません。サンプリング レートが高いほど、遅延が大きくなります。

I2C クロックと timer1 が同期されていないことに関係していると感じているため、加速度計データの呼び出しに不要な待機が含まれています。I2C の 400KHz クロックでは不十分だとは思いませんが、間違っていたら訂正してください。

I2C スレーブ デバイスからデータを正しく読み取るにはどうすればよいですか? また、十分に高いサンプリング レートで読み取りたいジャイロスコープと磁力計もあります。磁力計には 160 Hz の制限があるため、3 つのデバイスすべてで 128 Hz のサンプリング レートで問題ありません。3 つのデバイスすべてから一度に読み取ろうとすると、サンプリングが予想よりも遅くなることは明らかです。

また、4ピンから同時にアナログデータを収集します(ADC 10bit)。このコードは既に実装されており、期待どおりに動作するサンプリング レートで 1KHz でアナログ データを読み取ることができます。動作が遅いのは I2C デバイスだけです!

3600Hz (I2C の場合は最大 800Hz) で出力できる場合、100Hz でサンプリングしようとすると、加速度計は問題ないと思いますが、本当に苦労していて、他に何を試せばよいかわかりません。

乾杯!

4

1 に答える 1