FC2ブログ
2018-09-05 17:50 | カテゴリ:PIC応用回路
(お詫び)
=================================
動画を「公開」にしていませんでした。
失礼いたしました
=================================

やっとPID係数の自動設定プログラムの製作に戻れました。
PIC16F18857に変更したので、メモリー空間が4倍にもなり、安心してプログラミングが出来ます。


プログラミングの方向を以下の様に設定しました。

1)PID夫々の係数を予め何種類か設定(これまでのテストで大体の数値は把握)

2)上記の係数の組み合わせをひとつづつ制御に組み込み、速度を変化しつつ標準偏差(SD)を計測し、平均。

3)得られた平均のSD値を小さな順にベスト3を選択し、その時の各係数を記録。

4)最後に、ベスト3のSD値とその際の各PID係数(配列の順番)を表示。

これをプログラミングしていきます。



続きは、、、


まず、用意した各係数のデータです。
以下の様にセットしました。

float PaKp[7] = {8.0, 10.0, 20.0, 40.0, 60.0, 80.0, 100.0};
float PaKi[5] = {1.0, 1.5, 2.0, 2.5, 3.0};
float PaKd[14] = {2, 4, 6, 8, 10, 20, 30, 40, 50, 60, 65, 70, 75, 80};


なお、実際には、PaKpとPaKiは、その1/1000から1/1000000程度で。、PaKdは、そのままの値となります。

上記の組み合わせをすべてチェックすると、とんでもない時間がかかりそうです。
そこで、PaKiに関しては、一応、ゼロとして、PaKpとPaKdの二つを総当たりでチェックする様にしました。

ただし、テストする車両によっては、小さ過ぎたり、大き過ぎたりしますので、任意の部分の係数を選べるようにしました。
これで、時間短縮にもなります。

具体的なプログラムは、こんな感じです。(あくまでもご参考程度で)


for (j = PS; j <= PE; j++) {//Kp値の開始点、終了点の指定

for (k = DS; k <= DE; k++) {//Kd値の開始点、終了点の指定

for (m = 0; m <= 4; m++) {//SD計測を繰り返す回数

//-----------------------------------------------------
// パラメータのセット 以下の i, k, q とminSDを記憶する
//-----------------------------------------------------
Kp = PaKp[j] / 1000.0;
Kd = PaKd[k];
Ki = 0;

Speed = SetSpeed[m]; //<<===============速度も事前にセットし、切り替えて計測する

for (n = 0; n <= 9; n++) {



いろいろ、紆余曲折がありましたが、計測したSD値の中で、小さいものから順に、その時のp、i、d係数を表示する様に組み上げました。
p、i、d係数を順次総当たりで変更していくのと同時に、Speedも低速と中速を繰り返し実行する様にし、Speedに応じて、BEMFを計測して、実際の速度が追従する様にし、その際のSD値(標準偏差)が迅速に収束する過程を計測し、平均のSD値が最小になる係数を見つける算段です。
ただし、今回は、Ki係数は、ゼロとしています。(テスト時間が非常に長くなるので)



表示されているp,i,dの横の数字は、それぞれの係数の配列の順番(先頭からの)の数字です。
また、#1、#2、#3は、SD値の良い(小さい)順番です。
参考にSD値も表示されます。



一連の動作状況を動画にまとめました。
ご覧いただけるとお判りになるかと思いますが、Speedを繰り返し変更すると、SD値が瞬間大きくなり、直ぐに低下していく様子がご覧いただけると思います。
指定速度が変更されて、指定のBEMF値と、実際に計測されたBEMF値の乖離が生じ、加速(原則)する様にパルス幅が増加(減少)しますが、その際にBEMF値の変化状況がSD値に反映され、乱れたのちに収束していきます。

この収束が、スムーズにいくか、上下にオーバーシュートを繰り返すかで、SD値が異なります。
よって、SD値の変化が小さいほうが良いわけです。

そのあたりも含め、動画をご笑覧ください。


Ki係数をゼロにしているため、今回は、Kp,Kdの制御となっている前提での、パラメータの候補をいくつか得られました。

これまでの実験で、Ki係数が非常に敏感で、かなり小さな値を設定しても、車両の速度が、大きく波打つ感じです。(制御目的値近辺でのハンチングとはちょっと違った感じです。)
理由が良く分かりませんが、もう少し検討してみます。

その後、いろいろ試しました。
結果ですが、i係数を非常に小さい値で設定すると効果があることがわかりました。(後述参照ください)


じつは、色々テストしていると、ターゲットBEMF値に、現在のBEMF値を近づけるような制御をしていくのですが、目的の値にある程度近くなるとそこで安定してしまい、BEMF値に差(乖離)があることがありました。

この様な際にi係数を設定するとその乖離がほぼなくなり、目標値付近で上下する形で制御されることがわかりました。



(動画)



(訂正)ビデオ中の「終息」は「収束」の間違いです(笑)

最後になんですが、実はこの動画を撮影し、各種パラメータをセットして動作実験をしたのですが、どうも思うような走行にならず、ぎこちない走行に。 ひょっとしたら、i 係数が、何か悪さをしているのかもしれません。

おまけに、制御がかなり乱雑なふるまいをしている様で、車両のライトも強弱の点滅状態になっています。
あるいは、レールと車両の接触不良があるのかもしれません。

もうこれで、
「Nゲージ・コントローラの再考4。 PID制御」シリーズは、完了しようと思っているのですが、なかなかスッキリ終了できません。(笑)

関連記事
【ジャンル】:趣味・実用 【テーマ】:鉄道模型
コメント(7)

管理者のみに表示する