発行済み 2026-03-18
で遊んでいるときによくこのような状況に遭遇しますか?サーボs: ジンバルをターゲットにしっかりと向けたいのですが、ジンバルが揺れ続けます。または、指定した角度に回転させたいのに、常に所定の位置に回転できないことがありますか?これは実際には、適切に調整されていない典型的な PID 制御です。 STM32 を初めて使用する友人の多くは、PID は複雑すぎると考えています。実際、これは「どのようにしてサーボ今日は、STM32 を使用して、サーボ指示を正確に理解し、使用できるようにしてください。
簡単に言えば、PID は超高性能の「補正器」のようなものです。動いている物体を手で掴んでいると想像してください。あなたの目は物体の位置(フィードバック値)を見ます。脳は物体がどこにあるのか、どのくらいの速さで動いているのかを計算し、手を調整(出力)するように指示します。これが PID の機能です。目標位置と現在の実位置との差をリアルタイムに計算し、その差を修正するために必要な力を教えてくれます。 P は比率であり、補正の強度を決定します。 I は積分なので、長期にわたって蓄積されたエラーを排除するのに役立ちます。 D は差動で、変化する傾向を事前に感知し、オーバーシュートを防ぐことができます。
これが最も厄介な問題です。ほとんどの場合、P 値の調整が高すぎることが原因です。比例制御は、車を運転していて前の車を見て、アクセルを踏む強さを P 値によって決定するようなものです。 Pが大きすぎると、距離が少し遠いと思った瞬間にアクセルを踏み込み、オーバーシュートしてしまいます。それからブレーキを踏みます。このまま行ったり来たりすると車が前後に揺れてしまいます。サーボも同様です。 Pが大きすぎると目標位置で前後に振動してしまいます。このとき、Pを適切に下げるか、ディファレンシャル制御Dを導入する必要があります。Dは「ダンピング」の役割を果たし、この振動を抑え、ステアリングギアを安定させることができます。
難しいことではありません。コアコードは実際にはわずか数行です。最初に 3 つのパラメータ (Kp、Ki、Kd) といくつかの変数 (目標値、現在値、最後の誤差、積分項) を定義する必要があります。メインループでは、サーボの現在位置 (通常はポテンショメータによってフィードバックされる ADC 値) が継続的に読み取られ、誤差が計算されます。比例項 P = 誤差Kp.積分項 I = 累積積分項 + 誤差「気」は、摩擦やその他の理由で生じる小さなずれをゆっくりと補うのに役立ちます。微分項 D = (現在の誤差 - 最後の誤差) * Kd。最後に、出力 PWM 値 = P + I + D となります。計算された PWM 値をタイマーに割り当てて、サーボを回転させます。これで、最も基本的な閉ループ制御が完了します。
ステアリングギア制御には、通常、位置 PID が使用されます。位置 PID は、最終的にサーボに与える絶対位置 (PWM デューティ サイクル) を計算します。直感的でわかりやすいです。文字通り、「今度はこの角度に行くべきです」と教えてくれます。インクリメンタル PID は、前の出力に対する現在の出力の「変化」を計算します。毎回実行されるステップ数を正確に制御する必要があるステッピング モーターなどのシナリオに適しています。サーボを制御するときに関心があるのは、サーボがどのように進むかではなく、どこで停止するかということです。そのため、位置 PID はよりニーズに適合し、コードの実装がより単純になり、積分飽和の問題が発生しにくくなります。
午後中一生懸命働いて、ようやくサーボが安定しました。電源が落ちるたびにリセットすることはできませんよね?これには、STM32 の内部フラッシュ シミュレーションを使用するか、外部チップを接続する必要があります。プログラムでは、3 つの調整パラメータ Kp、Ki、Kd を構造体として定義できます。デバッグが完了すると、ボタンを押すと保存機能がトリガーされ、この構造体のデータが指定されたフラッシュ アドレスに書き込まれます。次回システムが起動するときに、初期化コード内のそのアドレスからデータを読み取り、それを PID の 3 つのパラメーターに割り当てます。これにより、電源を切ってもパラメータが保存され、デバッグ結果が永久に保持されます。
これには、「積分分離」トリックを使用する必要があります。従来の PID では、サーボが回転し始めたばかりで位置誤差が大きい場合、積分項 I は必死に大きな値を蓄積します。サーボがターゲットに近づこうとするとき、この大きな積分値が深刻な「オーバーシュート」を発生させ、サーボがオーバーシュートしてしまいます。解決策は、しきい値を設定することです。たとえば、誤差が 50 度より大きい場合は、積分項 I をクリアして、機能しないようにします。誤差が 50 度未満で、サーボがほぼ定位置にある場合にのみ、積分項 I を介入させて、最後の小さな静的な差を除去します。これにより、設置時の迅速な起動と精度の両方が保証されます。
さて、サーボを STM32 制御するための PID プログラムですが、核となる考え方と手順はおそらくこれです。実際にチューニングを行う場合、パラメータのチューニングは忍耐を必要とするプロセスであり、コード自体を記述するよりも時間がかかる場合があります。プロジェクトに取り組むときに位置 PID を使用することを好むのか、それとも他のよりインテリジェントな制御アルゴリズムを試したことがありますか?コメント欄であなたの経験を共有してください。この記事が役立つと思われる場合は、「いいね」を押して保存し、サーボをプレイする他の友達に転送することを忘れないでください。
更新時間:2026-03-18