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.

Her biri aynı frekansta, dikey olarak istiflenmiş üç kare dalga izi. Üstteki dalga her periyodun %25'inde yüksek, %75'inde alçaktır. Ortadaki dalga periyodun yarısında yüksek, yarısında alçaktır. Alttaki dalga %75'inde yüksek, %25'inde alçaktır.

%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 PWM pini, seri bir R direnci üzerinden bir çıkış düğümüne bağlanır. O düğümden toprağa bir C kapasitörü alçak geçiren filtreyi tamamlar; düzleştirilmiş voltaj V_out noktasında görünür.

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.