PID制御概説2「微分要素の効果」
微分要素は反応速度を向上させる効果があります。
また、比例要素が大きくてふらつく場合にふらつきを抑制する効果もあります。
PID制御概説3「積分要素の効果」
成分要素は位置の微調整を行う効果があります。
個人的にはあまり使いません。
解説(雑)
プログラムの構造としては
タイマー機能などを使ってシステム時刻を生成し
ループ周期を安定化させます。
メイン関数{
初期化処理
無限ループ{
if(システム時刻>=設定時刻){
設定時刻=システム時刻+実行周期
定期処理 }
}
}
Arduino系を使う場合はmillis()関数を使う事でシステム時刻を取得できます。
定期処理部は
・情報取得部現在の出力角度の取得
現在の目標角度の取得
出力角速度=(現在の出力角度-1周期前の出力角度)/実行周期
目標角速度=(現在の目標角度-1周期前の目標角度)/実行周期
1周期前の出力角度=現在の出力角度
1周期前の目標角度=現在の目標角度
角度誤差=現在の目標角度-現在の出力角度
速度誤差=目標角度速-出力角速度
累積誤差+=角度誤差*実行周期
にて誤差等を計算します。
取得した角度にノイズが乗る場合、そのまま速度を計算するとノイズが増幅されるので少しだけローパスフィルタをかけると安定します。ローパスフィルタが強すぎると遅れが発生し、挙動が不安定になります。
累積誤差は誤差があると無限に増え続けるのである程度リミットをかけておいた方が安全です。
・出力部出力=角度誤差*比例ゲイン
出力+=速度誤差*微分ゲイン
出力+=累積誤差*積分ゲイン
PWMポートへ出力
にて実際にモーターを動かします。
PIDによる誤差フィードバックのみだと誤差0=出力0となり誤差0の状態を作来るのが難しいので、目標速度を満たす推定出力値をオープンループとして追加する事で挙動が安定します。
また、過去の調査結果から
DCモーターの出力は常時回生で使用した方が制御性が良いようです。