Saya menggunakan output PWM perangkat keras dengan wiringpi. Ini menyediakan fungsi pwmSetClock yang seharusnya memungkinkan untuk mengubah frekuensi. ( https://projects.drogon.net/raspberry-pi/wiringpi/functions/ ). Saya percaya karena defaultnya adalah 200 Mhz pengaturan pembagi ke 200000000 harus membuat LED terhubung ke output flash terlihat, tetapi itu tidak terjadi.
Bisakah ini diubah?
pwmWrite()
. Bukan sesuatu yang saya harapkan akan terjadiJawaban:
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:
Sisa dari jawaban mengasumsikan kita berada dalam mode mark-space.
Saya juga melakukan beberapa percobaan dengan rentang nilai yang diijinkan untuk
pwmSetClock()
danpwmSetRange()
. Seperti disebutkan dalam salah satu jawaban lain, rentang yang valid untukpwmSetClock()
tampaknya beralih dari 2 menjadi 4095, sedangkan rentang yang valid untukpwmSetRange()
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:
Jika Anda menggunakan nilai maksimum yang diizinkan untuk
pwmSetClock()
danpwmSetRange()
, 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.sumber
Menurut rumus ini:
Kita dapat mengatur
pwmClock=1920
danpwmRange=200
mendapatkanpwmFrequency=50Hz
:Saya mengujinya di alarmpi:
Catatan: Servo saya mengharapkan sinyal 50Hz .
sumber
Ini adalah kode yang saya gunakan. Saya mencoba melihat apa yang akan berubah ketika saya mengubah pengaturan.
Dari apa yang saya uji, tampaknya pembagi beralih dari 2 ke beberapa nomor kurang dari 5.000. Saya kira itu ada hubungannya dengan representasi biner dari angka-angka yang sedang diatur secara langsung dalam register. Setelah representasi angka biner memiliki lebih banyak bit daripada yang bisa diambil register, hanya perlu bit pertama dan menafsirkan angka dengan cara itu. Itulah mengapa perilaku aneh itu muncul ketika pergi dari 4000 ke 5000.
sumber