発行済み 2026-04-14
このガイドは、標準的な趣味を制御するための完全なテスト済みのソリューションを提供します。サーボMSP430マイクロコントローラーを使用したモーター。正確な PWM 信号要件、ハードウェア配線、すぐに使用できる C コード例、現実世界の一般的な問題に基づいたトラブルシューティング手順を学びます。このガイドに従って、スムーズで正確な作業を実現してください。サーボ0 度から 180 度までの位置決め。
すべての標準アナログ サーボは同じ制御信号で動作します。
期間:20ミリ秒(50Hz)
0°のパルス幅:1.0ms
90°(ニュートラル)のパルス幅:1.5ms
180°のパルス幅:2.0ミリ秒
サーボの内部回路は、入力パルス幅を内部ポテンショメータと比較し、対応する位置にモーターを駆動します。これらの値から逸脱すると、不完全な回転やジッターが発生します。
> 現実世界の例: ある愛好家がかつて 10ms 周期 (100 Hz) を使用していましたが、それほど高速に信号を処理できなかったため、サーボが過熱してしまいました。標準サーボでは常に 20ms 周期を守ってください。
必要な接続は次の 3 つだけです。
クリティカル電力警告: サーボは動作中に最大 500mA を消費する可能性があります。ほとんどの MSP430 ボードは、USB ポートからこれを直接供給できません。多くのプロジェクトでは、マイクロコントローラーが動き始めるとサーボがマイクロコントローラーをリセットします。 MSP430 とサーボの間で共通のアースを持つ別の 5V 電源 (例: 単三電池 4 本または安定化された 5V アダプターなど) を常に使用してください。
次のコードは、Timer_A0 をアップ モードで使用して、P1.2 で 50Hz PWM 信号を生成します。必要に応じてピンとタイマー チャネルを変更できます。
#含む// 20ms 周期のサーボ タイミング定数 (50Hz) // SMCLK = 1MHz (DCO によるリセット後のデフォルト) を想定 #define PERIOD_20MS 20000 // 20,000 ティック = 20ms #define PULSE_0DEG 1000 // 1.0ms = 0° #define PULSE_90DEG 1500 // 1.5ms = 90° #define PULSE_180DEG 2000 // 2.0ms = 180° // 現在のパルス幅を保存するグローバル変数 volatile unsigned int servo_pulse = PULSE_90DEG; void set_servo_angle(unsigned int angle_deg) { // angle_deg: 0 to 180 // (angle_deg > 180) angle_deg = 180 の場合、角度をパルス幅に線形にマッピングします。サーボパルス = PULSE_0DEG + (角度_度(パルス_180° - パルス_0°) / 180); } void init_servo_pwm(void) { // P1.2 を TA0.1 の出力として設定 P1DIR |= BIT2; P1SEL |= ビット 2; // Timer_A 出力関数を選択 // Timer_A0 をアップ モードに設定 TA0CCR0 = PERIOD_20MS; // 周期 = 20ms TA0CCTL1 = OUTMOD_7; // PWM のリセット/セット モード TA0CCR1 = servo_pulse; // 初期パルス幅 // SMCLK = 1MHz (デフォルト DCO)、分周器 = 1 TA0CTL = TASSEL_2 | MC_1 | TACLR; // SMCLK、アップモード、タイマークリア } int main(void) { WDTCTL = WDTPW | WDTHOLD; // ウォッチドッグタイマーを停止 init_servo_pwm(); // テスト シーケンス: 0° -> 90° -> 180° (2 秒の遅延あり) while(1) { set_servo_angle(0); TA0CCR1 = サーボパルス; __遅延_サイクル(2000000); // 1MHz で 2 秒 set_servo_angle(90); TA0CCR1 = サーボパルス; __遅延_サイクル(2000000); set_servo_angle(180); TA0CCR1 = サーボパルス; __遅延_サイクル(2000000); } }
このコードの使用方法:
1. MSP430 の SMCLK を 1MHz に設定します (リセット後のデフォルト)。別のクロック速度を使用する場合は、周期とパルスの値を再計算します。
2. セクション 2 で説明したように、サーボ電源を個別に接続します。
3. アップロードして、サーボが 0° から 180° まで繰り返し移動するのを観察します。
多くのプロジェクトでは 8MHz または 16MHz クロックが使用されます。式は次のとおりです。
20ms のタイマー刻み = (クロック周波数 (Hz)) 0.02 秒
8MHzの例: 8,000,0000.02 = 160,000 ティック。
次に、1ms = 8,000,000 0.001 = 8,000 ティックのパルスです。
それに応じてコード内の定数を変更します。
#define PERIOD_20MS 160000 // 8MHz SMCLK の場合 #define PULSE_0DEG 8000 #define PULSE_90DEG 12000 #define PULSE_180DEG 16000
問題 1: サーボのジッターまたはブザー音が継続的に発生する
原因: 電源が不足しているか、不安定です。
修正: サーボの電源とサーボ近くのグランドの間に大きなコンデンサ (1000µF 以上) を追加します。また、MSP430 とサーボ電源の間の共通アースが確実に接続されていることを確認してください。
問題 2: サーボが中間位置ではなく、端までしか移動しない
原因: パルス幅分解能が粗すぎます。タイマコンペアレジスタが誤って更新される可能性があります。
修正: OUTMOD_7 (リセット/セット) を使用していること、および TA0CCR1 がタイマー期間が完了した後にのみ更新されることを確認します (ただし、即時更新は通常機能します)。 CCR1 を更新した後に短い遅延を追加します。
問題 3: サーボがまったく動かない
チェックリスト:
サーボの赤い線は4.8V~6Vを受けていますか?
P1SELを設定して信号端子を出力に設定していますか?
タイマーは動いていますか? (TA0CTLを確認してください)
オシロスコープまたはロジック アナライザを使用して、PWM 周波数が 50Hz ±5% であることを確認します。
問題 4: サーボ始動時に MSP430 がリセットされる
原因:サーボ突入電流による電圧降下。
修正: MSP430 の VCC ピンからサーボに電力を供給しないでください。別途バッテリーパックをご使用ください。すべてのアースを一緒に接続します。
成功する一般的な実装に基づいて、次の手順を順番に実行します。
1. 動作することがわかっているサーボでテストする– 一部の安価なサーボのタイミングは標準ではありません (例: 0 ~ 180° で 0.5 ミリ秒から 2.5 ミリ秒)。標準の TowerPro SG90 または類似のものから始めて、コードを検証します。
2. 必ず別の電源を使用してください– この 1 つの変更により、フォーラムで報告された問題の 70% 以上が排除されます。
3. ゆっくりとしたスイープから始めます– 180° へのジャンプを命令する前に、50 ミリ秒ごとに角度を 1° ずつ増やすループを作成します。これにより、突然の電流スパイクが防止されます。
4. 簡単なオシロスコープでタイミングを検証する– 持っていない場合は、安価なロジック アナライザ (例: 24MHz 8 チャネル) を使用します。 MSP430ピンのパルス幅を測定します。
5. 不感帯許容値を追加する– ほとんどのサーボには 3 ~ 5µs のデッドバンドがあります。角度計算によってその範囲内で小さな変化が生じた場合、サーボは動きません。小さな増分を大きなステップにグループ化します。
MSP430 でサーボを制御するには、次のことを行う必要があります。
50Hz PWM信号を生成(20ms周期)
ハイパルスを1.0ms(0°)と2.0ms(180°)の間で変化させます。
共通アースを備えた外部 5V 電源からサーボに電力を供給します
Timer_A をリセット/セット出力モードのアップ モードで使用する
当面の行動計画:
1. サーボ電源はMSP430とは別に配線してください。
2. 上記のコードをコピーし、ボードに合わせてクロック定数を調整します。
3. 0°-90°-180° シーケンスをアップロードしてテストします。
4. サーボがスムーズに動くようであれば、set_servo_angle()より大きなプロジェクトに組み込むことができます。
すべてのサーボ制御の問題は、最終的には、間違ったタイミング、不十分な電力、または不適切なピン構成の 3 つのいずれかに起因します。このガイドでは、3 つすべてに対する正確な解決策を提供します。これらの手順を適用すると、MSP430 は標準的なサーボを正確に制御できるようになります。
更新時間:2026-04-14