C言語におけるPICマイコン制御を学びだして1年が経過しました。
やっと目標としているPICマイコンでPID制御まできました。
ことのはじまりはミニ人工心肺装置をつくりたいで透析装置から取り外したACモーターを位相制御したもののモーターの負荷でモーターの回転速度が変動してしまいます。
だからモーターから出力されている回転速度を検出するレートジュネレーターを利用して回転速度を一定に保つという制御が夢でした。
そんでpicマイコン初心者(2011年くらいにアセンブラでPICマイコンを経験しているが・・)である私がクリアしなければならなかった課題が、
①PICマイコンを実際にうごかす 達成
②PICマイコンでサーボモータを動かす(PWM制御を学ぶ) 達成
この間に ”割り込み” も学びました。 達成
③PICマイコンでLCDモニタを表示してみる(文字や制御値の確認の為必須 達成
この間に ”A/D変換” も学びました。 達成
そして最後の砦↓
④ミニ人工心肺装置を作成し遊ぶ→たのしい→ワインで乾杯 未達成 2017年12月達成
すっとばして見たい方は↓
2017年12月 ついにPICマイコンによる位相PID制御が完成!!
今回はPICマイコンの機能をフルに使ってA/Cモーターを制御する事が目標です。
システムの構想
まず、どうやってA/Cモーターを制御するか?ですが、ここでも触れている通り交流電圧の位相制御には変更ありません。
今までは、この位相制御を0から100%の調整範囲をボリュームによる手動で行っていましたが、ポンプにかかる負荷によってポンプ速度が変動してしまいます。
特に低域では効率よく一定でポンプを動作させるのは困難でした。
そこで思いついたのがボリュームで決定した回転速度を5Vの電圧でPICマイコンに入力し0Vから5Vまでの電圧を8bitの256段階にA/D変換します。
そしてA/Cモーターの回転検出ジュネレーターから出力される電圧0-30Vをレベル変換して0-5Vの範囲にし、回転速度設定値と現時点での実測速度を比べ自動的に設定値になるようにPICマイコンによって位相制御を変化させるというものです。
交流電源は50Hzもしくは60Hzの周波数なので半波形毎に電圧はゼロになります。
このタイミングでPICマイコンに外部割り込みを動作させて、その都度回転速度と目標値を比べて制御量を決定するという仕組みです。
調節には制御量などをモニタリングしたいのでLCDパネルもつけます。つけさせてください!!
言葉で説明はかなりむずいの画像でもどうぞ!!
上記の図が全体のイメージです。
簡単な説明図はオリエンタルモータさんが作ってました。
実際に本業の人たちも同様の制御をしてるんですねW
交流電源の半波ごとにゼロクロスが訪れるのでそのタイミングごとに割り込みを発生させ、そのつど目標値と実測回転数を比べます。
比べた差からPID制御で制御量を決めて、ゼロクロスからどのくらいタイミングをズラすかを決定して、トライアックを動作させAC電源をON/OFFして位相をつくりモータに出力させるのです。
制御量などの微調整を行う為にLCDパネルを設置します。つけさせてください。
制御量の決め方 PID制御について
位相制御を行うパルスについてはまず私の住まいは西日本ですので交流周波数は60Hzになります。ですので半パルスの時間は8.333333333msecになります。 計算がかなりめんどくせぇです。
東日本なら50Hzなので半波形の時間は10msecと計算しやすいですがね。
フォトカプラでゼロクロスの点でトリガして、そこからおおよそ0.33〜8msec送らせてフォトカプラにパルスを送れば半サイクルごとに位相制御ができそうです。
PID制御を行わない場合(ただのボリュームによる位相制御)は、その遅らせ時間をdutyとするとボリュームで決定する目標値を0-5Vの電圧を8bitで0-255段階の範囲に変換すると1段階の時間は8.33msec/256で32.5520μsecとなり、おおよそ32μsecとします。
上記からduty(目標値 )が決まれば(256-duty)* 32μsecで半パルスごとのAC出力幅が設定できます。
例1 ボリュームを回さずdutyが0の場合、A/D変換結果は0のはずなのでduty=0です。
なので計算式は(256ー0)* 32μsec = 8.192msec ほぼ8.3msecでパルスがオンになり、トライアックを作動させる点が交流波形のゼロクロス付近なのでAC出力はほぼ0になります。
例2 ボリュームを目一杯右に回すとduty=255になります。
計算式は(256-255)* 32μsecで=32μsecになります。
ゼロクロスから早い段階でパルスが立ち上がりトライアックをオンにする事でAC出力はほぼ100%となります。
制御量をPID制御にする
位相制御だけするなら上記で良いのですが、回転実測値と目標をくらべて偏差をフィードバックする制御にしないと安定した回転がえられないのでPID制御を行います。
PID制御とはwikiでお勉強なすってください。
要するにいい感じにフィードバックしてうまく実測回転数を目標値に追順させる制御です。
PID制御するには決まった計算式があるので今回はそれに従います。
計算式はモーターのPID制御を参考にさせてもらいました。
P:Proportinal(比例)
まぁ簡単にいうと比例制御は偏差を比例的に小さくしていきます。だけどいつまでたっても目標値に到達できないという欠点があります。これを残留偏差などといいますね?
I:Integral(積分)
まぁこっちも簡単に言うと上記の残留偏差をなくします。
D:Differential(微分)
まぁこっちも簡単にいうと瞬間的に大きな変動などにすぐに対応して偏差をなくす特徴があるのが特徴です。
上記の頭文字をとってPIDです。
操作量=Kp×偏差+Ki×偏差の累積値+Kd×前回偏差との差
(比例項) (積分項) (微分項)
記号で表すと
MVn = MVn-1 + ΔMVn
ΔMVn = Kp(en-en-1) + Ki en + Kd((en-en-1) – (en-1-en-2))
MVn、MVn-1:今回、前回操作量 ΔMVn:今回操作量差分
en,en-1,en-2:今回、前回、前々回の偏差
ここで重要なのがkp ki kd のパラメータ定数です。
先人たちがおおよその定数を求めていますが、実際にはカットアンドトライでチューニングしていくしかないようです。
最初は比例制御だけにして動かしてうまく動作すれば微分と積分で残留偏差などの除去を行おうと思っていまーす。
ハードの構成:回路図
回路図はなんかぐちゃぐちゃしてますが、私の稚拙な図と合わせてみてもらうと単純明快です。
実際の写真がこれ!!
あんまりうまくない配置ですがなんとかハンダ成功。
真ん中の黒のブレッドボードにPICマイコンを入れる予定です。
とりあえず構想とハードはできたので次回はちゃんとハードが動くかを実験してみます。
いきなりプログラムを書いたPICを乗せて動かしてバーン!!ってなったら怖いので・・・
それではsee you next time bye thank Q