Web制作、Web開発の歩き方

STM32入門(組み込み開発)

■第6話:RTOSを使ったタスク管理とPID制御

(最終更新日:2025.01.27)

C言語のイメージ
この記事は6分で読めます!
(絵が小さい場合はスマホを横に)

「RTOSを活用しよう!」

RTOSは複数タスクの効率的な管理を可能にし、PID制御は比例・積分・微分を用いて高精度な制御を実現する。 本稿では、RTOSの基本設定やタスク分割の利点を解説し、PID制御を活用したステッピングモーターの具体的な制御例を紹介する。


1.FreeRTOSの導入と基本設定

FreeRTOSはオープンソースの軽量なリアルタイムOSで、主に組み込みシステム向けに設計されている。 特長としては、マルチタスクのサポート、軽量で低いメモリフットプリント(メモリ使用量)、プライオリティベースのスケジューリング、 タイマーやキュー、セマフォなどの豊富な機能などが挙げられる。

■導入手順 FreeRTOS公式サイトから最新のソースコードをダウンロードする。 STM32CubeMXでプロジェクトを作成、Middlewaresの設定で、FreeRTOSをEnableに設定し、各種設定を行う。 設定が完了したら、IDE(IAR Embedded Workbench)にFreeRTOSのソースコードを追加する。

そのソースコードにおいて、FreeRTOSConfig.hをプロジェクトに合わせてカスタマイズする。 configUSE_PREEMPTION(プリエンプティブスケジューリング)、 configUSE_IDLE_HOOK/configUSE_TICK_HOOK(フック関数の有効化)、 configMINIMAL_STACK_SIZE(タスクの最小スタックサイズ)、 configMAX_PRIORITIES(設定可能なタスクの最大プライオリティ数)などである。

FreeRTOSのタスクは、xTaskCreate関数を使用して作成する。 具体的には以下のような書き方になる。

基本タスクの作成

2.タスク分割による効率化

■タスク分割の目的
タスク分割は、システムの処理を小さなモジュールに分解し、それぞれを独立したタスクとして管理する手法だ。 これにより、以下の利点がある。

  1. リアルタイム応答性の向上:重要なタスクを高いプライオリティで処理可能
  2. コードの可読性と保守性向上:各タスクが明確な責任を持つ
  3. リソースの競合削減:適切に分割すれば、リソースの効率的な利用が可能

■タスク分割の方法
まず、タスクの役割を定義する。 例えば、センサーデータの取得タスク、通信プロトコルの処理タスク、ディスプレイの更新タスクなどになる。

次に、タスク間の優先順位を設定する。 例えば、センサー入力はリアルタイム性を重視するため高優先度、データのログ記録は後回しでも良いので低優先度という具合である。

更に、タスク間通信の設計を行う。タスク間の情報共有には、下記のようなFreeRTOSの以下の仕組みを活用する。

  1. キュー(Queue):データをFIFO形式で渡す
  2. セマフォ(Semaphore):リソースの同期や排他制御を行う
  3. 通知(Task Notification):軽量なイベント通知を行う

以下は、センサー読み取りとLCD表示の更新を分割する例である。

タスク分割の実装

FreeRTOSを導入する際は、タスク設計と分割が非常に重要だ。 効果的にタスクを分割し、通信や同期を工夫することで、システム全体の効率化が図れる。 また、デバッグを容易にするためにログ出力やタスク監視機能を組み込むのも重要である。

3.PID制御の概要

モーターや温度調節を行う際、必ず設定値の通り越し(オーバーシュート)が起こる。 水を温める際、50.0℃に設定しても、50.1℃になり、49.9℃になりを繰り返して50℃に近づくことになる。 PID制御は、そのオーバーシュートを極力抑えるための制御アルゴリズムである。 以下の3つの要素で構成される。

■比例(P: Proportional)
現在の誤差に比例して制御出力を調整する。 誤差が大きいほど、強い制御を加える。 単純で迅速な応答が可能だが、誤差(定常偏差)が残る。

Pout=Kpe(t)

■積分(I: Integral)
過去の誤差を累積して制御に反映する。 定常偏差を解消する役割を果たす。 誤差をゼロにできるが、過積分により応答が遅れることがある。

Iout=Kie(t)dt

■微分(D: Derivative)
誤差の変化速度に応じて制御出力を調整する。 応答を滑らかにし、振動を抑制する。これにより、制御の安定性が向上する。 ノイズに敏感になるという点が課題になる。

Dout=Kdddte(t)

これら3つの要素を組み合わせたPID制御の総合的な式は以下の形になる。

u(t)=Kpe(t)+Kie(t)dt+Kdddte(t)

PID制御を実際使う際には、目標値(設定値)と現在の状態(センサーなどから取得)を比較して誤差(e(t))を計算し、 Kp、Ki、Kdを手動または自動で調整して、応答特性(速さ、安定性)を最適化し、 制御対象(モーター、温度制御など)によってゲイン調整や制御周期を調整する。

4.ステッピングモーターでの実践例

ステッピングモーターは、電気的なパルス信号に応じて一定の角度で回転するモーターだ。精密な位置制御が可能だが、次の課題がある。 負荷が変動すると目標角度から外れる。高速回転時に振動が生じる。PID制御を使うことで、これらの課題を解決し、より精密な動作が可能になる。


■PID制御を用いたステッピングモーター制御の流れ
必要なデータの収集として、目標位置(角度)、現在位置(エンコーダーやセンサーから取得)、 誤差計算(e(t) = 目標位置 - 現在位置)が要る。 実際、この誤差を最小化するには、PID制御を適用した下記のようなコードを用いる。

制御アルゴリズムの実装

制御出力を元にステッピングモーターの速度やステップ数を調整する。 速度制御は出力値をステップ信号の周波数に変換し、位置制御は出力値をステップ数に変換する。

モーター制御

そして、実際ステッピングモーターを目標位置に回転させるには、下記のようなコードになる。

指定角度への回転

PIDゲインのチューニングは以下の手法で行う。まずは、Kpを調整する。反応速度を向上させるため、最初に設定する。 高すぎると振動が発生するため注意する。次にKiで定常偏差を解消する。過積分に注意する。 最後にKdを調整する。振動を抑制し、応答を滑らかにする。これにより、ステッパーモーターの正確な位置制御や応答性の向上が計れる。

5.まとめ

RTOS(リアルタイムオペレーティングシステム)は、複数タスクを効率的に管理するための仕組みであり、 組み込みシステムの応答性や安定性を向上させる。 PID制御は、比例・積分・微分の3つの要素を組み合わせて、目標値に対する誤差を最小化し、安定した制御を実現する手法だ。 本稿では、FreeRTOSを用いたタスク管理の基本設定と効率的なタスク分割方法を解説するとともに、PID制御を活用したステッピングモーターの実践例について詳述する。 RTOSによるタスク分割は、モジュール化された設計を可能にし、PID制御を組み合わせることで、 ステッピングモーターの位置制御や振動抑制を高精度に実現できる。 これらの手法を組み合わせることで、より柔軟で安定した組み込みシステムの構築が可能となる。

▼参考図書、サイト

STM32マイコン公式日本語サイト  STマイクロエレクトロニクス
 「WindowsではじめるSTM32」 インプレスR&D 山本 小鉄
PID制御とは  理化工業株式会社