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   |
+----+--------------+----------+----------+

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

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