google-site-verification: google3bd66dd162ef54c7.html
fc2ブログ

ペルチェ温度コントローラーの製作(機能・ソフト解説)

◆まえがき
少し間が空いてしまいましたが、ペルチェ温度コントローラー作りの話の続きです。前回は基板とケース作りでしたが、今回は機能説明とソフトの解説です。

・ペルチェ温度制御装置の外観
ペルチェ温度コントローラー

◆機能説明
・操作パネル
操作パネル
下段には電源スイッチとOK表示(stabilized 表示)LEDを付けました。このLEDは実際の温度が設定値の±0.2℃以内に入った時に点灯します。上の段は操作スイッチでリセットとスタートボタン、項目選択つまみです。

電源を入れて、実行したい項目を選び、その後にスタートスイッチを押すことで実際に温度制御が開始されるようになっています。こうしておくと、電源を入れただけで加熱(冷却)運転が始まることは無いので安全です。なお、電源スイッチがあるのでリセットボタンは無くても良いのですが、あれば便利かもしれないので付けておきました。

◆表示パネル
・機能選択画面
現在の機能は下記の5種類です。最後に選んだ機能はEEPROMに記録しているので、次回の起動時は最初からその機能が選択されています。機能を追加・変更したい時はコード書いて再コンパイルです。
1. マニュアル :セレクトつまみで温度を設定します。設定値は運転中に任意に変更可能
2. プログラム1:10℃→60℃→10℃を10℃ステップ、各ステップ5分間ホールドの繰り返し。1サイクル50分
3. プログラム2:10℃→60℃→10℃を2℃/分の速度で昇温/降温、上下端で5分ホールドの繰り返し。1サイクル60分
4. プログラム3:10℃/60℃を最高速度で繰り返す。各温度で1.5分ホールド。1サイクル3分
5. プログラム4:20℃/50℃を最高速度で繰り返す。各温度60秒ホールド。1サイクル2分

・機能選択画面
マニュアル

プログラム-1 20191222IMG_0651.jpg 以下同様

・運転中の画面表示
プログラム-2
128x32画素のOLEDに出来るだけ多くの情報を詰め込みました。
・運転時間はスタートからの累積時間を秒で表示します。なおマニュアルでも表示。
・ペルチェのパワーは±100%の数値で示すと共に、一番下にバーグラフでグラフィックに表示しています。左に振れると冷却、右に振れると加熱ですが、直感的に判り易いです。

◆プログラム
こちら → ペルチェコントローター制御プログラム 20191221peltierTempCon (shift-JIS です)

【2023/03/23追記】184行目は下記に修正
誤:V = x * 1.1 / 10230.0; // 平均電圧の計算 (1.1V=1023)(10回ループで1.2ms)
正:V = x * 1.1 / 10240.0; // 平均電圧の計算 (1.1V=1024)(10回ループで1.2ms)

機能が多いので長めのプログラムになっています。全体のポイントは以下の通りです。
・タイミングはMsTimer2で5ms周期の割り込みで制御
・ペルチェのパワーはフルブリッジを使ったPWM制御 (Arduino の analogWrite )
・温度はPID制御

◆PID制御
Arduino のライブラリもあったのですが、使い方が判り難かったのと、制御出力が正負に対応していない感じがしたので、自前の関数を作りました。そうはいっても、計算は離散値PID制御で標準的に使われている式でやっています。なお、PIDのパラメーターはプログラム先頭付近の #define の Kp, Ki, Kd の値で定義しています。

一般的な計算式を使ったといっても少しカストマイズしているので、自分用のメモを兼ねて中の仕組みを解説しておきます。

PID制御の出力はfloat pid( ) 関数の戻り値となっています。この関数が制御のキモなのでコードを見ながら説明します。
float pid(float sv, float pv) {       // 制御量を計算(pid制御)飽和対策
float x;
float e, dP, dI, dD;
static float e1 = 0.0;
static float e2 = 0.0;
static float lastMv = 0.0;
float dMv; // 操作修正量

if ((sv - lastSv) > 2.0) { // 1回の変化量の上限超えていたら
sv = lastSv + 2.0; // 微分成分の飽和防止のために変化量を制限する(2℃/0.2秒)
}
if ((sv - lastSv) < -2.0) {
sv = lastSv - 2.0;
}
lastSv = sv; // 次回監視用に値を保存

// 離散値に対するPID制御の式で制御量を決定
e = sv - pv; // 現在の誤差量
dP = Kp * (e - e1); // 比例部
dI = Ki * e; // 積分部
dD = Kd * ((e - e1) - (e1 - e2)); // 微分部
dMv = dP + dI + dD; // 補正量計算

Serial.print(F(", ")); Serial.print(TTC * 0.2, 1); // 時間
Serial.print(F(", ")); Serial.print(dP); // ΔKp
Serial.print(F(", ")); Serial.print(dI); // ΔKi
Serial.print(F(", ")); Serial.print(dD); // ΔKd
Serial.print(F(", "));

x = lastMv + dMv; // 制御量を決定
e2 = e1;
e1 = e;

if (x > 100.0) { // 調節範囲の上限越していたら
x = 100.0; // 100%でクランプ
}
if (x < -100.0) { // 下限以下なら
x = -100.0; // -100%でクランプ
}
lastMv = x; // 次回の計算用に保存(制約付きで保存)
return x; // 実際の制御量を返す
}

1) PIDの制御量計算
この関数では毎回制御量を計算し、30行の x = lastMv + dMv; で実際のペルチェの出力を決定しています。この式は過去の計算結果が累積されるので積分型になっています。こういう方式にしておくことで過去のデーターを大量に保存しなくて済み、プログラムが簡単になるのだと思います。

積分した結果でPIDの各要素の効果を発揮させるということは、それぞれの要素はあらかじめ1回微分した値を用意しないといけません。つまり、P(比例)は誤差の微分で、I(積分)は誤差そのままで、D(微分)は誤差を2回微分した値で準備します。dP, dI, dD の各要素はそういう意図で計算されているのですが、最初はこういう理屈が判らなくて悩みました。

2) アンチワインディング
例えば設定を70℃とした場合、実際に到達可能な温度の上限は約65℃なので誤差はゼロになりません。こういう状態が続くと積分項の効果はどんどん蓄積されるので制御量は非常に大きな値になってしまいます。そういう状態から例えば設定値を50℃に下げたとします。当然制御量を減らして追従しようとしますが、すでに非常に大きな値が入っているのでなかなか制御量が減りません。その結果反応時間が遅れてしまいます。これをワインドアップ現象と言います。
そういう問題を無くす方法はいろいろあるようですが、34から39行の処理で制御量の上限を制限しました。

3) 設定値変化速度の制限
以上のような方法でアンチワインドアップ対策を行うと計算結果の情報の一部が失われることになります。一番影響が出るのが微分項です。最初の変化は無視されてしまって、後半の変化量だけの情報が反映されるようなことが起きてしまいます。その結果、極端な場合は操作方向が逆になってしまうようなことまで起きてしまいます。そういう場合でも、時間が経てば誤差ゼロの状態に収束しますが、応答時間が長くなって好ましくありません。

対策はいろいろ考えられそうですが、手っ取り早い処置として、操作の変化速度の上限を制限することにしました。具体的には9~15行までの処理で、ここで1回、つまり0.2秒あたりの変化量を最大で2℃に制限しました。

◆まとめ
・PID制御のプログラムはもっと美しい実装がありそうですが、とりあえず動いているのでまあこれで良いかと思っています。PID制御を本格的に勉強しようとしている学生には非常に良い教材なので、もっと性能の良い実装を考えてもらうと良いと思います。

ダイソーの3.4AのUSB充電器を何かうまいことに使えないだろうか?というかなり不純な動機で始めたペルチェ温度コントローラーですが、やってみるとなかなか面白かったです。これ作らなかったらPID制御なんてやらなかったので良い経験をさせてもらいました。

・表示に小型のOLEDを使いましたが、表現力が高く、グラフィックな表示も出来るのでなかなか使い易いです。ただ1倍角の文字は小さすぎて読みづらいので、縦だけ2倍角の文字、つまり幅6画素で高さ16画素の文字が表示できるともっと表現の幅が広がると思います。誰かそういうライブラリを作ってくれないですかね。ひょっとしたら Adafruit_SSD1306 で出来るのかも知れないのですが。

ペルチェ温度コントローラーの製作(基板とケースの製作)

◆まえがき
久しぶりにペルチェ温度制御装置の話です。前回の記事でソフトはあらかた出来たので、今回はプリント基板とケースを作って最終的な形に仕上げて行きます。とは言ったものの、製作中の写真はほとんど撮っていないので、完成状態の写真で紹介します。

現物の前にまずは回路図です。

◆回路図 (図をクリックで別窓に拡大図)
Arduinoを使ったペルチェ温度コントローラーの回路図
モジュール間を分離するためのコネクタを書いて、実装状態が判る図面に書き換えました。この図面に書き忘れちゃいましたが、電源スイッチはコネクタで操作パネル側に引き出しています。あと、クーリンファンの電源の配線(5V)も書き漏らしていました。

コントローラーには安く手に入る Arduno NANO の互換品を組み込んでいます。

電源は USB の ACアダプタを使いますが、NANO の基板の電源をどうやって供給するかが悩ましいところです。今回はショットキバリアダイオード (D1) を経由して NANO の +5V ピンに直接供給する方式にしました。なお、もし 7V 以上の電圧の電源を使うなら、VIN から供給することになりますが、このあたりの話は、Arduino よもやま話-7 (Nano の互換機を使ってみた) に関連の話が出てきます。

◆各部の写真
以下写真で紹介していきます。
・全体
ペルチェ温度コントローラー
プリント基板が剥き出しになっちゃってますが、この状態で完成としました。まあ使うのは自分だけだし、使用頻度も少ないはずなのでこれで妥協しました。

・正面
ペルチェ温度コントローラー
パネルは厚さ1mmくらいのプラ板で作りました。これ、加工しやすくて便利です。

・操作パネル
操作パネル
128x32 画素の OLED に情報を表示しています。右のツマミはロータリーエンコーダーで、これを使って各種設定を行います。下の方に緑色に光っている LED は温度が設定値の±0.2℃以内に入ったことを示しています。

この OLED はサイズが小さいのが難点ですが、安いのに視認性が良く表現力も高いので便利です。Arduino を使った工作の表示にはキャラクタ液晶を使うことが多かったですが、このようなグラフィック OLED を使うともう戻れない感じです。

・モジュールを分解した状態
ペルチェ温度コントローラー、コネクタを外した状態
メンテナンスし易いようにモジュール間はコネクタで分離出来るようにしました。

・プリント基板
ペルチェ制御基板
おなじみの秋月のC基板をそのまま使いました。

・基板裏面
コントローラー基板の裏面
いつもより使った線の色が多いですが、パワー系と制御系の電流パスを明示するために線の色と太さを変えています。

信号の配線はいつものようにφ0.26の青色のPTFEの単線を使っています。この線の在庫が少なくなったので、そろそろ秋葉原のオヤイデ電気に買い出しに行かないといけません。調布のマルツにあればそこで済ませたいところです。

・基板取り付け状態
ペルチェ制御基板の取り付け状態
コネクタはピンヘッダ/ピンソケットを必要なピン数に切断して使っています。なお、逆挿ししないように(し難くなるように)、ケーブルをフォーミングしています。左下の赤/青の線は電源ですが、ここには少し電流容量の大きな逆挿し出来ないコネクタを使っています。

・保温カバー
保温カバー
多少なりとも外乱の影響が少なくなるように、硬質のスポンジを両面テープで貼り合わせてて作った保温カバーを用意しました。

・裏側
保温カバー裏面
カバーは輪ゴムで止めています。被試験物も輪ゴムで軽く押し付けられるように、M2.5のタップ穴をいくつか開けておきました。

◆まとめ
・あまり見かけは良くありませんが、とりあえず使い易い状態にまで仕上げることが出来ました。デバイスの温度特性の測定などに便利だと思います。

・次回の記事ではソフトの解説と機能解説編を予定しています。

◆電源容量について
電源にはダイソーの 3.4A 出力の USB 充電用の ACアダプタを使うことを想定しています。というか、ダイソーの 3.4A の ACアダプタを買ったのがきっかけでこのペルチェ温度コントローラーの製作を思いつきました。

しかし実際に動かしてみると、大電流が必要になるのは、最大発熱から最大吸熱へ、あるいはその逆に一気に切り替えた時だけでした。これはペルチェ効果による電圧が残っている状態で逆電圧を加えるので大きな電流が流れるわけで、そういう状態はすぐに解消されてしまって、定常状態では1.8Aくらいの電流容量があれば十分でした。

つまり 3.4A の電流容量が無くても何とかなります。もちろん過大電流が流れると出力電圧低下などの問題が発生しますが、そういうことに目をつむれば、普通のスマホの充電器がそのまま使える可能性が高いです。

ペルチェ温度コントローラーの製作(温度プロファイル指定機能)

久しぶりにペルチェ温度コントローラー作りの話です。基本的な機能は出来たので、ケースに入れる作業とプログラムの改良を同時進行で少しずつ進めています。

ケースや操作スイッチなどのハード作り、とプログラムは相互に関係する部分が多いので、同時にやると完成度が上がる場合が多いです。と書くとかっこいいですが、要するに出たとこ勝負の現物合わせでやっているということです。

◆現在の状態
ペルチェ温度コントローラー
かなり出来上がってきて、最終的な形が見えてきました。

◆プログラムの機能追加
さて、ハード製作と並行して進めているプログラムの改良ですが、温度プロファイルの自動再生機能を入れることにしました。いくつかの温度変化のパターンを用意しておいて、それを自動再生すれば便利になるはずです。

そんなことで、とりあえず用意した温度変化のパターンを実際に動かした様子をグラフで見ていきます。以下のグラフはの Sv は設定値、Pv は実測温度です。

1.ステップ昇温/降温
ステップ昇温・降温
10℃から60℃まで10℃ステップで昇温(降温)し、各温度で5分間ホールドするパターンです。デバイスの温度特性測定に使用すると便利だと思います。特に温度がステップ変化したときの過渡応答の観察にも使えると思います。

2.昇温(降温)速度一定
一定昇温速度
10℃から60℃まで、変化速度 = 2 ℃/分で温度を上昇、降下させるパターンです。温度に対する特性の変化グラフを作りたい時に便利だと思います。

3.昇温/降温繰り返し
高速Hi/Low
1分間隔で10℃と60℃を繰り返します。温度に対する特性変化の傾向確認や、PID制御のパラメーター調整に便利だと思います。

4.マニュアル
温度を手動設定するモード。ロータリーエンコーダーから温度を指定します。

◆興味深いグラフ
運転時には温度以外に各種の情報をシリアルに吐き出しているのですが、その中で面白そうなものを紹介します。

・PIDのパラメータの変化
PIDパラメーターの変化
これは、3.項の昇温/降温を繰り返した時の PID制御量計算に使っている比例(dP)、積分(dI)、微分(dD)、制御量(Mv)が変化する様子です。PIDの各要素の感度係数はこういうグラフを見ながら調整しました。

・ペルチェの入力パワー(電圧)と温度の関係
ペルチェ入力vs温度
これは2.項の昇温速度一定のグラフと同時に取集している制御量(Mv)の値と、実際の温度の関係を散布図にしたもので、青いプロットがそのデーターを表しています。横軸はペルチェに加えている電圧で、100%が5Vに相当し、正側が発熱、負側が吸熱になります。縦軸は温度で、ペルチェに加えるパワーに応じて温度が変わっています。

ここで注目点は、パワーの正負でグラフの傾きが違っている点です。

ペルチェ素子ではペルチェ効果による熱の移動が行われますが、同時にオーミックな発熱を伴うのでこういう特性になるのだと思います。つまり、オーミックな発熱は電流の方向に無関係、つまり電流の絶対値に比例して発生します。一方でペルチェ効果による熱の移動は電流の方向で決まるので右上がりの直線になります。こういう特性がまとめて観察されるので、このこのグラフのようなパワーゼロを境に傾きが変わるグラフになるのだと思います。

赤い点線は私が書き加えたものですが、この直線がペルチェによるもの。ここにオーミックな発熱がV字型に加わるので、青線のような測定結果になったと考えると良いと思います。

◆まとめ
測定を行うと思いがけない特性に出くわすことがありますが、今回のペルチェの温度特性はその良い例でしょう。理屈が判ってしまうと、なるほど、となりますが、事前にこういう変曲点を持ったグラフが出てくるとは予想していませんでした。

ペルチェのパワー/温度特性カーブからヒートポンプとしての性能係数のようなものが計算出来ると面白いと思いました。でもヒートシンクから捨てている熱量が判らないし、出力側を通過している熱量となるともっと判らないので、定量化は難しいのかも知れません。
カレンダー
05 | 2023/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -
プロフィール

ラジオペンチ

Author:ラジオペンチ
電子工作を中心としたブログです。たまに近所(東京都稲城市)の話題など。60過ぎて視力や器用さの衰えを感じつつ日々挑戦!
コメントを入れる時にメールアドレスの記入は不要です。なお、非公開コメントは受け付けていません。
記事の内容のご利用は読者の自己責任でお願いします。

記事が気に入ったらクリックを!
最新記事
カテゴリ
最新コメント
リンク
FC2カウンター
検索フォーム
月別アーカイブ
RSSリンクの表示
QRコード
QRコード