25-kHz-4-Pin-PWM-Lüftersteuerung mit Arduino Uno – Bau, Code & Test
Komponenten und Zubehör
- 1× Axiallüfter, 12 VDC, 4-Pin PWM
- 1× Arduino UNO
- 1× USB-A auf Mini-USB Kabel
- 1× Steckbrücken (Jumper Wires)
- Netzteil: 12 V (z. B. umgebautes ATX-Netzteil)
- Optional: Hand-Oszilloskop zur Signalprüfung
Software
- Arduino IDE
Projektbeschreibung
Dieses Projekt zeigt, wie man einen 4-Pin-PWM-Lüfter präzise mit 25 kHz über einen Arduino Uno steuert. Die Frequenz ist einstellbar von 125 Hz bis 8 MHz, der Tastgrad (Duty Cycle) variabel von 0–100 %. Verwendet wird Timer 1 im phasenkorrekten PWM-Modus (Mode 10) auf den Pins 9 (OC1A) und 10 (OC1B).
Wichtige Hinweise vor dem Bau
- Datenblatt prüfen: Der Steuerpin ist oft gelb (normalerweise Tacho-Signal). Nicht alle Lüfter erwarten PWM am gleichen Pin.
- Zulässiger Frequenzbereich: Viele Lüfter spezifizieren eine „Centering Frequency“ (z. B. 25 kHz). Den Code entsprechend anpassen.
- Netzteil: Ein stabiles 12-V-Netzteil ist essenziell (ATX-Netzteil empfohlen).
- Zweiter Lüfter: Die gleichzeitige unabhängige Steuerung zweier Lüfter über Timer 2 funktioniert nicht zuverlässig, da Timer 2 nur 8-Bit-Auflösung hat (vs. 16 Bit bei Timer 1), was zu verzerrten Signalen führt.
Arduino-Code
const byte OC1A_PIN = 9;
const byte OC1B_PIN = 10;
const word PWM_FREQ_HZ = 25000; // Gewünschte Frequenz in Hz (hier 25 kHz)
const word TCNT1_TOP = 16000000 / (2 * PWM_FREQ_HZ);
void setup() {
pinMode(OC1A_PIN, OUTPUT);
// Timer1 zurücksetzen
TCCR1A = 0;
TCCR1B = 0;
TCNT1 = 0;
// Timer1 Konfiguration: Phase Correct PWM, Mode 10
// COM1A1:1 = 0b10 (Clear on match up, set on match down)
// WGM13:10 = 0b1010 (Phase Correct PWM, TOP = ICR1)
// CS10 = 1 (Kein Prescaler, 16 MHz)
TCCR1A |= (1 << COM1A1) | (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << CS10);
ICR1 = TCNT1_TOP; // TOP-Wert setzt Frequenz
}
void loop() {
setPwmDuty(0); delay(5000);
setPwmDuty(25); delay(5000);
// setPwmDuty(50); delay(20000);
// setPwmDuty(75); delay(20000);
// setPwmDuty(100); delay(20000);
}
void setPwmDuty(byte duty) {
// duty: 0–100 %
OCR1A = (word)(duty * TCNT1_TOP) / 100;
}
Schaltplan
Erklärung: Der Code setzt Timer 1 auf phasenkorrekten PWM mit ICR1 als TOP. Die Frequenz wird über PWM_FREQ_HZ definiert, der Tastgrad über OCR1A. Pin 10 (OC1B) bleibt ungenutzt, kann aber analog angesteuert werden.
Herstellungsprozess
- LED-Helligkeit per PWM und Taster am Arduino Mega steuern
- Deckenventilator per Alexa steuern – Schritt-für-Schritt-Anleitung
- Arduino Echtzeituhr für islamische Gebetszeiten bauen
- Smartes Sparschwein: Münzprüfer mit Arduino Nano steuern
- LED per Bluetooth mit Arduino steuern – Einfache DIY-Anleitung
- Zwei Schrittmotoren mit Arduino Nano & Joystick steuern – Einfaches Tutorial
- Bilder auf 1,17-Zoll-TFT-LCD mit Arduino UNO anzeigen
- 8×8 LED-Matrix mit Arduino Uno meistern: Schritt-für-Schritt-Anleitung
- 4x4x4 LED-Würfel mit Arduino Uno & 1Sheeld bauen – Interaktives LED-Projekt
- ThimbleKrox: Fingermontierte Maussteuerung mit Arduino Micro & MPU-6050