前回の記事で、シャーシにファンを取り付けたほうがいいなぁ。と書きましたが、もうちょっと仕様を検討してみました。
使用する DC ファンは山洋電気 9GA0612P1K60(12V 60mm角のファン)を通販でみかけたので 2 個購入しました。
概略の性能は以下のとおりです。
+---------+------+-------+----------+--------+----------+------+ |PWM DUTY | 電流 | 入力 | 回転速度 | 風量 | 最大静圧 | 音圧 | | (%) | (A) | (W) | (min-1) |(m3/min)| (Pa) | (db) | +---------+------+-------+----------+--------+----------+------+ | 100 | 0.95 | 11.40 | 14,800 | 1.50 | 675 | 59 | | 0 | 0.05 | 0.50 | 1,480 | 0.134 | 8.3 | 16 | +---------+------+-------+----------+--------+----------+------+
この DC ファンには 4本のコードが出ています。
赤: 電源 +
黒: 電源 –
茶: PWM 制御
黄: 回転数センサ
回転数制御ができれば十分なので、電源の線と PWM制御の線合計3本使うことにします。
回転数センサは、回転数をモニタするときには必要ですが今回そこまで要らないので使用しません。
この DC ファンを全開で使うとラックマウントサーバー並みの騒音が発生しますので、最大30%~40% を目安に
リミッターをかけたいと思っています。回転数の制御は PWM 線に 25kHz の PWM を流せば回転数を調整できます。
この信号を発生させるために Arduino UNO(ATMEGA328P) の Timer2 を使用して発生させることにしました。
なぜ、Arduino UNO かという理由は、積み基板があったことと AVR マイコンになれているからです。
今回は Timer2 を位相基準モード(Mode 5)に設定して PWM を発生させることにします。
// // Timer2 Mode 5: 位相基準 PWM TOP=OCR2A // // クロックは 16MHz / 8 = 2MHz // DC FAN PWM 周波数 = 25kHz // OCR2A = 2MHz / 25kHz = 80 -> 40 // OCR2B = デューティー比 0 - 40 の 2.5% きざみになる // PWM 出力端子は OC2B = PD3 = 3 // void setup() { pinMode(3, OUTPUT); TCCR2A = _BV(COM2B1) | _BV(WGM20); TCCR2B = _BV(WGM22) | _BV(CS21); OCR2A = 40; OCR2B = 0; }
細かい説明は省きますが、 OCR2B に 0 – 40 まで設定すると 0% – 100% の PWM を発生させることができます。
ソースのコメントにもかいていますが、2.5% ステップで調節できます。
ファン周りは以上で、次は温度センサーです。
TMP36GZ というトランジスタみたいな形の温度センサーです。この温度センサーは 25℃のときに 750mV 出て、1℃変化すると電圧が10mV 変化するというものです。
+-------+---------------------------------+-------------+ |TMP36G | Output Voltage 25℃ (mV) | 750 | | | Output Voltage Range (mV) | 100 ~ 2000 | | | Scale Factor -40~125℃ (mV/℃) | 10 | +-------+---------------------------------+-------------+
Arduino UNO の analogRead(pin) で TMP36GZ の出力を読み取って温度の判定をします。
analogRead() の戻り値は 0~1023 です。リファレンス電圧は 5V なので戻り値の単位は 5000mV / 1024 = 4.88 mV
温度 = analogRead() * (5000 / 1024) / 10 – 50
・10 は 10mV/℃
・50 は 0℃のときのオフセット電圧 500mV / Scale Factor 10mV = 50
で計算することができます。
PWM 出力の設定は、実際に動かしてみないとわからないのですが、
仮で下記のようなテーブルを設定してみました。
+----+--------------+----------+----------+ |温度|センサ出力(mV)|analogRead|FAN PWM(%)| +----+--------------+----------+----------+ |-10 | 400 | 82 | 0.0 | | -5 | 450 | 92 | 0.0 | | 0 | 500 | 102 | 0.0 | | 5 | 550 | 113 | 0.0 | | 10 | 600 | 123 | 0.0 | | 15 | 650 | 133 | 0.0 | | 20 | 700 | 143 | 2.5 | | 25 | 750 | 154 | 2.5 | | 30 | 800 | 164 | 5.0 | | 35 | 850 | 174 | 5.0 | | 40 | 900 | 184 | 7.5 | | 45 | 950 | 195 | 7.5 | | 50 | 1000 | 205 | 10.0 | | 55 | 1050 | 215 | 12.5 | | 60 | 1100 | 225 | 15.0 | | 65 | 1150 | 236 | 20.0 | | 70 | 1200 | 246 | 25.0 | | 75 | 1250 | 256 | 30.0 | | 80 | 1300 | 266 | 35.0 | | 85 | 1350 | 276 | 40.0 | +----+--------------+----------+----------+
基板につけたボリュームは当初最低回転数の設定に用いる予定でしたが、現在は上記テーブルで回るファンの回転数を
ちょい増し・減らしの調整用にしようと考えています。
あとは、回転数設定をどれくらいの頻度で行うかも検討が必要ですが、これはトライ&トライで決めたいと考え中。
ひとまず、机上での検討結果でした。
突然恐れ入ります。
自分でも試してみて、arduino unoでぴったり25khzのPWM出力を作れました。ありがとうございました。ここ以外に参考になるページが見つかりませんでした。(公式での方法では31khzにしかならない)しかも2.5%刻みでデューティー比も変更できて、nextion HMIを接続してパネルで10段階にデューティー比変更設定可能なまで作れました。
本来、arduino mega 2560で25khz PWMを作る必要があり、調べてはみたものの、不勉強でどうしても思ったように出来ません。mega のPin out 3はTimer3のようですが、数字を推測で変更してもうまくいくわけもなく、教えていただけないでしょうか?可能であれば、些少なり御礼差し上げたく。お返事お待ちしております。
何度もコメント申し訳ありません。以下で、ピンは2ですが出来ました。
pinMode(2, OUTPUT);
TCCR3A = _BV(COM3B1) | _BV(WGM30);
TCCR3B = _BV(WGM33) | _BV(CS31);
OCR3A = 40;
OCR3B = 10;
理由がわかってないのが痛いですが、もう少し自分で努力してみようと思います。PIN3にこだわる必要もないかもしれないです。
しかし、このページがなかったらこんな結果にはたどり着かなかったと思います。ありがとうございます。