Neden bazı pimlerin farklı bir PWM frekansı var?


Yanıtlar:


23

PWM sinyalleri için mevcut olan sadece frekanslar bunlar değildir. Bununla birlikte, bunlar uygulanan ön ölçekleyicinin belirlediği frekanslardır (aşağıda ayrıntılı olarak kolayca değiştirebilirsiniz).

3 çift PWM iğnesinin her biri, her biri kendi temel frekansına sahip olan bir zamanlayıcıya aşağıdaki gibi bağlanır:

  • 5 ve 6 numaralı pimler 62500Hz taban frekansı ile timer0'da eşleştirilir
  • Pim 9 ve 10, 31250Hz taban frekansı ile zamanlayıcı1'de eşleştirilir
  • Pim 3 ve 11, 31250Hz taban frekansı ile zamanlayıcı2'de eşleştirilir

Daha sonra her bir pim setinde, seçilebilen ve bu pim çiftinin taban frekansını bölecek bir dizi ön ölçekleyici değeri bulunur. Mevcut ön ölçekleyici değerleri:

  • Pim 5 ve 6, 1, 8, 64, 256 ve 1024 ön ölçek değerlerine sahiptir
  • Pim 9 ve 10, 1, 8, 64, 256 ve 1024 ön ölçek değerlerine sahiptir
  • Pim 3 ve 11, 1, 8, 32, 64, 128, 256 ve 1024 için ön ölçek değerlerine sahiptir

Farklı kombinasyonlar, belirli bir PWM piminde farklı frekanslar verir. Zamanlayıcı 2'nin (pim 3 ve 11'e bağlı) daha fazla ön ölçekleyici değerine sahip olduğuna ve daha fazla frekansa neden olduğuna dikkat edin.

Şimdi, zamanlayıcı 2 neden farklı, bu ayrı bir soru.

Düzenleme: İşte pin başına olası PWM frekanslarının bir listesi ( bu makaleden ):

Pim 6 ve 5 için (OC0A ve OC0B):

  • TCCR0B = xxxxx001 ise, frekans 64kHz'dir
  • TCCR0B = xxxxx010 ise, frekans 8 kHz'dir
  • TCCR0B = xxxxx011 ise, frekans 1kHz'dir (bu Diecimila önyükleyicisinin varsayılanıdır)
  • TCCR0B = xxxxx100 ise, frekans 250Hz'dir
  • TCCR0B = xxxxx101 ise, frekans 62.5 Hz'dir

9, 10, 11 ve 3 pinleri için (OC1A, OC1B, OC2A, OC2B):

  • TCCRnB = xxxxx001 ise, frekans 32kHz'dir
  • TCCRnB = xxxxx010 ise, frekans 4 kHz'dir
  • TCCRnB = xxxxx011 ise, frekans 500Hz'dir (bu Diecimila önyükleyicisinin varsayılanıdır)
  • TCCRnB = xxxxx100 ise, frekans 125Hz'dir
  • TCCRnB = xxxxx101 ise, frekans 31,25 Hz'dir

TCCRnBzamanlayıcı için ön ölçekleyici bitlerini n, nayarlamak istediğiniz zamanlayıcıya bağlı olarak 0, 1 veya 2 ile değiştirdiğiniz yerdir . Bitsel işlemlerden hala emin değilseniz, bu bit matematik eğitimini okuyun .

Kaynaklarım:

Bu kaynaklarda, 9 ve 10 pinlerinin 5 ve 6 veya 3 ve 11 ile aynı davranışa sahip olup olmadıkları konusunda bir farklılık olduğu görülüyor, ancak yine de fikri anlıyorsunuz. Hangisinin doğru olduğunu ya da bunun panolar arasında bir fark olup olmadığını anlamak için veri sayfasını okuyorum.


1
Bu cevap hangi ATmega'ya atıfta bulunuyor? Kontrol etmedim, ama bahse girerim denetleyici başına biraz farklıdır.
jippie

@jippie İyi bir nokta! Kaynaklar ATmega168 ve 328'e atıfta bulunmaktadır.
Ricardo

@jippie Cevabımda, pin numaraları Uno kartında nasıl atandıklarını ifade eder (iğne 1, örneğin Dijital Pin 1 veya D1 anlamına gelir), IC'yi değil (ATmega328 pin 1 sıfırlanır).
Ricardo

1
İnanıyorum ki bu detaylar pano, Uno, Duemilanove, Mega, ... ile
değişiyor

@jippie Kesinlikle evet.
Ricardo

8

Tasarımla ilgili hususların farkında değilim, ancak Arduino'nuzdaki mikro denetleyicinin veri sayfasını kontrol ederseniz, PWM pinlerinin birlikte gruplandığını ve bir zamanlayıcıya bağlı grup başına olduğunu fark edeceksiniz. Bu zamanlayıcının artırılma hızı yapılandırılan ön ölçekleyiciye göre değişir. Belirli bir zamanlayıcı için ön ölçekleyiciyi değiştirirseniz, ilgili PWM pinleri için PWM frekansını değiştirirsiniz. Bazı zamanlayıcıların millis();işlev gibi diğer amaçlar için iki katına çıktığını düşünüyorum . Bu zamanlayıcı için ön ölçekleyiciyi değiştirirseniz, döndürülen değerler millis()aynı faktör tarafından kapatılır.

Ön ölçekleyici ayarını aşağıdaki gibi hesaplayabilirsiniz:

$$ \ text {prescaler} = \ dfrac {f_ {CPU}} {PWMresolution × f_ {PWM}} = \ dfrac {16 \ text {MHz}} {256 × 490} \ yaklaşık 128 $$

ölçekleyici = f [CPU] / (PWMresolution × f [PWM]) = 16000000 / (256 × 490) = yaklaşık 128.

Veri sayfasını kontrol edin ve 128'in gerçekten seçebileceğiniz ön ölçekleyici değerlerinden biri olduğunu göreceksiniz.


2
Evlat, MathJax'ı özlüyor muyuz? Umarım betadan sonra etkinleştiririz.
Ricardo

1
@Ricardo Tarayıcımda bir MathJax düğmesi var; o) meta.arduino.stackexchange.com/questions/13/…
jippie
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.