1

Arduino Mega を 6 軸ロボット アームに接続しています。6 つの割り込みはすべてエンコーダーに接続されています (1 つのエンコーダー ピンは割り込みに、もう 1 つは通常のデジタル入力に)。割り込みは次のコードで処理されます。

void readEncoder1(){
//encoders is a 2d array, where the first d is the axis, and the two pin numbers
//first pin is on an interrupt (CHANGE), and second is a standard digital in
  if (digitalRead(encoders[0][0]) == digitalRead(encoders[0][1])) {
   positions[0]++;
  } else {
   positions[0]--;
  }
 if(servoEnable){
  updatePositions(); //// compares positions[] to targets[] and adjusts motor speed accordingly
 }
}

これは、アームを特定の位置にロックしたままにするように設計されています。arduino がモーターの位置が特定のしきい値だけずれていることを検出すると、モーターに供給される電力を更新してアームを所定の位置に保ちます。

問題は次のとおりです。2 つまたは 3 つ (またはそれ以上) の軸に負荷がかかっている場合 (位置を維持するには常に更新が必要)、または軸が移動している場合、Arduino はシリアル入力で無傷のコマンドを受信しなくなり、いくつかの文字が削除されます。 . 割り込みは明らかに非常に高速に実行されており、何らかの理由でコマンドが破損しています。これを回避する方法はありますか?アーキテクチャ的に、私はこれを正しく行っていますか? 私の主な本能は、たとえば 100 ミリ秒間隔でメインの実行ループで updatePositions() を呼び出すことです。これにより、割り込みのオーバーヘッドが大幅に削減されますか? 私の質問は、6 つのエンコーダーすべてが脈動している場合でも、信頼できるシリアル コマンドを Arduino にどのように取得するかということになると思います。

4

2 に答える 2

2

直交エンコーダは、ハードウェアカウンタによって読み取られるように設計されています。モーターが全速力で動作している場合、脈拍数は一般に高くなります。1メガヘルツは珍しいことではありません。パルス数が多いほど、サーボループの動作が良くなり、モーターをより正確に配置できます。

これを行うのは、低電力CPUを搭載したソフトウェアで行うことです。ISRがパルス間の間隔より長くかかると、バラバラになります。あなたはパルスを失い、したがって位置を失います。このエラー状態を検出する方法がないため、特に悪いです。そして、この損失は、ロボットが高速で移動しているときに発生します。これは、制御を失う最悪の場合の条件です。

割り込みハンドラでサーボループを更新する余裕は絶対にないので、最初にそれを取り除きます。ISRを最小限に抑え、位置のみをカウントし、他には何もカウントしません。サーボループは、タイマー割り込みまたはティックによって駆動されるように分離する必要があります。100ミリ秒のサーボアップデートでは、ロボットが大きく遅くならない限り、ロボットを適切に制御することはできません。スムーズな加速と安定したフィードバックを得るには、これはせいぜい数ミリ秒である必要があります。

数千ドル相当のロボットハードウェアを制御するために40ドルを費やすことには、限られた知恵があります。サーボループに追いつかないことは検出できることです。位置エラーが大きくなりすぎた場合は、サーボループをシャットダウンしてください。パルスを失うことについてあなたができることは何もありません、それは難破です。ハードウェアカウンターを取得します。

于 2012-03-28T10:58:09.623 に答える
1

組み込みシステムの最初のルール:

割り込みはできるだけ少なくします。

あなたの場合、割り込みの位置を更新し、位置/速度制御ループをバックグラウンドまたは低い優先度で実行するだけです。

余談ですが、チャンネルの1つに割り込みがないため、エンコーダーパルスを「失っている」ことに気付いていると思いますか?

また、割り込み駆動のエンコーダー分析は非常にノイズが発生しやすいです。ノイズ パルスが発生した場合、エッジが近すぎて両方を処理できないため、どちらか一方の割り込みのみが表示される可能性があります。

より堅牢な方法は、4 つの遷移すべてを監視するステート マシンを使用することですが、これには、両方のチャネルの両方のエッジで割り込みを行うか、期待するレートまで何も見逃さないように十分に高速にポーリングする必要があります。

于 2012-03-28T11:54:05.150 に答える