IAR ile STM8S – PWM

Bir önceki yazıda Timer konusunu tamamladığımıza göre bu bölümde PWM’e geçebiliriz. Burada Timer’dan çok farklı bir şey olmayacak sadece Timer’ları ilgili çıkışlara yönlendireceğiz. STM8S de bulunan bir güzel özellik Timer’ın çıkışı almaktan ziyade bu çıkışlarını “Complement”‘ini almak da mümkündür. Bahsettiğim bu yapıyı genellikle 32-Bit MCU’larda görüyordum. 8 bit bir MCU’da bu özelliği görmez oldukça güzel. Bu sayede Half Bridge – Full Bridge uygulamalarını rahatlıkla gerçekleştirebileceğiz. Kafanızdaki soruya hemen cevap vereyim. Evet “Dead Time” özelliği bile var. 

 

 

Öncelikle hangi Timer ve çıkışları kullanacağımızı belirleyelim. Burada sadece TIM1 ve TIM2 den çıkış alabileceğimizi unutmuyoruz. Örnek olarak TIM1’in 1 ve 2 çıkışlarını ele alalım.


Buradan görebileceğiniz üzere 1 ve 2 nolu çıkışlar C6, C7 pinlerinde bulunuyor. Bunun yanı sıra bu özel “Alternatife Function” seçeneklerini kullanabilmek için Option Bytes kısmından ilgili AFRx ayarlarını “Alternative Function” olarak ayarlamanız gerekiyor. Bu işi IAR’da debug moduna geçiş (RUN etmeden önce) ST-Link->Option Bytes kısmından yapabilirsiniz.


Burada AFR7’yi de şimdiden aktif ederseniz daha sonraki kısımlarda kullanacağımız Complement çıkışlarını da açmış olursunuz.


Bu ayarları yaptıktan sonra “Save” butonuna basın ve projenin olduğu dizine kaydedin. Daha sonra bu dosyayı projeye dahil ederek her seferinde Option Bytes güncellemesini de otomatik olarak yapmış olursunuz.


Artık kod kısmını geçebiliriz. Öncelikle Timer ile frekans ayarını yapmalıyız.

Formül yine oldukça kolay.


Yapacağımız örnek 2kHz PWM için Period değerini 3999, Prescaler değerini ise 1 olarak ayarladım.

Bu işlemden sonra kullanacağınız PWM kanallarını aktif etmeniz gerekiyor. Bu işlemi yaparken başlangıç Duty değeri, Complement aktivasyonu, PWM modu gibi seçenekler var.

Burada PWM2 haricinde yapacağınız ayarlarda Toggle mode, Capture giriş gibi ekstra özelliklerde mevcut. OUTPUTNSTATE ile Complement çıkışı aktif ediyoruz.

Son olarak yapmamız gereken TIM1’i çalıştırıp PWM çıkışlarını aktif etmek

Ben kütüphane içinde Duty değiştirmek için bir fonksiyon göremedim. İş başa düştü bunu da kendimiz yazarız artık.

Yüzdesel Duty hesabı için değişkenleri önce 32 bit’e “cast” ettim. Malum büyük period değerleri ve duty için çarpım işlemi 16 biti aşabilir. Bunun önlemini almamız gerekiyor. Artık kodu çalıştırıp çıkışları inceleyebiliriz.

 


Tabi Dead Time’ı unutmamak gerekiyor. Yoksa yarım köprüleriniz hep yanar 🙂

Çıkışları tekrar inceleyelim. Hatta biraz yakınlaştıralım.


Evet artık ölü zamanları ekleyerek verimli bir PWM elde ettik. Bu zamanı “117” değerini düzenleyerek değiştirebilirsiniz.

Kodların tam halini aşağıda paylaşıyorum.

Toparlayacak Olursak;

Küçük ama dev sayılabilecek bu denetleyici ailesi PWM açısından da bize büyük katkılar sağlıyor. Gerek kolay çalıştırılabilir olması, gerek 32-Bit STM denetleyici aratmayacak kadar bol özelliğinin olması tasarımcılar açısından tercih sebebi olmasını sağlıyor.

Bir başka yazıda görüşmek üzere…

Esen Kalın.

You may also like...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir