Bu projede, harici bir hazır ESC kullanmak yerine Arduino Uno ile kendi 3 Fazlı Sensörsüz (Sensorless) BLDC Motor Sürücümüzü inşa ediyoruz. Devre; 6 adet N-Kanal MOSFET'ten oluşan 3 fazlı bir köprü (Inverter), 3 adet IR2104S MOSFET sürücü entegresi ve rotor pozisyonunu algılamak için BEMF (Back Electromotive Force / Zıt EMK) voltaj bölücü direnç ağından oluşur. Motor hızı iki adet buton (Speed Up / Speed Down) ile dijital olarak kontrol edilmektedir.
Sensörsüz BLDC motorlarda rotor pozisyonunu belirleyen Hall sensörleri bulunmaz. Bunun yerine motor döndükçe boşta kalan faz bacağında indüklenen Zıt EMK (BEMF) voltajı okunur.
IN pini sinyali, SD (Shutdown) pini ise çıkışları aktif/pasif yapmayı sağlar.| Arduino Pini | Bağlandığı Yer | Görevi |
|---|---|---|
Pin 2, 3, 4 |
IR2104S (Faz A, B, C) - SD Pinleri |
Faz Çıkışlarını Açma/Kapatma (Enable) |
Pin 9, 10, 11 |
IR2104S (Faz A, B, C) - IN Pinleri (PWM) |
PWM ve Komutasyon Sinyalleri |
A0, A1, A2 |
Faz A, B, C Voltaj Bölücü Çıkışları | BEMF Sıfır Geçiş Tespiti (Zero-Crossing) |
A4 / A5 |
Speed Up / Speed Down Butonları | Hız Kontrol Girişleri (Internal Pull-up) |
Aşağıdaki kod; motoru durur vaziyetten kaldırmak için açık döngü (Open-Loop Start) başlatma dizisi uygular, ardından BEMF okuması ile kapalı döngüye geçer ve butonlarla hızı ayarlar:
// Arduino Sensörsüz BLDC Sürücü (DIY ESC)
// Sürücü SD ve IN pin tanımlamaları
const int SD_A = 2, IN_A = 9;
const int SD_B = 3, IN_B = 10;
const int SD_C = 4, IN_C = 11;
// Buton pinleri
const int BTN_UP = A4;
const int BTN_DOWN = A5;
int step = 0;
int motorSpeed = 2000; // Mikrosaniye cinsinden adım gecikmesi (Küçüldükçe hız artar)
int pwmDuty = 80; // Başlangıç PWM gücü (0-255)
// 6 Adım Komutasyon Tablosu
void setStep(int stepNum) {
switch(stepNum) {
// Adım 1: Faz A High, Faz B Low, Faz C Boşta (BEMF A2'de)
case 0:
digitalWrite(SD_C, LOW);
digitalWrite(SD_A, HIGH); analogWrite(IN_A, pwmDuty);
digitalWrite(SD_B, HIGH); analogWrite(IN_B, 0);
break;
// Adım 2: Faz A High, Faz C Low, Faz B Boşta (BEMF A1'de)
case 1:
digitalWrite(SD_B, LOW);
digitalWrite(SD_A, HIGH); analogWrite(IN_A, pwmDuty);
digitalWrite(SD_C, HIGH); analogWrite(IN_C, 0);
break;
// Adım 3: Faz B High, Faz C Low, Faz A Boşta (BEMF A0'da)
case 2:
digitalWrite(SD_A, LOW);
digitalWrite(SD_B, HIGH); analogWrite(IN_B, pwmDuty);
digitalWrite(SD_C, HIGH); analogWrite(IN_C, 0);
break;
// Adım 4: Faz B High, Faz A Low, Faz C Boşta
case 3:
digitalWrite(SD_C, LOW);
digitalWrite(SD_B, HIGH); analogWrite(IN_B, pwmDuty);
digitalWrite(SD_A, HIGH); analogWrite(IN_A, 0);
break;
// Adım 5: Faz C High, Faz A Low, Faz B Boşta
case 4:
digitalWrite(SD_B, LOW);
digitalWrite(SD_C, HIGH); analogWrite(IN_C, pwmDuty);
digitalWrite(SD_A, HIGH); analogWrite(IN_A, 0);
break;
// Adım 6: Faz C High, Faz B Low, Faz A Boşta
case 5:
digitalWrite(SD_A, LOW);
digitalWrite(SD_C, HIGH); analogWrite(IN_C, pwmDuty);
digitalWrite(SD_B, HIGH); analogWrite(IN_B, 0);
break;
}
}
void setup() {
pinMode(SD_A, OUTPUT); pinMode(IN_A, OUTPUT);
pinMode(SD_B, OUTPUT); pinMode(IN_B, OUTPUT);
pinMode(SD_C, OUTPUT); pinMode(IN_C, OUTPUT);
pinMode(BTN_UP, INPUT_PULLUP);
pinMode(BTN_DOWN, INPUT_PULLUP);
// Tüm sürücüleri başlangıçta kapat
digitalWrite(SD_A, LOW);
digitalWrite(SD_B, LOW);
digitalWrite(SD_C, LOW);
Serial.begin(115200);
Serial.println("DIY BLDC ESC Başlatılıyor...");
// Open-Loop (Açık Döngü) Başlangıç Rampası
for (int i = 5000; i > motorSpeed; i -= 100) {
setStep(step % 6);
step++;
delayMicroseconds(i);
}
}
void loop() {
// Buton Kontrolleri
if (digitalRead(BTN_UP) == LOW) {
if (motorSpeed > 800) motorSpeed -= 50; // Hızlan
delay(100);
}
if (digitalRead(BTN_DOWN) == LOW) {
if (motorSpeed < 4000) motorSpeed += 50; // Yavaşla
delay(100);
}
// Komutasyon Adımını İlerlet
setStep(step % 6);
step++;
delayMicroseconds(motorSpeed);
}
Henüz yorum yapılmamış. İlk yorumu siz yapın!