PWM Kodu?

Başlatan 94onur94, 14 Aralık 2012, 02:38:06

94onur94

Merhaba arkadaşlar bu yazılımdaki PWM kodu nasıl oluyoda istediğimiz pinden pwm sinyali üretebiliyo
For i=0 To 255 Step 1
PWM GPIO.1,i,5 Yazılımsal pwm mi oluyo burdaki C dilinde bunu nasıl yapabiliriz?

yusufburak

emin değilim ama orda 0'dan 255'e adım adım arttırarak git deniliyo galiba :S
C'de ise

for(i=0;i<=255;i++);

muhtemelen C'de bunu yapabilirsin. aradan 4 sene geçtiği için pek hatırlamıyorum afedersin umarım doğrudur yazdığım :)
Öğretici aranıyor :)

drmp

#2
{

hani bunun parantezleri ;
sanırım yukarıdaki kod eksik;

}






ete

Burada bir Basic komutu olan PWM komutunun ne yaptığına bakmak gerekir. Önce komutun parametrelerine bakalım.
PWM Pin,Duty,Cycle
Burada Pin PWM sinyalinin çıkartılacağı pin'i belirler.
Duty değeri ise PWM sinyalinin alacağı %duty oranını belirler. 0 verilirse duty değeri sıfır 255 verilirse duty değeri %100 olur. 127 için duty %50 olacaktır.
Cycle ise bu sinyalin ne kadar süre yada çevrim olarak çıkartılacağını belirler. Süre genelde işlemci kristaline bağımlıdır. 4 Mhz osilatör kullanılması durumunda sinyal 5 ms süre ile ilgili pinden çıkartılır.
Bir örnek verecek olursak PWM PORTA.0,127,100  şeklinde bir komut kullanılırsa bu PORTA.0 pininden duty değeri %50 olan bir sinyalin 100 puls olarak çıkartılacağını ifade eder.
Şimdi sizin örneğe dönecek olursak,
For i=0 To 255 Step 1  burada 0 ile 255 arasında bir döngü kuruluyor. (Step 1 yazılması gerekmiyor idi)
Sonra döngü değeri PWM komutuna yerleştiriliyor.
PWM GPIO.1 , i , 5
Burada hemen anlayacağınız üzere 0-255 arasında bir döngü kurularak çıkartılacak olan PWM sinyalinin Duty değerinin %0 ile %100 arasında değiştirilmesi düşünülmüş. Bir nevi rampa yada soft start gibi bir şey yapılmaya çalışılmış.
Bu bir yazılımsal PWM işlemidir ancak bildiğimiz anlamda değil. Çünki sinyalin sürekliliği yoktur. Komut bitince sinyalde biter. Yazılımsal PWM sinyalinde sinyalin sürekliliği olmalıdır. Sİnyali açıp kapatabilirsin. Duty değeri ile oynayabilirsin.  Gelelim benzer bir işi C dilinde yaratmaya. Ben olsam aynısını elde etmeye çalışmazdım. Onun yerine bir TMR0 kesmesi kullanıp sürekliliği olan bir PWM sinyali üretir ve kuracağım döngü ile duty oranını değiştirirdim.
Adım adım tarif edersek;
- PWM frekansı olarak diyelimki 500 hz kullanacağız. Peryod 2ms olacaktır. Bu HIGH ve LOW süreleri toplamıdır.
- Her 2 ms de bir kesme oluşturacaksın.
- Programın ana bölümünde I değişkenine 0-255 arasında değer verdirecek bir döngü kuracaksın.
- I değişken değeri sende HIGH süresini belirleyecektir. 0 değeri Hıgh süresi =0 olarak uygulanacak, 255 değeri ise 2 ms olarak uygulanacaktır. LOW süresi ise 2000us-HIGH süresi olarak hesaplanıp uygulanacaktır.
- Sonuçta kesme kısmında I değişkenine bağlı olarak ;
- PIN=1 (PWM sinyali HIGH oldu
- I değişkenine karşılık gelen gecikme süresini us olarak hesaplayacaksın ve o kadar gecikme (0-2000 us) uygulayacaksın
- SOnra PIN=0 yapıp 2000-HIGHSüresi kadar lık bir gecikme daha verip kesmeden çıkacaksın.
Hepsi bu kadar.
Ete

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