Pic İle Frekans Okuma

Başlatan toprak, 23 Kasım 2012, 22:00:50

ete

Sorunu tam olarak anlamamakla birlikte TMR0 sayacının dahili osilatörden puls alarak her bölücüye balı olarak saydığını söyleyebilirim. BU sayaç sürekli sayan durdurulamayan ancak sıfırlanabilen bir sayaçtır.
İki yerden puls alabilir. Ya dahili osilatörden yada harici bir kaynaktan. Option registerin 5 nolu biti bunu ayarlamaktadır.
Bu bit 1 olursa PORTA.4 pininden gelen pulsları sayar. İlgili bit 0 ise dahili osilatörden gelen pulsları sayar.
Biliyorsun dahili osilatör seçilen osilatör frekansının 4'e bölünmüş halidir. 4 Mhz kristal yada dahili OSC için CLKout 1 Mhz dir.
Yani 1 Mhz den gelen pulsleri sayarak işlem yapar.

Ete

toprak

Pıc 12F675 in GPIO2 pinini kullanarak dışarıdan bağlanan sinyal ucundaki frekansı ölçüyorum hocam. Bu uç T0CKI ucudur. Ölçtüğüm frekans kücük olduğu için TMR0 kullandım. 100 milisaniye TMR0 ı açık bırakarak sonucun 10 katını düşünerek programı yazdım.
Sorum da şuydu. PIC bu ölcümü yaparken GPIO2 ucuna gelen sinyalin belirtilen süre içindeki dalga adetini mi sayıyor.
Bunu hangi hassasiyetle yapıyor. Yani ölcülen sinyalin periyotu 5msn ise bunu hangi hassasiyetle ölcüyor.
Belki karışık oldu ama bu konuyu anlamak istiyorum hocam.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

ete

T0CKI pini TMR0 clk giriş pinidir. Option registeri 5 nolu biti 1 yaptı isen, TMR0  buradan giren puls ları sayar.
Puls demek kenarın yükselmesi ve tekrar düşmesi anlamına gelir. Dolayısıyla puls sayımından frekans değeri elde edilebilmektedir. 1000 ms içinde gelen puls adedi sana frekansı verecektir.
Bu sistem yeterince hassastır.  Ancak frekans aralığına dikkat etmek gerekir.
Örnek vermek gerekir ise
1 Hz lik bir sinyali 1000 ms de 1 puls üretir.
10 Hzlik bir sinyal 1000 ms de 10 puls üretir
100 hzlik bir sinyal 1000 ms de 100 puls üretir
1000 hzlik bir sinyal 1000 ms de 1000 puls üretir ve sen bunu TMR0 sayacı ile sayamazsın.
Bölme oranını 1/1 aldığın zaman ancak 255 Hz lik bir sinyali ölçebilirsin.
Bölme oranını 1/2 alırsan 510 Hzlik bir sinyali ölçebilirsin.
Bölme oranını 1/4 alırsan 1000 Hz lik bir sinyali ölçebilirsin. (aslında 255 x 4=1020 Hz lik)
Ölçeceğin sinyal değerine bağlı oalrak bölme oranını program içinde de değiştirebilirsin.

Ete

toprak

Hocam
Ben TMR0 ile 100 milisaniye  ölçüm yaptım . Sonucu 10 kat fazlası olarak düşündüm.
programı ona göre yazdım.
Bölme oranını 1/8 aldım.
Zaten bana gereken en fazla 1500 Hz lik bir sinyali ölçebilmek.
Yaklaşık 100 aşaği 100 yukarı ölçse de sorun olmaz.O kadar hassas olması da gerekmiyor.
Bu değerlerle ölçüm yapabiliyor.
Şu anda istikrarli çalışıyor devre.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

toprak

Pic12F675 in GPIO.2 TMR0 clock giriş pinine ölçeceğim frekans sinyal kablo ucunu direk bağladım.
Bu tür bağlantılarda bir sorun yaratır mı bu hocam. Dıştan etkilenmelere açık olur mu?
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

ete

Bu tür bağlantıların belendajlı kablo ile yapılması daha uygun olur.
Ete

toprak

Alıntı yapılan: ete - 05 Aralık 2012, 19:25:30
Bu tür bağlantıların belendajlı kablo ile yapılması daha uygun olur.
Ete
Belendajli kablo nedir Hocam. Hiç duymamıştım.
Ayrıca benim asıl sormak istediğim pice sinyal girişine herhangi bir (mesela 100nf) kondansator bağlamaya gerek varmı.
Yine direnç ile pull down yapmaya gerek varmı hocam.
Kişi kesinliklerle başlarsa gideceği yer kuşkulardır, ama kuşkularla başlayacak kadar doygun ise kesinliklere ulaşır.

ete

Blendaj normal kablonun etrafına örgülü çıplak kablo geçirilmiş kablodur. Dış örgüyü GND ye bağladığınız zaman kablo dış etkilerden ya hiç etkilenmez yada en az oranda etkilenir. Bu nedenle ses-görüntü veya yüksek frekanslı sinyaller bu tür kablolarla taşınırlar.
Piyada blendajlı kablo diye satılır. Blendaj  içindeki kablo sayısı ile anılır. 2 li kabloda içeride 2 ayrı kablo dışında blendaj vardır.
Sen teklisi ni kullanabilirsin.

Senin işlemcin sinyal seviyesi 0-5V arasında olan sinyalleri okuyabilir. Araya kondansatör bağladığın zaman voltaj seviyen hemen aşağılara düşecek ve işlemci sinyalleri okuyamayacaktır. Kondansatörlü girişler bir ön kuvvetlendirme devresi olan sistemlere girişlerde kullanılır. Sen kullanamazsın.
Pullup yada pulldown direncide gerekmez.

Ete

huso

#23
Herkese Merhaba , ben bu sitede yeniyim , bu link  içindeki örneklere bakarak  Puls-frekans ölçme düzenleme yaptım , ISIS' de  denedim çalışıyor fakat girişe gelen yüksek frekansları (10Khz civarı) yanlış veya eksik okumaktadır  , Nerede hata yapıyorum acaba??

   

     

ete

PULSIN komutu ölçtüğü konum süresini 4 Mhz kristalde 10us ninkatları şeklinde hesap eder. Yani aslında 140us olan süre değişkene 14 olarak yerleştirilir. Bu ise çözünürlüğün düşük olacağı anlamını taşır.
Diğer taraftan frekans hesabı F=1.000.000/Peryot şeklinde yapılır. Bu hesabın sonucu Hz cinsidne bulunur ve peryot da us cinsinden verilmelidir.
Pic matematiğinde 1.000.000 sayısını 1000 x 1000 şeklinde kullanmak gerekir. Hatta hesap kolaylığı ve hassasiyeti açısından bunu 10.000 x 100 şeklinde kullanmak daha doğru  olur. Hesaplanan peryot değeri 10 bölünmüş değer olacağı için formül,
10.000 x 10/Peryot şeklinde uygulanmalıdır. Bunu (10 /peryot)*10000 şeklinde uygularsanız çözünürlüğünüz yine düşük çıkacaktır.

Kesme kullansanız bile komut gecikmeleri sayma işlemini epeyce etkilemektedir. Bu nedenle bu sistemle çok hassas ölçümler yapmak mümkün değil. Belki Capture özelliği olan bir işlemci kullanarak biraz daha hassasiyet yakalamak mümkün olur.

Ete

huso

Hocam verdiğiniz bilgiler için teşekür ederim, ancak verdiğiniz formulleri uyguladım ama yine tam frekansı ölçme sonucunu alamadım , acaba diğer komutları mı eksik kullanıyorum .

DEFINE OSCCAL_1K 1           'Dahili OSC doğru çalışsın diye yazılan komut
define OSC 4             ' 4 Mhz iç osillator
'DEFINE PULSIN_MAX 11000
TRISIO = %00000100         
GPIO=0
OPTION_REG=%1000000           
CMCON=7       'CMCON = %00000111   '       ' Giri?lerdeki Comparatorlar iptal
ANSEL=0     
ALCAK   VAR WORD
YUKSEK  VAR WORD
PERYOT  VAR WORD
FREKANS VAR WORD
clear
pause 300

BASLA:
PULSIN GPIO.2,1,YUKSEK
PULSIN GPIO.2,0,ALCAK
      PERYOT=(YUKSEK+ALCAK)
      FREKANS= 10000*(10 /peryot)     ' veya  10000/(peryot/10)         
     
IF PERYOT<>0 AND  FREKANS>200 and FREKANS<520 THEN                     
      LED1=1
     
Şeklinde kullandığım komutlar.
---------------------------------------------------------------------------------------------------------------------------

Hocam bir de COUNT komutu ile olanını denedim , bu komut ile giriş pinin'de sürekli Frekans olduğu sürece(Hz ,Khz)  Frekans aralığına ait  olan  Çıkış Led'ini  de çok doğru yaktırıyor, ancak
Girişe gelen  Pulsler (kare dalga) yada  frekanslar bir an bile sürekli gelmeyi kesildiğinde çıkış Ledleri sapıtarak rastgele yanmaya başlıyor.

BASLA:
FREKANS=0
COUNT GPIO.2,1000,FREKANS
PERYOT= YUKSEK+ALCAK

IF PERYOT=0  AND   FREKANS>50  and  FREKANS<120 then
    LED1= 1
    PAUSE 50
ELSE
    LED1=0
ENDIF
   GOTO BASLA

Hocam buraya hangi komutu ilave etmeliyim ki giriş Pulse sinyalı kesildiğinde bile rastgele ledler yanmasın.

Saygılar.

mykoch

Hocam, yazılarınızı okuyorum ve çok faydalı buluyorum.

Benim 500 ile 5000 RPM arasında devir veya buna karşılık gelen frekansı çok hassas bir şekilde okumak istiyorum.

Amacım devir / zaman grafiğini çok düzgün bir şekilde çizmek ve bazı hesaplamalar yapmak istiyorum. Bunun için her 10 ms de bir devir okumayı planlıyorum.

Bu arada yapacağım hesaplamada bilgisayarın ve çalışan programların da benim ölçüm ve hesaplamalarımı etkilemesini istemiyorum.  Tavsiyeniz nedir acaba ?




Alıntı yapılan: ete - 29 Nisan 2014, 11:47:28
PULSIN komutu ölçtüğü konum süresini 4 Mhz kristalde 10us ninkatları şeklinde hesap eder. Yani aslında 140us olan süre değişkene 14 olarak yerleştirilir. Bu ise çözünürlüğün düşük olacağı anlamını taşır.
Diğer taraftan frekans hesabı F=1.000.000/Peryot şeklinde yapılır. Bu hesabın sonucu Hz cinsidne bulunur ve peryot da us cinsinden verilmelidir.
Pic matematiğinde 1.000.000 sayısını 1000 x 1000 şeklinde kullanmak gerekir. Hatta hesap kolaylığı ve hassasiyeti açısından bunu 10.000 x 100 şeklinde kullanmak daha doğru  olur. Hesaplanan peryot değeri 10 bölünmüş değer olacağı için formül,
10.000 x 10/Peryot şeklinde uygulanmalıdır. Bunu (10 /peryot)*10000 şeklinde uygularsanız çözünürlüğünüz yine düşük çıkacaktır.

Kesme kullansanız bile komut gecikmeleri sayma işlemini epeyce etkilemektedir. Bu nedenle bu sistemle çok hassas ölçümler yapmak mümkün değil. Belki Capture özelliği olan bir işlemci kullanarak biraz daha hassasiyet yakalamak mümkün olur.

Ete

Hattuşa

slm ete hocam;

hocam bir sensör yapmak istiyorum, sensör tamamen pwm üzerine kurulu, sorunum şu;
bir bobinden gelen (bobinden gelen frekans bir opampla tam kare dalgaya dönüştürülüp işlemciye verilecek)frekans okunup bu frekansa göre başka bir pinden frekans verilecek. çıkış frekansım okunan frekans yükseldikçe yükselecek, okunan frekans düştükçe de düşürülecek. başka bir işlemim yok hocam. yalnız çalışılan frekans aralığı biraz geniş ve yüksek (en azından bana göre)
min. frekansım 5khz max. frekansım ise 200 khz arası.
şimdi bu işlemi yaptırabilmek iiçin,
frekans okuma işlemini INT girişinden mi yaptırmalıyım yoksa TOCKI den mi?
verilecek frekans pwm den verilebilir diye düşünüyorum. 12f675 buna pek müsait değil sanırım. 12f1822 var elimde onda da aksilik int,tocki ve pwm kanalı aynı pinde 3. seçenek olarak gariban 628a var her zamanki gibi bu işi üstlenecek.  ;D   ;D   ;D

hocam nasıl bir yol izlemeliyim. neler önerirsiniz?

NOT: devreyi analog olarak basitçe 2 tr ile yaptığımda hassasiyet düşük çıktığı için böylesi bir işlemi tercih ettim.

ete

Timer sayaclarının harici giriş pinlerinden puls saymak her zaman avantajlıdır. Frekans saymada önemli bir faktör zamanın tutulmasıdır. Zira frekans 1000 ms de ölçülen puls sayısıdır. Bu zamanı dilimlere bölerek sayma yapmak bazen küçük frekanslarda sorun çıkartır bu nedenle en iyisi gerçek zaman diliminde sayma yapmaktır. Bu bakımdan harici timer girişleri avantajlıdır. Timer0 8 bitliktir bu iş için pek uygun değil bana göre tmr1 16 bitlik olup gerekirse bölücüde kullanılarak her amaç için kullanılabilir. Diğeri yani tmr0 ı ise zaman sayacımolarak kullanıp kesmeye bağlarsan 1000 ms içinde gelen pulsları saydırıp ona göre pwm den istediğin sinyali çıkartırsın. Çıkacak frekans aralığın çok geniş. 200 khz de çözünürlük çok düşecek duty her zaman %50 olacak ise yine sorun yok gibi. Denemek gerekir.

Ete

Hattuşa

hocam çıkacak pwm duty değeri %50 olmak zorunda zira bir tranzistor üzerinden bobin sürülecek ayrıca 200khz değeri sıkıntı yaratabilirse frekansı düşürmekte sorun teşkil etmez. hocam bana 2 pin yeterli diye düşünüyorum. bir pin okuma için diğer pin çıkış pini, 628A bu iş için yeterli ancak daha küçük bir işlemci ile bunu yapabilirmiyiz? mesela 12f1822
birde hocam timerlerle iş yapacağımız için harici kristal bağlamak ve bu kristali de 20 mhz de tutup işlemciyi hızlandırmak işimizi kolaylaştırırmı?

yazılarım çelişkili gelebilir zira kararsızım, şimdi kendim bir kod yazıp denemek istiyorum ama 12f1822 ye gözüm almıyor, bana kolay olan TOCKI pini ve pwm kanalı 12f1822 de bu işlemler aynı pinde olacağı için 628A ile bir deneme yapayım. takıldığım yerde yardımlarınıza müracaat edeyim.

Powered by EzPortal