2.8- MicroPython ile PWM Uygulamaları

ESP32 mikrodenetleyicinin GPIO16 ayağı hariç diğer ayaklarından PWM çıkışı alabiliriz. Her ne kadar ADC ve DAC yönüyle kısmen kısıtlı görünse de PWM yönüyle yeterli bir mikrodenetleyici olduğunu söyleyebiliriz. MicroPython ESP32’nin zamanlayıcılarını PWM üretmek için fazlaca soyutlanmış bir şekilde kullanmamıza imkan vermektedir. Dijital güç ve motor kontrol uygulamalarında PWM sinyallerinde birbirini tamamlama (complementary), ölü bölge (deadband) gibi özelliklere ihtiyaç olup ESP32’nin motor kontrol zamanlayıcısında bunlar mevcut olsa da MicroPython’da PWM üretmek için sadece LED kontrol için kullanılan zamanlayıcıları kullanmaktadır. MicroPython’ın kaynak kodunda bunu görebilirsiniz.

https://github.com/micropython/micropython/blob/master/ports/esp32/machine_pwm.c

Yine de temel kontrol uygulamalarında üretilen PWM sinyalinin yeterli olacağını söyleyelim. Zamanlayıcıların hızlı çalışmasından dolayı hem yüksek çözünürlük hem de yüksek frekans elde edebiliriz.

Şimdi 1kHz’lik %50 görev döngüsüne sahip bir sinyal üretip bunu osiloskopta gözlemleyelim.

Burada PWM() yapıcısıyla PWM üretmek istediğimiz ayağı ve frekansı belirlemekteyiz. Sonrasında ise duty() metodu ile sinyalin görev döngüsünü ekrana yazdırmaktayız. Sinyale osiloskoptan baktığımızda sinyalin frekansının 1kHz ve görev döngüsünün ise %50 olduğunu görüyoruz.,

Şimdi sinyalin görev döngüsünü (1 ve 0 olma oranı) değiştirip bunun etkisini LED üzerinde gözlemleyelim. Bunun için sinyalin çıkışına bir adet LED bağlamamız yeterli olacaktır.

Devre8_PWMLed.fzz

Burada 1kHz’lik PWM sinyalinin görev döngüsü sıfırdan başlayıp 1023’e kadar birer birer artacaktır. Bu durum hızlıca gerçekleştiği için LED’de yumuşak bir parlaklık artışını gözlemleyeceksiniz. Sonrasında ise parlaklığı en son seviyeye ulaşan LED yavaşça sönmeye başlayacaktır. PWM sinyallerini gözle gözlemlemek için frekans değerini 1000Hz’den 5Hz’e kadar düşürüp bekleme süresini 10mS yapabilirsiniz.

80MHz’de çalışan zamanlayıcıdan hesaplamalara göre 10-bit çözünürlükte en fazla 78.125KHz seviyesinde sinyal elde etmemiz mümkündür. ESP32 kullanılırken PWM çözünürlüğü en fazla 10 bit olarak belirlenmiştir. Bu frekansın üzerinde PWM üretmek mümkün olsa da frekans yükseldikçe çözünürlük düşecektir. Denemelerde %50 görev döngüsü ile 40MHz’e kadar sinyal alındığı gözlenmiştir. Bu durumda ESP32’nin sinyal üreteci olarak gayet iyi iş çıkardığını söyleyebiliriz.

Şimdi sabit görev döngüsünde değişken frekans üreten bir uygulama yapalım. Özellikle ses sinyali üretmek istediğimizde değişken frekansa ihtiyacımız olacaktır. Aşağıdaki gibi bir devreyi kuralım ve mümkünse osiloskoptan da üretilen sinyali takip edelim.

Devre9_PWMHoparlor.fzz

Potansiyometreyi çevirdikçe frekansın değiştiğini gözlemleyebilirsiniz. Bu uygulama aslında pek çok analog işlemin en basit halini sizlere göstermektedir. ADC’den değer okuma, hesaplama ve buna göre PWM ya da DAC çıkışı verme ve bunu en kısa sürede yapma pek çok kontrol uygulamasının temelini oluşturmaktadır.

PWM ile yaptığımız LED uygulamasında LED’in parlaklığının doğrusal bir biçimde artmadığının farkına varmış olmanız gerekir. Bunun sebebi mikrodenetleyicinin doğrusal bir şekilde sinyalin görev döngüsünü artırmaması değil gözümüz tarafından algılanan parlaklığın doğrusallıktan uzak olmasıdır. Aynı durum kulaklarımız için de geçerlidir. Çok düşük seviyedeki seslerde seviye farklılığına oldukça duyarlıyken sesin şiddeti arttıkça bu duyarlılık giderek azalmaktadır. O yüzden ses elektroniğinde bu artırımı insan kulağına uygun hale getirmek için logaritmik potansiyometreler kullanılır. Biz burada bunu dijital olarak gerçekleştirdiğimiz için hesaplamayı programla yapmamız gereklidir.

Bu uygulamada daha önceki LED uygulamasının devresi kullanılmıştır. GPIO14’e bağlı LED’in çözünürlüğü 100 adıma kadar düşürülmüştür. Çözünürlüğün düşmesine rağmen LED’in parlaklığının çok daha doğrusal arttığını ve göze pürüzsüz göründüğünün farkına varabilirsiniz. Demek ki LED animasyonlarında çözünürlükten ziyade geçişlerin pürüzsüzlüğü daha fazla önem arz ediyormuş. İnternette yer alan pek çok projede LED uygulamalarının görev döngüsünde doğrusal artırım ve azaltım yapılarak gerçekleştirildiğini görebilirsiniz. Doğrusallık elektronikte cihazlar için mükemmel olsa da insan gözü veya kulağı için mükemmel değildir. Biz burada logaritmik şekilde artırım yaparak insan gözüne daha doğal gelen bir animasyon gerçekleştirdik. Bir döngüde hesaplanan görev döngüsünün grafiği aşağıdaki gibidir.

Şimdi de PWM ile sinüs dalga üretmeye çalışalım. PWM normalde dijital çıkış verse de biz çıkışa yukarıda ADC girişi için gösterdiğimiz alçak geçirgen filtreyi ekleyeceğiz. Böylece DAC ile ürettiğimiz sinyale benzer bir sinyali DAC olmadan üreteceğiz. Sensor terminaline PWM çıkışını ekleyin ve AdcGiris terminalini ise çıkış olarak kullanın.

Çıkışı osiloskopta incelediğimizde sinüs sinyali elde ettiğimizi görmekteyiz.

Burada her bir periyodu meydana getirmek için pek çok PWM sinyali kullanıldığından 50KHz’lik PWM çıkışının 500Hz sinüs sinyaline dönüştüğünü görmekteyiz. Düşük frekanslarda istediğimiz sonucu elde edemediğimiz gibi bu sinyal de mükemmel değildir. Dalgalanma(ripple) adı verilen durumu aşağıdaki resimde daha iyi görebilirsiniz.

Bu etkiyi kondansatör değerini artırarak nispeten azaltsak da bunu engellemeye yönelik farklı yöntemler de mevcuttur.

Frekans Okuma

Analog uygulamalarda bazen frekans okumamız gerekebilir. Özellikle bazı algılayıcılar analog çıkış vermek yerine gerilimi frekansa çevirerek belli gerilimler arasını belli frekans değeri olarak vermektedir. Biz de aynı şekilde bir bilgiyi frekans olarak daha uzun mesafelere gönderme imkânımız vardır. Normalde frekans okuma zamanlayıcıların sayıcılarıyla dışarıdan tetiklenmesi veya daha etkili olarak sinyal uzunluğu okuma yöntemleriyle yapılmaktadır. MicroPython’da ise sinyal uzunluğu okumak için time_pulse_us() metodu bulunmaktadır.

Devreyi kurmak için bir jumper kablosunu GPIO14 ile GPIO18 arasına bağlamanız yeterlidir. Frekans ölçmek için PWM üreteceğiz.

Üretilen 1kHz’lik sinyal 1000–1002 arasında okunmaktadır. Kesmelerin gerçekleşmesi okumada dalgalanmaya sebep olabilir. Bu durumda kesmeleri kapatmak ve birden fazla okuma yapıp bunun ortalamasını almak daha sağlıklı bir ölçüm yapmamıza imkân verebilir. Bu uygulama yüksek frekanslarda çok sağlıklı sonuç vermese de (50kHz üstü) düşük frekanslarda işimize yarayabilir.

--

--