Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Peryod ölçme

Başlatan mesmert, 10 Şubat 2015, 15:37:58

mesmert

Merhaba,

STM32L152 ile peryod ölçüp frekans hesaplamak istiyorum peryod boyu minimum 200ns maksimum 1000ns arasında değişiyor. Bu değerleri external interrupt küçük süreler olduğu için okuyamadım bunun dışında nasıl okuyabilirim.

ferit06

#1
Frekansı peryoddan hesaplamak zorunda mısınız? Eğer öyle ise ölçeceğiniz sinyal 1-5 Mhz arasında olduğuna göre %1 lik doğrulukla ölçmek için (TIMER için clock) 500 Mhz lik bir işlemci kullanmanız gerekir.  Peryoddan frekans ölçümü düşük frekanslı sinyaller için uygundur.

mesmert

Başka bir ölçme mantığı ne olabilir. Bütün fikirlere açığım.

ferit06

İşlemcini tanımıyorum ama, Harici girişten sayan TIMER'i  işlemcinin vardır. O TIMER ile harici sinyali 0.1 sn veya 1 sn yada kendi belirlediğn bir sürede saydırıp hesaplayacaksın.

tekosis

ben olsam şöyle yaparım
1- timer ile 100msn lik bir bekleme koy
2- bu 100msn lik bekleme süresince sinyalini işlemcinin capture girişine uygula
3- 100msn sonunda captureden elde ettiğin toplam saykıl sayısını 10 ile çarp frekansı bulursun. frekansı bulunca haliyle peryoduda bulursun.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

mesmert

işlemcim hızı 16 Mhz bu frekans da capture ile minimum okuma hızı nedir?


Kabil ATICI

#7
Periyot ölçümü basittir. Dışarıdan gelen sinyal için bir harici kesme ataması yap. İster yükselen, ister inen kenar olsun.
Bir tane de timer..
başlangıç timer değeri sıfırla

kesme geldiğinde timer sayacının çalıştır, ikinci kesme geldiğinde timer sayacını durdur. Timer değerini oku.
Bu ölçüm senin timer giriş (saat kaynağı) cinsinden dışarıdan gelen (kesme) sinyalinin peroyodunu verir. Bu noktada işlemcinin timer saat kaynağının periyodu bilindiğine göre, timer değeri ile bu elimizdeki saat kaynağı periyodu ile çarpıldığında bize dışarıdan gelen sinyalin periyodunu verecektir.
Sonrasında sonraki kesme için timer sıfırla.
ambar7

CLR

Periyot frekans ölçme kolay ama 16mhz'de 200ns'lik periyot okumak öyle kolay değil çünkü 16Mhz'de bir asm komutu 62,5ns'dir ve bu süre 200ns'nin yaklaşık %32'lik kısmını oluşturur,

Daha işlemci interrupt'a gidemeden 200ns süresi geçer.

Bunu okuma esnasında tüm interruptları kapatarak main içinde(veya fonksiyon) assembly içinde yapabilirsin ama yine %100 doğru demek zor çünkü tek asm fazla işletsen bir periyot için sonuç %30 civarı şaşabilir. 

Onun yerine yine asm ile tek puls yerine ardışık bir kaç periyot pulsi oku mesela 4/8 gibi sonucu 4/8'e bölersin. Böylece daha fazla doğruya yaklaşırsın. Veya aynı şekilde yaparak işlemcini 32mhz'de çalıştırırsan daha doğru sonuç elde edebilirsin.

Knowledge and Experience are Power

tekosis

İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

mesmert

Alıntı yapılan: Kabil ATICI - 10 Şubat 2015, 21:24:23
Periyot ölçümü basittir. Dışarıdan gelen sinyal için bir harici kesme ataması yap. İster yükselen, ister inen kenar olsun.
Bir tane de timer..
başlangıç timer değeri sıfırla

kesme geldiğinde timer sayacının çalıştır, ikinci kesme geldiğinde timer sayacını durdur. Timer değerini oku.
Bu ölçüm senin timer giriş (saat kaynağı) cinsinden dışarıdan gelen (kesme) sinyalinin peroyodunu verir. Bu noktada işlemcinin timer saat kaynağının periyodu bilindiğine göre, timer değeri ile bu elimizdeki saat kaynağı periyodu ile çarpıldığında bize dışarıdan gelen sinyalin periyodunu verecektir.
Sonrasında sonraki kesme için timer sıfırla.

@Kabil ATICI  hocam söylediğiniz şekilde malesef olmuyor çünkü peryot sürelerim nano saniye mertebelerinde.


Alıntı yapılan: CLR - 10 Şubat 2015, 22:11:23
Periyot frekans ölçme kolay ama 16mhz'de 200ns'lik periyot okumak öyle kolay değil çünkü 16Mhz'de bir asm komutu 62,5ns'dir ve bu süre 200ns'nin yaklaşık %32'lik kısmını oluşturur,

Daha işlemci interrupt'a gidemeden 200ns süresi geçer.

Bunu okuma esnasında tüm interruptları kapatarak main içinde(veya fonksiyon) assembly içinde yapabilirsin ama yine %100 doğru demek zor çünkü tek asm fazla işletsen bir periyot için sonuç %30 civarı şaşabilir. 

Onun yerine yine asm ile tek puls yerine ardışık bir kaç periyot pulsi oku mesela 4/8 gibi sonucu 4/8'e bölersin. Böylece daha fazla doğruya yaklaşırsın. Veya aynı şekilde yaparak işlemcini 32mhz'de çalıştırırsan daha doğru sonuç elde edebilirsin.



@CLR hocam asm ile ilgili bir örnek verebilirmisiniz acaba?

STM32 Capture-Compare tecrübe eden varmı acaba yabancı forumlarda bu konu ile ilgili yorumlar var ama ben bir türlü çalıştıramadım.
Klein hocamızın TIMER2 ile verdiği örneği çalıştırdım ama bir türlü doğru sonuç alamadım

https://www.picproje.org/index.php?topic=37420.0

Kabil ATICI

#11
Ölçme sistemini frekansmetre olarak değiştirmen gerekiyor.
Çünkü periyot ölçümü Hz mertebesindeki sinyaller için ölçümü verimlidir. Ölçüm sonucunu arkadaşların belirttiği gibi periyoda çevirmek gerekir.

Pardon, ilk yazdığınız yazıyı dikkat edemememişim.
ambar7

fahri-

Sizin işlemcinizi bilmiyorum ama PIC işlemcilerde dışarıdan tetiklenen timerların hızı, kullandığınız kristal frekansından çok yüksek olabiliyor. 1 Timer ı 1 sn yeye kurun. 1 sn sonra Count ucu ışarıda olan timer da saydığınız değer frekansınızı verir. 

mesmert

Alıntı yapılan: fahri- - 11 Şubat 2015, 10:03:32
Sizin işlemcinizi bilmiyorum ama PIC işlemcilerde dışarıdan tetiklenen timerların hızı, kullandığınız kristal frekansından çok yüksek olabiliyor. 1 Timer ı 1 sn yeye kurun. 1 sn sonra Count ucu ışarıda olan timer da saydığınız değer frekansınızı verir. 

STM32 serisinde böyle bir pin varmı bende bilmiyorum çünkü pic ile baya frekans counter yapılmış. Şimdilik araştırıyorum

LukeSkywalker

Alıntı yapılan: mesmert - 11 Şubat 2015, 14:00:28
STM32 serisinde böyle bir pin varmı bende bilmiyorum çünkü pic ile baya frekans counter yapılmış. Şimdilik araştırıyorum

STM32 serisindeki Timer modülleri de CCP şeklinde kullanılabilir.  En mantıklı yaklaşım sanırım belli bir süre içerisinde gelen palsleri saydırmak.