Elektronik Devreler Projeler Elektronik ve biraz daha fazlası İletişim - Araçlar - Dikkat - Topluluk
Elektronik / Elektronik Kaynakları/

MikroC Dersleri 12

Sponsorlu Bağlantılar

Merhaba elektronik Severler. Bir önceki dersimizde programcılık deneyimlerimiz arasına Pic ile analog işlemler işlemeyi, kullanım algoritmasını ve ilgili değimlerini ve programsal kullanımını ve örnek uygulamamızı gerçekleştirdik. Bu dersimizde PIC ile PWM protokolünün kullanımını öğreneceğiz. Ve bunu örnek bir proje ile pekiştireceğiz. Burada bahsedilen protokol PWM harfleri PULSE WİDTH MODÜLATİON yani sinyal darbe genişliği kelimelerinin baş harfidir. Bir sonraki dersimizde OW (one wire TEK KABLO) Protokolünü işleyeceğiz.

Dersimize başlamadan önce alışkanlık olan işimize yarayabilecek birkaç kısa bilgi verdikten sonra dersimize geçelim.

• PWM yöntemi ile çözünürlüğü yüksek voltaj bölme işlemleri gerçekleştirmek mümkündür.

• Bu bölme işlemleri bir mantık dahilinde yapıldığı taktirde Bir DC motor Hız kontrolcüsü yada Dimmer kontrolcüsü mümkün olabilmektedir.

• Yine hızla yaygınlaşan LED tabela ve aydınlatmalarında da animasyon yada seviye ayarlamada kullanımı mümkün olmaktadır.

• Günümüz devre tasarımları SMD malzemelerin fiyat uygunluğu gerekse devre tasarımlarının boyutu küçültmesi sebebi ile kullanımı yaygınlaşmaktadır.

Bu kadar bilgi bu ders için yeterli.

Detaya girmeden PWM nedir ne mantığa dayanır ondan bahsedelim. Biz bir voltaj bölme işlemi yapacaksak önce bir oran belirlemeliyiz ve bu orana göre PWM modülünü hazırlamamız gerekir. Burada bir periyotun görev saykılı ayarlanmış olacaktır. Yani demek istediğim 10voltluk bir gerilim kaynağı ile bir motor 1000Devir/dakika ile döndüğünü varsayalım Ancak bize234d/d ile bir hız gerekli olsun bunun için bizim motora voltaj olarak 2,34V vermemiz gerekir ancak bu bölme işlemini dirençle yada tel rezistansla yapmak enerji kaybetmemize sebep olur oysa PWM ile sürme işlemini yapacağımız transistor yada mosfeti gerilimi alacağımız bir oranlı frekansla tetiklememiz yeterli olacaktır.

Ayrıca dirençli bölme işleminde bazı ürünler belirli voltajın altında çalışmayacağı için kullanımı güçtür. Örneğin ledler 0,7 0,8voltun altına düştüğünde çalışmazlar oysa pwmde oransal olarak 0,001 volt ile dahi çalışır çünkü lede her zaman gerekli gerilim gelecek ancak çalıştırılma oranı çok küçük olduğundan sanki o kadarlık gerilim varmış gibi çok kısık ışık verecektir.Mesela 10vluk bir kaynakta 2,34voltu elde etmek için 1000 dilimlik zamanın 234lük kısmında mosfet tetiklenmeli kalan kısmında isi kesimde tutulmalıdır. Yada 10 volttan 5volt elde edeceksek 500ms on 500ms off yapılmalıdır.burada zamanı elde edeceğimiz sinyalin frekansı 2 3 KHz ile 10 12 KHz aralığında olması yeterli olmaktadır.bunu grafikle gösterirsek

pwm-sinyalin-frekansi-2-3-khz-10-12-khz-pwm

Yukarıdaki örnekte Vcc gerilimi 0-5V olan sinyal için ortalama gerilim değeri
%25 için ortalama gerilim 1.25V olur
%50 için 2.5V olur
%75 için 3.75 olur.

Eğer %100 pwm değeri için ortalama gerilim Vcc ye eşit olur5V olur.

Buraya kadar anlattıklarım pwm olgusunun mantığını oluşturmaktadır.

Pic ile bu yapının gerçekleştirilmesi ise çokta zor değil.

PWM modülasyonu uygulamanın 2 seçeneği vardır. Donanımsal PWM yada yazılımsal PWM dir. Donanımsal PWM Kullanacak Olduğumuz PIC donanımında olması gerekir. Bunun içinde seçeceğimiz PIC i dikkatle seçmeliyiz. PWM modülü Capture ve compare modülü ile orak bileşenler içermektedir(TIMER1 i kullanarak işlerler) Bu sebepten ötürü genelde CCP1 CCP2 gibi adlanırılarak etiketlenir. Donanımsal PWM kullanmak için öncelikte CCP1 CCP2… Pinleri çıkışa yönlendirilir. Bu CCP1 2 pinleri 16F877A da PORTC1 ile PORTC2 pinleridir. 628Ada PORTB3dür.

Çok hassas zamanlama gereken işlemleri için PWM periyodu PWM Duty cycle (görev saykılı) ve PWM Frekansı Gerekli hesaplamalar sonucunda belirlenmelidir. Bu hesaplamalar birkaç matematiksel dönüşüm işleminden ibarettir. Gerekli olması halinde PWM konusuna değinen bir kitaptan yada PİC datasheettlerinde bulabilirsiniz. Burada biz mikroC kullandığımız için işin detay hesaplamasından çok iş yapacak kısa ve net bilgiler yeterli olacak.

Bu yüzden MikroC yi oluşturanlara şükran borçluyuz assembbly ile uğraşsak bir PWM için 2 3 sayfayı dolduracak kodlarla boğuşmamız gerekmekteydi. Oysa şimdi bu işi çok kolay bir şekilde yapabilmemizi sağlayan birkaç fonksiyon komutlardan başka bilmemiz gereken birşey yok.

MikroC ile bilmemiz gereken fonksiyonlar aşağıdakilerden ibarettir.

PWM1_Init(10000); // PWM1e 10khz yüklendi PWMin çalışacağı frekansı belirtiriz

PWM1_Start(); // PWM1 başlatılıyor ccp1 PWM1 ise ccp1 sürülür PWM işlemlerinin başlaması için yazılmalıdır

PWM1_Set_Duty(x); PWM2_Set_Duty(j); // j değeri PWM2 ye yüklendi x değeri PWM1e yüklendi. PWM geçerli değerinin yeni değerlerle değiştirilmesi için kullanılır.

Bu dediklerimizi örnek program üzerinde incelersek

/*
Projeyi yazan : Aytaç Dürgen
 Projenin adı : Pwm modülünün kullnılması
 Mikrodenetleyici:PIC16F877A
 Proje Tarihi : şubat 2010
 Açıklama : bu projede Pwm sayaçlarından birisi
 PWMin bağımsız gerçekleştiğini göstermek için PortB da gösterildi
*/

unsigned short j,x;

void AnaAyarlar() {
PORTB = 0; // portb sıfırlanıyor
TRISB = 0; // PORTB cikis olarak ayarlandi

ADCON1 = 6; // tum adc girisleri digital olarak ayarlandi
PORTA = 0xFF; // PORTA cikisi ff yapıldı
TRISA = 255; // PORTA girise ayarlandı

PORTC = 0xFF; // PORTC ff yapıldı
TRISC = 0; // PORTC çıkış yapıldı
PWM1_Init(10000); // PWM1e 10khz yüklendi
PWM2_Init(10000); // PWM2e 10khz yüklendi
}//~

void main() {
AnaAyarlar(); // AnaAyarlar ayarlarını uygula
j = 0;
x = 255; // j değeri 255 e pwm%100ye ayarlandı
PWM1_Start(); // PWM1 başlatılıyor ccp1 PWM1 ise ccp1 sürülür
PWM2_Start(); // PWM2 başlatılıyor ccp2 PWM1 ise ccp1 sürülür

while (1) { // sonsouz döngü
if (Button(&PORTA, 0,1,1)){ // RA0 a basıldımı?
j++ ; // j +1
x--;
}
if (Button(&PORTA, 1,1,1)){ // RA1 a basıldımı?
j-- ; // j - 1
x++ ;
}
PWM1_Set_Duty(x);
PWM2_Set_Duty(j); // j değeri PWM2 ye yüklendi
PORTB = j; // j değerini PORTBde göster
Delay_ms(40); // bekle
}
}


Yazılımsal PWM

Buraya kadar anlattıklarımızı Pic donanımı sayesinde kendisi yapıyordu yazılımsal olarak yazılımsal pwm de ise işi yazılım yapar ve PIC işlemekte olan programı o işlemlerin yapılmasını bekler. O sebeple işlemlerin ve zamanlamaların yerinde kullanılması gerekli.

Yazılımsan olarak fonksiyon delay kodundan ibarettir.

Void PWM_YAZILIM(unsigned short PWM_DEGER){
For(i=0;i

Şeklinde bir fonksiyon tanımlandığında donanım PWM fonksiyon PWM değerini parametre olarak alacak fonksiyona girdirecek bu değeri 255 dilimde oranlayacak Modülasyonu bu şekilde gerçekleştirecek.

Bu fonksiyon ana program da döngü içerisinde PWM_YAZILIM(200); şeklinde çağrılabilir. Burada 200 parametre olur ve 255 dilimlik zamanın 200uSaniyesi DUTY cycle olur ve 1 seviyesinde çıkışı tutar. Buradaki temel yazılımsal PWM dir.

Yazılımsal olarak daha değişik fonksiyonlar geliştirmek mümkündür. E bu işte tabi uğraşıp emek verenlere haiz olacaktır.
Armut piş ağzıma düş olmaması için daha kapsamlı bir yazılım paylaşmıyorum.

Bu dersimizde bu kadar.

Uğraşan arkadaşlara kolay gelsin Sorularınız yanıtlamaya çalışırım.

Alt tarafta iletişim kanallarım mevcut herkesi internet siteme girmeye davet ediyorum. Önümüzdeki süreçten ürün satışı yapmak için googledan listelere girmemiz gerekiyor e listeye girmek içine siz değerli öğrencilerimin sitemizi muhtelif zamanlarda ziyaret etmesi gerekiyor.

Kolay gelsin İyi Çalışmalar.
Kaynak yazılım ve isis şeması:

ELEKTRİK EELEKTRONİK EKNİK ÖĞRETMEN
http://www.facebook.com/#!/umutelektroniktarsus(aytacdurgen)
aytacdurgen@gmail.com
tarsusled@gmail.com
www.ledpiksel.com
544 924 28 87

Umut Elektronik,Orman Ürünleri ve İnşaat SAN TİC LTD ŞTİ
LED kayan Yazı, LED VİDEO EKRAN , LED TABELA, Animasyon, Saat derece,RGB animasyon,kayan yazı ve kontrol kartları,LED GRAFİK PANEL,otobüs güzergah kontrol kartları,USB Cihaz Kontrolü,USB kontrollü Petrol Fiyat Gösterge Kontrol Kartları,
TARSUS MERSİN

  • ysf

    mikro C’de 2’lik tabandaki sayıyı 10’luk tabana çeviren bir komut var mı ?

  • Özkan

    Allah razı olsun Aytaç hocam, ne güzel uğraşıp, emek verip paylaşıyorsun.

  • Aytaç

    @yusufevet öyle bir komut var ama gerekli dönüşümleri matematiksel olarak siz kendiniz programa dahil etseniz daha sağlıklı olur . Bintodec yada dectobin diye kod olması gerek.şu an bilgisayar kullanma imkanı maalesef yok tam olarak kod aklımda degil :-(

    @özkan
    Dostum fayda sağlayabiliyorsam ne mutlu . Umarım bilginize fayda sağlıyordur.

    bu arada 13. Ders bi dört ay daha yayına girmeyecek sebebi ise şu an askerlik görevimi infaa etmekteyim haziranda yeni ders yeni uygulamalarla yayına girecek allah izin verirse.
    kolay gelsin iyi çalışmalar.

  • Hamza

    PWM_init’e yazdığımız frekans değerini neye göre belirliyoruz?