Selamün aleyküm arkadaşlar. devremde 50Hz - 1500Hz aralığında pwm sinyallerine ihtiyaç duyuyorum. 10mhz kristal kullanıyorum. pwm için de timer2 yi kullanıyorum. malum bu timer 8 bit olduğundan 10 mhz kristal için 610Hz altına inemiyorum. bu timeri kullanarak, kristal frekansını düşürmeden CCP pwm frekansını aşağı çekebilme yolu yok mu? çözünürlük 10 bite çıkabiliyor ama bu sanırım duty/cycle oranı ile ilgili bir durum.
aynı kılıfta bu işi görebilecek pic mcu tavsiyelerine de açığım.
Hocam CCP birimini kullanmadan 19-20mS taşma oluşturacak Timer kurup çıkışı tersleyerek de oluşturabilirsiniz bu sinyali. HPWM zorunluluğu mu var?
PWM modülünü kullanmam kesinlikle iyi olacak. diğer türlü dediğiniz gibi de yapılabilir ama programın sürekli kesmeye girip çıkmasını istemiyorum.
http://ww1.microchip.com/downloads/en/AppNotes/00594B.PDF (http://ww1.microchip.com/downloads/en/AppNotes/00594B.PDF)
Hocam bir tablo var işlemci frekansı ile pwm frekansı arasındaki bağlantı ile ilgili.
Bir de bir hesaplama sitesi var, ben en düşük 1MHz'de 60Hz'leri görebildim, bir de siz bakın.
http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html (http://www.micro-examples.com/public/microex-navig/doc/097-pwm-calculator.html)
Evet hesap doğru cemre. verdiğin uygulama notunu da inceliyorum. pek bir şey çıkartabileceğimi sanmıyorum ama bir gelişme olursa yazarım. yardımın için teşekkür ederim.
50 - 60 Hz sinyal üretmek istiyorsan kristali 4 mhz e düşür daha randımanlı olacaktır.
arkadaşlar http://ww1.microchip.com/downloads/en/AppNotes/00594B.PDF (http://ww1.microchip.com/downloads/en/AppNotes/00594B.PDF) buradaki ilk sayfada aşağıda resmini verdiğim kısımda bir şeyler anlatıyor ama anlayamadım. bir şekilde bu timer2 8 bitten 10 bite çıkartılabiliyor mu yoksa sadece ilk mesajda dediğim gibi çıkış göre/peryot oranını 2^10 parçaya mı bölerek hassasiyeti mi arttırıyor?
(http://s21.postimg.cc/ygrxmz7jn/not.jpg) (http://postimg.cc/image/ygrxmz7jn/)
Olmuyor hocam.
Alıntılanan dökümanda bahsedilen 2 biti bir yerlerde tanımlayıp 10bit çözünürlüğe çıkmak. Ki bu halinde 610Hz e kadar düşebilir, 10Mhz + Pll ile.
Timer prescaler değeri 256 olabilen, ve PWM çözünürlüğü en az 10 bit olan bir işlemci lazım size.
Canım sıkıldı şimdi devreyi kur hemen hemen her şey yerli yerine otursun pwm sayıcısı 8 bit olsun buraya takıl. hata bende ama bu hiç aklıma gelmemişti, başka yerlere odaklanmıştım. sanırım bundan sonra bu işler için keil ve stm32f103 ikilisine geçeceğim.
sizin prescaler oranınız nedir?
setup_timer_2(T2_DIV_BY_16,255,16); //1,6 ms overflow, 26,2 ms interrupt
setup_ccp1(CCP_PWM|CCP_SHUTDOWN_AC_L|CCP_SHUTDOWN_BD_L);
set_pwm1_duty((int16)510);
prescaller değeri 16 hocam. timer2 için prescaller değeri 1,4,16 olabiliyor. pwm için tetikleme timer2/4/6 olabiliyor. bunlarda da en fazla prescaller değeri ne yazık ki 16.
yukarıdaki kod minimum pwm frekansını üretiyor. o da 10mhz kristal için 625Hz.
o zaman bulduğunuz değer 10bit timer değeri için üretilmiş
hocam anlamadım kusura bakma. kafam durdu şu an.
PWM Period = PRx . 4 . Prescaler
________________
10000000
rakamları yerine koyarsan 610 Hz yapıyor
evet hocam benim bulduğum değerler de aynı. teşekkür ederim. beni yanıltan(umutlandıran) çözünürlüğün 10bit olarak ayarlanması oldu. neyse
@Cemre. nin de önerdiği gibi kesme içine girip çıkarak 50-610Hz arasındaki sinyalleri kesme ile çıkışı toggle yaparak, daha yüksek frekanslı sinyalleri ise PWM modülü ile üreteceğim.
intosc 500khz ayarlarsanız, pwm ile 50 hz alırsınız çok rahat.
hatta 30hz ile 60khz arası gibi birşey
@Maxim hocam teşekkür ederim bir heves inceledim datasheeti ama ne yazık ki olmuyor. capture compare kısmı osilatör tetiklemesinde dahili osilatör ile de yapılabiliyor. ancak PWM modülünü tetikleyen TIM2/4/6 ler sadece external osilatörden tetikleme alıyor. eğer böyle ise bu durumda dahili osilatörle çalışan bir sistemde bu timerler kullanılamayacak mı? biraz daha bakayım.
---------------------
timer2 sadece sistem clock source den besleniyor. benim sistem kristalim 10mhz olduğundan sadece onu kullanabiliyor.
aşağıdaki dökümanın 4. sayfasında da "Timer Clock Source The Timer2 module has one source of input clock, the device clock (FOSC/4)." olarak belirtilmiş.
http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf (http://ww1.microchip.com/downloads/en/DeviceDoc/31013a.pdf)
Kesme içinde TimerX ile bir değişkeni artırınız; bu
değişkeni ana döngü içerisinde istediğiniz değer
ile karşılaştırınız. Buna göre de ilgili pinin değerini
değiştiriniz.
Analog girişi kullanılarak da değişkenlik sağlanabilir...
haklısınız, ben bu yolu kullanmamak için iki gündür zorluyorum ama başka çare kalmadı şimdilik bu şekilde olacak.
Alıntı yapılan: mehmet - 21 Mart 2016, 11:38:48
Kesme içinde TimerX ile bir değişkeni artırınız; bu
değişkeni ana döngü içerisinde istediğiniz değer
ile karşılaştırınız. Buna göre de ilgili pinin değerini
değiştiriniz.
Analog girişi kullanılarak da değişkenlik sağlanabilir...
Bu durumda gereken pwm frekansından çok daha fazla, istenen pwm çözünürlüğü kadar kesmeye girilmesi gerekir.
Timer 1/3/5 32K int osc ile çalışabiliyor. Timer0 prescaler i 256 olabiliyor ve counteri 16 bit.
Bu timerlardan birini kullanıp sadece pini low high yapacak şekilde frekansın 2 katı katı kesmeye girmek yeterli.
610/50=12,5% dan fazla duty gerekmeyecekse, pwm one shot modunda frekans kadar kesme yeterli olur. timer0/1/3/5 kesmesinde TMR2/4/ reset ve pwm enable et kodu yeter.