試運転で抽出した課題の一つに、水中ポンプ流量が多すぎ、がありました。ポンプの出力は電圧で変えられるようなので抵抗でも入れようかと思っていましたが、少し調べてみるとこの手の調整はPWM制御で行うことが多いんですね。仕組みはあまり理解できていませんが、PWM制御で水中ポンプ流量制御を試してみることにします。
PWM制御
PWMは、Pulse Width Modulationの略です。ざっくり、信号のオンオフを繰り返し、パルス信号にすることで平均的な電圧を下げる、という理解で良さそうです。信号を受け取る機器(水中ポンプ)側からすると、ポンプは単純に短時間のオンオフを繰り返し受けている状態です。短いオンの間にモーターがちょっと動いて、オフになるけど、モーターは慣性で回っていて、停止する前に次のオン信号が来る感じですね。

すごく一般的な制御なんでしょうね。XIAO ESP32C3もPWM信号を出力できるピンを11個持っています。全14ピン中、電源(5V、3.3V)2ピン、GND1ピンなので、信号に使えるピンは全部PWM制御に使えます。しまった、そこまで常識だったとは。
使い方はLang-shipさんの記事を参考にしました。
ESP32のPWM出力は255が最大じゃなかった | Lang-ship
詳細を全てすっ飛ばすと、使い方自体は簡単です。これといったライブラリとかも不要で使えます。具体的には精度、PWMの周波数とDuty比を指定するだけです。
周波数は、1秒間に繰り返す波の数、ですね。単位はHzです。結果から行けば今回の検討では70kHzくらいが良さそうなので、一秒間に70000回波が来る=オンオフがある、ということです。すごい回数のオンオフですよね。冷水塔RaySui-kun基板のポンプのリレーをフォトリレーにしておいてよかったです。ところで、周波数fと波の周期Tは以下の関係にあります。
$$ f \ = \ \frac{1}{T} $$
例えば70kHzの波の周期は、1/70000で1.43×10-5秒になります。短すぎてイメージ付かないですが、チョチョチョチョチョーっとモーターを回す感じでしょうか。
Duty比は、一回の周期の中でオンになっている時間の比率です。オンとオフの一回づつがワンセットで、その周期Tを100とした時、オンの時間の割合(%)をどの程度にするか、ですね。イメージ図を下に書きましたが、余計分かりにくいかも。

スケッチ
これらの周波数とDuty比を指定するだけなので、スケッチはシンプルですね。ledcAttach()を使う場合、チャンネルは自動設定されるとのこと。
LED Control (LEDC) / ESPRESSIF
https://espressif-docs.readthedocs-hosted.com/projects/arduino-esp32/en/latest/api/ledc.html#led-control-ledc
精度は8bitsで決め打ちです。目的は動かすことなので、よく見かける設定にしておきました。最適化とかどうやるんだろう。
Duty比は%を直接入力するのではなくて、分解能の最大値に対してどの程度の数字を入れるか、となっています。なので、ledcWrite()の中には、上限を256として、それ以下の数字を入れています。実際にどのくらいのDuty比となったかは、後で確認です。
ポンプが動かない設定がいくつかあり、能力が出ないのか基板にエラーが起こっているのか動きだけでは分かりづらかったので、Setup()に全開で10秒ポンプを動かす命令を入れています。
const int P3 = D1; //cooling tower pump
const int B2 = D2; //cooling tower blower
#define PWM_FREQ 70000
#define PWM_RES 8
void setup() {
Serial.begin(115200);
//D0 --vacant
pinMode(P3, OUTPUT); //D1 --cooling tower pump
pinMode(B2, OUTPUT); //D2 --cooling tower blower
//D3 --vacant
//D4 --vacant
//D5 --vacant
//D6 --vacant
//D7 --vacant
//D8 --vacant
//D9 --vacant/caution when you use as LED pin
//D10 --vacant
ledcAttach(P3, PWM_FREQ, PWM_RES);
ledcAttach(B2, PWM_FREQ, PWM_RES);
ledcWrite(P3,256);
Serial.println("256");
delay(10000);
}
void loop() {
ledcWrite(P3,50);
Serial.println("50");
delay(2000);
}
流量確認実験
0~256までの分解能の間で、Duty比に応じてポンプの流量が変わっていくと思っていましたが、実際に水を流してみると、Duty比に応じて流量が変化する領域は非常に狭く、大部分の設定値の範囲が、動かないか、全開で動く、のどちらかでした。
流量確認は以下のように実施しました。
・水を溜めた容器に水中ポンプDH-390を投入、設置
・9mmチューブを水中ポンプ吐出に接続
・天秤の上に置いた容器に10秒間で出せた水の重量を記録(n=2)
・10秒当たりの流量を1時間当たりの流量へ換算
・パラメータは周波数とDuty比(実際は分解能の数字)
10秒経過したら、手でチューブを元の容器側へ移すので、誤差が結構大きいです(10g程度)。まあそこまで正確な数字が必要なわけではないので、良しとしましょう。
DH-390はサクション側に可変のオリフィスが付いているので、とりあえず全開で計測しました。


何度か計測を行っていると、ポンプから音がする時としない時がありました。周波数等の設定値や流速とは相関なさそうでしたが、少し気になります。動画だとあまり聞こえませんね。
結果は以下の通り。

Duty比は0~100%の間で連続的にポンプ流量が変わるのかと思っていましたが、実際はDuty比で変化が見られる区間は非常に狭く、18~21%の間でした。
Duty比を100とした場合、周波数に依らず流量は126L/hrとなりました。これは、スケッチをD3ピンHIGHとした場合も同じ流量になりました。一方、水中ポンプの電源をUSB5Vに直接接続すると、流量は144L/hrでした。
70、80、90、110kHzの各周波数でDuty比を変化させると、Duty比が低い場合にポンプが停止する結果となりました。分かりにくいですが、”0″になっている部分の内、黒字の”0″はポンプが途中で停止、又は最初から動かなかった設定値です。周波数が高い方が、Duty比の下限は高いことが分かります。
また、Duty比19.5%の場合のみ、低周波数側まで確認しています。同じDuty比でみた場合、周波数が高い方が流速が低くなり、110kHzで停止してしまうことが分かりました。

110kHzではポンプが停止したので、数字は出ていません。これをみると、周波数が低い方が流速は上がりますが、10kHzまで周波数を落とすと、流速が下がってきます。これ以上周波数を落とすと(1kHz以下)、こちらもポンプが停止してしまいました。
周波数を70kHzに固定してDuty率を変化させたときの流量を下のグラフに示します。Duty率46/256(18.0%)ではポンプが停止しましたが、47/256(18.4%)から流量が上がっていって、51/256(19.9%)くらいからあまり上がらなくなります。最終的にはDuty率100%となる256/256で126.7L/hrとなりました。ただし、このデータは揚程10cmの時になります。

オリフィスと揚程の効果
試運転をやった時にはオリフィスの開閉は流速に影響しないと感じていましたが、実際測定してみると、結構しっかり効果が出ていました。いや、まあ、正直、オリフィスは効果ないだろうと思い込んでいたので、オリフィス開閉のデータはこれだけです。また、チューブを持ち上げて揚程を変えてみたところ、流速は大きく変動することが分かりました。

結果まとめと今後の方針
Duty比に連動して水中ポンプDH-390の流速が変化する範囲は非常に狭く、18-21%の間でした。またDuty比が低い、あるいは周波数が高いと水中ポンプは停止することが分かりました。
想定外でしたが、オリフィスと揚程の変化で、PWM制御で変化させられることのできる範囲を大きく超えて、流速が変動することが分かりました。
最も効果的なファクターが別にあったことが今回の流速実測で分かった為、この二つを固定した上でデータを取り直すことにします。
次回は揚程、オリフィスを固定した上での流速再確認かな。









コメントを残す