STM32F4 – PWM and Complementary Output

image50STM32F4 de bulunan bir çok Timer dan TIM1 ve TIM8 bize ekstra özellikler sağlıyor.Bu timerlar ile “Complementary” çıkışlar elde edebiliyorsunuz. Complement çıkış bir PWM sinyalinin tam tersidir. Şayet bir PWM çıkışı “CH1″olarak isimlendiriliyor ise Complement’i “CH1N” olarak ifade edilir. Alternatif olarak PWMH ve PWML olarak da görebiliriz.
Bu yapı oldukça basit ve bir çok uygulamada kullanılmakla beraber çeşitli mosfet devrelerinde de karşılaşabilirsiniz. Bu konuyu bir görsel üzerinden daha rahat inceleyebiliriz.

edged-aligned-dead-time

Burada önemli bir nokta ise “Dead Time” dır. Bu Dead Time Complement çıkış kullanıldığında aynı anda HIGH veya LOW olmaması içindir.Bu ölü zaman denilen bölge nanosaniyeler mertebesindedir. Bu gibi bir durumlar Full-Half Bridge Inverterlarda karşımıza çıkabilir. Aşağıdaki şekilde T1 bir PWM sinyali ise T4 bu sinyalin Complement olmalıdır.T3 PWM iken T2 bu sinyalin Complementi olur ve böylece bir motoru sağ ve sola yönlendirmiş oluruz. Ama T1-T2 ve T3-T4 aynı anda iletimde olursa bu kısa devreye yol açar.Bunu için sinyale Dead Time eklenir.h-bridge_inverter_cjc1

Ben bu örnekte bir çıkış ve bu çıkışın complement’ini uyguladım. Duty değeri 60% ise bunun tersi 40% olacaktır.Sürekli değişen Duty değerini 2 adet LED üzerinde gözlemleyebiliriz.

Bu uygulama TIM1_CH1 çıkışı PE9 ve TIM1_CH1N çıkışı PE8 olarak kullanılmıştır.Bu çıkışların nasıl belirlendiğine STM32F407’nin datasheetinden öğrenebilirsiniz.(Sayfa 50)

Programda yapılacak ilk iş Clock ayarlarıdır.

Öncelik stm32f4xx.h dosyasındaki

Kısmı aşağıdaki gibi değiştiriyoruz.

Bu Harici kristal OSC değeridir.Daha sonra system_stm32f4xx.c dosyasından PLL parametrelerini aşağıdaki gibi düzenliyoruz. Burada amaç 168MHz değerini elde etmek.

Bu işlemler tamam ise main fonksiyonunda harici OSC’yi aktif edip aktif olana kadar bekliyoruz.

Kullanacağımız pimleri hazırlamak için “GPIO Init” işlemini “Alternatif Function” olarak ayarlıyoruz.

Pinleri hazırladıktan sonra PWM için kullanacağımız Timer 1’i hazırlamamız gerekiyor.Ben 10kHz lik bir PWM oluşturdum.

PWM ayarlarını yapmak için “TIM_OCStruct” yapısına ayarları yükleyip sinyalleri başlatıyoruz.Burada önemli bir nokta “TIM_OutputNState” ile N çıkışını aktif etmemizdir.

Buna ek olarak ben bir fonksiyon ile istediğimiz çıkışlara Duty değerini yükleyen bir yapı hazırladım.

Artık çalışmaya hazır olan yazılımı SystemTick ile otomatik değişen bir hale getirdir.

Bu SysTick ile Duty değerini yüzdesel olarak değiştirerek çıkışa aktardığımı gözlemleyebilirsiniz.Duty değerini çıkışa yüklediğiniz anda o değerini terside ototmatik Complement çıkışa aktarılacaktır.

https://youtu.be/zCM0X46vPvA

Kodun tamamı

 

You may also like...

Bir yanıt yazın

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