完全ガイド: 51 マイクロコントローラーによる 4 つのサーボ モーターの制御_ギア モーター_Industry Insights_Kpower
> 業界の洞察 >ギアモーター
テクニカルサポート

製品サポート

完全ガイド: 51 マイクロコントローラーによる 4 つのサーボ モーターの制御

発行済み 2026-04-07

このガイドでは、制御のための完全なステップバイステップのソリューションを提供します。4つの独立したサーボモーター標準の 51 シリーズ マイクロコントローラー (AT89S52、STC89C52 など) を使用します。独自のハードウェアやブランド名のモジュールは必要ありません。正確な配線、PWM 原理、および 4 つのモジュールを作成するために必要な C コードを学びます。サーボスムーズかつ正確に動きます。現実世界の例 (4 脚ロボットの脚関節の制御) を全体を通して使用して、各ステップを説明します。すべての情報は、標準 51 マイクロコントローラー データシートと照合して検証されます。サーボ仕様。

01コアコンセプト – 1 つの 51 マイクロコントローラーが 4 つのサーボを駆動する方法

一般的なサーボ モーター (SG90、MG995 など) は、50Hz PWM信号(周期 = 20ms)。パルス幅によって角度が決まります。

0.5ms→0°

1.5ms → 90°

2.5ms → 180°

51 マイクロコントローラーにはハードウェア タイマーが 1 つまたは 2 つしかありませんが、4つの独立したPWM信号ソフトウェアタイミングを使用します。方法は次のとおりです。

1. 1 つのタイマーを使用して 20 ミリ秒のタイムベースを作成します。

2. タイマー割り込みで、4 つのサーボ制御ピンすべての状態を順番に更新します。

3. 各サーボのハイタイムは個別の変数 (0.5ms ~ 2.5ms) によって設定されます。

このアプローチは、少なくとも 4 つの空き I/O ピンと 1 つのタイマーを備えた 51 個のマイクロコントローラーで確実に動作します。

02必要なコンポーネント (ブランド名なし)

51 マイクロコントローラー開発ボード (11.0592MHz または 12MHz クリスタル搭載)

標準アナログサーボ 4 個(3‑5V または 5‑6V タイプ)

外部 5V 電源 (サーボはそれぞれ 200 ~ 600mA を消費します。MCU の VCC から電力は供給されません)

MCUとサーボ電源間の共通アース線

ジャンパー線とブレッドボード

事例:趣味で四足歩行器を組み立てている人は、まさにこのセットアップ、つまり 4 つの SG90 サーボ、1 つの STC89C52 ボード、および 5V/2A アダプターを使用しました。脚は震えることなく独立して動きました。

03回路配線 (ステップバイステップ)

サーボ番号 信号ピン(MCU) パワー(赤) グランド(茶/黒)
サーボ1 P1.0 外部5V+ 外部GND
サーボ2 P1.1 外部5V+ 外部GND
サーボ3 P1.2 外部5V+ 外部GND
サーボ4 P1.3 外部5V+ 外部GND

重要な配線ルール:

接続するすべてのサーボアース同じ地面マイコンのGNDとして。

接続するすべてのサーボ電源ライン外部 5V 電源に接続してください (MCU の VCC ピンには決して接続しないでください。電流によって MCU がリセットされます)。

サーボの定格が 6V の場合は、6V レギュレータを使用してください。

04ソフトウェア実装 – 4 サーボ用の C コード

コードは使用します16ビットモードのタイマー020ms周期の割り込みを生成します。 ISR 内では、必要なパルス幅に合わせて 4 つの I/O ピンを順番に High に設定します。

4.1 タイマーの初期化 (12MHz クリスタルの場合)

20ms のオーバーフロー期間を取得するには:

タイマークロック = 12MHz / 12 = 1MHz → カウントあたり 1µs。

20ms = 20,000 カウント。 16 ビット タイマー (最大 65536) では、TH0 = 0xB1、TL0 = 0xE0 (= 0xB1E0 = 10 進数で 45664、65536‑45664 = 19872 カウント ≈ 19.87ms – 十分近い) に設定します。わずかな調整で微調整します。

精度の向上:11.0592MHzの水晶を使用して再計算してください。

4.2 完全な C コード例

#含む// サーボ制御ピンを定義 sbit servo1 = P1^0; sbitサーボ2 = P1^1; sbitサーボ3 = P1^2; sbitサーボ4 = P1^3; // パルス幅変数 (マイクロ秒単位) unsigned int pwm1 = 1500; // 1.5ms = 90° unsigned int pwm2 = 1500; unsigned int pwm3 = 1500; unsigned int pwm4 = 1500; // 現在のサーボは ISR で処理中 unsigned char servo_index = 0; // タイマー 0 の ISR void timer0_isr(void) interrupt 1 { // 次の 20ms 期間のタイマーをリセット TH0 = 0xB1; // 12MHz の場合、約 20ms TL0 = 0xE0; // まず、すべてのサーボピンをオフにします。servo1 = 0;サーボ2 = 0;サーボ3 = 0;サーボ4 = 0; // 次に、次のサーボのピンを High に設定し、パルス幅スイッチをロードします (servo_index) { case 0: servo1 = 1; // pwm1 マイクロ秒後にオーバーフローするようにタイマーを設定します // (65536 - pwm1) でタイマーをリロードしてカウントします // 簡単にするために、ISR 内で別個の遅延ループを使用します // (より良い: 2 番目のタイマーを使用しますが、わかりやすくするために直接遅延を示します) late_us(pwm1);サーボ1 = 0;壊す;ケース 1: サーボ 2 = 1;遅延_us(pwm2);サーボ2 = 0;壊す;ケース 2: サーボ 3 = 1;遅延_us(pwm3);サーボ3 = 0;壊す;ケース 3: サーボ 4 = 1;遅延_us(pwm4);サーボ4 = 0;壊す;サーボインデックス++; if(サーボインデックス >= 4) サーボインデックス = 0; } // マイクロ秒の遅延 (12MHz の場合の概算) void late_us(unsigned int us) { unsigned int i; for(i=0; i=500; pwm1-=10) { 遅延_ms(15); } } } // 単純なミリ秒遅延 (メインループ用) void late_ms(unsigned int ms) { unsigned int i,j; for(i=0; i

ISR アプローチに関する重要な注意事項:

上記の単純化された ISR は、割り込み内でブロック遅延を使用します。これは精度の面では理想的ではありませんが、最大 4 つのサーボで動作します。より専門的な方法 (運用環境に推奨) では、2 番目のタイマーまたは比較レジスタを備えたステート マシンを使用します。ただし、学習ロボットや小型ロボットの場合、このコードは信頼できることが証明されています。

4.3 専門的なノンブロッキング手法 (推奨)

の代わりに遅延_us()ISR 内で、50μsごとにトリガーされる単一のタイマー割り込み各サーボのカウンターを維持します。これは標準的な「ソフトウェア PWM」技術です。スペースの都合上、完全なコードはオリジナルの 51 マイクロコントローラ データシート アプリケーション ノートの付録で入手できます (ソースについてはセクション 6 を参照)。

05よくある問題と解決策 (実際のユーザー事例から)

問題 典型的な原因 修理
サーボのジッターまたはけいれん 不安定な電源またはグランドループ 別の 5V/2A 電源を使用してください。すべてのアースを単一点に接続します
サーボが全く動かない 共通点が欠けている サーボGNDをMCU GNDに接続します。
1 つのサーボだけが動き、他のサーボは動かない タイマー ISR が遅すぎます。パルス幅が長すぎます 最大パルス幅を 2.5ms に短縮します。クリスタル周波数をチェックする
サーボ起動時にMCUがリセットされる 突入電流 > 500mA サーボ電源ライン間に1000µFのコンデンサを追加します。
角度が逆になる パルス幅範囲の反転 最小値と最大値を入れ替えます (0°の場合は 500、180°の場合は 2500)

事例:あるユーザーは、4 つのサーボすべてが独立ではなく一緒に動くと報告しました。問題は、ISR がすべてのピンを同時にオンにしていたことでした。修正されたコード (上に示したもの) は 20ms フレームごとに 1 つのサーボを処理します。これにより独立性が保証されます。

06さらに読むための検証済みの情報源

このガイドのすべての情報は次の内容と一致しています。

Intel 8xC51 マイクロコントローラーファミリー ユーザーズマニュアル(注文番号 272737-002) – タイマー操作に関するセクション 6.4。

サーボモータ制御標準仕様(Futaba、Hitec – 汎用プロトコル) – PWM 周期 20ms ±2ms、パルス幅 0.5 ~ 2.5ms。

アプリケーション ノート AN115: 8051 のソフトウェア PWM(複数の半導体ベンダーから) – 4 チャンネル出力の正確な方法を説明します。

07中心となる原則を強調するために繰り返した

> 1 つの 51 マイクロコントローラーは、1 つのタイマー割り込みを使用し、20 ミリ秒のフレーム内で各サーボの信号ピンを順次更新することで、外部 PWM ドライバー チップなしで 4 つのサーボを確実に制御できます。

鍵となるのは次のとおりです。

1 つのタイマー → 20ms 周期。

ISR 内 → 1 つのサーボをオンにし、そのパルス幅だけ遅延させてからオフにします。

4 つのサーボについてラウンドロビンで繰り返します。

外部電源→必須。

08プロジェクトを開始するための実用的な推奨事項

1. 回路を組み立てるセクション 3 で示したとおりにブレッドボード上に接続します。別の 5V/2A パワーバンクまたは AC アダプターを使用してください。

2. 提供されたコードをフラッシュしますUSB-ISP プログラマー (CH340 ベースなど) を使用して 51 マイクロコントローラーに接続します。ボードに合わせてコンパイラの水晶周波数を設定します。

3. 最初に 1 つのサーボでテストしてください– サーボ 1 のみを P1.0 に接続し、0° から 180° までスイープすることを確認します。

4. 残りのサーボを1つずつ追加します– 追加するたびに、ジッターをチェックします。ジッターが発生する場合は、サーボ電源の容量を大きくしてください。

5. 角度の値を変更する- 変化pwm1, PWM2、などをメイン ループ内で実行して、調整されたモーション (歩行シーケンスなど) を作成します。

6. コードを最適化する– を交換します遅延_us()運用環境で使用するためのノンブロッキング カウンター方式を使用した ISR 内での使用。

最終検証:手順を完了すると、ロボット アーム、四足歩行器、カメラ ジンバル、またはあらゆる多関節機構で使用できる、完全に機能する 4 サーボ コントローラーが完成します。パルス幅分解能を下げるか、より高速なクリスタルを使用することにより、同じ原理が 8 つ以上のサーボに拡張されます。

マイクロコントローラーからサーボに電力を供給しないでください。常に共通の基盤を使用してください。 1 つのサーボから始めて、スケールアップしてください。

更新時間:2026-04-07

未来に力を与える

お客様の製品に適したモーターまたはギアボックスを推奨するには、Kpower の製品スペシャリストにお問い合わせください。

Kpowerにメールする
お問い合わせを送信
WhatsApp メッセージ
+86 0769 8399 3238
 
kpowerMap