GM70シングル シャーシ冷却用ファンのコントローラ作成(2)

前回の記事で、シャーシにファンを取り付けたほうがいいなぁ。と書きましたが、もうちょっと仕様を検討してみました。
使用する 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   |
+----+--------------+----------+----------+

基板につけたボリュームは当初最低回転数の設定に用いる予定でしたが、現在は上記テーブルで回るファンの回転数を
ちょい増し・減らしの調整用にしようと考えています。

あとは、回転数設定をどれくらいの頻度で行うかも検討が必要ですが、これはトライ&トライで決めたいと考え中。
ひとまず、机上での検討結果でした。

GM70シングル シャーシ冷却用ファンのコントローラ作成

2016-04-10 14.06.42

シャーシが決まっていませんが、なんとなく必要になりそうだったので作っておきました。山洋の DC ファンを PWM 制御するコントローラ + リレー4個まで接続出来るようにした基板です。DC ファンはたまたま山洋のを買ったので PWM 周波数は 25kHz です。

  • 構成は Arduino UNO R2 + TD62003 のシンクドライバ + TMP36GZ 温度センサー
  • ATMega328P の Timer2 高速 PWM モードで 25kHz PWM を生成
  • ボリュームのアナログ値を読み取って、ファンを低速で回す。
  • TMP36GZ(LM35DZと同じような温度センサー)のアナログ出力を読み出して、シャーシ内が高温になったらファンの回転を高める
  • 冷えたと判断したら元に戻る

最終的には上記の動きになるようプログラムする予定です。ひとまずボリュームのアナログ値を読み込んで PWM 幅を変更するサンプルを作成して実行してみました。

pwm90
pwm60
pwm10
pwm00

90%, 60%, 10%, 0% を並べてみました。デューティー比を下げるとキッチリいけてませんね。0% でヒゲみたいにワンショットでちゃってます。データシート読んで悪そうなところを見直しましょう。デューティー比を変えても 25kHz の周期でパルス出せているのでレジスタ設定の肝心な部分は OK でした。

DC ファンは全開で回すとモーターの音と風切り音がラックマウントのサーバーみたいにヤカマシイので最大20~30%のパワーあたりで調整入れていくような感じになりそうです。

2016/4/11 追記

高速 PWM モードでは、0% のときはパルスがでるとデータシートにもあったので、位相基準 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;
}    

void loop() {
  // Duty 0 - 50% テスト 
  int i;
  for(i = 0; i < 21; i++) {
    OCR2B = i;
    delay(5000);
  }
}