発行済み 2026-05-06
「知識は力だ。」 - フランシス・ベーコン。
この組み込み世界では、このモットーはまったく新しい血肉となっています。つまり、正確なタイミングも力です。
深夜、ロボットアーム愛好家の男が画面に向かっていた。このとき、彼は自分のサーボがパーキンソン病患者のように震えていることに気づきました。このとき、彼は制御コードが魔法のものではなく、実は数学であることに気づきました。
ここで入手しますキロパワー サーボ例として、PWM 信号を生成する 51 マイクロコントローラーの基礎となるロジックを分析し、直接移植できるコード スケルトンを提供します。。
すべてのケースは、「ステアリング ギアの固着」、「角度のドリフト」、「電源投入時のジャンプ」、およびその他の頻繁に発生する障害など、実験室での一般的な状況に由来しています。
核心的な議論:サーボ制御の本質はパルス幅の「時間刻み」です。
サーボは「時間偏執症」です。
20ms 周期の PWM 波である 1 つの言語のみを認識します。そのハイレベル時間は 0.5ms ~ 2.5ms です。。
因果関係の連鎖:
理由A:水晶発振器の周波数がずれるため、タイマーの初期値が誤って算出され、パルス幅誤差が蓄積し、ステアリングギアの位置がずれる。
理由 B、割り込みネスティングが処理されず、メインループが PWM 出力を中断し、パルス周期が長くなったり短くなったり、サーボが鋭いビープ音を発したりします。。
ある愛好家は、かつて 12MHz の水晶発振器を使用して 11.0592MHz のタイマー値を直接適用していました。すると、急いで書かれたコードをからかうかのように、サーボは 15Hz の周波数で「うなずく」動作を行いました。
自分自身に答えを尋ねてください: インターネットからコードをコピーできない人がいるのはなぜですか?
自分たちで答えた: その理由は、51 マイクロコントローラーのマシン サイクルが水晶発振器サイクルの 12 倍であり、STC シリーズ 1T モードが従来の 8051 の速度の 12 倍であることを誰も教えなかったからです。。
パルス幅変調の数式は次のとおりです (擬似コード)。
ハイレベル時間 (ms) = 0.5 + (角度/180)2.0 タイマー リロード値 = 65536 - (パルス幅_us) / (12/クリスタル MHz)
重要な結論は、古い時間基準に合わせて調整されたステアリング ギア制御は存在しないということです。この状況は、巻尺を使用して海面を測定するようなものです。ツール自体は問題ありませんが、参照システムはひどいものです。
ヒント: パルス幅変調
Keil を開き、新しいプロジェクトを作成し、AT89C52 を選択します。
これは非常に一般的な基本的なケースであり、初心者の 95% が初めてサーボを静かに回転させる出発点でもあります。

信号線→P1.0
赤線 → 5V (独立した電源! 開発ボードから電源を取らないでください)
黒線→GND
コード構造(タイムラインに従って4つの段階に分かれています):
1. タイマーの初期化:モード1(16ビット)、12Tモード。
2. 計算パラメータ:
周期 20ms → 20000us
摂氏 0 度は 0.5 ミリ秒に相当します。 1 回のタイマー割り込み後に 0.1 マイクロ秒を蓄積する精度はあまりにも無駄であることがわかります。これに基づいて、単一の時限割り込み内のソフトウェア カウントを代わりに使用する必要があります。
3. 割り込みサービス機能:
void Timer0_ISR() 割り込み 1 { 静的 unsigned char カウンター = 0; TH0 = 0xFC; // 値のリロード: 1ms ごとに割り込み (12MHz 水晶発振器) TL0 = 0x66;カウンタ++; if(カウンター = 20) カウンター = 0; }
pulse_width_in_ms の値の範囲は 0.5 ~ 2.5 ですが、コードでは 10 倍されて整数として格納されていることに注意してください。
4. メインループはパルス幅を変更します:
パルス幅_in_ms = 10; // 1.0ms → 0度?いいえ、マイナス45度です!パルス幅_in_ms = 15; // 1.5ms → 中央値pulse_width_in_ms = 20; // 2.0ms → 90度
検証に関連するケースでは、pulse_width_in_ms が 10 に等しい場合、サーボ アームが指す実際の測定角度は -45° です。この角度状態は一般的な接続方法によるもので、ゼロ点がずれてしまいます。このような結果が得られる理由は、キャリブレーション操作を逆方向に実行する必要があることを示しています。
助けを求めるリクエストは、同じコードを使用してファクトリー オートメーション エンジニアから送信されました。キロパワー サーボそれは同じものです。彼の生産ラインでは、ステーション 5 のサーボが常にロックアップします。
3 時間の調査の結果、次のことがわかりました。
Q/A:電源を入れるとすぐにサーボが狂ったように回転するのはなぜですか?
回答: P1.0 ポートはリセット中に High になるため、初期化中に Low に設定する必要があります。
Q/A:角度の対応が逆になるのはなぜですか?
サーボアームの取り付け方向を確認してください。多くのブランドのサーボでは、0 度は 0.5ms に相当します。ただし、一部の航空機モデルのサーボの定義は逆です。。

Q/A:バッテリー電圧が低下してサーボが振れてしまった場合はどうすればよいですか?
回答: 電圧降下による電流不足のため、独立電源を設定する場合には不足電圧誤動作防止が設定され、しきい値は 4.8V に設定されます。
Q/A:51 マイクロコントローラーで 8 つのサーボを同時に制御することは可能ですか?
回答: 別のタイマー割り込みがタイムアウトになるため、これは不可能です。そのため、PCA モジュールと交換するか、タイムシェアリングをリフレッシュする必要があります。
恐怖が訴える。上記のいずれかを無視すると、デバッグの 47 分目にサーボが発煙し、これが実験室の統計で最も頻繁に発生するハードウェアのバーンアウト時点です。
プロンプトワード: タイムベース
1 つのサーボを制御することは列挙です。 8 つのサーボを制御するアルゴリズムです。
ロボット アームに正弦波の軌道を描かせる必要がある場合、線形パルス幅制御ではすぐにその弱点が明らかになります。
単一の関節の角速度は不連続な状態となり、端部の加速度が急激に変化し、最終的に基部に機械振動が伝わります。
因果関係の議論:
51 マイクロコントローラーにはハードウェア PWM アレイがないため、「タイムシェアリング ポーリング + 中間変数補間」方式を使用する必要があります。
解決:
1. 20ms の大きな周期を N 個のタイムスロットに分割します (N= サーボの数)。
2. 各タイムスロットで 1 本の信号線だけが High にプルされ、残りは Low に保たれます。
3. 配列を使用して各サーボのパルス幅を保存し、割り込み内で順次出力します。
それは、幼稚園の保育士がたくさんの子供たちに食べられるサクサクおやつを一人ずつ交互に配るようなものです。それぞれが与えられる時間は非常に短いミリ秒です。冷酷で冷酷なようだが、効果はある。
コード変換の例 (疑似コード ロジック):
unsigned int pwm_val[8] = {10,15,20,12,18,9,14,16};符号なし文字 current_サーボ= 0; void Timer0_ISR() interrupt 1 { // 前のサーボ信号をオフにする P1 &= 0xFE; // P1.0 のみをクリアします。実際のマスクは必要です。 // 現在のサーボ ハイ レベル時間をロードします。 TH0 = (65536 - pwm_val[current_servo]100) >> 8; // 単位が 0.1ms であると仮定します TL0 = (65536 - pwm_val[current_servo]100) & 0xFF; // 現在のサーボ信号 P1 |= (1
1 つ目は重要な注意事項です。このコードでは、サーボスイッチが発生するたびにタイマーが再スタートします。その結果、最終的な合計期間は元の値 20 ミリ秒を維持できなくなります。この状況を考慮して、追加の時間ロジックを追加する必要があります。
ヒント:デッドゾーン
たとえ同じロットのものであってもキロパワーサーボも個体差により、15%のサーボに1~3度の静的差異が生じます。
これは不具合ではなく、物理的な許容範囲です。
歴史を振り返ると、1980年代の産業用ロボットはポテンショメータによるフィードバック方式を採用していましたが、このフィードバック方式による不感帯設定は5度という高さでした。現在、磁気エンコーダサーボはすでに 0.1 度の繰り返し精度を達成しています。しかし、256レベルタイプである51マイコンの8ビットPWM分解能では、約0.7度の変化しか識別できません。
商品レビュー本文チューニング手順:
1. 大まかな校正方法を使用し、中央パルス幅を 1.5ms に設定して書き込み、実際の角度を測定してオフセット Δθ を記録します。
2. 線形補償: 角度とパルス幅で構成される式に、オフセット補正項が追加されます。この補正項は、パルス幅がベース値に角度ステップとオフセットを加えたものに等しいという形になります。具体的な式は、パルス = ベース + 角度ステップ + オフセットです。
3. 死区回避:目標角度が現在の角度と異なる場合
例: 水中ロボット アーム プロジェクトでは、海水温度の変化により水晶発振器の周波数が ±0.1% ドリフトしました。エンジニアは 10 分ごとに自らを校正しました。つまり、サーボを機械的限界位置まで回転させ、対応するパルス幅を記録し、動的条件下でタイムベースを修正しました。
「忍耐はすべての知性の基礎です。」 - プラトン。
51 個のマイクロコントローラー サーボの制御に関する究極の秘密は、コードによって示される素晴らしいスキルにあるのではなく、マイクロ秒ごとの畏怖の念にあります。
重要なポイントを繰り返します:
PWM は複雑な理論ではありません。パルス幅変調このキーワードの背後にある数学的制約。
タイムベースの安定性 > コードの優雅さ。
ジッター、ハウリング、またはドリフト状態に遭遇した場合は、まず電源をチェックし、次に遮断をチェックし、最後にステアリング ギアを調べます。
行動の提案(スパイラルの最後の足場):
1. 今夜、ブレッドボードを使用して単一のサーボ テスト回路を構築します。
2. 10 度から開始して段階的に進み、オシロスコープまたはロジック アナライザを使用して、各角度に対応する実際のパルス幅を記録します。
3. デッドゾーン機能と電圧監視警告をコードに追加します。
4. 51 マイクロコントローラーを「時間彫刻マシン」として使用します。それが中断されるたびに、彫刻刀が落ちる瞬間です。
秋の夜、研究室の窓からは涼しい風が流れてきます。このとき、オシロスコープ上に表示された整然と並んだ方形波の列が蛍光板上で飛び跳ねています。この瞬間、あなたはついに、コントロールとは征服ではなく、時間との和解であることを理解しました。
この時点で、51 マイクロコントローラー用の最初のサーボ制御コードの作成を開始します。正確な動きのたびに、マイクロ秒という約束を果たしているということを忘れないでください。
更新時間:2026-05-06