Stm32 ile Frekans Ölçme Uygulaması

Onur NP

Yeni Üye
Yasaklı Üye
29 Mar 2019
13
3
3
STM32 kullanarak giriş Frekansını ölçme



Merhabalar arkadaşlar bugün sizlerle frekans ölçme uygulaması yapacağız açıkçası bu uygulamayı yapma kararım farklı bir proje de pid ile motor sürme yapıyordum motorun hızını ölçmem gerektiği için yaptım gayette basit ama güçlü bir uygulama oldu logic seviyedeki herşeyin frekansını rahatça ölçebilirsiniz mini osilaskop diyemesekte mikro osilaskop diyebiliriz kendisine :)

Bu yapacağımız Uygulamadan Bahsedecek olursak saniyede kaç adet kare dalga oluştu onu sayacağız ve her saniye sonunda lcd ekranımıza bu okunan değeri yansıtacağız hadi bakalım hemen uygulamamıza geçelim.

Timer Ayarlama


Bu kısım bu projenin en önemli kısmı arkadaşlar burada yaptığınız ayarlara çok önem gösterin yoksa okuduğunuz değerler yanlış olacaktır. İlk Olarak CubeMX açıp ben Timer 2 Kullanacağım dilerseniz siz diğer timerları kullanabilirsiniz.

Timer 2 Aktivasyon


CubeMX Tim2 Aktive etme görseli.png


Timer 2 APB Yolu Hız Ayarı
Arkadaşlar burada dikkat etmeniz gereken ana konu timer'ın bağlı olduğu apb1 ana yolunun hızı 45 Mhz olması gerekmektedir. Siz eğer farklı bir timer seçerseniz farklı apb yoluna bağlı olabilir ona göre apb yolunu belirleyip 45mhz e sabitlemelisiniz.

CubeMX Tim2 Ayar Görseli.png


Timer 2 Hız Ayarı

Şimdi TIM2 45 MHz'de çalışıyor. Bu yüzden prescalar değerimi 45000 olarak ayarlayacağım ve bu kurulumdan 1 KHz (1 ms zaman periyodu) frekansı alacağım. Ayrıca ARR değerini mümkün olan en yüksek değere ayarlayalım ki geniş bir skalada okuma yapabilelim. Benim İşlemcimin ARR değeri 32 bit olduğu için 0xffffffff olarak ayarlayacağım siz bluephill kullanıyorsanız kesinlikle 0xffff yapmak zorundasınız çünk arr değeriniz 16bit.


CubeMX Tim2 Detaylı ayar görseli.png


Tamamdır Şu bu derken artık timer ayarımızı gerçekleştirdik. 45 MHZ hızında çalışan timer'ımızı Prescaler ile 1kHz Hızda çalıştırarak 0xffffffff yani 4294967295 değerine kadar saymasını sağladık ölçüm yapmak için bu hızda kaça kadar saydığını karşılaştırıp saniyede kaç ms ilerlediğini ölçmüş olacağız. Haydi şimdi projemizi generate edip keil studio da kodlamaya başlayalım...

Kodlama


Sizlere projenin liblerini ve tamamını en aşağıya ekleyeceğim gerekli libleri oradan indirebilirisiniz.Şimdi ilk olarak liblerimizi ve değişkenlerimizi ekleyelim.

Kod:
#include "i2c-lcd.h"

uint32_t freq, increment=0;
char freqchar[6];


Şimdi size aşağıda verdiğim kodu global alana yani main dışı bir yere yapıştıralım bir yandan da kodumuzu inceleyelim

Kod:
void read_freq (void)
{
    htim2.Instance->CNT = 0;  // set the count to 0

    while ((htim2.Instance->CNT) < 1000)  // while the count is less than 1000 ms
    {
        while (!(HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_1)));  // wait for the pin to go high

        while ((HAL_GPIO_ReadPin (GPIOA, GPIO_PIN_1)));  // wait for the pin to go low

        increment++;  // increment the variable
    }

    freq = increment;  // freq = number of times pin goes high and low in  second

    increment = 0;
}

Fonksiyon ve liblerimizi eklediğimize göre main bloğu içerisine timer başlatma ve lcd ekranımızın tanımlamasını ekliyelim.

Kod:
lcd_init ();

HAL_TIM_Base_Start (&htim2);


Artık genel olarak programımızı yazdık şimdi girdileri okumak için While bloğu içerisine çıktı alabilmek için gerekli kodlarımızı yerleştirip projemizi derleyelim


Kod:
        read_freq ();
      
      
        sprintf (freqchar, " %d", freq);
        lcd_send_cmd (0x86);
        lcd_send_string (freqchar);
        lcd_send_string (" Hz");

Tadaaa Frekans okuyucumuz tamamdır!!


frekans okuma lcd görseli 1.jpg


frekans okuma lcd görseli 2.jpg


Evet frekans okuma işini tamamladık umarım sizler adına faydalı olmuştur başka projelerde görüşmek üzere İyi Çalışmalar.


Gerekli Dosyalar ve Libler : LCD Lib Tam Proje Link
 

Robotikforum.net Nedir?

  • Robotikforum.net 2020 yılında kurulup yayın hayatına başlayan ve Türkiye’de robotik kodlama alanının gelişimine katkıda bulunmak için bu alan ile ilgilenen bireylerin bir birleri ile yardımlaşmaları ve fikir danışmalarını sağlayarak daha iyi öğrenmek için her bir bireyin bilgisini ve tecrübesini alarak kendini geliştirebileceği ve sorularına cevap bulabileceği bir platform olarak kurulmuştur.

Bilgilendirme!!!

İçerik sağlayıcı paylaşım sitelerinden biri olan www.robotikforum.net Adresimizde T.C.K 20.ci Madde ve 5651 Sayılı Kanun'un 4.cü maddesinin (2).ci fıkrasına göre TÜM ÜYELERİMİZ yaptıkları paylaşımlardan sorumludur.

Sayfamızı beğendin mi?

X Merhaba ziyaretçi! Robotikforum.net adresinde ki tüm içeriğe üye olmadan erişebilirsin. Ama üye olarak sorularınızı sorabilir yardım alabilir ve diğer kullanıcılara yardımcı olabilirsiniz. Üyelik için herhangi bir özel bilgi ve ücret vermenize gerek yoktur.
Kayıt Ol