pulseIn()のタイミングはどのくらい正確ですか?


8

pulseIn()PWMベースのバイナリデータエンコーディングを処理する関数を使用しています。これは、長さが大きく異なるパルス、たとえば500usと1500usを区別するのに適しています。これは、典型的なIRリモコンの処理には十分すぎるほどです。

しかし、2つ以上のパルス長を使用できる独自のIRシステムを作成して、データ転送をより高速に実行できるようにしたいと考えています。理想的には、8進エンコーディングに8つの異なるパルス長を使用したい(例:200us、400us、600usなど)。

pulseIn()ただし、返される値にはかなりのばらつきがあることに気付きました(+/- 10%)。少なくとも一部はIRトランスミッターおよびレシーバーモジュールによって導入されると思いますが、それを確認するのに十分な設備がありません。

その外部エラーを軽減できると仮定すると、そのpulseIn()ような同様のパルスを区別するのに十分正確である可能性がありますか?

回答:


11

Pulsein()関数は非常に損失が大きく、ハードループであり、数値を返します*ループごとにかかる想定クロックサイクル

...
// wait for the pulse to stop
while ((*portInputRegister(port) & bit) == stateMask) {
  if (numloops++ == maxloops)
    return 0;
  width++;
}

// convert the reading to microseconds. The loop has been determined
// to be 20 clock cycles long and have about 16 clocks between the edge
// and the start of the loop. There will be some error introduced by
// the interrupt handlers.
return clockCyclesToMicroseconds(width * 21 + 16); 

PINのタイミングをキャプチャする最も正確な方法は、入力キャプチャ機能を使用することです。この例を見てください。最大解像度のCPUの1xで入力キャプチャを有効にし、入力ピンの各エッジが、生成された割り込みサービスから読み取るためのタイマーのクロック値をキャプチャします。また、タイマーオーバーフロー割り込みを有効にして、絶対時間を大きく維持し、キャプチャすることもできます。1xはかなり速く転がるので。キャプチャは、メインループで読み取るために、時間を配列に格納します。


IRを介した信号に使用する一般的なライブラリは、shirriff / Arduino-IRremoteライブラリです。復調信号からIRを読み取って送信するいくつかのデモがある場合。自分のデザインのスケッチを作成できるようにするため。このコードは元々、以下によって決定されるレートで入力ピンをポーリングするタイマー割り込みを作成します

#define USECPERTICK 50  // microseconds per clock interrupt tick

IRremote.hファイル内。私の目的のために、25に変更しました。私はこれがまだ断続的に欠落しているパルスストリームである可能性があることを見つけました。

復調はIRレシーバー内で行うのが最適です。IRレシーバーはこの信号を出力します。背景を追加する場所。典型的な38KHz変調を使用すると、パルスのサイクルあたり26.3uSの最小分解能に相当します。シェリフのライブラリは、通常、ほとんどのボーまたはビットが10+パルスのオーダーであることを示しています。ご希望のタイミングを満たしているようです。

microtherion / Arduino-IRremote for shrriffの作業は、ピンのタイマー割り込みポーリングをPinChangeInterruptsの使用に置き換えることで、受信を改善します。これを自分のmpflaga / Arduino-IRremoteフォークにマージしました。これにより、他のいくつかの機能が追加されます。

したがって、上記のライブラリのいずれかを使用できます。または、以下のいずれかを使用してエッジをキャプチャする独自のアプリを作成します。

  1. タイマーイベントのポーリング(例:50uS)
  2. PinChangeInterruptでmicros()をキャプチャします
  3. 入力キャプチャ割り込みを使用して正確な時間を取得します

1
素晴らしい答え。Arduino-IRremoteは非常に高品質のライブラリです。読みやすく、十分に考え抜かれた設計が多く、信頼性が高い。
サイバーギボンズ2014

2

テストのテストデータの一部を次に示しpulseInます。1つのArduinoが14usパルスと想定されるものを送信し、もう1つはこのデータを吐き出しました。

18,18,18,12,18,18,18,18,18,18,18,18,18,18,18,18,18,24,19,18,18,18,18,18,24、 18,18,18,19,18,18,12,18,18,19,18,18,18,18,18,18,18,18,18,18,18,19,18,19,24、 18,18,18,18,18,18,18,24,18,18,18,18,18,18,18,18,18,18,18,18,18,19,18,18,18、 18,18,18,18,18,18,18,19,18,18,18,11,18

ご覧のとおり、パルスは決して正確ではありません。送信側と受信側がアセンブリで記述されている場合、または独自のプロセッサにオフロードされている場合でも、時刻はより正確になります。

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