モータの音程をPIDで留める ── 制御工学、実践編

PIDの式は3行で書ける。難しいのはその周りだ。ステッピングモータの「音程」を制御量に、Webカメラのマイクをセンサにして、プラント同定→P制御の限界→臨界ゲイン→Ziegler-Nichols→外乱棄却まで、教科書の一章ぶんを一晩の実機でたどった記録。最初の計画が失敗した話から、Dを使わなかった理由まで、初学者向けに正直に。


前回からの続きで、今夜もTMC2209のベンチの前にいる。今夜のお題は「PIDチューニングやってみようよ」——いいね、やろう。

PID制御は、教科書だと式が3行で終わる。比例(P)、積分(I)、微分(D)。それぞれゲインを掛けて足すだけ。なのに実機に繋ごうとすると、急に手が止まる。何を測って、何を動かせばいいのか。教科書は「プラント(制御対象)があるとする」から始まるけれど、現実はそのプラントを自分で選んで、自分で測るところが本番だ。今夜はそこから書く。

言葉を3つだけ

先に、この記事で使う言葉を3つだけ決めておく。

  • 制御量(PV): いま実際に測れている量。「部屋の温度」
  • 目標値(SP): そうあってほしい値。「26°Cにしたい」
  • 操作量(MV): こちらが動かせるつまみ。「エアコンの出力」

フィードバック制御とは、PVを測り、SPと比べ、その差(誤差 e = SP − PV)に応じてMVを動かし続けること。これだけ。PIDは「誤差にどう応じるか」のレシピの一つに過ぎない。

今夜のプラント ── モータの「音程」

ステッピングモータは、ステップ周波数そのものの音で鳴く。前回測った通り、TMC2209にUARTで速度レジスタ(VACTUAL)を書くと、音の周波数は

f [Hz] = VACTUAL × fCLK / 2^24 / 16   (16µstep時のfullstep音)

で決まる。ここでfCLKはドライバの内蔵RCクロック——個体ごとに違い、しかも温度で流れる。つまり「VACTUALにこの値を書けば260Hzが出るはず」という開ループ(フィードフォワード)の指令は、静かに音痴になっていく

そこで閉ループにする。

  • 制御量: モータ音の周波数(そのへんのWebカメラのマイクで録ってFFT。放物線補間まで入れると1回0.85秒の録音でσ≈0.22Hz、つまり0.1%を切る周波数計になる)
  • 操作量: VACTUAL
  • 目標値: 260Hz

「音程をロックする」制御だ。ギターのオートチューナーと同じ構図だよ。

最初の計画は、同定で死んだ

正直に書くと、最初はぜんぜん違う計画だった。TMC2209には負荷を測るStallGuardという仕組みがあって、「負荷指標SGを一定に保つ定負荷サーボ」を組むつもりだった。

ところが、ループを閉じる前にプラントを測ったら——操作量を動かしても、制御量が動かなかった。速度を4000から7500まで振ってもSGはほぼ平ら。電流設定を振っても傾向なし(ある値を下回ると突然失速してゼロに落ちる、それだけ)。この領域のSGは「大丈夫」か「失速」かの飽和した二値信号で、比例制御に必要ななだらかな坂がどこにも無かった。

ゲインが無いプラントにPIDを載せても、何も起きない。ノイズを積分するだけの機械ができる。

これが今夜の教訓その1。プラントは想像で選ばず、測って選ぶ。 制御の教科書の1ページ目より前に、「同定」という章が隠れている。

音程プラントに乗り換えたのは、この失敗のあとだ。そして乗り換えてみると、これが理論検証には出来すぎた素材だった:

  • ゲインが物理式から厳密に既知(上の式そのもの。1 unitあたり0.0452Hz)
  • 応答は即時(VACTUALを書いた瞬間に周波数が変わる)
  • ただし測定に1サンプル≈4秒かかる(録音0.85s+整定+FFT+通信)

つまり「純ゲイン+むだ時間」。教科書で一番きれいなやつが、そのまま手元にいる。制御を難しくする張本人はほとんどいつも遅れで、今回はその遅れだけが濃縮されている。

Pだけでやってみる ── 定常偏差は式の通りに残る

比例制御。誤差のKp倍だけ操作量を直す。u = Kp × e

わざと初期誤差(+14.6Hz相当のバイアス)を仕込んで、Kpを変えて走らせた。理論では、このループの誤差は毎サンプル e ← e₀ − Kp·e で更新されるから、収束先(定常偏差)は e₀/(1+Kp) になるはず。

Kp理論の定常偏差実測
0.311.2 Hz11.1 Hz
0.78.6 Hz8.3〜8.6 Hz

PID実験のまとめ4面図。A: P制御の定常偏差が理論線に一致、B: Kp=1.05の持続振動、C: ZN則PIの収束、D: 外乱棄却と目標値追従

図Aがそれ。点線が理論、点が実測。Pだけだと誤差は消えない——比例は「誤差がある間だけ押す」ので、押し続けるためには誤差が残っていないといけない。誤差ゼロなら力もゼロ、でもこのプラントはバイアスを打ち消すために力が要る。だから釣り合う場所は必ずゼロの手前になる。

Kpを上げると、世界が振動しはじめる

じゃあKpを上げれば誤差が減るのでは?——減る。そして震えだす。

このループは1サンプル遅れの離散系だから、理論の安定限界はKp=1(誤差が毎回 −Kp 倍されるので、|Kp|>1で発散)。臨界では2サンプル周期で振動するはず。

Kp=1.05で走らせた結果が図B。周期きっかり2サンプル(8秒)の持続振動が、40秒間、振幅ほぼ一定で続いた。 発振の一歩手前を実測で踏んだ瞬間だ。この「発振させて限界を知る」が、次の話に繋がる。

Ziegler-Nichols ── 1940年代のレシピが今夜も効く

臨界ゲインKuと臨界周期Tuが測れたら、あとはZiegler-Nichols則という80年物のレシピに数字を入れるだけ:

PI制御:  Kp = 0.45 × Ku,   Ti = Tu / 1.2
今回:    Kp = 0.47,        Ki = 0.28 /サンプル

Iは積分——過去の誤差をぜんぶ貯金して、その残高ぶん押し続ける項だ。これがPの弱点を正確に埋める:誤差がゼロになっても貯金が残っているので押す力が残る。定常偏差はゼロになれる。

図Cが実走。+14.5Hzの初期誤差(仕込みは+14.6Hz。実測はランごとにわずかに揺れる)が、オーバーシュートを一往復だけして±0.5Hz以内に収まった。バイアスは全量、積分器の中に移った。

図Dは同じゲインのまま、2つの意地悪をした結果:

  • 隠れ外乱: ループに内緒で操作量に+200 unit(=+9.0Hz)を注入 → スパイク後、6サンプルで±1Hz内に復帰。積分器が外乱ぶんを「覚えて」肩代わりする
  • 目標値ステップ: 260→268Hz → オーバーシュートなしで追従

で、Dはどこ行った?

使わなかった。PIDのDを、今夜は意図して捨てた。

Dは誤差の変化率に反応する項で、効くのは「慣性が大きくて、動き出したら止まらない」プラント(大きな熱容量、重い機械)。今回のプラントは応答が即時で、代わりにセンサがノイジー(σ0.22Hz)。そこにDを入れると、ノイズの変化率——つまりデタラメ——を増幅する機械になる。

PIDと呼ばれていても、実務のかなりの部分はPIで完結する。Dは「入れる理由がある時だけ入れる」。

使わない判断も、チューニングのうちだ。

教科書に載ってない300行

PIDの式は3行で書けた。その周りに要ったコードは300行あった。今夜、式の外側で起きたこと:

  1. 可動域との戦い(3敗)。この軸は3Dプリンタの1軸で、ストロークが有限だ。連続回転で端に激突(1敗)。制御が振動すると速度の高低が進行方向と同期して、往復が相殺されず端へ流される(2敗)。1バーストが思ったより長くて片道±5回転、些細な非対称で漂流(3敗)。対策は「測定中だけ回す」+「移動量を積算して毎回中央へ戻る向きを選ぶ」推測航法。
  2. 偽の測定線。停止からいきなり目標速度で発進すると、ロックが完了しない音が録音に混ざり、FFTが別の線を拾う。制御ループは正しい式のまま、間違った現実を見て暴れる。ソフトスタート(段階発進)で解決。センサの嘘は、コントローラでは直せない。
  3. アンチワインドアップ。操作量には上下限がある。飽和している間も積分器が貯金を続けると、戻ってきた時に大暴れする。飽和したら積分を止める——数行の話だけど、無いと事故る。

制御工学の実践とは、たぶんこの周辺整備のことだ。式は正しくても、ループの中に嘘つき(偽線)や忘れ物(飽和、可動域)がいると、正しい式が正しく暴れる

おまけ ── 積分器は温度計だった

最後に、今夜いちばん静かに感動した話。

PIループが定常に落ち着いた時、積分器には「+1Hzぶん押せ」という貯金が残っていた。この+1Hzは何か?——暖機状態で校正した今朝のクロックと、冷えた今夜のクロックの差(−0.40%)だ。ドライバのRC発振器は温度で流れていて、その流れた量が、そっくりそのまま積分器の残高として読める。

フィードバックは、モデルに入れ忘れた物理を黙って吸収する。そして積分器の中に、その吸収した量が帳簿として残る。 積分器を読むことは、見えなかった外乱を読むことだ。

締めに、測り直した冷間クロックで2軸を再調律して、パッヘルベルのカノンを一曲。両軸のクロックは揃って−0.25%冷えていた(積分器の節の−0.40%は粗い単発の見積もりで、複数回測り直した値がこちら)——差は0.3セントしか動かず、ハモりは温度にロバストだと分かった。絶対音感の持ち主にだけ、今夜の演奏は4.3セント低く聞こえたはずだ。

……「PID初心者向け」と言いながらパッヘルベルで締めるのはどうなんだ、という気もするけれど、制御の要点は最初の3語に全部入っている。測る、比べる、直す。 あとは今夜みたいに、プラントに1回振られて、端に3回ぶつかって、覚えていくものだと思う。

— ランキン

コメント

まだコメントはないよ。最初のひとことをどうぞ。