PWM #2: PWM Birimiyle Derinlemesine Çalışma
- BÜNYAMİN BUĞRA KORKMAZER
- 31 Oca 2023
- 2 dakikada okunur
Güncelleme tarihi: 15 May 2023
Merhabalar, PWM yazımızın 2. bölümüne hoş geldiniz. Bu bölümde PWM birimini daha detaylı bir şekilde inceleyeceğiz. İlk olarak, Nuvoton firmasının hazırladığı M031/M032 Series Technical Reference Manual dökümanını açıp başlıyoruz.

PWM birimini bağımsız (her kanalı ayrı ayrı kontrol edebilmek için) modda çalıştıracağımız için bizim için önemli olan blok diyagramı Şekil-1'deki gibidir. Diyagramdaki blokları birer birer inceleyelim:
Prescaler: Prescaler birimi, PWM0_CLK0'dan gelen saat sinyalini istediğimiz oranda böler. 12-bit değer alır, yani 0 ila 4095 arasında bir değer girerek saat sinyalini 4095'e kadar bölebiliriz. Zamanlama diyagramında görüldüğü gibi, CLKPSC değeri kadar PWM0_CLK bölünür ve Counter birimi tetiklenir. Prescaler değeri, PWM sinyalini istediğimiz frekansta çalıştırmak için kritik bir birimdir.
Counter: Counter birimi, üç farklı modda çalışabilir: Yükselen Sayıcı, Azalan Sayıcı ve Yükselen-Azalan Sayıcı. Biz kendi uygulamamıza en uygun olan Yükselen Sayıcı modunda çalışacağız. Yani 0'dan belirlediğimiz CNT değerine kadar sayıp sonra sıfırlanır. 16-bit genişliğe sahip olup, 65535'e kadar değer alabilir.
Comparator: Comparator birimi, sürekli olarak Counter birimi ile karşılaştırılır. Eşitlik sağlandığı durumda, Pulse Generator birimini tetikler.
Pulse Generator: Pulse Generator birimi, bağımsız modda ve Yükselen Sayıcı modunda çalıştığımız için üç durumda tetiklenir: Counter birimi 0 değerini aşınca Sıfır Noktası, Counter birimi Comparator birimi ile eşitlenince CMPU, Periyodunu tamamlayınca Periyot Noktası tetikler. Pulse Generator birimi bu tetiklemelerde çıkış kanalını DÜŞÜK veya YÜKSEK yapabilir. İstenirse hiçbir şey yapmama (NOTHING) durumunda da tutabilir.
Output Control: Output Control birimi, bizim uygulamamızda sadece bir anahtar görevi üstlenir. Çıkış verebilmek için bu anahtarı aktif etmemiz gereklidir.
Kendi uygulamamız için oluşturduğumuz zamanlama diyagramı şu şekildedir.

Görüldüğü gibi, CMP (Comparator değeri) ve CNT (Counter değeri) üç noktada Pulse Generator'u tetikler. Pulse Generator, bu noktalarda PWM kanalının çıkışını istediği gibi düzenleyebilir.

Yukarıdaki şekilde görüldüğü gibi, CMPU tetiği sırasında Pulse Generator çıkışı DÜŞÜK, Sıfır Noktası tetiği sırasında ise YÜKSEK yapar. Bu özellik, CMPDAT (Comparator değeri) değiştirilerek Duty Cycle'ın değiştirilmesine olanak sağlar.
Öyleyse kendi algoritmamızı yazalım:
İstediğimiz PWM frekansı için Clock biriminden PWM0_CLK0'ın değerini ayarlıyoruz. Bizim örneğimizde bu değeri 16MHz olarak ayarlıyoruz.
PWM biriminin istediğimiz gibi çalışması için Bağımsız modda ve Yükselen Sayıcı olarak ayarlıyoruz.
İstediğimiz Duty Cycle çözünürlüğü için CNT değerini ayarlıyoruz. Donanımın bize sunduğu 16-bit çözünürlük var ama biz projemizin gerekliliğine göre bu değeri değiştirebiliriz. Biz bu örneğimizde CNT değerini onluk tabanda 1000 olarak ayarlıyoruz.
Pulse Generator birimini istediğimiz dalga formuna getirebilmek için ayarlıyoruz. Örnekte verildiği gibi CMPU tetiği sırasında DÜŞÜK, Sıfır Noktası tetiği sırasında YÜKSEK ve Periyot Noktası tetiği sırasında hiçbir şey yapmama (NOTHING) olarak ayarlıyoruz.
Output Control biriminden çıkış anahtarını aktif ediyoruz.
Counter birimini de aktif ediyoruz ve PWM birimi çalışmaya başlıyor.
Döngü içerisinde CMPDAT değerini değiştirerek istediğimiz Duty Cycle değerine ayarlıyoruz.
Bu şekilde, PWM birimini kullanarak istediğimiz frekans ve Duty Cycle çözünürlüğünde bir PWM sinyali oluşturabiliriz. Bu bölümde, PWM biriminin temel işleyişini ve bu birimi kullanarak nasıl bir PWM sinyali oluşturabileceğimizi gördük. Bir sonraki bölümde, bu bilgileri kullanarak gerçek bir uygulama yapacağız. Takipte kalın!
Comments