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.

Three square-wave traces stacked vertically, each at the same frequency. The top wave is high for 25 % of each period and low for 75 %. The middle wave is high and low for half the period each. The bottom wave is high for 75 % and low for 25 %.

%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.

A PWM pin connects through a series resistor R to an output node. A capacitor C from that node to ground completes the low-pass filter; the smoothed voltage appears at V_out.

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 , C = 1 µFf_c = 1 / (2π × 1.6 × 1 µF) 100 Hz verir.

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 R değerindedir. Akım çeken herhangi bir aşağı akış yükü, R ile yükü bir bölücüye dönüştürerek V_out değ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 ms sü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üçük R veya C) ve daha fazla dalgalanmayı kabul edin.