7 Mayıs 2014 Çarşamba

Arduino - PWM ile DC Motor Sürme

Darbe genişlik modülasyonu (PWM) ile ilgili uygulama gerçekleştirmiştik. Bu yazımda ise bu konuyu biraz daha aralayacağız ve bu modülasyon ile transistörün anahtarlama özelliğinden faydalanarak DC motor hızını kontrol edeceğiz.

PWM'den bahsetmeden önce gerekli olan malzemelerden bahsetmek istiyorum.
  • 2N2222 Transistör
  • 1N4001 Diyot
  • 5K ya da 10K Pot
  • DC Motor (9V'luk ya da daha küçük)
  • 470 Ώ direnç
PWM NEDİR ?
PWM en basit haliyle bir sinyal modülasyon tekniği olarak tanımlanabilir. Sinyal bilgisinin aktarım için uygun hale çevirilmesi amacının yanı sıra güç kontrolü sağlamak ve elektrik makineleri,güneş pili şarj üniteleri gibi özel devrelere destek olmak amacı da taşır. 


Bu kontrol de tamamen anahtarlama ile sağlanır. Anahtarlama ne kadar hızlı yapılırsa, PWM ile aktarılan sinyalin gücü o kadar da artar. Örneğin bir lambaya gönderilen sinyalde PWM tekniğine ihtiyaç duyuluyorsa, bu teknik 120 Hz frekans değerinde uygulandığında maksimum verim elde edilebilir. 

"Duty Cycle" yani görev döngüsü olarak tanımlanan bir kavram bulunuyor ve PWM tekniğinde de sıkça karşımıza çıkıyor. Görev döngüsü kavramı aslında yapılan işlemin periyodunu belirtiyor. Bu döngü düşük seviyelerde ise aktarılan güç düşük olurken, döngünün yüksek seviyelerinde yüksek güç aktarılıyor. 




Basitçe soldaki Duty Cycle grafikleri ile PWM'i şu şekilde anlatabiliriz. 10 bitlik bir ADC ile analog değerimiz 0-255 arasında değer alır. Bu yeni dijital değer ile anahtar olarak kullanacağımız transistörün bazına bu sayısal değerler ile PWM uygularız. Sayı ne kadar büyük ise "Pulse Width" yani "Darbe Genişliği" o kadar büyük olur.

Bir pervaneyi elimizle çevirdiğimizi düşünelim. Ne kadar çok çevirip az dinlenirsek pervanemiz o kadar çok dönecektir. Çevirim kısmını 1,dinlenme kısmını da 0 olarak düşünürsek 1'ler ne kadar çoksa pervane de o kadar çok hızlı dönecektir. İşte bu 1'ler transistörümüzün bazına uyguladığımız PWM sinyalinin Darbe Genişliği demek oluyor.

DC MOTOR SÜRMEK
Edindiğimiz bilgiler ile DC Motor sürmek artık kolay. İhtiyacımız yüksek akım kapasiteli bir transistör, PWM üretecimiz ki biz bunu Arduino'muz ile yapacağız ve 1 motor ile diyot.


Soldaki devreyi Arduino'muz ile kuracağız.Transistörün 2N2222 veya muadili olmasına dikkat etmekte fayda var hakeza BC547 vs. gibi transistörler ile bu iş mümkün değil.Çünkü motoru döndüren güç akımdır ve yüksek akım geçiremeyen transistörler ile motor süremeyiz.
Direnç olarak 1k Ώ da kullanabilirsiniz fakat ben 470 Ώ kullandım, bu konuda sıkıntı yok.







Çok kısa da olsa kullanacağımız transistörden de bahsetmek istiyorum. Tüm transistörlerin C,B,E bacakları standart değildir. O yüzden devreyi tamamlerken sağdaki resme bir göz atmanızda fayda görüyorum. Ben ilk seferde transistörü ters taktım ne yazık ki :D ve  transistör o kadar çok ısındı ki elimi yaktım. O yüzden dikkat !





ARDUINO ile DEVRE BAĞLANTISI
Arduino ile sadece motoru yavaşlatıp hızlandırmayacağız. Analog girişe taktığımız potansiyometre değerine göre motorumuzu süreceğiz ve bu işi en kısa yoldan yapmamızı sağlayan bir kod da öğrenmiş olacağız, map.
"map" komutu ile istediğimiz bir çıkış değerini, bağlı olan giriş değerine göre anında değiştirebiliriz.Örnek vermek gerekirse ki bu kodu motor sürme devremizde de kullandık;

motordegeri = map(potdegeri, 0, 1023, 0, 255);

Bu yukardaki kod ile "motordegeri" isimli değerimizi, potun durumuna bağlı kıldık ve okunan analog değeri 10 bit ile sayısal değere çevirdik ve bunu da çıkışa 8 bit olarak yansıttık. Bu sayede motorumuzun hızını potansiyometrenin değeri ile kontrol edebiliyoruz.

Devreyi kurarken motoru harici bir pil ya da adaptör ile sürmenizde fayda var yoksa motoru arduino üzerinden süremezsiniz. Kodlarımız ;

int potPin = A0;
int motorPin = 3;
int potDegeri = 0;
int motorDegeri = 0;
void setup() {
 Serial.begin(9600);
}
void loop() {
 potDegeri = analogRead(potPin);  
 motorDegeri = map(potDegeri, 0, 1023, 0, 255);
 analogWrite(motorPin, motorDegeri);  
 Serial.print("Potansiyometre = " );     
 Serial.print(potDegeri);
 Serial.print("\t motor = ");
 Serial.println(motorDegeri);
 delay(2);    

}

Devreyi çalıştıtırken Seri Haberleşme Monitörüne bakmayı da ihmal etmeyin :).
Bu da devremizin son halinin resmi ve videosu.






22 yorum:

  1. guzel ve aciklayici bir calisma olmus elinize saglik.

    YanıtlayınSil
  2. ben bunu reduktorlu dc motorla yapabılırmıyım?

    YanıtlayınSil
    Yanıtlar
    1. 2N2222 transistörü 0,8 A'e kadar akım çekebilir. Motorunuzun çekeceği akım bu değere kadarsa çalışabileceğini düşünüyorum. Değilse eğer MOSFET'li sürücü devresi kurabilirsiniz. Şu başlık biraz yardımcı olabilir size.
      http://forum.arduinoturkiye.com/discussion/1169/reduektoerlue-dc-motor-sueruecuesue/p1

      Sil
  3. Motorun değerlerini yazabilir misiniz

    YanıtlayınSil
  4. ben bu devredeki atmega 328p-pu arduıno üzerinden söküp baskı devre üzerinde yapmam lazım .bana bu konuda yardımcı olabilirmisiniz .ödev olarak yapmam laım

    YanıtlayınSil
    Yanıtlar
    1. https://www.quora.com/Can-I-use-ATmega328P-without-Arduino-just-using-it-in-breadboard-for-projects

      kurulum burda.

      Sil
  5. Hocam motordan bi ses geliyor ama dönmüyor sorun ne yardımcı olur musunuz

    YanıtlayınSil
    Yanıtlar
    1. Transistörünüzü değiştirin. 2N2222 ya da yüksek akım geçirebilen bir transistör kullandığınızdan emin olun.

      Sil
  6. Güzel olmuş. Peki joystick ile 2 dc motor nasıl olur. Sağ sol ileri. Böyle bir çalışma yapmak istiyorum ben

    YanıtlayınSil
  7. selamlar
    1 Ω = 10 Ώ
    bu doğrumudur ? ohm işaretinde çizgi olunca 1 sıfır ekleniyor sanırsam

    YanıtlayınSil
    Yanıtlar
    1. Böyle bir şeyi ilk defa duyuyorum. 0 ekleme gibi bir durum yok :).

      Sil
  8. iki tane dc motoru sürücü olmadan sürebilir miyim

    YanıtlayınSil
    Yanıtlar
    1. Sürücüden kastınız transistörler ise hayır süremezsiniz.

      Sil
  9. elinize sağlık.
    ben 4 adet 3.7 v mikro dc motoru bu şekilde transistör ile sürerek qualkopter yapmayı düşünüyorum.
    820 dc motor 300 ma çekiyor. bu durumda bc547 kullanabilir miyim.
    bir de arduino ile transistör aradındaki direnç 300 ma motora tam güç vermesi için kaç ohm olması gerekir ?
    teşekkür ederim.

    YanıtlayınSil
    Yanıtlar
    1. Teşekkür ederim.
      BC547 en fazla 100mA geçirmektedir. O yüzden yeteceğini düşünmüyorum.
      Aradaki direnç konusunda ise arduino pininden en fazla 40mA akım çıkabiliyor 5V gerilimde yanlış hatırlamıyorsam. Kullanacağınız transistörün ß kazancını bilmeniz gerekmekte direnci hesaplayabilmeniz için.

      Sil
  10. Bu yorum bir blog yöneticisi tarafından kaldırıldı.

    YanıtlayınSil
  11. Çok güzel açıklama olmuş internette û transistör ne işe yarıyor tam anlamamıştım çok teşekkür ederim bir şey sormak istiyorum bende l298 motor sürücü devresi var bu transistörü ikisini birlikte kullanma şansımız var mı kurdum mantık yanlış mı eğer doğru ise nassıl bağlantı yapabiliriz

    YanıtlayınSil
    Yanıtlar
    1. L298 varsa transistör kullanmanıza gerek yok, L298 içerisinde transistör seti var zaten. İstenilen bacaklarına pwm'i vereceksiniz e çıkıştan motoru süreceksiniz.

      Sil
  12. Merhabalar, 7 A, 24 V Değerlerindeki bir DC motoru ne ne şekilde sürebiliriz?

    YanıtlayınSil
  13. Merhaba, aynı devreyi BC547 ile yapmıştım, base önündeki direnci 10K yaptığım zaman transistörüm çok ısınıyor, ama 470 ohm kullanınca ısınma olmuyor. Bunun nedeni nedir?

    YanıtlayınSil
  14. 12 v motor güç verince dönüyor sonra duruyor kontrol edemiyorum sorun nerde acaba

    YanıtlayınSil