MSP430 DC Motor Hız ve Yön Kontrolü
Bu yazımızda MSP430G2553 ile DC motor kontrölü yapacağız. Bunun için öncelikle motor sürücüsüne ihtiyacımız var. Bunun için H-bridge (Köprüsü) olarak adlandırılan devreyi kurmamız lazım. Yada bununla uğraşmak istemiyorsanız hazır olarak motor sürücüsü alabilirsiniz.
H-Köprüsü Devresi (Motor Sürücü) |
Devrenin çalışma mantığına gelirsek; A girişi logic 1, B girişi logic 0 seviyesindeyken NPN transistörün çalışma prensibinden dolayı Q1 ve Q4 iletimdeyken Q2 ve Q3 transistörleri kesimdedir. Bu nedenle akım Q1 transistörü üzerinden DC motora akar ve buradan da Q4 üzerinden toprağa ulaşıp devreyi tamamlamış olur. Böylece motor bir yöne dönmüş olur. A girişi logic 0, B girişi logic 1 iken yukarıda anlattığımız durumun tam tersi gerçekleşip akım ters yönden akar ve Q2 transistörü üzerinden toprağa akar. Böylece motor ters yönde dönmüş olur.
A B MOTOR
0 0 HAREKET YOK
1 0 İLERİ HAREKET
0 1 GERİ HAREKET
1 1 HAREKET YOK
Devrede bulunan 1N4148 diyotunu piyasada bulamazsanız 1N4007 de kullanabilirsiniz. Bu diyotlar devreden akım ani akımları kesmek için kullanılmıştır. Girişlerdeki dirençler olmasa da olur. Yine de koruma amaçlı kullanmanızda fayda var. 150 ohm direnç bulamazsanız 120 ohm gibi yakın direnç değerleri de kullanabilirsiniz.
Motor sürücünü hazır olarak almak isterseniz buradan ulaşabilirsiniz. Bu devrenin üzerinde bir adet 5V'lik regülatörde bulunmaktadır. Bu sayede mikrodenetleyicimizi buradaki kaynaktan da besleyebiliriz. Enable girişlerine logic 1 seviyesi verdiğimizde bu entegre aktif olur diğer türlü girişleri hangi logic seviyeye çekerseniz çekin çalışmaz. Bu kartın üstündeki entegre 2 adet H-Köprüsü barındırmaktadır. Bu nedenle aynı anda 2 adet DC motor da sürebilirsiniz bu devreyle. Giriş voltajı olarak motorunuz kaç volt ile çalışıyorsa o voltajı verin. Bu entegre maksimum 30 Volt girişe dayanabiliyor bu nedenle daha yüksek bir voltaj uygulamayın. Zaten elektronikçilerde bulunan motorlar 6-12 volt arası çalıştığından bu herhangi bir sorun teşkil etmeyecektir sizin için.
L298 Motor Sürücü Devresi |
Motorun yön kontrolünün nasıl yapacağını anlattık şimdi sıra geldi hız kontrölüne. Hız kontrölü için PWM (Pulse With Modulation) yöntemi kullanılır. Bu yöntemi kısaca anlatmak gerekirse, mikrodenetleyiciler için logic 1 seviyesi 5 yada 3,3 volttur. Logic 0 seviyesi ise 0 volttur. Eğer ki biz yukarıdaki devrenin girişlerine logic 1 seviyesi verirsek motor yüksek hızda dönecektir. Motorun hızını azaltmak istiyorsak mikrodenetleyiciden logic 1'in daha altında bir voltaj uygulamamız gerekli fakat bu direkt olarak mümkün değil. Bunun yerine belli bir süre logic 1 belli bir süre 0 verilirse bu iki seviyenin ortalama değeri devreye verilmiş gibi olacaktır.
Yukarıdaki dalga animasyonunu inceleyecek olursak ilk örnekte doluluk oranı %10'dur. Logic 1 seviyesini 5 Volt kabul edersek birim zamanda devreye 0,5 Volt eşdeğer voltaj uygulanır. İkinci örnekte 1,5 Volt, üçüncü örnekte 2,5 volt ve son örnekte 4,5 volt eşdeğere gerilim oluşturulmuştur. Bir periyottaki doluluk oranı ne kadar fazla ise uygulanan eşdeğer voltaj o kadar yüksek olur. MSP430'un pinlerindeki çıkış gerilimi 3,3 volt olduğundan yukarıdaki grafiği tekrar inceleyecek olursak;
PWM (Pulse With Modulation) |
- Dalga 0,33 Volt
- Dalga 0,99 Volt
- Dalga 1,65 Volt
- Dalga 2,97 Volt olur.
Aşağıda kodumuzu görüyorsunuz. Aşağıda gördüğünüz kodu açıklamayacağım çünkü yanına gerekli açıklamaları yaptım. Aklınızdaki soruları ve görüşlerinizi yorum olarak yazabilirsiniz ve kodu istediğiniz gibi değiştirerek farklı uygulamalarda kullanabilirsiniz.
#include "io430.h"
#include "in430.h"
void gecikme(void); //Fonksiyon için prototip oluşturuldu
int k;
P2DIR = 0xF0; //Port2' nin 1. 2. 3. 4. pinleri çıkış gerisi giriş
P2REN = 0x0F; //Girişlerin pull up direnci aktif
P2OUT = 0X00; //P2 çıkışı temizleniyor
P2IE = 0x0F; //Port2, 1 2 3 4 kesme olsun
P2IES = 0x00; //Yükselen kenarda kesme olucak
P2IFG = 0x00; //P2 portu kesme bayragı temızlenıyor
P1OUT = 0x00; //P1 port cıkısları temızlenyor
P1DIR = 0x0F; //1 2 3 4 giriş gerisi cıkıs
_BIS_SR(GIE); //Tüm kesmeler aktif
for(;;);
}
#pragma vector=PORT2_VECTOR //Port2 kesme vektöru tanımlandı
__interrupt void P1_ISR(void)
{
if(P2IFG_bit.P0) //İleri
P1OUT_bit.P0 = 1;
P1OUT_bit.P1 = 0;
gecikme(k);
else if(P2IFG_bit.P1) //Geri
P1OUT_bit.P0 = 0;
P1OUT_bit.P1 = 1;
gecikme(k);
else if(P2IFG_bit.P2) //Hızlan
k-=500;
else if(P2IFG_bit.P3) //Yavaşla
k+=500;
P2IFG = 0x00; //Bayrak temizlendi
}
void gecikme(void)
{
volatile unsigned int i;
for(i=0 ; i < 50000 ; i ++);
}