発行済み 2026-04-22
このガイドでは、標準のマイクロコントローラ コードを正確に制御するための完全なステップバイステップのアプローチを提供します。サーボモーター。正確なパルス タイミング要件を学び、テスト済みのコード例を参照し、実行可能な手順を取得して、サーボ0度から180度まで正確に動きます。すべての例は一般的なセットアップに基づいており、ブランド固有の依存関係を回避しているため、事実上あらゆる汎用マイクロコントローラー ボードに適用できます。
すべての標準サーボ モーター (ロボット アーム、RC 車両、カメラ ジンバルで一般的に使用されている) は、同じタイプの制御信号に応答します。50 Hzのパルス幅変調(PWM)。これは、20 ミリ秒ごとに繰り返しパルスを生成する必要があることを意味します。サーボの位置は、20 ms フレーム内の High パルスの幅によってのみ決定されます。
0.5msパルス→ 0度(左いっぱい/反時計回り)
1.5msパルス→ 90度(中央)
2.5msパルス→ 180 度 (右いっぱい/時計回り)
0.5 ms ~ 2.5 ms のパルス幅では、比例した中間角度が得られます。たとえば、1.0 ms パルスは 45 度に対応し、2.0 ms パルスは 135 度に対応します。
> 覚えておくべき重要な事実:パルス幅が 0.5 ms 未満または 2.5 ms を超えると、サーボがジッターしたり、過熱したり、損傷したりする可能性があります。常に値をこの安全な範囲に固定してください。
次のコードは標準 C で書かれており、ほぼすべての 8 ビットまたは 32 ビット マイクロコントローラー用にコンパイルできます。タイマーと GPIO レジスタ名を特定のハードウェアに適合させる必要がありますが、ロジックは同じままです。
まず、20 ミリ秒の周期を生成するように 1 つのハードウェア タイマーを設定します。ほとんどのマイクロコントローラーには 16 ビット タイマーが搭載されています。 16 MHz のシステム クロック (非常に一般的) を想定すると、タイマーを次のように設定できます。
// タイマー プリスケーラー: 64 // 20 ms のタイマー周期 = 16,000,000 Hz / 64 = 250,000 カウント/秒 // 20 ms (0.02 秒): 250,0000.02 = 5000 タイマー ティック #define TIMER_PERIOD_20MS 5000 void init_servo_timer(void) { // タイマー モードを最高値 = 5000 の PWM に設定 // サーボ制御ピンの出力比較チャネルを有効にする // レジスタ書き込み例 (汎用) TCCR1A = (1
関係は直線的です。次の式を使用します。
// 角度: 0 ~ 180 度 // パルス幅をマイクロ秒単位で返します (500 ~ 2500) uint16_t angle_to_pulse(uint8_t angle) { if (angle > 180) angle = 180; // 500 us + (角度 (2000 us / 180 度)) return 500 + (角度 2000 / 180);
}
次に、マイクロ秒をタイマーの刻みに変換します。タイマー クロックが 250 kHz (16 MHz / 64 = 250,000 Hz) の場合、各ティック = 4 マイクロ秒になります。それで:
uint16_tpulse_to_ticks(uint16_tpulse_us){returnpulse_us / 4; // ティックごとに 4 us なので }
すべてを組み合わせてサーボ位置を設定する関数を作成します。
void set_servo_angle(uint8_t angle) { uint16_tpulse_us = angle_to_pulse(angle); uint16_t ティック =pulse_to_ticks(pulse_us); // 比較レジスタ OCR1A = ティックを更新します。 }
![]()
ロボット アームが物体を持ち上げる場合、多くの場合、けいれんを避けるために徐々に動作する必要があります。以下は、サーボを 0° から 180° までスイープし、またその逆にスイープする完全なループです。
#含む#含む// ... 上記と同様にタイマーの初期化 ... int main(void) { init_servo_timer(); while (1) { // 0 から 180 度までスイープ for (uint8_t angle = 0; angle 0; angle--) { set_servo_angle(angle); _遅延_ms(15); 0を返します。 }
サーボが小さな物体を持ち上げる簡単な教育プロジェクトを考えてみましょう。学生は 2 つのサーボを使用してグリッパーを構築します。1 つは手首の回転用、もう 1 つはグリップの開閉用です。上記のコードを書いた後、0°に設定するとサーボが振動することに気づきました。原因は?彼らのパルス幅計算では、整数の丸め誤差により 495 μs が発生しました。修正は飽和チェックを追加することでした。
uint16_t angle_to_pulse_safe(uint8_t angle) { uint16_t パルス = 500 + (角度 2000 / 180); if (パルス 2500) パルス = 2500;リターンパルス。 }
もう 1 つの一般的な問題は、マイクロコントローラーと共有される 5V 電源の使用です。サーボが動くと最大 500 mA が消費され、マイクロコントローラーがリセットされます。解決策常に別の 5V/2A 電源からサーボに電力を供給し、信号線とアースのみをマイクロコントローラーに接続します。マイクロコントローラーの電圧レギュレーターを介してサーボ電流を決して流さないでください。
1. タイマークロックを確認してください– 正確なタイマーのティック期間を計算します。 1 ティックあたりわずか 1 µs の不一致でも、極端な角度では 20° の誤差が生じる可能性があります。オシロスコープを使用して、実際のパルス幅出力を測定します。
2. ソフトウェア制限を追加する– コードが 0 ~ 180° のみを要求している場合でも、電気ノイズによりグリッチが発生する可能性があります。 400 ~ 2600 μs 以外のパルス幅を拒否するフィルターを実装します。
3. 必要に応じてロジックレベルコンバータを使用してください– 多くのサーボは 5V ロジックで動作します。マイクロコントローラーが 3.3V で動作する場合は、専用のレベル シフターを使用してください。そうしないと、サーボが High パルスを認識できない可能性があります。
4. 必ず 100 ~ 470 µF のコンデンサを含めてください– 電解コンデンサをサーボの電源ピンとグランドピンの間に、サーボのできるだけ近くに配置します。これにより、逆起電力スパイクが吸収され、マイクロコントローラーのリセットが防止されます。
5. 最初にロードせずにコードをテストします– サーボホーンを取り外し、スイープを実行します。ノイズのないスムーズな動きを聞いてください。ブザー音は、パルスのタイミングが間違っているか、電力が不十分であることを示します。
動作するサーボ コードを作成するための絶対的な鍵は次のとおりです。0.5 ms ~ 2.5 ms の正確なパルス幅で安定した 50 Hz PWM 信号を生成。どのマイクロコントローラーを使用しても、それが達成できれば、サーボは希望の角度に正確に動きます。上記のコード例は複数の汎用プラットフォームでテストされており、電源とタイマーの設定が正しく実装されていれば確実に動作します。
をコピーしますangle_to_pulse_safe()プロジェクトに機能します。
20 ms 周期 (50 Hz) を生成するようにタイマーを構成します。
タイマーのクロック速度を使用してパルス幅を比較レジスタに書き込みます。
470 µF コンデンサを備えた別の 5 V 電源からサーボに電力を供給します。
スイープテストを実行します。 0° から 180° までスムーズに移動する場合、コードは正しいです。
更新時間:2026-04-22