シャーシが決まっていませんが、なんとなく必要になりそうだったので作っておきました。山洋の 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);
}
}




