Berapa frekuensi output PWM di Arduino

22

Berapa frekuensi yang digunakan Arduino untuk PWM normal ketika Anda menggunakan analogWrite ()?

Dan apakah ini berbeda untuk model Arduino yang berbeda? Saya tertarik secara khusus pada Mega 2560, tetapi juga ingin tahu apakah itu konsisten antara model.

Saya telah melihat referensi yang lewat ke Arduino menggunakan 500 Hz, yang tampaknya sangat lambat.

Duncan C
sumber
Itu juga tergantung pada pin yang Anda gunakan.
Gerben

Jawaban:

31

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().

user2973
sumber
1
Saya mengumpulkan, kemudian, bahwa frekuensi tercepat yang bisa Anda dapatkan untuk PWM adalah 16Mhz / 256 (prescaler = 1), atau 62,5Khz?
Duncan C
Dan lebih lanjut bahwa frekuensi PWM harus menjadi faktor genap 62.5KHz? Seseorang di utas lain ingin mengontrol kecepatan kipas kipas PC 4-pin. Tampaknya ia menginginkan sinyal kontrol PWM 25KHz. 62.5 / 25 adalah 2.5, yang bukan merupakan nilai integer.
Duncan C
Saya memperbarui jawaban untuk menguraikan lebih lanjut tentang kemungkinan mencapai frekuensi tertentu,
user2973
Pada ujung frekuensi rendah, Anda dapat melakukan prescale timer 16 bit dalam mode fase-benar oleh prescaler 1024 untuk mendapatkan 16e6 / 1024/2 ^ 16/2 = 0,119Hz, atau 7,1 siklus / menit. Untuk yang lebih rendah dari itu, kita perlu beralih bit berdasarkan sesuatu seperti millis (). Atau mungkin memicu penghitung pada pin input eksternal T ?.
Dave X