Timer ihtiyacı

Başlatan erdemefe, 22 Aralık 2014, 23:50:51

erdemefe

Arkadaşlar merhaba,

Yapacağım bir projede, 2 adet CCPM modülü kullanarak PWM üreteceğim, iki adet motorun devrini ölçeceğim. bir adet triyakın ateşleme süresiyle oynayarak dim yapacağım, bir de motorları farklı farklı ayarladığım süre boyunca yön değiştireceğim ve durduracağım.

Projeye başlarken hem program hafızası hem kesme öncelik ayarı hem de 4 adet TMR'ı olduğu için 18F452 seçtim.

Devir ölçme kısmından başladım TMR0'ı 8 bit olarak kullanarak 1sn'lik kesme oluşturdum. TMR1'i de 16 bit counter olarak kullanarak motorun encoderinden (motor 1 devirde 24 pals üretiyor, 1 sn'de gelen palsi 60 ile çarpıp 24'e böldüm) gelen palsleri sayarak devri doğru bir şekilde okudum. Fakat 2. motorun devrini nasıl okuyacağım TMR2 anladığım kadarı ile 8 bit bu yetersiz hem de PWMlerin frekansını ayarlamak için TMR2 kullanıldığı için ona da dokunamıyorum. TMR3'ün de CLK girişi TMR1 ile aynı. saniyeyi TMR3 ile tutup motorları TMR0 ve TMR1 ile ölçebilirim fakat bu sefer de TMR0'da 1:1 bölme oranı olmadığı için hassasiyetten ödün vereceğim.

Daha gelmedim fakat triyak ateşleme kısmı da beni düşündürüyor. zero crossing detector ile 0 geçişlerini RB0 kesmesi ile yakalayacağım 50 HZ'de çalışacağım için her geçişte 0 ile 10ms arasında gecikme ile triyaka bağlı diyakı ateşlemem gerekiyor. Bu süreyi nasıl sağlayacağım?

Kod kısmını yazabilirim fakat picin hangi özelliği ile hangi işlemi yapmalıyım hangi kesmeleri kullanmalıyım kestiremiyorum yardımlarınıza ihtiyacım var.

Teşekkürler.

erdemefe

Arkadaşlar saniye palslerini yakalamak için TMR3 kesmesini kullandım. Frekans saymak için TMR0'ı counter olarak kullanmayı deniyorum fakat TMR0 için bölücüyü devredışı bıraktığımda bide 1:2 oranında bölme yapıyor. TMR0 Counterını 1:1 ile çalıştırmak mümkün değil mi?

Mucit23

Timer0 mininmun 1:2 oluyor. Timer1 Kullanabilirsin.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

erdemefe

Onu başka bir amaç için ayırmıştım fakat şimdi fark ettim ki 16 bit modda TMR0H regısterını clear edemiyorum datasheette bahsedilmiş direk okuma yazma yapılamayacağından fakat nasıl sıfırlanacağını anlamadım.

Mucit23

Pic18F452 için Timer0 16 bit blok diyagramı aşağıdaki gibi verilmiş.


Buradan anlıyorumki TMR0H registerine yazma ve okuma işlemi TMR0L registerine bağlı olarak yapılıyor. Timer 0 bir sayaç sonuç olarak.  Kesme amaçlı kullanılacaksa ve Timer0'a preload değeri yüklenecekse TMR0H ve TMR0L değerleri aynı anda güncellenmelidir. TMR0H'ye yazma okumanın TMR0L ye bağlı yapılmasının sebebi bundan kaynaklanıyor.

Bu yüzden yazma ve okuma işlemlerinde ilk önce TMR0H sonrasındada TMR0L zerinde işlem yapman gerekir. İkiside güncellenmiş olur.
Timer0'ı sıfırlamak için ilk önce TMR0H sonrasında TMR0L nin içeriğini sıfırla.

Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

erdemefe

#5
Teşekkür ederim dediğin gibi önce TMR0H registerını yazınca sorun çözüldü. TMR0'da da bölme oranını PSA bitini 1 yaparak iptal edebiliyorsun. Fakat şimdi de şöyle bir sorun yaşıyorum countera girilen frekansın yarısını ölçüyorum hem TMR0'da hem TMR1'de. TMR3'ü 1:4 oranında 20MHZ'de 16 BIT olarak kurdum 0.2us*4*65536=52428.8us'de bir kesme oluşturdum 19 kesmede 1 saniyeye denk geliyor sayıcıyı 19'a gelince TMR0 ve TMR1'den değer okuyorum fakat okuduğum değer tam yarısı. Simulasyonda osiloskop ile baktığımda her 1sn içerisinde girilen frekans kadar yükselen kenar görüyorum fakat registerda yarısı görülüyor. Bu sorunu nasıl çözebilirim?



T0CON=%10101000         ' TMR0 AÇIK, 1:1 BÖLÜCÜ, YÜKSELEN KENAR, COUNTER
T1CON=%00000111         ' TMR1 AÇIK, 1:1 BÖLÜCÜ, COUNTER, SENKONIZE DEĞİL

DISABLE
KESME:
SYC=SYC+1
IF SYC=19 THEN

RPM1.LOWBYTE=TMR0L : RPM1.HIGHBYTE=TMR0H
TMR0H=0 : TMR0L=0
RPM2.LOWBYTE=TMR1L : RPM2.HIGHBYTE=TMR1H
TMR1L=0 : TMR1H=0

SYC=0
ENDIF

TMR3IF=0

RESUME
ENABLE
END

Powered by EzPortal