Saya baru-baru ini memiliki beberapa alasan untuk mulai bereksperimen dengan PWM sendiri, dan menemukan bahwa (sebagaimana ditunjukkan oleh salah satu komentar) frekuensinya tampaknya berbeda dengan siklus tugas - aneh, bukan? Ternyata Broadcom menerapkan PWM "seimbang" agar pulsa PWM hidup dan mati didistribusikan secara merata. Mereka memberikan deskripsi algoritma dan beberapa diskusi lebih lanjut di halaman 139 dari lembar data mereka:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Jadi yang Anda inginkan adalah menempatkan PWM dalam mode mark-space, yang akan memberi Anda PWM tradisional (dan mudah diprediksi) yang Anda cari:
pwmSetMode(PWM_MODE_MS);
Sisa dari jawaban mengasumsikan kita berada dalam mode mark-space.
Saya juga melakukan beberapa percobaan dengan rentang nilai yang diijinkan untuk pwmSetClock()
dan pwmSetRange()
. Seperti disebutkan dalam salah satu jawaban lain, rentang yang valid untuk pwmSetClock()
tampaknya beralih dari 2 menjadi 4095, sedangkan rentang yang valid untuk pwmSetRange()
hingga 4096 (saya tidak berusaha menemukan batas bawah).
Rentang dan jam (nama yang lebih baik mungkin adalah pembagi) keduanya mempengaruhi frekuensi. Rentang ini juga memengaruhi resolusi, jadi meskipun dimungkinkan untuk menggunakan nilai yang sangat rendah, ada batas praktis seberapa rendah Anda mungkin ingin pergi. Misalnya, jika Anda menggunakan rentang 4, Anda bisa mencapai frekuensi yang lebih tinggi, tetapi Anda hanya akan dapat mengatur siklus tugas ke 0/4, 1/4, 2/4, 3/4 atau 4/4.
Jam Raspberry Pi PWM memiliki frekuensi dasar 19,2 MHz. Frekuensi ini, dibagi dengan argumen pwmSetClock()
, adalah frekuensi di mana penghitung PWM bertambah. Ketika penghitung mencapai nilai yang sama dengan rentang yang ditentukan, penghitung ulang ke nol. Sementara penghitung kurang dari siklus tugas yang ditentukan, output tinggi, jika tidak output rendah.
Ini berarti, jika Anda ingin mengatur PWM untuk memiliki frekuensi tertentu, Anda dapat menggunakan hubungan berikut:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
Jika Anda menggunakan nilai maksimum yang diizinkan untuk pwmSetClock()
dan pwmSetRange()
, Anda akan berakhir dengan frekuensi PWM perangkat keras minimum yang dapat dicapai ~ 1,14 Hz. Ini tentu akan memberikan kedipan yang terlihat (lebih banyak flash, sebenarnya) ke LED. Saya memang mengkonfirmasi persamaan di atas dengan osiloskop, dan tampaknya tahan. Batas frekuensi atas akan dipengaruhi oleh resolusi yang Anda butuhkan, seperti dijelaskan di atas.
pwmWrite()
. Bukan sesuatu yang saya harapkan akan terjadi