Hesaplama konusunda yardım .

Başlatan Maxim, 07 Ekim 2010, 13:10:39

Maxim

derleyiciye göre olmadığı için buraya konu açmak en doğrusu.

şimdi anlamadığım ve o yüzden nasıl hesaplandığını bilmediğim bir kaç şey var,
bana bunun nasıl yapılacağını anlatırmısınız.

örnek bir senaryo yapalım .

pic ile gelen kare dalga frekansı ölçtüğümüzü düşünelim .

pic osc hızı 10mhz olsun (18Fxxx)
gelen frekansımızda 1khz (1000hz) olsun
bu frekansın duty değeride %80 olsun
timer1 prescale 1:8

şimdi bu frekansımızı 16bitlik timer1 ile hem yüksek hemde düşük kenarda ölçtüğümüz zaman
karşımıza 2 farklı word değeri çıkıyor. (2 farklı timer değeri çıkıyor)

örneğimizdeki frekansımız diyelim 15000 yüksek, 45000 düşük kenardaki word değerlerimiz . (duty %80 ya)

tamda uygun bir resim buldum :




öğrenmek istediğim şeyler tam olarak :
1- ben bu elimdeki timer1 değerleri ile düşükte ve yüksekte kalma sürelerini nasıl hesaplarım? kaç ms düşük? kaç ms yüksek? veya us ?


2-ben frekansı nasıl bulurum bu timer1 değerleri ile ?


t2

#1
Timer1 interrupt ayarlarsın

programı başlatırken
Timer1 = 0 olsun

picin giriş ucunda kenar tetiklendiğinde interrupt oluşsun. girişin 1 mi sıfırmı olduğunu anlamak kolay

kenar 1 ken sıfır olduysa  alçalan kenar durumu var. tersi ise yükselen kenar.
bu esnada interrupt oluşur ve timer değerine bakılır. ve timer sıfırlanır.
timerin ms cinsinden kaça tekabül ettiği prescaler durumu programın en başında ayarlanır. interrupt anında okunan değeri ms cinsinden çevirmek sorun olmaz. bayt olarak yetiyorsa timer0  da kullanılabilir.


Giriş olarak   dijital giriş olmak zorunda değil. Comparator interrupt tanımlanarak 0.2volt hassasiyetle durumu okuyabilirsiniz. comparator durum değiştirdiğinde dahili bir bit durum değiştirir.


X-Fi

timer ile kendim pwm oluşturmak için şu kodları kullanmıştım.

static void interrupt KESME()
{

if(!periyot){
	TMR1L= 255-Pwm_l;
	TMR1H= 255-Pwm_h;
	periyot=1;
	out=1;}

else{
	TMR1L=Pwm_l;
	TMR1H=Pwm_h;
	periyot=0;
	out=0;}

	TMR1IF=0;
}

http://www.coskunergan.dev/    (Yürümekle varılmaz, lakin varanlar yürüyenlerdir.)

ferdem

Alıntı Yapöğrenmek istediğim şeyler tam olarak :
1- ben bu elimdeki timer değerleri ile düşükte ve yüksekte kalma sürelerini nasıl hesaplarım? kaç ms düşük? kaç ms yüksek? veya us ?
Eldeki değerler timer değerleri, eğer timer her 1 ms de bir artıyorsa yüksek 15000 ms, düşük 45000 ms sürmüş demek olur. Mikrodenetleyicide kullandığımız timer larda her bir "machine cycle(mc)" da, 4 mc de veya 16mc de bir artsın gibi seçenekler vardır. Prescale ayarını değiştirmediyseniz timer ınız her 1 mc de bir artar. Peki bir 1mc kaç saniye? PIC18F lerde osilatörün her 4 periyodu bir mc yapar. Osilatörünüz 10MHz ise periyodu 100ns olur, 4x100ns=400ns, demek ki mc niz 400ns sürüyormuş, yani timer ınız her 400ns de bir artmış, örneğin 15000 defa arttıysa 15000*400ns=6ms geçmiş demektir.

Alıntı Yap
2-ben frekansı nasıl bulurum bu timer değerleri ile ?
Frekansı ya direkt 1 sn de gelen kenar sayısından ya da iki kenar süresi arasında geçen süreyi(periyot) 1/süre yaparak bulabilirsiniz. Siz süreyi zaten bulduysanız 1/süre yapar frekansı bulabilirsiniz. İyi çalışmalar.

F493

Selam,

  Capture interruptini  yukselen kenera kurun. Sonrasında interrupt geldiğinde düşen kenara kurun bu şekilde çok sade bir şekilde yapabilirsiniz..

Esen kalın.

Maxim

arkadaşlar sanırım yanlış anladınız beni  :)

diyelim timer1 ile ölçüm yaptık bitti..
elimizde 2 farklı word değeri var. (timer1 değerleri)
kare dalganın düşük ve yüksek taraflarına ait.


@ferdem beni anladı,
ferdem hocam unutmuşum prescale olayını
prescale 1:8 diyelim, o zaman nasıl bir hesaplama çıkar ortaya ?
(ilk mesajımı editledim)


frekansın ölçümünü malesef anlamadım gene .

mufitsozen

kare dalganın düşük ve yüksek taraflarına ait iki degerin toplamin, senin dalganin periodunu veriyor . ornegin 1.5ms+4.5ms = 6ms

frekans 1sndeki periodlar oldugu icin f=1/P ile bulunur, yani 1/6ms= 1000/6 = 166.66666 senin dalganin frekansidir.
Aptalca bir soru yoktur ve hiç kimse soru sormayı bırakana kadar aptal olmaz.

ete

Frekans=1/T formülünde T frekansın peryodu dur.
Peryod ise HIGH+LOW süresinin toplamına eşittir.
Frekans değeri 1000 Hz ise peryod T=1.000.000/1000=1000 us dir.
%80 duty değerine sahip bu frekansda HIGH süresi 1000*%80= 800 us dir. Low süresi ise 200 us olmalıdır.

Şimdi gelelim ölçümlerine , pic ile frekans ölçmenin çeşitli yolları var. Bunlardan birisi T1 (Timer1)'i dışarıdan pals alacak şekilde ayarlarsın ve ona ait girşe frekansı verirsin. T1 değerini sıfırlayıp hassas zaman tutarsın. Tutacağın zaman 1000 ms olmalıdır.
Bu süre zarfında gelen frekans (gelen palsler) sürekli olarak T1 değerini artıracaktır. 1000 ms sonunda T1 değeri direk sana frekansı verecektir. Tabiiki T1 bölücüsü 1/1 olmalıdır. Bölücü kullanırsan bölme oranı ile ayrıca çarpman gerekir.

Diğer bir metod ise gelen palsin low ve High sürelerini ölçmek olacaktır. Bu senin bahsettiğin yöntem.
Sonuçta us cinsinden bulduğun değerleri toplarsan frekansın peryodunu bulacaksın demektir. Buradan da Frekans;
F=1/T yada T yi us cinsinden girecek isen  F=1.000.000/T (us) şeklinde hesaplanacaktır.

Gelen sinyalin low ve High süreleri nasıl ölçülecek sanırım biliyorsun. Arkadaşlarda bazı fikirler vermişler.
Hangi dilde çalışacağını bilmediğim için bu konuda bir şey söylemedim ama Basic de direk komutları var . Mesela
PULSIN 0,VAR   LOW palsinin değerini verir. VAR değişkeni WORD tipinde olmalı ve sonuç 10us ninkatları şeklinde hesaplanır. Yani 100us lik sonuç VAR=10 olarak ölçülür.
PULSIN 1,VAR buda HIGH palsinin süresini ölçer. AYnı şekilde sonuç 10'un katları şeklinde hesaplanır.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

F493

Selam,

Öncelikle anlaşılması için şebeke frekansı üzerinden  konuşalım. Şebeke frekansı 50hz'dir  yani T = 1/ F = 0.02sn == 20ms dir. Bu 1 period dur. Sinüsün + ve - alternanslarının toplamıdır. Şebekede sinüs + ve - 10'ar ms dir. Şimdi bu sinüsü bir devre yardımıyla DC kare dalgaya  çevirdiğimizi düşünelim. Elimizde 10ms(high)  ve 10ms(low)  olan bir karedalga olur. Biz bu kare dalganın + ve - 'de kalma sürelerini bulmak isteyelim. Öncelikle Timer'ı 1ms'de bir interrupt alacak şelikde kurduğumuzu düşünelim.

Bu nedemek biz her 1ms'de bir timer interrup'ine gidicez demektir. Ben timer interruptının içine karedalganın bağlı oldugu I/O'nun durumuna bakarak sinyalin 1 kısmındamı yoksa 0 kısmında mı oldugumu anlayayım. Şimdi interrupt geldi ve I/O 1 durumunda ve Ton adında bir counter'ı 1 arttırdım ve bir süre böyle devam etti ve bir baktım I/O 0 olmuş bu sefer if deyiminin else kısmındaki Toff adındaki counter'i arttırayım. Şimdi aslında baktığımızda Ton ve Toff degerleri bize şunu söyler. Ton == 10 ise ben buraya 10 kere gelmişimdir. Eee ben buraya 1ms'de bir geliyorsan 10*1 == 10ms yapar.

Aynı şekilde Toff içinde geçerli. Eger Timer'ı ben 500us' ye kursaydın çıkan Ton ve Toff degerleriyle 500us ile çarpacaktım. Şebekenin + ve - alternanslarınında 10'ar ms oldugunu söylersek bu counterlar genelde 500us için 20 degerini alır ve 20 * 0.5ms == 10ms yapar.

Ama benim önerim bunun Capture ile yapılması nedeni ise siz 1ms'de bir timer'a gidip I/O kontrolu yapıyorsunuz belki siz time interrupt'ı almadan 300us önce I/O nun durumu değişti. Siz aslında kaba bir süre elde etmiş olursunuz. Bunu capture ile yaparsanız siz capture'u yukselen kenera kurarsınız sinyalde köşe değişimi OLDUGUNDA interrupt alırsınız bu şekilde doğruluk payı çok yüksek bir deger alırsınız. Orada da arka planda timer1 falan çalışıyor tamda frekans ölçmek için tasarlanmış.

Esen kalın.

Maxim

arkadaşlar gerçekten yardımcı oluyorsunuz farkındayım ama benim istediğim o değil  :)

bir sinyal nasıl ölçerim ?? ben bunu sormuyorum ..


ben ölçtüğümüz değerin, nasıl ms veya us veya frekansını hesaplayabiliriz onu soruyorum .

ölçtüğümüz değer: timer1 ölçümü sonrası elimizde olan düşük ve yüksek kenardaki word değerleri .
ölçtük, high için timer1 değeri 15000 çıktı, low için 45000 çıktı
elimizde 2 tane word değeri var timer1 sayıcısının .

ccp ucundan ölçelim her sinyal değişiminde interrupt oluşsun ,
sinyal high oldu , low olana kadarki değeri timer1 ölçsün ve bir değer kaydetsin = 15000
hala sinyalimiz low, high olana kadarki değeri gene timer1 ölçsün ve bir değer olarak kayıt etsin = 45000

şimdi elimizde 2 word değeri oldu mu ? tamam.

tekrar yazmak gerekirse :
pic osc hızı 10mhz olsun (18Fxxx)
timer1 prescale 1:8

şimdi ben bu ms-us high low zamanlarını ve frekansını nasıl hesaplarım ,
frekansı hesaplamayı anladım da ama önce bu iki high low değerlerini tespit etmek lazım .

eğer eksik anlattıysam daha önce kusura bakmayınız , biraz kafam karıştı şu hesaplama konusunda .


ferdem

Alıntı yapılan: Maxim - 07 Ekim 2010, 14:48:16
prescale 1:8 diyelim, o zaman nasıl bir hesaplama çıkar ortaya ?
(ilk mesajımı editledim)
prescale 1:8 ise timer her mc de değil her 8 mc de bir artar demektir.
Eğer osilatörünüz 10MHz, yani bir mc niz 400ns ise timer her 8 mc de artacağından 8*400ns de yani 3200ns=3.2us de bir artar. Eğer timer 1500 defa arttıysa 1500*3.2us=... s kadar zaman geçmiş demektir. Kolay gelsin.

Maxim

hepinize teşekkürler kafamda bazı soru işaretli yerler çözülmüş oldu .

konunun tekrar üzerinden gidecek olursak:

şöyle bir adres buldum, buldum demeyelim zaten biliyordumda bu gözle bakmamıştım .
http://www.best-microcontroller-projects.com/pic-timer-1.html


yukarıda verdiğim örnek değerleri buraya giriyoruz.
*yanlız burada neden timer1 değerini count to OVFL olarak giriyoruz onu anlamadım,
OVFL overflow



önce low kenarı hesaplayalım:



ferdemin söylediği hesapları otomatik yapan bir tablo ,
10mhz osc ile 1/8 prescale =3.2us period çıkıyor (mc)

low timer1 değerine 15000 demiştik

15000 * 3.2 = 48.000ms çıkar
1/ 48ms = 0.02083 çıkar, bunuda 1000 ile çarpalım =20.833hz çıktı.




şimdi high tarafına bakalım:
ona da 45000 demiştik timer1 değeri için.



hesap sonuçları
144.00 ms ve 6.944hz çıkıyor

demekki bizim toplam frekansımız:
20.833 + 6.944 = 27.777 hz




@ferdem hocam mc yi nasıl hesaplıyoruz ?
osc 10mhz de 100ns /4 dedik
peki atıyorum 8mhz olsaydı ? veya 16mhz ?

JKramer

(1/OSC) * 4 * prescale
|-----mc-----|

(1/(10^7)) * 4 * 8 = 3.2 us

ferdem

#13
Alıntı yapılan: Maxim - 08 Ekim 2010, 09:09:02
@ferdem hocam mc yi nasıl hesaplıyoruz ?
osc 10mhz de 100ns /4 dedik
peki atıyorum 8mhz olsaydı ? veya 16mhz ?

Hocam PIC lerde mc, JKramer in dediği gibi (1/osilasyon frekansı)*4 olarak hesaplanıyor. PIC serisinde bu kurala uymayan bir sınıf var mı bilmiyorum. Şimdi 16F628A nın kataloguna baktım bu değer Electrical Spec. in altında Timing Diagrams and Specifications başlığı altında TCY = 4/FOSC  olarak belirtilmiş. Kolay gelsin.

Düzenleme: Yazım hatası ;)

Maxim

teşekkürler arkadaşlar, sizede kolay gelsin