Haberler:

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

Ana Menü

pwm ve frekans yardım!

Başlatan dijitaltemas, 13 Nisan 2007, 10:46:02

dijitaltemas

Arkadaşlar bildiğiniz gibi pic basic proda HPWM komutu var. HPWM pin,değer,frekans olarak kullanıyoruz. Fakat bu komutu kullanmak için picde donanımsal pwm yi desteklemesi gerekiyor. Ben program ile bir pwm yapmak istiyorum PWM pin,değer,sakıl adeti olarak çalısıyor. Ama ben HPWM komutunda oldugu gibi frekansıda sabit 2000 vermek istiyorum. Bunu yapmak için nasıl bir yol incelemeliyim. :) Bana bu konuda yardımlarınızı bekliyroum. Sitede araştırdım ama yeterli bilgi bulamadım. Frekans konusunda yardımlarınızı bekliyorum. İyi çalışmalar picproje ailesi ;) :D

gloin

istediğiniz frekans değeri için timer içeriğini girip, ilgili timer ın taşma interruptın da istediğiniz bir pini toggle ederek pwm e benzer bir işaret elde edebilirsiniz

//isr
.
pin_degeri != pin_degeri;
timer = <istenen frekans için hesaplanacak değer>
.

timer içeriğine pin değerinin 1 ve 0 olduğu durumlarda aynı taşma değerleri yazarsanız duty cycle %50 olur, farklı değerler yazarak duty cycle ı değiştirebilirsiniz

iyi çalışmalar,
Gloin

dijitaltemas

hocam bu konuyu biraz daha açık anlatabilirmisiniz ? Biraz kafam karıstırdı bu konu :( :(

ete

Sabit 2000 HZ lik bir PWM sinyali elde etmenin en iyi yollarından birisi TMR0 kesmesi kullanmaktır.
Frekansın 2000 HZ (2 khZ) olması durumunda bu sinyalin peryodu;
T=1000000/F formülü ile hesaplanıyor idi(us cinsinden). Buna göre;
T= 1000000/2000 = 500 us olarak bulunur. Bu şu demektir.
Şayet Duty oranı %50 ise bu sinyalin 250 us lik bölümü HIGH 250 us lik bölümüde LOW süresidir. O halde biz TMR0 sayacını her 250 us de bir kesme oluşturacak şekilde ayarlayabilirsek istediğimiz sinyali kolaylıkla elde edebiliriz.
4 MHz de komut işleme süresi 1 us olduğuna göre TMR0 şayet 0-250 ye gelince yada 256-250=6 dan tekrar 256 oluncaya kadar sayar ise her 250 us de bir kesme oluşturur. Programın Kesme kısmında ;
TOGGLE PIN
TMR0=6
komutlarını vermeniz halinde sistem 2 KHz lik sinyali sürekli üretecektir.

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

gloin

örneğin 4 mhz lik bir kristali 18 serisi piclerle kullandığınızı düşünün.

Fcy = Fosc/4 olduğundan Fcy = 1mhz olur yani zaman olarak 1us

kullanacağınız timerı 16 bitlik olarak konfigüre edip, prescale kullanmazsanız, ve timerin high ve low byte larını sıfırdan başlatırsanız, timer 65535 e kadar sayıp taşacaktır (0 a dönecektir içeriği) ve eğer önceden taşma interruptını enable etmişseniz , ilgili timer ın interruptına girmiş olursunuz. Taşma interruptına girme süreniz yaklaşık 65.5 ms olacaktır. (65535 * 1us)

Timer ın high ve low byte ını sıfırdan değil de başka bir değerden başlatırsanız taşma süresini kısaltırsınız yani frekansınız büyür.
örneğin,

TMR0H = 0x7F;
TMR0L = 0xFF;

verirseniz ilk konfigürasyonda,
timer saymaya başlar ve timer0H=0xff ve timer0L = 0xff olunca taşar ve interrupta girer, fakat bu seferki taşma süreniz yaklaşık 32 ms olacaktır.

bu şekilde istediğiniz frekans değerine göre timer0h ve timer0L değerlerini hesaplayabilirsiniz  

işte bu interrupt içerisinde eğer bir output pininizi toggle ederseniz pwm üretmiş olursunuz

out_pin = !out_pin; bu ifadeyle interrupta her girildiğinde, pin 0 değerindeyse 1, 1 ise sıfır atanacaktır, böylece pwm üretmiş olursunuz.

iyi çalışmalar,
Gloin

dijitaltemas

Arkadaşlar verdiğiniz bilgiler için çok çok tşk ederim. Bilgiler çok işime yaradı. İyi çalışmalar... :D

paradox

şu linke bi göz at eğer sorun yaşarsan.ben 100 khz yapmaya çalıştım.ama 25 khz oldu.tmr0 değerini ve goto gibi komutları hesaba katarak ayarla istersen.program çalışıyo denendi  ;)
konunun en altındaki program...

kolay gelsin...

http://picproje.org/index.php/topic,14773