Geçenlerde PWM ile kendim denemeye başlamak için bazı nedenlerim vardı ve (yorumlardan birinin işaret ettiği gibi) sıklığın görev döngüsüne göre değiştiğini gördüm - bizzare, değil mi? Broadcom’un, PWM sinyallerini mümkün olduğu kadar eşit bir şekilde dağıtmak için “dengeli” PWM kullandığı ortaya çıktı. Algoritmanın açıklamasını ve veri sayfalarının 139. sayfasında daha fazla tartışmayı veriyorlar:
http://www.element14.com/community/servlet/JiveServlet/downloadBody/43016-102-1-231518/Broadcom.Datasheet.pdf
Yani gerçekte istediğin şey, PWM'yi aradığın geleneksel (ve kolayca tahmin edilebilir) PWM'yi verecek olan işaret boşluğu moduna koymak.
pwmSetMode(PWM_MODE_MS);
Cevabın geri kalanı işaret boşluğu modunda olduğumuzu varsayıyor.
Ayrıca bazı değerleri izin verdiği aralıkta deneme yaptım pwmSetClock()
ve pwmSetRange()
. Diğer cevaplardan birinde belirtildiği gibi, geçerli aralık pwmSetClock()
2 - 4095 arasındadır, geçerli aralık pwmSetRange()
4096'ya kadar çıkmaktadır (daha düşük bir limit bulmaya çalışmadım).
Aralık ve saat (daha iyi bir isim muhtemelen bölen) her ikisi de frekansı etkiler. Bu aralık aynı zamanda çözünürlüğü de etkiler, bu nedenle çok düşük değerler kullanmak mümkün olsa da, muhtemelen ne kadar düşük gitmek istediğinize ilişkin pratik bir sınırlama vardır. Örneğin, 4 aralığını kullandıysanız, daha yüksek frekanslar elde edebilirsiniz, ancak görev döngüsünü yalnızca 0/4, 1/4, 2/4, 3/4 veya 4/4 olarak ayarlayabilirsiniz.
Ahududu Pi PWM saat 19.2 MHz'lik bir temel frekansa sahiptir. Argümanla bölünen bu frekans, pwmSetClock()
PWM sayacının artırıldığı frekanstır. Sayaç belirtilen aralığa eşit bir değere ulaştığında, sıfıra sıfırlar. Sayaç belirtilen görev döngüsünden az olsa da, çıkış yüksektir, aksi halde çıkış düşüktür.
Bu, eğer PWM'yi belirli bir frekansa ayarlayacaksanız, aşağıdaki ilişkiyi kullanabilirsiniz:
pwmFrequency in Hz = 19.2e6 Hz / pwmClock / pwmRange.
İçin izin verilen en yüksek değerleri kullanmak ise pwmSetClock()
ve pwmSetRange()
, sen ~ 1.14 Hz minimum elde donanım PWM frekansı ile sona erecek. Bu kesinlikle bir LED'e gözle görülür bir titreme (daha çok flaş) verir. Yukarıdaki denklemi bir osiloskopla onayladım ve öyle görünüyor. Üst frekans sınırı, yukarıda açıklandığı gibi ihtiyacınız olan çözünürlükten etkilenir.
pwmWrite()
.