Mikrodenetleyiciler ile dc motorların hız kontrolü, ledlerin parlaklığının değiştirilmesi gibi uygulamaların yanısıra, PWM elektrik ve elektronikte birçok alanda, farklı amaçlar için kullanılmaktadır. Telekomünikasyon, güç, voltaj düzenleyiciler, ses üreteçleri veya yükselteçler gibi çeşitli uygulama alanları ve farklı uygulamaları bulunmaktadır. PWM tekniğinin mantığı mikrodenetleyicinin pininden dışarıya çıkan 5V değerini sürekli olarak değilde kesik kesik çıkışa aktarmaktır. Diyelimki mikrodenetleyicimizin bir pininden bir saniye boyunca 5V, 1 saniye boyunca 0V alınmakta ve bu böyle devam etmektedir. Bu sinyalin ortalama voltajı 2,5V olur. Frekansı ise f=1/T formülünden (1/2 saniye) 0.5Hz olarak bulunur. Bu pinden yarım saniye 5V, birbuçuk saniye 0V geliyorsa frekans yine 0.5Hz olmakla birlikte çıkış geriliminin ortalaması 1,25V olur. Yani frekans sabit tutularak sinyalin 5V değerinde kalma süresinin değiştirilmesi, böylelikle çıkıştaki ortalama voltajın ayarlnamasına darbe genişlik modülasyonu denilmektedir. Sinyalin 5V seviyesinde kaldığı saykıla görev saykılı (duty cycle) denilir. MikroC Pro derleyicisinde bulunan PWM kütüphanesi sayesinde işler oldukça kolaylaştırılmıştır.
PIC mikrodenetleyicilerde PWM birimi CCP (Capture/Compare/PWM) modülünün bir parçasıdır. PIC16f628A mikrodenetleyicisinde bir adet CCP modülü bulunmaktadır ve bu modüle ait pin RB3 pinidir.
Bu derste bir buton yardımı ile duty saykılın değiştirilmesi üzerinde duracağız.
Devre şeması:
Görüldüğü gibi devre şeması çok sade. Görev saykılını değiştirmek üzere bir buton ve sinyaldeki değişimleri gözlemek için bir osilaskop.
Kodlarımıza bakalım;
char dutycycle=0; void main() { TRISB.B0=1; // PORTB'nin 0. pini giriş yapıldı. OPTION_REG.NOT_RBPU=0; //Dahili pull-up dirençleri aktif. PWM1_Init(1000); // PWM1 frekansı 1KHz olarak ayarlandı. PWM1_Set_Duty(0); //PWM1'in görev saykılı 0 olarak ayarlandı. PWM1_Start(); // PWM1 sinyali RB3 pininden verilmeye başlandı. while(1) { if(!PORTB.B0) { dutycycle+=5; if(dutycycle>255)dutycycle=0; PWM1_Set_Duty(dutycycle); while(!PORTB.B0); } } }
Bu kodlarda kullanılmayan bir fonksiyon daha bulunmaktadır, o da “PWM1_Stop();” fonksiyonudur. Ayrıca iki veya daha fazla PWM kanalı bulunan PIC mikrodenetleyicilerde PWM2_init(), PWM3_Start() gibi kodlar yazılabilir. Buradaki 1,2,3 gibi rakamlar kullanılacak kanal veya kanalları belirler.
Bu ders notu ile ilgili bütün dosyaları buradan indirebilirsiniz.
İyi çalışmalar.
Hocam öncelikle çalışmalarınız ve aydınlatıcı bilgileriniz için teşekkür ederim, bir çok insanın ufkunun açılmasına vesile oluyorsunuz. PWM ile ilgili takıldığım bir nokta var PWM1 frekansını nasıl 50Hz’e ayarlayacağız, 18F4550 mikronetleyiciyi 20Mhz’de de 4Mhz de çalıştırarak ayarlamayı denedim ancak mikroC derlerken hata veriyor. Yardımcı olursanız sevinirim….
Pwm frekansini o kadar düşük değerlere ayarlamak imkansız gibi… Bunu ancak yazilimsal pwm kullanarak yapabilirsiniz. Timer kesmesi kullanılarak herhangi bir ptt neden istenilen oranlarda pwm sinyali alınabilir. Yazılımsal pwm için rgb led isimli konuya göz atabilirsiniz.
teşekkür ederim hemen incelemeye başlıyorum …
Merhaba,tekrar ben.
Şöyle bir proje yapmayı planlıyorum. 4 motor + 4 Ultrasonic sensor kontrolünü gerçekleştireceğim. Bunun için 8 pwm sinyaline ihtiyacım var. Ama bu pwm sinyalleri hepsi ayrı ayrı kontrol edilebilecek. yani bir pwm ile sırasıyla hepsini kontrol etmeyeceğim. Hepsinin frekansı, duty cycle’ı farklı olabilir ve aynı anda çalışabilir. Örneğin motorlar, birbirinden farklı hızlarda, doluluk oranları farklı şekilde çalışabilir. Bu yüzden 8 ayrı pwm modülüne ihtiyacım var. Microchip’in çok pwm’li denetleyicisi değilde, özel entegreler varsa onu kullanmak istiyorum. Yazılımsal pwm uygun olmayacaktr. NE555 entegresi ile oluşturabilirim ancak freakans değerini yazılımsal olarak ayarlayamam. TLC5940 entegresi led sürmek için kullanıldığından uygun değil galiba, çıkış gücü düşük. Yani bana pwm jeneratörü mü, pwm multiplexer mı denir bilmiyorum. böyle bir entegre lazım. Teşekkür ederim
Ben olsam stm32 serisi bir mcu kullanirdim.
Sizin sorunuza gelince; tlc5940 entegresinin cikislarini motor surucu entegrelerine girerek motorlari surebilirsiniz.
Teşekkürler. TLC5940 kendi sayfasında, uygun olmadığına söylemiş üreticiler.
http://e2e.ti.com/support/applications/motor_drivers/f/38/p/362422/1273227#1273227
Doğru. Çıkış akımları doğrudan motor sürmek için yetersiz. Fakat dediğim gibi araya L293 veya L298 gibi (süreceğiniz motorun çekeceği akıma göre) bir motor sürücü entegre bağlayabilirsiniz.