Doğan Kayadelen
iir high pass filter stm32f4

IIR Yüksek Geçiren Filtre Tasarımı ve STM32F4 Mikroişlemcisinde Kodlanması

Bugün IIR yüksek geçiren filtre tasarımını matlab ‘de yapıp bu tasarımın stm32f4 mikroişlemcisinde nasıl kodlanılacağını detayları ile beraber vereceğim.

High pass filtre tasarımıza geçmeden önce kullandığım araçlar: MATLAB fdatool, stm32f4 discovery board, konfigurasyon ayarları için cubemx, ide olarak atolic TrueStudio, sinyal jeneratörü ve osiloskop.

Yüksek geçiren filtre tasarımı MATLAB

Öncelikle MATLAB programını açıyoruz. Workspace alanına “fdatool” yazıyoruz. Karşımıza böyle bir ekran geliyor. Yapmak istediğimiz high pass filtre ikinci dereceden, 5kHz kesme frekansı ve örnekleme frekansı 10kHz olsun. Bu ayarları girip “Design Filter” butonuna tıklıyoruz.

fdatool high pass filter
fdatool high pass filter

Daha sonra solda bulunan 4. bloga tıklayıp resimdeki ayarları yapıp “Realize Model” diyoruz. Bu işlem bilgisayarınızın özelliklerine göre 1 – 2 dk zaman alabilir.

fdatool high pass filter design
fdatool high pass filter design

Aşağıdaki şekilde bir block diyagramımız oluştu. Sarı halka içerisindekiler bizim gainlerimiz gibi düşünebiliriz.

fdatool high pass filter block diagram
fdatool high pass filter block diagram

Yani bir nevi kat sayılarımız. z^-1 ifadesi ise gecikme süresi olacak birazdan onlara geleceğim. Şuan için matlab de işimiz bitti. Artık aldığımız bu block diagram ‘ın stm32f4 mikroişlemcisine nasıl entegre edeceğimiz kaldı.

Stm32f4 ‘de yüksek geçiren filtre uygulaması

Öncelikle block diagramımızın output ve örneklemeleri için ayrı ayrı fonksiyon yazmamız gerekiyor. r[n] ilk örneğimiz sonra r[n-1] daha sonra r[n-2] ilk olarak r[n] ifademizi yazalım. Kontrol dersi alanlar bu denklemi zorlanmadan yazabilecekler diye düşünüyorum. ff1, ff2, fb1, fb2 değerleri halkadaki kat sayılar olarak ifade ettik.

r_n = in * ff1 – r_n1 * fb1 – r_n2 * fb2;

Şimdi output denklemini yazalım.

out = r_n2 + r_n1 * ff2 + r_n;

Burada en önemli kısım örnek geciktirmesidir yani her çevrim tamamlandığında bir örnek geciktirmemiz gerekiyor. Aksi halde yanlış sonuç alacağız bu yüzden  son olarak örneklerimizi geciktirelim.

r_n2 = r_n1;
r_n1 = r_n;

Cubemx programında ADC, DAC ve adc ‘ye tetik vermek için bir timer kurduk bu sadece adc mize tetik verecek saymayacak bu yüzden herhangi bir pine atama işlemi de olmayacak. High pass filter için cubemx ayarlarını yazının en sonunda paylaşacağım koddan rahatlıkla anlayabilirsiniz.

Cubemx ayarlarını yapıp proje dosyamızı oluşturduktan sonra projemizi TrueStudio programında açalım ve “HighPassModule” adında bir klasör oluşturalım bu klasörde highPassModule.h ve highPassModule.c dosyalarımız oluşturalım. Bu klasörü asıl dosya projenin görmesi için ana projenin properties kısmından dosya yolunu eklemeyi unutmayın!!

Header dosyamızı aşağıdaki şekilde stm32f4 mikroişlemcisi için yazalım.

highPassModule.c dosyamızın içerisinde yüksek geçiren filtremizin gerekli fonksiyonlarını yazalım.

Main dosyamız içerisinde highP cut5k; yazalım böylelikle highP yapısında cut5k adında bir örnek aldık artık bu örnek üzerinden dilediğimiz parametrelere erişebiliriz. Burada kat sayıları belirtelim. Bu kat sayılar matlab de block kısmında üçgen bloklara tıklayarak değerlerini görebilirsiniz. Doğruluk açısından . dan sonra tüm rakamları yazdım.

Main içerisinde adc, dac ve timer ‘ı base modunda başlatıyoruz. Şimdi ise interrupt dosyasından kurduğumuz ADC ‘nin kesmesine geliyoruz.

High pass filter stm32f4

Yüksek geçiren filtrenin stm32f4 mikroişlemcisinde kodlanmış halinin tamamı github üzerinden paylaşılıp konuya eklenecektir. Herhangi bir sorunuz varsa yorum kısmında sorabilirsiniz.

Yardımlarından dolayı Nazım Yıldız ‘a teşekkürler. Daha detaylı bilgi için http://www.nazimyildiz.com/2016/01/17/iir-filtre-tasarimi-ve-gerceklemesi/

Leave a Comment