3.13. PWM ve bir RC filtresiyle analog üretme¶
ADC, bir pin üzerindeki voltajları okur. Bunun tersi – bir pin üzerinde 0 V ile Vcc arasında bir ara voltaj üretmek – daha zordur, çünkü bir GPIO çıkışı yalnızca kendi iki rayını sürmeyi bilir. Standart yedek çözüm, pini raylar arasında ortalama voltaj istediğiniz değer olacak kadar hızlı bir şekilde anahtarlamaktır.
3.13.1. Darbe genişlik modülasyonu¶
Darbe genişlik modülasyonlu (PWM) bir sinyal, sabit bir frekansta, yüksek süresi – her döngünün toprak yerine Vcc’de geçirilen kesri – yazılımda ayarlanan bir kare dalgadır. Bu kesir görev döngüsüdür (duty cycle). Dalga biçiminin ortalama voltajı, görev döngüsü çarpı Vcc’dir:
V_avg = duty × Vcc
%25 görev döngüsü ortalama olarak Vcc / 4 verir; %50 görev döngüsü Vcc / 2 verir; %75 görev döngüsü 3 × Vcc / 4 verir.
%25, %50 ve %75 görev döngüsünde PWM. Ortalama voltaj, görev döngüsünü izler.¶
Frekans, PWM yapılandırıldığında ayarlanır; görev döngüsü ise yazılımın anında değiştirdiği şeydir. machine.PWM sınıfı, dalga biçimini CPU yardımı olmadan üreten bir donanım zamanlayıcı kanalını sarmalar – bir kez yapılandırıldığında, sinyal değiştirilene kadar seçilen frekans ve görev döngüsünde devam eder.
3.13.2. machine.PWM sınıfı¶
Bir PWM örneğini pin ve başlangıç frekansı ile görev döngüsüyle oluşturun:
from machine import PWM, Pin
pwm = PWM(Pin("P7"), freq=20_000, duty_u16=32768)
Bu, P7 pininde %50 görev döngüsünde 20 kHz’lik bir kare dalga başlatır. İki metot çıkışı anında değiştirir:
pwm.duty_u16(16384) # change to 25 % (16384 / 65535)
pwm.freq(5_000) # change to 5 kHz
duty_u16(), 0 değerini “her zaman alçak” ve 65535 değerini “her zaman yüksek” olarak eşleyen işaretsiz 16 bitlik bir tam sayı alır. freq(), taşıyıcı frekansını hertz cinsinden ayarlar.
Not
Aynı donanım zamanlayıcısındaki her PWM kanalı, frekansını paylaşır. Bir kanalda freq() çağrılması, o zamanlayıcıya bağlı diğer her kanalı değiştirir. Çıkışların farklı frekanslarda çalışması gerektiğinde farklı zamanlayıcıların kanallarını kullanın.
Çıkış artık gerekmediğinde zamanlayıcı kanalını serbest bırakmak için deinit() metodunu çağırın.
3.13.3. Bir RC alçak geçiren filtreyle ortalama alma¶
Ham PWM yumuşak bir voltaj değildir; ortalaması istediğimiz şey olan bir kare dalgadır. Bu ortalamayı çıkarmak için PWM’yi alçak geçiren bir filtreden geçirin – Sıçrama Önleme (Debouncing) belgesinde anahtar sıçrama önlemede kullanılan aynı direnç ve kapasitör kombinasyonu.
Bir RC alçak geçiren filtre üzerinden PWM: kapasitör, kare dalgayı görev döngüsüyle orantılı bir DC voltaja ortalar.¶
Filtrenin kesim frekansı – geçirdiği frekanslar ile engellediği frekanslar arasındaki sınır – sıçrama önleme devresine zaman sabitini veren aynı RC çarpımıyla ayarlanır:
f_c = 1 / (2π × R × C)
Filtrenin bir PWM girişinden temiz bir DC voltaj çıkarması için kesim frekansının PWM frekansının kendisinden çok daha düşük olması gerekir. DC bileşeni (frekans 0) değişmeden geçer; PWM’nin temel harmoniği (PWM frekansında) kabaca f_c / f_PWM oranında zayıflatılır. 1 / 200 oranı, çıkıştaki kalıntı dalgalanmayı giriş salınımının yaklaşık 0.5 % değerine düşürür.
Yavaş değişen bir ayar noktası için makul bir başlangıç noktası:
PWM frekansı
f_PWM = 20 kHz– sesin oldukça üzerinde ve zamanlayıcının temiz bir şekilde üretmesi kolay.Filtre değerleri
R = 1.6 kΩ,C = 1 µF–f_c = 1 / (2π × 1.6 kΩ × 1 µF) ≈ 100 Hzverir.
Taşıyıcıda 200× bastırma, PWM’nin tam salınımını V_out noktasında kabaca Vcc / 200 kalıntı dalgalanmaya düşürür – 3,3 V’ta yaklaşık 16 mV.
İki pratik not:
Filtrenin çıkış empedansı kabaca
Rdeğerindedir. Akım çeken herhangi bir aşağı akış yükü,Rile yükü bir bölücüye dönüştürerekV_outdeğerini ideal ortalamanın altına çeker; tıpkı ADC ile analog okuma sayfasındaki bölücü gibi. Milliamper çeken bir yük değil, bir ADC pini veya yüksek empedanslı bir arabellek besleyin.Görev döngüsü değiştiğinde kapasitörün oturması yaklaşık
5 × R × C ≈ 8 mssürer;V_out, görev döngüsü ayarının bu kadar gerisinden gelir. Daha hızlı güncellenmesi gereken bir ayar noktası için kesimi yükseltin (daha küçükRveyaC) ve daha fazla dalgalanmayı kabul edin.