Kontrol Kipas PWM 4 Pin 25 kHz dengan Arduino Uno – Bangun, Kode & Uji
Komponen dan Perlengkapan
Kipas Aksial, 12 VDC
×
1
Arduino UNO
×
1
Kabel USB-A ke Mini-USB
×
1
Kabel jumper (umum)
×
1
Aplikasi dan Layanan Online
Arduino IDE
Tentang Proyek Ini
Saya tertarik dengan proyek ini dan cara mengontrol kipas PWM 4 pin saya. Saya memiliki 5 kipas yang tidak terpakai dan mencoba mencobanya. Nilai frekuensi dapat disesuaikan antara 125 HZ hingga 8 MHZ beserta siklus kerja yang variabel. Rangkaian menggunakan mode 10 PWM phase-correct pada timer 1 OCR1A (Pin 9) dan ICR1 (Pin 10). Beberapa debugging diperlukan untuk memahami hal ini dan saya memiliki osiloskop portabel. Ini memudahkan untuk melihat frekuensi dan siklus kerja tanpa tebakan. Berikut adalah tautannya: Osiloskop.
Saya sangat menyarankan Anda mencari datasheet kipas Anda karena pin kontrol dalam kasus saya berwarna kuning (biasa disebut sebagai kabel tach). Pastikan juga untuk menemukan rentang frekuensi yang dapat diterima (atau "FREKUENSI PUSAT") untuk kipas yang Anda pilih. Anda mungkin perlu mengubah frekuensi kode untuk menyesuaikan kebutuhan Anda. Akhirnya Anda akan membutuhkan sumber daya yang baik (Saya menggunakan ATX PSU yang dikonversi dari PC lama).
CATATAN: Saya telah mencoba menggunakan timer lain dan mengontrol 2 kipas secara independen. Ini tidak berjalan. Alasannya adalah resolusi timer ke-2 lebih rendah (16 bit vs 8 bit). Ini berarti langkah dalam penyesuaian frekuensi dan siklus kerja berisik dan bentuk gelombang semakin terdeformasi. Ini juga tidak setidak-tidaknya saat memasukkan nilai.
Kode
const byte OC1A_PIN = 9; const byte OC1B_PIN = 10; const word PWM_FREQ_HZ = 25000; //Sesuaikan nilai ini untuk menyesuaikan frekuensi (Frekuensi dalam HZ!) (Saat ini diatur ke 25kHZ) const word TCNT1_TOP = 16000000/(2*PWM_FREQ_HZ); void setup() { pinMode(OC1A_PIN, OUTPUT); // Bersihkan register kontrol dan hitung Timer1 TCCR1A = 0; TCCR1B = 0; TCNT1 = 0; // Set konfigurasi Timer1 // COM1A(1:0) = 0b10 (Output A clear rising/set falling) // COM1B(1:0) = 0b00 (Output B operasi normal) // WGM(13:10) = 0b1010 (Phase correct PWM) // ICNC1 = 0b0 (Input capture noise canceler disabled) // ICES1 = 0b0 (Input capture edge select disabled) // CS(12:10) = 0b001 (Input clock select = clock/1) TCCR1A |= (1 << COM1A1) | (1 << WGM11); TCCR1B |= (1 << WGM13) | (1 << CS10); ICR1 = TCNT1_TOP; } void loop() { setPwmDuty(0); delay(5000); setPwmDuty(25); //Ubah nilai ini 0-100 untuk menyesuaikan siklus kerja delay(5000); // setPwmDuty(50); // delay(20000); // setPwmDuty(75); // delay(20000); // setPwmDuty(100); // delay(20000); } void setPwmDuty(byte duty) { OCR1A = (word) (duty*TCNT1_TOP)/100; }