シャーシが決まっていませんが、なんとなく必要になりそうだったので作っておきました。山洋の DC ファンを PWM 制御するコントローラ + リレー4個まで接続出来るようにした基板です。DC ファンはたまたま山洋のを買ったので PWM 周波数は 25kHz です。
- 構成は Arduino UNO R2 + TD62003 のシンクドライバ + TMP36GZ 温度センサー
- ATMega328P の Timer2 高速 PWM モードで 25kHz PWM を生成
- ボリュームのアナログ値を読み取って、ファンを低速で回す。
- TMP36GZ(LM35DZと同じような温度センサー)のアナログ出力を読み出して、シャーシ内が高温になったらファンの回転を高める
- 冷えたと判断したら元に戻る
最終的には上記の動きになるようプログラムする予定です。ひとまずボリュームのアナログ値を読み込んで PWM 幅を変更するサンプルを作成して実行してみました。
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); } }