Arduino Unoで25kHz 4ピンPWMファンを制御 – 製作・コード・テスト
必要な部品と材料
- 軸流ファン 12VDC × 1
- Arduino UNO × 1
- USB-A - Mini-USBケーブル × 1
- ジャンパーワイヤ × 1式
使用するソフトウェア
- Arduino IDE
プロジェクトの概要
手元にあった5つの4ピンPWMファンを制御したくて取り組んだプロジェクトです。周波数は125Hz〜8MHzの範囲で調整可能で、デューティサイクルも可変です。回路はタイマー1のOCR1A(ピン9)とICR1(ピン10)を使ったモード10(位相補正PWM)を利用しています。デバッグにはハンドヘルドオシロスコープを使用し、波形を目で確認しながら調整しました。


重要な注意点
- ファンのデータシートを確認してください。 制御ピンの色はメーカーにより異なります(黄色のケースが多いですが、これは通常タコメータ出力です)。
- ファンの許容周波数範囲(または「センタリング周波数」)を確認し、コード内の周波数設定を合わせてください。
- 安定した電源(ATX電源の改造品など)を用意してください。
注意: 別のタイマーを使って2台のファンを独立制御しようとしましたが、うまくいきません。2番目のタイマーは解像度が低い(16bit対8bit)ため、周波数とデューティの調整ステップが粗くなり、波形が歪みます。また、値の入力も直感的ではありません。
回路図

ソースコード
const byte OC1A_PIN = 9;
const byte OC1B_PIN = 10;
const word PWM_FREQ_HZ = 25000; // 周波数をHzで指定(現在25kHz)
const word TCNT1_TOP = 16000000 / (2 * PWM_FREQ_HZ);
void setup() {
pinMode(OC1A_PIN, OUTPUT);
// Timer1 レジスタクリア
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// Timer1 設定
// COM1A(1:0) = 0b10 (出力A: 立上がりでクリア/立下がりでセット)
// COM1B(1:0) = 0b00 (出力B: 通常動作)
// WGM(13:10) = 0b1010 (位相補正PWM)
// ICNC1 = 0 (入力キャプチャノイズキャンセラ無効)
// ICES1 = 0 (入力キャプチャエッジ選択無効)
// CS(12:10) = 0b001 (クロック分周なし)
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = TCNT1_TOP;
}
void loop() {
setPwmDuty(0);
delay(5000);
setPwmDuty(25); // 0-100でデューティサイクル調整
delay(5000);
// setPwmDuty(50); delay(20000);
// setPwmDuty(75); delay(20000);
// setPwmDuty(100); delay(20000);
}
void setPwmDuty(byte duty) {
OCR1A = (word)(duty * TCNT1_TOP) / 100;
}
製造プロセス
- Arduino MegaでPWM制御:プッシュボタン付きLEDフェード制御チュートリアル
- Alexaでシーリングファンを音声制御:ステップバイステップガイド
- Arduino で作るイスラム教礼拝時刻付きリアルタイムクロック
- スマート貯金箱を作ろう:Arduino Nanoでコインアクセプターを制御
- ArduinoでBluetooth経由でLEDを制御 – シンプルDIYガイド
- Arduino Nanoとジョイスティックで2軸ステッピングモーターを制御:Visuinoで簡単プログラミング
- Arduino UNOで1.17インチTFT LCDに画像を表示する方法
- Arduino Unoで8×8 LEDマトリックスを制御:ステップバイステップガイド
- Arduino Unoと1Sheeldで作る4x4x4 LEDキューブ – インタラクティブLEDプロジェクト
- ThimbleKrox: Arduino MicroとMPU-6050を用いた指装着型マウス制御
- Arduinoでゴキブリ制御システムを自作 - 30ドル以下で構築