FC2ブログ
2018-08-16 18:50 | カテゴリ:PIC応用回路

3つのパラメータの最適化は?

前回は、PIDの係数を色々変化して、データを検討してみました。
どうやら、これらの係数の組み合わせで、良い結果が出そうだと思われますが、検証したいです。

どうやって検証すればよいのか??

「標準偏差」

嫌いな数学ですよね!



標準偏差とは、「データの散らばりの度合いを示す値」です。
標準偏差を求めるには、分散(それぞれの数値と平均値の差の二乗平均)の正の平方根を取ります。

データが平均値の周りに集中していれば標準偏差は小さくなり、逆に平均値から広がっていれば標準偏差は大きくなります。

らしいです、、、、、

(PID4-01)
PID4-01.jpg

?????

この先は、「勇気ある方」のみ、お進みください(笑)

冗談です、是非ご覧ください。


続きは、、、


検証の方法の一つとして考えられるのは、定速走行中に速度を維持するためにパルス幅を増減させて、一定のBEMF値を保つ制御を行っていますので、検出されたいくつかのBEMFデータのばらつき具合を見れば、目標の値(目標とするBEMF値)に近いところで制御されているか、オーバーシュートを繰り返しているかを見分けることが出来そうです。

ばらつきを見るには、「標準偏差」を求めればよさそうです。(うー!もう少し数学を勉強しておけばよかった)

WEBで調べて、標準偏差を求める公式を得ました。

(Wikiペディアより)

(PID4-02)
PID4-02.jpg



さて、計算式は理解できましたが、具体的にプログラム上でどの様に計算するかですが、今回のプログラムは、tmr0割り込みで、100usecごとにカウントして、パルスのOn/Offを制御していますので、パルスOffのタイミングで、以降に生じるBEMFを平均して、そのパルスに対するBEMF値を得ています。
それを100パルス分程度、計測して、それらの標準偏差を順次表示していくように、プログラムを改良しました。
つまり、PFMの出力パルス、100回分の標準偏差をみようという計画です。

また、PIDの係数の組み合わせは、起動時に選択できるようにしました。

これで、どの組み合わせが、ばらつきが少ないか? スムースな制御かを検討できます。

要するに、計測した標準偏差が小さければ、バラつきが小さいと言う事で、目標とするBEMF値に対して、オーバーシュートが少なく、制御できていると言う事になるはずです。(想像ですが)

この辺りを。いくつかのパラメータの組み合わせで、標準偏差がどの様に変化するかを見てみました。

プログラムでは、約1秒毎にその時の

Target BEMF値
Current BEMF値(その瞬間の)
SD値(標準偏差下に表示)SDの右の数字は、パラメータ設定番号

をLCDに表示する様にしてあります。
それを、各設定毎に、上り下り平坦の際の値を調べてみました。(大変だ~こりゃ)

(SD値表示動画)



これは、下記の設定(グラフ)の#0と#7の走行時のBEMF値、SD値の変化と、パルス幅の変化(LEDバー表示)を撮影しました。


(PID4-03)
PID4-03.jpg


(PID4-04)
PID4-04.jpg


最も良さそうな設定の#0と反対の#7では、表示される数値や、LED表示など、かなりの差があります。

P値だけでもよさそうな値が出ているので、I値やD値が効果を出している様に感じません。
逆に、I値やD値を設定すると、ばらつきが大きくなるという、変な結果が出ました。


どうも納得のできる論理的な値にたどり着く事がなかなかできません。

今のところパラメータは、

Kp = 0.2;
Ki = 0.004;
Kd = 12;



がよさそうなんですが、Kp値=0.2だけの方が、SD値が小さく(BEMF変化が安定していると言う事)よいという結果です。(笑)
Kp値の補正そのもので、結構BEMFが上下(オーバーシュート)しているような気もします。


そこで、思い切って、Kp値を更に小さくして、テストしてみました。
Kp値を、0.01-0.05あたりでテストしました。これまでのKp値の1/10くらいの値です。

Kp = 0.01;
Ki = 0.001;
Kd = 5;


この辺りがちょうどよさそうです。
実際の走行動画と、その時のBEMF値のSD(標準偏差)を撮影してみました。
これまでに良かった設定#0と新しく、もっとKpを下げて、0.008にした場合の比較です。

(PID_SD_comp1)


走行状態を見る限りでは、肉眼でその差はまったくわかりませんでした。
しかし、標準偏差の値を比較してみると、はっきり違いが出ていました。
Kp値を小さくして、Ki、Kdを追加したほうが、安定した制御になっていました。(標準偏差値が小さい)


(PID4-05)
PID4-05.jpg


設定(ターゲット)BEMF値に対して、リアルタイムの瞬間BEMF値の振れ幅の変化が、非常に小さく、常に、ターゲットの前後の値に絡んでいる感じです。
SD値も一桁台から10台辺りに落ち着いています。
LEDのバー表示の値(パルス幅を表示)も、平坦路では大きくは変動していません。坂での変動もバラついていないようです。

Kp値を、0.01-0.02くらいにして、Ki値、Kd値を設定する方法、これは正解かもしれません。

そこで、最終的に、Kp値をもう少し小さくしたものと、Ki値、Kd値の組み合わせを作り、最終的なSD値の比較検討を行い、ベストと思われる設定を決めることにしました。

組み合わせの候補は、


(PID4-06)
PID4-06.jpg



これです。
この設定を順次切り替えて、上り、下り、平坦路でSDを夫々10回取得して、平均をとりました。(標準偏差の平均をとる意味は解りませんが)(笑)

そのグラフがこれです。


(PID4-07)
PID4-07.jpg



設定#0が、これまで良いと思われていた設定で、Kp値は、1(0.01)です。
有意な差があるかわかりませんが、Kp値をさらに小さくして、Kd値を少し増した設定#6が、SD値の上り下り平坦路の差が小さく、つまり、一定の速度で走行していると思われました、。

この実験の最初の頃は、SD値がどんなに頑張っても、10程度にしか下がらなかったのですが、Kp値をぐっと下げて、Kdを少し調整することで、SD値が5台に下げる事が出来ました。

BEMF値が速度を代表していると仮定すれば、上り下り平坦路を一周する際の各部の平均BEMF値を求めれば、夫々の速度を比較する事が出来ます。
試しに手動で計測してみましたが、プラスマイナス2.5%くらいの変動で制御されているようです。



最終的に落ち着いた実際の数字は



Kp = 0.008;
Ki = 0.001;
Kd = 7;


です。(LCDへの表示が整数に限られたので、プログラム中の少数を整数に変換しているので数値の桁が不ぞろいになっています)


また。この数値は、車両によっても大きく変わると思われます。(フライホイールの有無やコアレスモーターなどで)


さて、これまで色々検討してきましたが、なかなか論理的に綺麗なデータを得ることが出来ませんでした。
原因は、計測されるBEMF値の精度にあると思われましたが、制御に使用したKp値が大きすぎて、かえってオーバーシュートをしていたとも思われます。
思い切ってKp値を下げ、Ki、Kdを追加して、ほぼ満足できる結果が得られたと思います。(統計的にも)


そもそもBEMF制御は、駆動パルスをモーターに印可し、その後から、回転子による起電力を、モーターの「ブラシ」、車輪とレールの「接触」などの試練を経て、AD変換しますので、ノイズの入らないはずはありません。
また、そのノイズはランダムなので、計測するBEMF値にバラツキが出ます。(小さなコンデンサーをGNDとの間に入れていますが、厳しいです。)

ここさえ綺麗に計測出来たら、もっと完璧な制御ができると思いますが、素人工作では、この辺りが落としどころかもしれません。(笑)



関連記事

管理者のみに表示する