Sinyal PWM dihasilkan oleh timer pada chip AVR. Setiap timer dapat menghasilkan sinyal PWM pada dua atau tiga pin yang berbeda. Setiap pin dapat memiliki siklus tugasnya sendiri, tetapi mereka berbagi frekuensi PWM. Anda dapat mengubah frekuensi PWM dengan mengubah sumber jam untuk penghitung waktu. Secara default mereka menggunakan jam CPU dibagi dengan 64, yaitu. mereka memiliki prescaler mereka diatur ke 64 oleh kode inisialisasi Arduino. Untuk membingungkan banyak hal ada dua mode PWM yang berbeda: PWM cepat dan fase PWM benar. Dalam PWM cepat penghitung waktu ke 255, kemudian meluap dan mulai lagi dari 0 (256 negara berbeda). Dalam fase yang benar PWM penghitung waktu ke 255, kemudian mengubah arah dan menghitung ke bawah ke nol, mengubah arah dan sebagainya (510 negara berbeda).
Arduino Mega memiliki 5 timer, timer0 - timer4. Karena timer0 juga digunakan untuk fungsi millis dan micros, ia menggunakan PWM cepat, sedangkan timer lain dikonfigurasikan untuk PWM yang benar. Ini menghasilkan frekuensi yang berbeda pada pin yang berbeda:
Pin 4 dan 13, dikontrol oleh timer0:
16 Mhz / 64/256 = 976,56 Hz
Pin PWM lainnya, dikontrol oleh timer1-4:
16 Mhz / 64/510 = 490.20 Hz
Perhitungannya adalah: mode jumlah Clock / Prescaler / PWM dari status
Situasinya sama untuk semua papan Arduino lain yang saya tahu, kecuali mereka memiliki timer yang lebih sedikit yang terhubung ke pin yang berbeda.
Anda dapat mengubah frekuensi PWM dengan mengubah prescaler timer. Lihat halaman ini: http://playground.arduino.cc/Main/TimerPWMCheatsheet
Dimungkinkan juga untuk membuat timer menghitung ke nilai yang berbeda dari 255. Pada timer 8 bit Anda akan kehilangan pin output, tetapi pada timer 16 bit Anda dapat menggunakan Input Capture Register untuk menentukan nilai TOP. Fungsionalitas pengambilan input adalah fitur yang jarang digunakan dalam komunitas Arduino sehingga Anda mungkin tidak akan melewatkannya.
Perpustakaan Arduino hanya memungkinkan Anda untuk menggunakan resolusi 8 bit, bahkan pada timer 16 bit. Jika Anda menginginkan resolusi yang lebih tinggi, Anda harus menulis analogWrite Anda sendiri, atau menggunakan perpustakaan yang dibuat untuk tujuan tersebut. Pada Arduino Mega timer0 dan timer2 adalah 8 bit, sedangkan sisanya adalah 16 bit.
Dengan mengubah mode 16 bit timer untuk menggunakan resolusi penuh, dikombinasikan dengan mengubah prescaler dan nilai TOP, Anda dapat mencapai frekuensi PWM yang sangat luas.
Frekuensi maksimum yang dapat Anda capai adalah clock / 4, dengan mengatur prescaler ke 1 dan TOP ke 3 dalam mode PWM cepat - nilai yang lebih rendah tidak diperbolehkan. Ini akan memberi Anda PWM 4 MHz dengan resolusi 2 bit. Itu bisa pada 0%, 25%, 50%, atau 75% dari waktu. Nilai TOP yang lebih tinggi akan memberikan Anda resolusi yang lebih tinggi pada frekuensi yang lebih rendah.
Untuk penjelasan yang lebih panjang baca artikel ini atau merujuk ke lembar data .
Mengubah prescaler, mode PWM, atau nilai TOP untuk timer0 akan berantakan millis()
dan micros()
.