Doğan Kayadelen
arduino kontrollü fırçasız dc motor sürücü tasarımı kodları devresi

Arduino Kontrollü Sensörsüz Fırçasız DC Motor Sürücü Tasarımı (BLDC Driver)

Arduino ile sensörsüz fırçasız DC motor sürücüsü nasıl yapılır? Sensörlü ve sensörsüz sürücüler arasındaki farklar neler? Ve fırçasız DC motor sürücüsü yapılırken karşılaşılan hatalar nelerdir?

Fırçasız DC Motor (BLDC)

BLDC ‘ler hakkında çok fazla detaya girmeden yazıma devam edeceğim.  Sensörlü ve sensörsüz olmak üzere iki adet BLDC motor vardır. Sensörlü fırçasız motorlarda 3 adet hall sensörü bulunur. Bu sensörler rotor pozisyonunu tespit eder.

bldc motor
bldc motor

Komütasyon nedir? (Commutation)

Türkçe karşılığı değişme, komütasyondur. Sensörden gelen verilere göre mosfetlerin high ve low kısımlarına hangi zamanda enerji verilmesi gerektiğini söyler. BLDC ler için 6 komütasyon vardır. Her 6 komütasyondan sonra bu döngü başa dönerek devam eder.

Sensörsüz Fırçasız DC Motor

Sensörsüz fırçasız motorda hall sensörleri bulunmamaktadır. Bu yüzden rotor pozisyonu zıt elektromotor kuvveti (back electromotive force, bemf) ile tespit edilir. Sensörsüz BLDC motor kontrolünün ana avantajı  düşük sistem maliyetiyken dezavantajı ise, algılanacak yeterli BEMF üretmek için motorun minimum hızda hareket etmesidir.

Fırçasız DC Motor Nasıl Çalışır?

BLDC motor dönmeye başladığında her 3 sarımda zıt elektromotor kuvveti (bemf) oluşturur. Üretilen bu 3 BEMF sinyali hall sensöründeki gibi 120° faz farkı vardır. Aşağıdaki şekilde hall sensörü ve BEMF arasındaki ilişkiye bakalım.

fırçasız dc motor nasıl çalışır
fırçasız dc motor nasıl çalışır

Hall seönsürle BEMF tam anlamıyla senkronize olmadığını rahatlıkla anlayabiliriz. 30 derece faz farkı görülüyor. Her enerjilendirilen bölümde iki sargıya enerji veriliyor. Bunlardan birisi artı diğeri eksi bir diğeri de boşta (literatürde floating olarak geçiyor.) 3. kalan floating sargı yani boştaki sargı ise birazdan anlatacağım zero crossing (sıfır geçiş) olayını tespit etmek de kullanılıyor. Burada yüksekten düşüğe ve düşükten yükseğe her geçişte zero crossing olayını gözlemleyebilmekteyiz.

Sıfır geçiş olayını nasıl tespit edebiliriz?

Sıfır geçiş olaylarını tespit etmenin en kolay yolu karşılaştırıcılar (comparator)kullanmaktır. Atmega işlemcisinde analog comparatorumuz mevcut.  Karşılaştırıcının 3 ana terminali vardır: 2 giriş (pozitif ve negatif) ve bir çıkış. Pozitif voltaj negatif voltajdan yüksekse, karşılaştırıcı çıkışı high ve pozitif voltaj negatif voltajdan düşük ise low çıkışı verir.
Temelde bu proje için 3 karşılaştırıcıya ihtiyaç vardır, bağlantılar aşağıdaki şekilde gösterildiği gibi yapılır (B kısmı için). Her faz benzer bir devre gerektirir.

sıfır geçiş olayını nasıl tespit ederiz zerocrossing
sıfır geçiş olayını nasıl tespit ederiz zerocrossing

Virtual neutral point yani sanal doğa noktası 3 karşılaştırıcı için de aynıdır bu yüzden biz bunları devremizde 3 direnç kullanarak ve her fazdan gelenleri birleştirerek elde ettik.  Boşta kalan sargıda yani üstte bahsettiğimiz floating kısmında zıt elektromotor kuvveti sıfır noktasının pozitif kısmına geçtiğinde karşılaştırıcı low dan high a geçiş yapar. Eğer floatingdeki bemf sıfır noktasının negatif kısmına geöerse karşılaştırıcı da high dan low a geçiş yapar. Bu üç karşılaştırıcı devresinde her faz üzerinde bemf sinyalina karşılık üç dijital sinyal verilir. Bu üç sinyalin kombinasyonu komütasyon sırasını üretmek için  kullanılır.

Sensörsüz Fırçasız DC Motor Sürücüsü İçin Gerekli Devre Elemanları

  • Arduino UNO
  • Fırçasız DC Motor (BLDC)
  • 6 x IRFZ44 N tip mosfet veya eşdeğeri
  • 3 x IR2104 gate mosfet sürücüsü
  • 6 x 33k ohm direnç
  • 3 x 10k ohm direnç
  • 6 x 100 ohm direnç
  • 3 x IN4148 diyot
  • 3 x 10uF kapasitör
  • 3 x 2.2uF kapasitör
  • 2 x buton
  • 12V güç kaynağı
  • Breadboard
  • Erkek erkek ve erkek dişi kablolar

Arduino ile Sensörsüz BLDC Motor Kontrol Devresi

fırçasız sensörsüz dc motor devre gerçeklemesi
fırçasız sensörsüz dc motor devre gerçeklemesi

Tüm toprakları ortak bağlamayı unutmayın özellikle 12V ‘un eksisiyle. Devremizde 2 tane butonumuz var. A0 pinine bağlı olan motorun hızını arttırırken A1 pinine bağlı olan motorun hızını azaltır.

A, B ve C fazlarından çıkan kabloların girdiği ilk üç 33k direnç ve üç 10k direnç voltaj bölücü olarak kullanılmaktadır. Çünkü mikrodenetleyicimize 12V veremiyoruz. En sol kısımda bulunan diğer 33k dirençler ise sanal doğal noktayı (virtual neutral point) oluşturmaktadır. Ve bu pin arduinomuzun 6. pinine bağlanmaktadır.

Arduino UNO kartı, analog bir karıştırıcıya (analog comparator) sahip Atmega328p mikrodenetleyicine sahiptir.  Bu comperatorın pozitif girişi pin6 (AIN0)’dadır yani virtual natural pointte (sanal doğal nokta). Eksi girişi işe A fazının BEMF’i için pin7 (AIN1), B fazının BEMF için A2 (ADC2)pin ve C fazının BEMF için A3 (ADC3) pinine bağlanmıştır. Karşılaştırıcı her seferinde sanal noktayı bir fazın ters elektro motor kuvveti ile karşılaştırır bu işlem yazılımımızda yapılacaktır.

Mosfetlerin high ve low kısımlarını kontrol etmek için IR2104 entegresini yani mosfet sürücülerimizi kullandık. Yüksek ve alçak arasındaki geçişleri biz IN ve SC kontrol hatları üzerinden yapıyoruz. Aşağıda giriş ve çıkışların detaylı sinyalleri verilmiştir.

IR2104 lerin SD girişlerine Arduinomuzun 9, 10 ve 11. pinleri bağlanmıştır. High sidelar için de arduinomuzdan pwm üreteceğiz.

Arduino ile Sensörsüz Fırçasız DC Motor Kontrolü Kodu

pin 9 ve pin 10 > Timer1 (OC1A OC1B) ile ilişkilendiriyoruz. Pin 11 ‘i ise Timer2 (OC2A) modülü ile ilişkilendiriyoruz. Her iki zamanlayıcı modulde pwm sinyali üretmek için tasarlanmıştır. Bu pwm sinyalleri 31 KHz frekansında ve 8 bit çözünürlüğündedir. PWM sinyallerinin buton ile ilişkileri yani hızlanma veya yavaşlama durumları OCR1A, OCR1B ve OCR2A yazmaçlarına yazılarak güncellenir.

Analog karşılaştırıcı, AIN0 pozitif girişini (Arduino pin 6) AIN1 (pin 7), ADC2 (pin A2) veya ADC3 (pin A3) pinlerinden biriyle negatif girişle karşılaştırır. Pozitif pin voltajı negatif pin voltajından yüksek olduğunda, analog karşılaştırıcı ACO’nun çıkışı 1 olacak şekilde (set) ayarlanır ve pozitif pin voltajı negatif pin voltajından düşük olduğunda, ACO temizlenir (clear). Bu projede analog karşılaştırıcı kesmesini (analog comparator interrupt) kullandım . Hem yükselişinde hem düşüşünde (artıdan eksiye eksiden artıya) kesme kullandım böylelikle zero crossing yani sıfır kesme olaylarını mikrodenetleyicimizle yapmış olduk.

Sensörsüz fırçasız dc motor yapmak kolay bir olay değil bu olayı tam olarak anlayabilmek için birden fazla kaynaktan araştırma yapmanız gerekiyor. Araştırmalarınız için mosfet datasheetleri, gate sürücü datasheetleri, kullanacağınız atmega328p nin datasheetini mutlaka okumanızı tavsiye ediyorum.

Sensörsüz Fırçasız DC Motor Sürücü Kontrolü Arduino Kodu

BLDC Proteus Çizimi

brushless dc motor driver circuit
brushless dc motor driver circuit
fırçasız dc motor sürücü devresi mikrodenetleyici kontrollü
fırçasız dc motor sürücü devresi mikrodenetleyici kontrollü

Sürücüsüz Fırçasız DC Motorun Baskı Devre Çizimi (PCB)

bldc baskı devre çizimi
bldc baskı devre çizimi

Çizilen PCB ‘nin 3 boyutlu Görselleştirilmesi

sensörsüz fırçasız dc motor pcb arka yüz
sensörsüz fırçasız dc motor pcb arka yüz
sensörsüz fırçasız dc motor pcb ön yüz
sensörsüz fırçasız dc motor pcb ön yüz
sensörsüz fırçasız dc motor sürücü arduino ile
sensörsüz fırçasız dc motor sürücü arduino ile

Mikro Denetleyici Kontrollü Sensörsüz Fırçasız DC Motor Sürücülerinde Karşılaşılabilecek Hatalar

1- Kullanılacak mosfet yerine başka mosfet kullanmak: Eğer siz bizim yazdığımız mosfet yerine başka mosfet kullanacaksanız her iki mosfetin datasheetine bakarak spesifikasyonların aynı olmasına dikkat ediniz. Örneğin açılıp kapanma süreleri değişirse anahtarlama hızına mosfetler ayak uyduramayabilir.

2- Mosfet sürücüsü olarak IR2101 kullanmak: Bizim belirttiğimiz IR2104 gate sürücüsü yerine ir2101 kullanacaksanız kodda modifikasyon yapmanız gerekmektedir.

3- Motorun olduğu yerde titreyip hareket etmemesi: Bunun bir çok nedeni olabilir ama en muhtemel neden switching işleminin doğru olmaması yani ya kod ya da mosfetler.

4- Pwm sinyalinin başlangıcının 100 ün altına düşmeme sorunu: Kodumuzu detaylı incelediğinizde başlangıç duty 100 olarak ayarlanmış ve duty 0 ile 255 arası değer alabilir fakat siz başlangıç duty değerini 100 ün altına düşürürseniz bemf algılanamayacağı için titreme hareketi yapacaktır. Bunu çözmek için hall sensörlü fırçasız dc motor sürücüsü yapabilir veya farklı bir kodla deneyebilirsiniz.

5- Butonlar yerine potansiyometre kullanamama: Sensörsüz fırçasız dc motor sürücülerinde karşılaşabileceğiniz verdiğimiz tüm hatalar özellikle bu proje için geçerlidir. Örneğin kodumuzda analog karşılaştırıcı ile ADC ‘nin multiplexer’i (çoklayıcı) aynı olduğu için potansiyometre ile denendiğinde karışma ihtimali var o yüzden potansiyometre tercih edilmez.

Bu projenin kodlarını sıfırdan kendim yazmadım hazır olarak aldım fakat detaylı araştırınca aslında çok da zor bir kod olmadığını göreceksiniz sıfırdan tekrar yazmaya zamanım olmadı bu yüzden kod açıklamaları İngilizce zamanım olunca Türkçe olacak şekilde revize edeceğim. Ticari ESC ler (Elektronik Hız Kontrolcü) kadar başarılı bir sürücü olmadığını da belirtelim. Proje çizimini isteyen arkadaşlar yorum veya mail atarak iletişime geçebilir.

3 Comments

  1. İyi geceler. Umarım rahatsızlık vermiyorum.Arduino kontrollü DC motor sürücüsü projesi ilgimi çekti ve elimdeki fırçasız motor için kurmak istedim fakat kodda derleme kısmında hata aldım . Düzeltmeye çalıştım ama pek iyi olmadığım için beceremedim . Acaba kodda hata varda güncelleme yaptınız benim mi gözümden kaçtı yada kütüphane mi güncellemem gerekiyor.

    Hata kodu: exit status 1
    ‘lt’ was not declared in this scope

    Hata olduğunu gösteren satır: for(i = 0; i < 10; i++) {

    Eğer ilgilenirseniz çok teşekkür ederim.Cevabınız için şimdiden teşekkürler.

    1. Kopyala yapıştır yaptığınız için kod satılarında <> işaretleri başka harflerle yer değiştiriyordur muhtemelen.

Leave a Comment