« 2011年11月20日 - 2011年11月26日 | トップページ | 2011年12月11日 - 2011年12月17日 »

2011年12月4日 - 2011年12月10日の1件の記事

2011年12月 8日 (木)

熱電対によるヒーター制御:まずまずのPID制御。ソースの公開

小学校のクラス会(11/26/2011)
 所長は関西出身で大学卒業まで京都で過ごした。高校や大学時代の友人は東京に結構たくさん出ていて東京での同窓会も多い。最近は共にリタイアした同級生と頻繁に交流して、今や生活の一部となっている。しかし小学校の同窓生は地元に残った人が多いので同窓会は地元で開かれ、滅多に顔を出したことがない。

 高校の同級生で同じ小学校のクラス生から、前から「たまには出なさいよ」と強い要請があり、今回、場所が大津の石山寺と珍しいところだったので、それこそ50年ぶりくらいの感じで出席した。

S_pb264419

 石山寺は、琵琶湖の水が京都・大阪に流れ出す風光明媚なところで、会場はその石山寺の近くの料理屋(昔は川魚料理店だったのだろう)であった。石山寺は紫式部が源氏物語を書いた所ということでも有名である。

 50人のクラスで集まったのが15人。男は4人だけで女が11人。やはり女が元気である。久しぶりの同窓会は、いわば自分探しの場でもある。自分の知らなかった(忘れていた)一面を教えられ、人生観が変わる。今回もいくつかの収穫を得て新幹線の日帰りで京都から帰ってきた。最初は泊まるつもりだったが、京都は紅葉シーズンの最盛期で宿が全くとれなかったのである。

S_pb264433

 帰ってから、熱電対を使ったヒーターの温度制御のためのPID制御をあらためてお勉強する。現在、P(比例)制御まで動いている。対象は自作のアクリル曲げ器である。比例制御だけで一応の制御ができて(前記事参照)、アクリルを曲げるくらいならこれで十分なのだが、「凝り性」の性格で、やりだすと止まらない。それにPID制御は、中断しているライントレーサーなどのロボット制御には必須の技術なので、何とか自分のものにしておきたい。

 温度制御を実際に動かしたあと、前に読んだ全く同じ資料を読み返してみると、不思議なことに何故か新しい発見が増える。面白いものである。視点が変わっているからだろう。見晴らしが良くなって制御技術全体の理解が深まったように思う。

具体的な方法がわからなくて落ち込む(11/27/2011)
 とはいえPID制御の具体的な手順はまだ良くわからない。I制御もD制御も時間成分をどの範囲でどれだけとりいれるのか、その目安を書いている所がないのだ。それにこのところ仕事と行事が重なって電子工作にかけられる時間がなかなかとれない。

 そのうち気の滅入ることが続いて、制作意欲ががた落ちした。まず、エアコンのリモコンの液晶部分が壊れた(尖ったものでぶつけたらしい)ので代替品を買おうとした。ウェブで調べたところ純正品は¥5000以上するが、多種類エアコン対応を謳う互換リモコンの方がはるかに安い(1/3)のでアマゾンで取り寄せてみた。ところが、どのコード(うちの三菱だけでも10種類以上)でも動かず、一気に落ち込む。安物買いの銭失いを絵に描いたような話である(これはこのあと別の部屋のエアコンに使えて無駄にならなかった。やれやれ)。

 続いて、帯状疱疹(ヘルペス)という病気にかかる。顔に水疱のような吹き出物が出来て、最初、うるしにかぶれたのだろうと放置していたら段々広がり、医者に行くと「これは立派な帯状疱疹です」と宣言された。全く痛みはない。帯状疱疹は痛いと聞いていたので最初は半信半疑だったが、薬を飲んだらすぐ良くなったので医者の見立ては正確だったようだ。

Amalia

 結構、怖い病気らしいが痛くないので深刻感がない。しかし、顔が張れているので、気持ちが集中しない。しかも、そのころ知人がスペインで買ってきたという「Amalia Rodrigues」のCDを借りて何気なく聞き出すと、このポルトガルのシャンソンと言われるファド(Fado)の世界がとまらなくなった。暗い情念の溢れ出るCDを聴き続け、余計何もする気がなくなった。ということで、電子工作の進展は完全に止まってしまった。

自己流のPID制御を試みるがいまいち(12/2/2011)
 欝(うつ)には必ず終わりがある。Fadoを聞き続ける事でどん底まで落ち込み、かえって回復が早まったようだ。再び意欲が回復し、気がつけば、PCの前で温度制御のロジックをいじっていた。ハードは殆ど完成しており、やることはもう殆どない。2つのケースをアクリル曲げ器の台板に固定するだけだ。残る作業はもっぱら制御ロジックを作るソフト開発となる。

 1秒ごとのメッセージをUARTに出して、温度制御のプログラムテストを繰り返す。ウェブのPID制御のページを片っ端から拾い上げて参考になりそうなところを探す。殆どのページは基本の話の繰り返しばかりで、肝心の実践的なことが載っているページはほとんどない。後閑さんのPICのページはさすがで、少し参考になる式が載っている。

 微分積分と言っても、どうも多数のポイントをとっているのではなく、前回データの差分を見ているだけのようだ。微分の方がわかりやすいので、まず、こちらからやる。しかし、文献での説明と、自分の感覚がどうもずれているような気がする。

 こちらは急激なオーバーシュートを避けたいので、目標温度に突っ込んでくるような温度上昇を緩和させるのに微分係数を使いたいが、どうも逆の説明である。同じようなことを疑問に思っているページも見つけた。

 それと実際の係数をどう決めるかは何も書いていない。積分制御は比例制御との区別が良くわからない。目標温度との温度差が大きい時に積分制御を適用すると、ヒーターの加熱の効果が、かなりあとから出てくるので、猛烈なオーバーシュートになってしまう。これも適用する範囲を限定しないとおかしくなる。

S_pc084447

いまいちよくわからないが、自己流のPID制御ロジックを次のように決めた。

・まず比例制御帯を目標温度の1/2からとする。全体にすると、目標温度付近の勾配が少なくなりすぎ、効果が遅れて出てハンチング(値の振動)が大きくなるのを避けるためである。

・比例制御帯に入ったら、常に前の温度と比較し(1秒ごと)、一定の温度以上の上昇があるときは、ヒーターの制御定数を1/2にする(当面固定)。これが(d)制御にあたる部分である。

・目標温度の90%以内に現在温度がなったら、(I)制御帯に入り、1秒ごとに目標温度との偏差(オフセット)を積み上げる。制御定数はすぐに反映せず、次の手順でまとめる(温度変化が遅れることを考慮)。

・5秒ごとに、足し上げたオフセットの温度値の平均をとり、そのときの温度に応じた制御定数に一定の倍率をかけて、100段階の制御定数に足し込む(200℃なら1℃あたり2が基礎数)。

・温度が目標温度を上回ったら、途中まで積み上げていたオフセットはすべてクリアする。

・微分制御のもうひとつ、温度が目標温度以上になったあと、下がってきた時は、(d)制御として、そのときの比例で決まったヒーターの制御定数を2倍にして、現在温度が目標より高くてもヒーターを加熱し必要以上の温度低下を事前に食い止める。

 しかし、色々工夫しては見たが結果は比例制御とあまり大差がない。パラメーターを変えてみても(2倍を1.5倍とか)グラフなどで余り顕著な効果は出てこない。オフセットの解消については、(I)制御が非常に効果があったが、相変わらず目標温度を上下するハンチングをとめることはできない。

 ヒーターが点いてから、温度に反映されるまでの時間が長すぎて、PID制御が効かないのである。ウェブ情報にも、遅れ時間の大きい制御はPIDでは難しいという記事がある。

もういちど最初からPID制御(12/4/2011)
 やっぱり我流は先が見えない。それにパラメーターの調整がしにくい。もういちど制御ロジックを最初から作りなおすことにする。パラメーターで制御できるようにするため、変数をunsignedから符号付きのsignedにかえ、マイナスを導入して制御定数を計算しなおすことにする。

 勉強をもういちどやりなおす。伝達関数とPID制御の関係もやっと理解出来てきた。PID制御の伝達関数はちゃんと存在するのだ。PIDが理論以前の実践的手法から始まったことが良くわかった。

 ソースコードを大幅に見直すことにした。本格的なPID制御にするため、各種定数を#defineであらためて定義し、忠実に式をたててプログラムを作り直す。1以下の定数は、10倍(1から10)で定義しあとで10で割る。これで小数点の操作が整数データで出来るようになる。

 これまで符号無し変数とifでやりくりしてきた演算を、マイナスを含んだ符号付き変数にしたので、計算が面倒になったが、楽になったところもある。温度がオーバーシュートしたあと、目標温度の下に突っ込む時のヒーターの加熱指示が計算式だけで出来るようになった。

 あわせて、このあいだの空焚き警告のエラーメッセージが出るようにコードも追加した。汎用性を持たせるため固定数値は持たないようにしようとしたが、これは無理だった。高温の時は、いくらヒーターが連続で加熱されていても温度変化しないのですぐエラーになってしまう。

 結局、「計測温度が35℃以下で、長時間(当面20 秒)ヒーターが点きっ放しになっても温度変化が2℃以内」という固定条件で、ヒーターをただちに止めるロジックになった。解除は、リセットか、ロータリーエンコーダーの回転で戻る。

PID制御はパラメーターの調整がポイント(12/7/2011)
 この3日間、PIDのパラメーターをあれこれいじって、ヒーターの熱制御をスムーズにしようと頑張ったが、結局、目の覚めるような改善は出来なかった。しかし、まあ、こんなものかという程度までは制御が出来るようになった。グラフがその苦労のあとである。

Pid

 比例制御に較べれば、圧倒的にオーバーシュートは少なくなり、このパラメーターで280℃くらいまでオフセットは補正される。思い切って比例制御の比率を減らし、微分と積分制御の成分を大きくしたのが効果があったようだ。アクリル曲げ器は、内部230℃でアルミパイプ表面がアクリルを曲げる最適温度150℃程度になるので、これで十分である。ハンチングは残るが比例制御より心持ち少なくなっている。

 弁解になるが、こういう時間遅れの大きい制御は、本当に難しい。試しに、このあいだ作った調光器(無段階調整可能)で人間の手で所定の温度に止める制御をやってみた。放置しておけばこの前の記事のようにどこかで一定の温度に落ち着くが、決められた温度を手動で一定に保つことは実は極めて難しい。

 温度が下がってきたとき、ボリュームを上げて温度低下を防ごうとする。ところが温度は急には上がらない。暫くしてから徐々に温度は上がりだし、このとき慌ててボリュームを下げても、温度はどんどん上がっていく。

 結果として目標温度を大幅に上回ってしまう。さっきボリュームを下げたので、再び温度は低下しはじめる。しかし低下に気がついてボリュームを上げてももう遅い。少々ボリュームを上げても温度はいつまでも下がって目標温度をあっさり割り込んでしまう。そして、これの繰り返しになる。

 人間の手ではとても一定には出来ない。負け惜しみになるが、このマイコンの制御などうまくやっているほうだと思う。あまり自信はないが、ここまでの成果のソースコードを公開することにする。ハードはこの前と全く換えていないので回路図は前記事を参照していただきたい。

 まだ改善すべきところは多々あると思うが、あまりこればっかりにこだわっているわけにもいかない(面白いけれど)。このプロジェクトもこのあたりで一段落つけることにする。

 以下に例によってAVRStudioのプロジェクトフォルダーの形で、PID制御のソースコードを置きます。 フォルダー名が替っているだけでソースファイル名は同じなので注意してください。修正したコードはコメントの形で残っています。参考になれば幸いです。

「ThrmCpl861_1208_11.zip」をダウンロード

| | コメント (8) | トラックバック (0)

« 2011年11月20日 - 2011年11月26日 | トップページ | 2011年12月11日 - 2011年12月17日 »