ATmega16 MKの高精度マルチサーボ制御

最近、モックアップワークショップの友人たちが私に目を向け、非常に興味深いプロジェクトに取り組むことを申し出ました。 彼らは、いくつかの機械(クレーン、掘削機、駆逐艦)の詳細が移動するレイアウトを作成する必要がありました。 ロジックは単純ですが、特殊性は、ドライブ自体の速度よりもはるかに低い速度で移動する必要があり、これは中間点を通過することによってのみ実現できることです。 この記事では、多数のサーボを正確に制御する興味深い方法を紹介します。



私の場合、4つのドライブを使用することになっていた。 このプロジェクトでは、小さなボードを作成しました。



画像



画像



ボード自体はシンプルです-Atmega16A-AUマイクロコントローラー、コントローラー用のスタビライザー、ドライブ用の2つのスタビライザー、およびドライブを接続するためのPLSコネクター。 私の場合、ドライブにはほとんど負荷がありませんでした(サーボは紙の部品で移動していました)。そのため、ドライブには小さなラジエーターに1つのリニアスタビライザーで十分でした。



ドライブ制御については、 alex-exedi haltに関する2つの最も興味深い記事を見つけました。 ただし、どちらの方法にも欠点があります。 最初の場合:頻繁に割り込みを発生させる必要があるため、メインループの実行がほとんど遅くならず、高い位置決め精度を得ることができません。 実装中、ドライブは非常に強く収縮し、インストールの精度は約1度です。 実際に、ここにビデオがあります:







DI HALTメソッドは、フォーメーションを昇順で想定しています。つまり、シグナルを追加で計算する必要があります。



この点で、これらの困難の両方を回避する別の方法を提案したいと思います。



サーボドライブの制御原理は単純です。0.8〜2.3ミリ秒のパルスを15〜20ミリ秒の周期で送信する必要があります。 パルス幅は、サーボの位置を決定します。 提案された方法は、図に示すように、MKの脚でのパルスの形成を次々に伴います。



画像



このメソッドを実装するには、1つのタイマーで十分です。 マイクロ秒ごとに増加するようにタイマーを設定します。 信号周期全体は18000μsで、1つのパルスの形成時間は4500μsです。 4つのサーバーを制御するときのタイマー割り込みは、8回呼び出されます。 これは、メソッドの制限を意味します。1つのタイマーが8台を超えるドライブをハングさせることは機能しません(20msで、2.3msの持続時間で最大8個のパルスを生成できます)。



変数angle1-angle4は、メインプログラムサイクルで変化する正規化単位の角度です。 角度を0から180度に変更するには、800から2200に変更する必要があります。すべての制御は割り込みハンドラーで行われます。 タイマーが最初にトリガーされると、最初のドライブを担当するユニットが1に設定されます。 このドライブの角度値は、すぐにOCR1Aレジスタに書き込まれます。 次にトリガーされると、レッグは0に設定され、1つのドライブの制御期間の終了までに残ったサイクル数がOCR1Aレジスタに書き込まれます(4500に設定されています)。 その後、2番目のドライブを担当する脚で同じことが行われます。 したがって、1本の足で4.5msごとに、必要な持続時間のインパルスが表示され、最大1µsの精度で! つまり、角度の設定の精度は10分未満であり、ドライブ自体の特性によって制限されます。 したがって、コード自体:



ISR(TIMER1_COMPA_vect) { if (takt == 0) { PORTC |= 0b00000001; OCR1A = angle1; } if (takt == 1) { PORTC = PORTC & 0b11111110; OCR1A = cycle - angle1; } if (takt == 2) { PORTC |= 0b00000010; OCR1A = angle2; } if (takt == 3) { PORTC = PORTC & 0b11111101; OCR1A = cycle - angle2; } if (takt == 4) { PORTC |= 0b00000100; OCR1A = angle3; } if (takt == 5) { PORTC = PORTC & 0b11111011; OCR1A = cycle - angle3; } if (takt == 6) { PORTC |= 0b00001000; OCR1A = angle4; } if (takt == 7) { PORTC = PORTC & 0b11110111; OCR1A = cycle - angle4; } takt = takt + 1; if (takt == 9) takt = 0; }
      
      







プログラム全体のテキストは提供しません。メインサイクルのコーナーは、少なくともUARTに従って、少なくともADCを使用して、任意の方法で形成できます。 実際に、どこで、どこで、どのくらいの長さで立つかなどを手で決めました。 トグルスイッチもありました。 オンの位置では、サーボはプログラムに従って移動し、オフにすると元の位置に戻ります。 必要に応じて、すべてのプロジェクトソースをメールに送信できます。



4つのドライブのビデオを次に示します。







左下隅のドライブに注意してください-動きはほとんど目立ちません! このドライブはクレーンブームを制御します。 ドライブ自体についてさらに説明します。 私の手には4つの異なるドライブがありました。2つのアナログと2つのデジタルです。 両方のドライブが動作しているにもかかわらず、両方のアナログドライブが正常に数分間しか正常に動作せず、ランダムにひきつり始めたり、極端な位置で固定したりすることは注目に値します。 デジタルドライブは、数時間(または数日)にわたってすべてを明確かつ安定して実行しました。 お客様から苦情を聞いたことはありません。 クレーンブームには、ハイテクアクチュエータを使用しました。これは、最小ステップで位置を変更しました。



そして最後に-レイアウトの写真。 残念ながら、動画をアップロードできません。



画像



UPD:

主な記事は現在ここに保存されています



All Articles