Arduino PWM Sırları

Darbe genişliği modülasyonu (PWM), Arduino’da çeşitli şekillerde uygulanabilir.

Bu yazıda PWM kaydedicilerinin, doğrudan görev döngüsü ve frekans üzerinde daha fazla kontrol sağlanması için nasıl kullanılacağı basit PWM teknikleri ile anlatılmaktadır.

Bu konu hazırlanırken, ATmega168 veya ATmega328 işlemcileri kullanan Arduino board modelleri üzerinde durulmuştur.

 

Darbe Genişlik Modülasyonu hakkında birşey bilmiyorsanız, önce buraya bir göz atın.  Kısaca bir PWM sinyali; frekansı sabit olan bir dijital kare dalga olup, sinyalin ON durumunda ( 1 ) olduğu zamanın (buna görev döngüsü – duty cycle- denir) bir bölümü %0 ile %100 arasında ayarlanabilir.

PWM’in çeşitli kullanım alanları vardır:

  • LED prlaklığının ayarlanması
  • Bir analog voltaj çıkışı sağlama; eğer bir dijital çıkış süzülürse, % 0 ila% 100 arasında bir analog voltaj sağlayacaktır.
  • Ses sinyalleri üretme.
  • Motorlar için değiştirilebilir hız kontrolü sağlamak.
  • Modüle edilmiş bir sinyal üretmek, örneğin uzaktan kumanda için bir kızıl ötesi LED sürmek.

AnalogWrite ile Basit Darbe Genişlik Modülasyonu

Arduino’nun programlama dili PWM’in kullanımı kolaylaştırıyor; sadece analogWrite (pin, dutyCycle); fonksiyonunu kullanarak bunu yapabilirsiniz, buradaki dutyCycle değeri 0’dan 255’e kadar verilen bir değerdir ve pin ile belirtilen değişken PWM pinlerinden biridir ( Arduino Uno’da3, 5, 6, 9, 10 veya 11 numaralı pinler). analogWrite fonksiyonu, donanım PWM’ine basit bir arayüz sağlar, ancak frekans üzerinde herhangi bir kontrol sağlamaz. (Fonksiyon isminin analogWrite olmasına rağmen, çıktı genellikle dijital dalga olarak adlandırılan bir dijital sinyaldir.)

Muhtemelen okuyucuların% 99’u burada durabilir ve sadece analogWrite’ı kullanabilir, ancak daha fazla esneklik sağlayan diğer seçenekler de vardır.

Bit-darbeli Darbe Genişlik Modülasyonu

İstenen zamanlarda pini tekrar tekrar açarak ve kapatarak, PWM’i herhangi bir dijital pinde “manuel” olarak uygulayabilirsiniz. Örneğin;

int duty_suresi=100;

void setup()
{
  pinMode(13, OUTPUT);
}

void loop()
{
  digitalWrite(13, HIGH);
  delayMicroseconds(duty_suresi);       // Yaklşık olarak 10% duty cycle @ 1KHz
  digitalWrite(13, LOW);
  delayMicroseconds(1000  duty_suresi);
}

Yukarıdaki örnekte duty_suresi isimli değişken, 13 nolu çıkış pininin dutyCycle zamanını belirliyor. bu nedenle pin 100uS ON konumunda olacağından dolayı 1KHz frekanslı yaklaşık %10 duty cycle lık bir PWM sinyali elde etmiş olacağız.

Bu teknik, herhangi bir dijital çıkış pinini kullanabilme avantajına sahiptir. Ayrıca, görev döngüsünü ve frekansını tam kontrol edersiniz. Bir büyük dezavantaj ise; herhangi bir kesme meydana gelmesi zamanlamayı etkiler, kesmeleri devre dışı bırakmadığınız sürece önemli zaman gecikmesine neden olabilir. İkinci bir dezavantaj, işlemci başka bir iş yaparken PWM uyguladığınız çıkışı çalışır durumda bırakamamanızdır. Sonuç olarak, bu yöntemle belirli bir görev çevrimi ve frekans için uygun sabitler belirlemek zordur.

Tüm pinleden manuel olarak PWM çıkışı elde etmenin daha ayrıntılı bir örneği burada bulunabilir.

ATmega PWM kayıtçılarını (registerlerini) doğrudan kullanmak

ATmega168P / 328P çipinde 6 PWM çıkışını kontrol eden üç PWM zamanlayıcı bulunur. Çipin zamanlayıcı kayıtçılarını doğrudan idare ederek, analogWrite işlevinin sağladığıdan daha fazla denetim elde edebilirsiniz.

AVR ATmega328P veri sayfası, PWM zamanlayıcılarının ayrıntılı bir açıklamasını sağlar, ancak zamanlayıcıların birçok farklı kontrol ve çıkış modları nedeniyle, veri sayfası anlaşılması zor olabilir. Aşağıda anlatılanlar bu zamanlayıcıların kullanılmasını basitçe anlatmaktadır.

Atmega 168/328 zamanlayıcıları.

ATmega328P, Zamanlayıcı 0, Zamanlayıcı 1 ve Zamanlayıcı 2 olarak bilinen üç zamanlayıcıya sahiptir. Her zamanlayıcı, zamanlayıcıya ait iki çıkış için PWM genişliğini kontrol eden iki çıkış karşılaştırma kaydedicisine sahiptir: zamanlayıcı karşılaştırma kaydedicisi değerine ulaştığında, karşılık gelen çıkış değiştirilir(terslenir). Her bir zamanlayıcı için iki çıkış normalde aynı frekansa sahip olacaktır, ancak farklı dutyCycle’ları olabilir (ilgili çıktı karşılaştırma kaydedicisine bağlı olarak).

Zamanlayıcıların her biri, sistem saatini 1, 8, 64, 256 veya 1024 gibi bir ön ölçek faktörüne bölerek zamanlayıcı saati üreten bir önşartlayıcı (prescaler) içerir.

Arduino’nun 16MHz’lik bir sistem saati vardır ve zamanlayıcı saat frekansı, sistem saat frekansının ön ölçek faktörüne bölünmesi olacaktır.

Zamanlayıcı 2’nin diğer zamanlayıcılardan farklı ön ayar değerleri bulunduğunu unutmayın.

Zamanlayıcılar birkaç farklı mod nedeniyle karmaşıktır. Ana PWM modları aşağıda açıklanacak olan “Fast PWM” ve “Phase-correct PWM” dir. Zamanlayıcı, 0 ile 255 arası veya 0 ile başka bir sabit bir değer arasında çalışabilir. (16 bitlik Zamanlayıcı 1, 16 bit’e kadar zamanlayıcı değerlerini destekleyen ek modlara sahiptir.) Her çıkış ters çevrilebilir.

Zamanlayıcılar ayrıca taşma ve / veya çıkış karşılaştırma kayıtçısına karşı eşleşmelerde kesmeler oluşturabilirler, ancak bu, bu makalenin kapsamı dışındadır.

Zamanlayıcı Kayıtçıları

Her zamanlayıcıyı kontrol etmek için birçok kayıtçı kullanılır. Zamanlayıcı / Sayıcı Kontrol Kayıtçıları TCCRnA ve TCCRnB zamanlayıcı için ana kontrol bitlerini tutar. (TCCRnA ve TCCRnB’nin A ve B çıkışlarına karşılık gelmediğine dikkat edin) Bu kayıtçılar birkaç bit grubu tutar:

  • Dalga Şekli Üretme Modu bitleri (WGM): bunlar zamanlayıcıya ait genel modu kontrol eder.(Bu bitler TCCRnA ile TCCRnB arasında bölünmüştür.)
  • Saat Seçme bitleri (CS): bunlar saat önşartlayıcıyı (prescaler) kontrol eder
  • A Modu bitlerini Karşılaştırma Eşleştirme Çıktısı (COMnA): bu A çıkışını etkinleştirme / devre dışı bırakma / ters çevirme işlemleri yapar
  • B Modu bitlerini Karşılaştırma Eşleştirme Çıktısı (COMnB): bu B çıkışını  etkinleştirme / devre dışı bırakma / ters çevirme işlemleri yapar

Çıkış Karşılaştırma Kayıtçıları OCRnA ve OCRnB, A ve B çıkışlarının hangi düzeyde etkileneceğini  ayarlar. Zamanlayıcı değeri kayıtçı değeri ile eşleştiğinde ilgili çıkış, Mod tarafından belirtildiği gibi değiştirilecektir.

Bitler her zamanlayıcı için birbirinde biraz farklıdır, bu nedenle ayrıntılar için veri sayfalarına bakınız. Zamanlayıcı 1, 16 bit zamanlayıcı ve ek modlara sahiptir. Zamanlayıcı 2, farklı ön-ölçekleme değerlerine sahiptir.

Fast PWM

En basit PWM modudur, zamanlayıcı zaman zaman 0’dan 255’e kadar sayar. Zamanlayıcı 0 olduğunda çıkış yüksek konuma gelir (ON) ve zamanlayıcı çıkış karşılaştırma kayıtçısıyla eşleştiğinde alçak konuma gelir (OFF). Çıkış karşılaştırma kayıtçısındaki değer ne kadar yüksek olursa, çalışma çevrimi (duty cycle) o kadar yüksek olur. Bu mod, Hızlı PWM Modu olarak bilinir. Aşağıdaki diyagram, OCRnA ve OCRnB’nin belirli iki değerinin çıktılarını göstermektedir. Her iki çıkışın da aynı frekansta olduğunu ve tam zamanlayıcı döngüsünün frekansıyla eşleştiğini unutmayın.

pwm2

Fast PWM Mode

Aşağıdaki kod parçası, pin 3 ve 11’de (Zamanlayıcı 2) hızlı PWM ayarlar. Kayıtçı ayarlarını özetleeyecek olursak; WGM (Waveform Generation Mode) dalga formu oluşturma modu bitlerinin 011’ye ayarlanması ile hızlı PWM modu seçilir. COM2A bitlerinin ve COM2B bitlerinin 10’a ayarlanması ile, A ve B çıkışları için ters çevrilmemiş PWM sağlar. CS bitlerini 100 olarak ayarlamak, saati 64’e bölmek için önşartlayıcıyı (prescaler) ayarlar. (Bitler farklı zamanlayıcılar için farklı olduğundan, Doğru değerler için veri sayfasına bakınız .) Çıkış karşılaştırma kayıtçıları, A ve B çıkışlarının PWM görev döngüsünü kontrol etmek için keyfi olarak 180 ve 50’ye ayarlanır (Tabii ki pin modunu kullanmak yerine kayıtları doğrudan değiştirebilirsiniz, ancak pinleri çıkış olarak ayarlamanız gerekir .)

(Aşağıdaki ayarlar Timer2 için yapılmış olan ayarlardır. Bu kayıtçılar ile ilgili gerekli bilgiler Atmega329P datasheetinde detaylıca anlatılmıştır. )

pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
  TCCR2B = _BV(CS22);
  OCR2A = 180;
  OCR2B = 50;

Arduino Duemilanove’da bu değerler şu şekildedir:

Çıkış A frekansı: 16 MHz / 64/256 = 976.5625Hz
Çıktı Bir görev döngüsü: (180 + 1) / 256 =% 70.7
Çıkış B frekansı: 16 MHz / 64/256 = 976.5625Hz
Çıkış B görev çevrimi: (50 + 1) / 256 = 19.9%

Çıkış frekansı; 16MHz olan sistem saat frekansı, ön şartlayıcı değeri (64) ile zamanlayıcıyı tam olarak doldurmak için gerekli olan 256 tur sayısına bölümü ile tekrar bölünerek elde edilmiştir. Hızlı PWM’in; Çıkışı, karşılaştırma kayıtçısı değerinden bir tur daha uzun süre ON durumunda tuttuğunu unutmayın.

Phase-Correct PWM

İkinci PWM moduna faz-doğrultma PWM denir. Bu modda zamanlayıcı, 0’dan 255’e kadar sayar ve sonra tekrar 0’a geri gelir. Zamanlayıcı yukarı sayarken, çıkıştaki çıkış karşılaştırma kayıtçısı değerine isabet ettiği anda kapanır (OFF) ve zamanlayıcı aşağı yönde sayarken çıkış karşılaştırma kaydı değerinisabet ettiğinde ise tekrar açar (ON). Sonuç daha simetrik bir çıktı verir. Çıkış frekansı, hızlı PWM modu değerinin yaklaşık yarısı olacaktır, çünkü zamanlayıcı yukarı ve aşağı yönlerde çalışır.

pwm3[1]

Phase-Correct PWM Örneği

Aşağıdaki kod parçası, pim 3 ve 11’de (Zamanlayıcı 2) faz-doğrultma PWM’i kurar. WGM dalga formu oluşturma mod bitleri, faz-doğrultma PWM için 001 olarak ayarlanır. Diğer bitler hızlı PWM ile olduğu gibi aynıdır.

pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A1) | _BV(COM2B1) | _BV(WGM20);
  TCCR2B = _BV(CS22);
  OCR2A = 180;
  OCR2B = 50;

Arduino Duemilanove’da bu değerler şu şekildedir:

Çıkış A frekansı: 16 MHz / 64/255/2 = 490.196Hz
Çıktı Bir görev döngüsü: 180/255 =% 70.6
Çıkış B frekansı: 16 MHz / 64/255/2 = 490.196Hz
Çıkış B görev çevrimi: 50/255 = 19.6%

Faz-doğrultma PWM, hızlı PWM ile karşılaştırıldığında frekansı ikiye böler, çünkü zamanlayıcı yukarı ve aşağı yönde gider. Burada frekans 256 yerine 255 ile bölünmüştür ve görev döngüsü hesaplamalarına hızlı PWM’de olduğu gibi bir tane eklenmez. “Off-by-one” başlığı altındaki açıklamaya bakın.

Zamanlayıcı üst limitinin Ayarlanması: hızlı PWM

Hem hızlı PWM hem de faz-doğrultma PWM, çıkış frekansını kontrol eden ek bir moda sahiptir. Bu modda zamanlayıcı, 0’dan 255’e değil 0’dan OCRA’ya (çıkış karşılaştırma kayıtçısı A’nın değeri) sayar. Bu özellik, çıkış frekansı üzerinde önceki modlara göre çok daha fazla kontrol sağlamamıza izin verir. (Daha fazla frekans kontrolü için, 16 bitlik Zamanlayıcı 1’i kullanın.)

 

Bu modda, PWM için sadece B çıkışı kullanılabilir. OCRA hem üst değer hem de PWM karşılaştırma değeri olarak kullanılamaz.

Bununla birlikte, bu durumda her döngünün sonunda çıkış A’ya geçerek, sabit bir% 50 görev döngüsü ve yarı frekans üreten özel durum modu olan “Karşılaştırma Eşleşmesinde OCnA’ya Geçiş Yap” modu vardır. Örneklerde bu mod kullanılacaktır.

Aşağıdaki şemada, zamanlayıcı OCRnA ile eşleştiğinde sıfırlanır ve OCnB için önceki diyagramlardan daha hızlı bir çıkış frekansı verir. OCnA’nın her zamanlayıcı resetlemesinde bir kez nasıl geçiş yaptığını unutmayın.

pwm4[1]

OCRA tepede iken Hızlı PWM Modu

Aşağıdaki kod parçası, zamanlayıcı için OCR2A’yı en üst değer olarak kullanarak, 3 ve 11 numaralı pinlere (Zamanlayıcı 2) hızlı PWM ayarlar. WGM dalga formu üretme modu bitleri, OCRA üst limiti kontrol eden hızlı PWM için 111’e ayarlanır. OCR2A üst sınırı keyfi olarak 180’e ayarlanır ve OCR2B karşılaştırma kaydı keyfi olarak 50’ye ayarlanır. OCR2A’nın modu, COM2A bitlerini 01 olarak ayarlayarak “Karşılaştırma Eşleşmesinde Geçiş Yap” seçeneğine ayarlanır.

pinMode(3, OUTPUT);
pinMode(11, OUTPUT);
TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM21) | _BV(WGM20);
TCCR2B = _BV(WGM22) | _BV(CS22);
OCR2A = 180;
OCR2B = 50;

Arduino Duemilanove’da bu değerler şu şekildedir:

Çıkış Bir frekans: 16 MHz / 64 / (180 + 1) / 2 = 690.6Hz
Çıkış Bir görev döngüsü:% 50
Çıkış B frekansı: 16 MHz / 64 / (180 + 1) = 1381.2 Hz
Çıkış B görev çevrimi: (50 + 1) / (180 + 1) =% 28.2

Bu örnekte zamanlayıcı,  0’dan 180’e giderken 181 saat çevrimi sürdüğü için; bu nedenle çıktı frekansı 181’e bölünür. Zamanlayıcı döngüsünün her tamamlanmasında bir kez “Karşılaştırma Eşleşmesi Modu” Çıkışı A’yı değiştirir. Bu yüzden Çıkış A, Çıkış B frekansının yarısına sahiptir.

Zamanlayıcı üst limitinin Ayarlanması: Phase-Correct PWM

Benzer şekilde zamanlayıcı, OCRnA’ya ulaştığında sıfırlanması için faz-doğrultma PWM modunda yapılandırılabilir.

pwm5[1]

OCRA tepede iken Faz-Doğrultma PWM

Aşağıdaki kod parçası, OCR2A’yi zamanlayıcı için en üst değer olarak kullanarak 3 ve 11 numaralı pinlere (Zamanlayıcı 2) faz-doğrultma PWM’i ayarlar. WGM dalga formu üretme modu bitleri, OCRA üst limiti kontrol eden faz-doğrultma PWM için 101’e ayarlanır. OCR2A üst sınırı keyfi olarak 180’e ayarlanır ve OCR2B karşılaştırma kayıtçısı keyfi olarak 50’ye ayarlanır. OCR2A’nın modu, COM2A bitlerini 01 olarak ayarlayarak “Karşılaştırma Eşleşmesinde Geçiş Yap” seçeneğine ayarlanır.

pinMode(3, OUTPUT);
  pinMode(11, OUTPUT);
  TCCR2A = _BV(COM2A0) | _BV(COM2B1) | _BV(WGM20);
  TCCR2B = _BV(WGM22) | _BV(CS22);
  OCR2A = 180;
  OCR2B = 50;

Arduino Duemilanove’da bu değerler şu şekildedir:

Çıkış A frekansı: 16 MHz / 64/180/2/2 = 347.2Hz
Çıkış Bir görev döngüsü:% 50
Çıkış B frekansı: 16 MHz / 64/180/2 = 694.4 Hz
Çıkış B görev çevrimi: 50/180 =% 27.8

Bu örnekte zamanlayıcı, 0’dan 180’e gider ve tekrar 0’a döner. Bu işlem 360 saat palsı sürer . Böylece, (her şeyi 181’e bölen hızlı PWM durumundan farklı olarak) herşey 180 ya da 360’a bölünür ; Ayrıntılar için aşağıya bakın.

Off-by-one

Hızlı PWM ve faz-doğrultma PWM’in birbirlerine göre ayrı ayrı olduğunu fark etmişsinizdir, 255’e karşı 256’ya bölünmüş ve çeşitli yerlerde bir tane eklenmiştir. Bunu biraz detaylandırırsak;

Zamanlayıcının, hızlı PWM moduna ayarlı ve OCRnA değerini  de 3’e kadar saymaya ayarlandığını varsayalım. Zamanlayıcı, 0123-0123-0123 değerlerini sürekli olarak alacaktır … Bu şekilde saydığında zamanlayıcı döngüsünde 4 saat devirinin olduğunu unutmayın. Böylece frekans, 3 değil 4 ile bölünecektir. Çıkış; 0, 1, 2, 3 olarak sayarken 4 periyod boyunca yüksek olduğundan, görev çevrimi % 25’lik bir çarpı olacaktır. Aynı şekilde, zamanlayıcı 255’e kadar sayarsa, her zamanlayıcı çevriminde 256 saat devir olacaktır ve görev çevrimi 1/256’nın katları olacaktır.

Özetlemek gerekirse, hızlı PWM N + 1 ile böler; burada N, maksimum zamanlayıcı değeri (OCRnA veya 255) ‘dir.

Şimdi, faz-doğrultma PWM modunu, OCRnA değerinin 3’e kadar sayan zamanlayıcı ile düşünün. Zaman değerleri 012321012321 olacaktır … Her zamanlayıcı döngüsünde (012321) 6 saat devir vardır. Böylece frekans 6 ile bölünecektir. Çıkış; 6 çevrimin 0, 2, 4 veya 6 için yüksek olabildiğinden, görev çevrimi% 33’ün katı olacak. Aynı şekilde, zamanlayıcı 255’e kadar sayılır ve geri çekilirse, her zamanlayıcı çevriminde 510 saat devir olacaktır ve görev döngüsü 1/255’lik bir çarpı olacaktır.

Özetlemek gerekirse, faz-doğrultma PWM, 2N ile bölünür, burada N maksimum zamanlayıcı değeridir.

İkinci önemli zamanlama farkı, hızlı PWM’in, çıkışı; çıkış karşılaştırma kayıtçısı değerinden daha uzun bir çevrim süresince yüksek tuttuğudur. Bunun nedeni, hızlı PWM sayımının 255’e kadar olmasıdır. Görev çevrimi 0 ila 256 devir arasında olabilir, ancak çıkış karşılaştırma kayıtçısı yalnızca 0 ila 255 arasında bir değeri barındırabilir. Eksik değere ne olur? Hızlı PWM modu, çıkış karşılaştırma kayıtçısı N olarak ayarlandığında, çıkışı N + 1 çevrim süresince yüksek (ON) tutar. Öyleyse çıkış karşılaştırma kaydedicisi için 255 değeri, % 100 görev döngüsü demektir. Ancak çıkış karşılaştırma kayıtçısı için 0 değeri %0 görev döngüsü demek değildir ancak 1/256 görev döngüsü demektir. Bu, 255’lik bir kayıtçı değeri % 100 görev döngüsü ve 0’lık kayıtçı değeri için % 0’lık bir görev döngüsü olan faz-doğrultma PWM’den farklıdır.

Zamanlayıcılar ve Arduino

Arduino, çıkış pinlerinin bir alt kümesi üzerinde PWM’i desteklemektedir. Hangi zamanlayıcının hangi çıkışı kontrol ettiği hemen belli olmayabilir, ancak aşağıdaki tablo durumu açıklığa kavuşturacaktır. Tablo her bir zamanlayıcı çıkışı için Arduino’daki çıkış pini numarası (diğer bir deyişleboarda üzerindeki pin numarası), ATmega çipi üzerindeki pin numarası ve çıkış bağlantı port noktasının adı ve biti verilir. Örneğin Zamanlayıcı 0 çıkışı OC0A, Arduino çıkış pini 6’ya bağlanır; PD6 olarak da bilinen çip pini 12’yi kullanır.

Zamanlayıcı çıkışı                    Arduino çıkışı                  Chip pin                   Pin adı

OC0A                                                      6                                    12                            PD6
OC0B                                                      5                                    11                            PD5
OC1A                                                      9                                    15                            PB1
OC1B                                                      10                                  16                            PB2
OC2A                                                      11                                   17                           PB3
OC2B                                                       3                                    5                             PD3

Arduino, zamanlayıcıların bazılarını kendisi başlatır ve hazırlar. Arduino, saati 64’e bölmek için her üç zamanlayıcıda hazırlayıcıyı başlatır. Zamanlayıcı 1 ve Zamanlayıcı 2, Faz-Doğrultma PWM’i için başlatılıp hazırlanırken, Zamanlayıcı 0 ise Hızlı PWM’e göre başlatılır. Ayrıntılar için Arduino kaynak dosyası wiring.c’ye bakın.

Arduino, Timer 0 zamanlayıcısını millis () ve delay () fonksiyonları için dahili olarak kullanır, bu nedenle bu zamanlayıcı frekansının değiştirilmesinin bu işlevlerin hatalı olmasına neden olacağı konusunda bilinçli olunmalıdır. Gerçi frekansı değiştirmezseniz, PWM çıkışlarını kullanmak sorun olmayacaktır.

analogWrite (pin, duty_cycle) fonksiyonu, uygun pini PWM’e göre ayarlar ve uygun çıkış karşılaştırma kayıtçısını, (zamanlayıcı 0’daki görev döngüsü için özel durum ile) görev-döngüsüne ayarlar. digitalWrite () fonksiyonu zamanlayıcı ile ilgili bir pin üzerinde çağrıldığında PWM çıkışını kapatır. İlgili kodlar, wiring_analog.c ve wiring_digital.c ‘dedir.

Analog Write (5, 0) kullanırsanız, pin 5’in zamanlayıcısı (Zamanlayıcı 0) hızlı PWM kullansa bile% 0 bir görev döngüsü elde edersiniz. Yukarıda açıklandığı gibi hızlı bir PWM değeri olan 0  1/256’lık bir görev çevrimi verirse, bu nasıl olabilir? Cevap, analogWrite’ın “hile” yapmasıdır; Timer 0’da duty_cycle 0 ile çağrıldığında pin’i hemen kapatmak için özel durum kodu bulunur. Sonuç olarak Timer0’da analogWrite’ı kullandığınızda 1/256 görev döngüsü kullanılamaz ve gerçek duty_cycle için  0 ve 1 değerleri arasındaki bir atlama oluşur.

 Bazı ipuçları:

  • Herhangi bir çıkıştan PWM elde etmek için , pini hem çıkış olarak ayarlamalı hem de pindeki PWM modunu etkinleştirmelisiniz. Yani pinMode () yapmanız ve COM bitlerini ayarlamanız gerekir.
  • Farklı zamanlayıcılar, kontrol bitlerini ve prescaleri farklı şekilde kullanır uygun zamanlayıcı için datasheetine bakın.
  • Çalışmasını bekleyebileceğiniz bazı bit kombinasyonları ayrılmıştır,
    yani onları kullanmaya kalkarsanız çalışmazlar.
    Örneğin, geçiş modu, 255’lik hızlı PWM ile veya çıkış B ile çalışmaz.
  • Bitlerin düşündüğünüz gibi ayarlandığından emin olun. Bit işlemleri karışık olabilir,bu nedenle, kayıtçı değerlerini ikili (BIN) formatlayıcı ile yazdırabilirsiniz ve ayarladığınız değerin istediğiniz gibi olduğundan emin olun.
  • Doğru çıkış pinlerini kullandığınızdan emin olun. Yukarıdaki tabloya bakın.
  • Muhtemelen, çıkış pini üzerindeki istenmeyen parazitleri önlemek için bir ayırma kondansatörü (coupling capacitor) kullanabilirsiniz.

Birisi “Arduino PWM Sırları” üzerinde düşündü

Yorum bırakın