サーボモータを直接制御するコードの詳細な説明です。バックグラウンド処理の負荷分散をするために処理時間を短く、かつ処理による偏りがないようにしています。
◀ この記事の前に: Servomotor Driver( コード )
▶ この記事の次に:
リアルタイム制御の要件
タイマ割り込み処理が長時間になると、次のタイマ割り込みが発生します。これを二重割り込みと言います。割り込み処理は二重割り込みにならないように処理時間を短くする必要があります。また、バックグラウンド処理の時間が長くなるとフォアグランド処理に回せる時間が少なくなります。バックグラウンド処理の時間は処理の分散化や MCUリソースの活用によりできるだけ短くすることが必要です。
割り込み処理は状況に応じてその処理内容と処理時間が異なります。平均的に短い処理時間であることと同時に、最長時の処理時間が二重割り込みにならないことが必要です。フォアグランド処理に均等な機会を提供するためにも、各割り込みの処理時間は均質化していることが望まれます。
割り込みのしくみ
サーボモータは 50 Hzの PWMで制御します。
可変割り込み方式を使用するため、出力が OFFから ONに変化する時点、ONから OFFに変化する時点でタイマ割り込みを発生させて処理を行います。

複数のサーボモータは順番に処理対象となります。
一つのサーボモータは時分割で 2.5 ms( 50 Hzの周期 )になります。この時間の中に ONデューティがあります。( 0.5 ms ~ 2.4 ms )
制御の順番は以下の通りです。
Motor 1( OFF→ON )→ Motor 1( ON→OFF )→ Motor 2 ( OFF→ON )→ Motor 2( ON→OFF )→ Motor 3 ( OFF→ON )→ Motor 3( ON→OFF )→ 続く。
Motor x( OFF→ON )→ Motor x( ON→OFF ) で1サイクル分に相当します。
処理の流れ
サーボモータ制御用のタイマ割り込み処理は以下のフローです。
処理の分散化
処理を分散して均質化しています。以下のリストはプログラムが流れる部分のみ抜粋しています。
OFF → ON と ON → OFF は対になります。OFF → ON 時の処理の差はほぼありません。そのため、1サイクルで見た場合の処理時間はほぼ同じになります。各処理の中には繰り返しがありません。また、基本的には代入文が多くコンパイル後のコードも軽いものになります。計算式は必要最小限度にしています。
サーボモータの動作中はその速度は加減算する値 gsvSpeedDevで決まります。台形制御など角加速度を導入した場合はこの gsvSpeedDevが経時的に変化します。その場合でもほぼ現在と同じフローになります。バックグラウンド処理を行う関数 intSVtimer() の各条件での経路(パス)は以下のとおりです。( このコードは流れと相違点に注視することを目的としています。プログラムが走行するコード以外は省略していてコードとしては正しくありません。 )
処理間隔
サーボモータ制御の割り込みは、可変割り込み方式で必要な処理タイミングで割り込みが発生します。定時割り込み方式のようにカウントだけのために割り込みが発生することはありません。
そのため、制御の分解能を変更しても単位時間あたりの割り込み回数は変化しません。割り込み回数はサーボモータの制御信号の周波数とサーボモータの数に依存します。
- サーボモータの制御信号の周波数: 50 Hz ( 周期は 1/周波数なので 20 ms )
- サーボモータの個数: 7個( 実際はダミー1個を追加して 8個 )
- サーボモータ1台あたりのサイクル時間: 2.5 ms ( 20 ms / 8個 )
- ONデューティの幅: 0.5 ~ 2.4 ms ( サーボモータの仕様による )
- OFFデューティの幅: 2.0 ~ 0.1 ms( 2.5 ms – ONデューティの幅 )
- サーボモータ1台あたりの サイクル数: 50サイクル / s( 制御信号の周波数 )
- サーボモータ8台のサイクル数: 400サイクル / s( 同上 × サーボモータ数 )
- 割り込み回数: 800回 / s( 同上 × 2、 OFF→ON / ON→OFFの2回 )
- 平均割り込み間隔: 1.25 ms( 1 s / 800回 )
省電力制御との関係
省電力
回路で電源OFFにできる。そのときはタイマを止めることができる。
電源(電池)の負荷低減とともに、処理の低減ができて他の時間のかかる処理時にはそちらに振り向けることができる。
参考情報
参考になる情報は以下のとおりです。
このホームページ内
- Motion Interpreter( 概要 ): サーボモータ制御の最上位、Motion Interrupter の概要です。
- Motion Interpreter( 操作説明 ): アプリケーションからの操作方法です。( API )
- Motion Interpreter( コード ): コードの詳細を説明します。
- Motion sequencer( 概要 ): サーボモータの協調運動制御の概要です。
- Motion sequencer( 操作説明 ): シーケンスの開始・停止等の操作方法です。( API )
- Motion sequencer( コード ): コードの詳細を説明します。
- シーケンスデータ: シーケンスデータの仕様と作成方法です。
- Servomotor Driver( 概要 ): サーボモータそのものの制御です。( API )
- Servomotor Driver( 操作説明 ): 個々のサーボモータを制御する方法です。
- Servomotor Driver( コード ): コードの詳細を説明します。
- サーボモータの制御( コード詳説 ): バックグラウンド処理の分散化の実現方法です。
- サーボモータ: サーボモータの回路です。ハードウエアの説明です。