Arduino ile DC Motor Kontrolu
Güncelleme 15/06/2020
Motorların çalışırken yüksek akım çektikleri ve bu yüzden Arduino ve benzeri kontrolcülere asla direk bağlanmaması gerekir. Bunun için mutlaka Arduino ile motor arasına bir motor sürücü devre bağlanır.
PWM (Pulse Width Modulation) darbe genişlik modülü basit bir mantıkla belirli bir periyot içerisinde motora voltajın ne kadar sürede uygulanacağıdır.
Yukarıdaki şemada görüleceği gibi kare dalgaların genlikleri voltajın uygulanma süreleri verilmiştir.
Buna Duty Cycle yani uygulama süresi denilebilir.
En üstteki grafikte 0% Duty Cycle yani 0 Volt uygulandığı durumdaki dalga şematize edilmiştir. Diğer bir grafikte ise Duty Cycle 50% dir.
Burada bir T periyodunun yarısı süresince +5V uygulanırken Diğer yarısında 0V uygulanmış demektir.
Benzer şekilde 75% Duty Cycle için 3/4T periyodunda +5V 1/4T periyodunda ise 0V uygulanmıştır.
Peki bu ne işe yarar ?
PWM periyorları saniyenin çok çok altında sürelerde geçekleşir.
Yani +5v ile 0v un uygulanma süreleri o kadar kısadırki çıkışta ne +5V ne de 0v alabiliriz.
Onun yerine Duty Cycle değerine göre bu voltajların ortalaması olan PWM voltajı elde edilmiş olur.
Yani biz uygulamak istediğimiz voltajı PWM çıkış değerine göre belirleyebiliriz. Onuda şu şekilde yapıyoruz.
Arduino’da 8 bitlik PWM çıkış değeri vardır.
Yani biz PWM değerini 0 ile 255 değerleri altında ayarlayabiliriz.
Bu demek oluyor ki çıkıştaki 5 V ‘ u 255 parçaya bölerek elde edilen voltajın katlarını çıkış olarak verebiliriz.
Formulize edecek olursak;
Arduino’da PWM çıkışı almak için gerekli kod ise şöyledir; analogWrite(PWM_pini , Duty Cycle);
Bir örnek üzerinden mantığını tekrarlayalım.
Arduino Uno kartımızın 6 nolu PWM pininden çıkış almak isteyelim.
analogWrite(6, 127); — (5/255)x127 = 2,5 Volt çıkış alınır.
analogWrite(6, 64); — (5/255)x64 = 125 Volt çıkış alınır.
Yani basit bir mantıkla 1 PWM değeri 5/255= 0,020 V’a eşittir yaklaşık olarak.
Şimdi motorumuza kontrol etmek için bir Arduino PWM kontrol örneği yapalım.
int PWMpin = 6; //Motoru tetikleyen pin
void setup()
{
//PWM yada Anolag işlemler için ilgili pinler için setup ayarı yapılmaz.
}void loop()
{
// motorumuzun hızını belirli sürelerle arttırıp azaltalım.for(int k=0; k<9 ; k++>
{
analogWrite(PWMpin,(32*k)-1); // k’nın 8 değerine kadar PWM değeri yaklaşık 32 nın k katları olarak artacak.voltaj 0’dan +5V çıkacak.
(k=8 için PWM =256 olamaz o yüzden -1 kullanıldı.)
}
for(int k=8; k>-1 ; k–)
{
analogWrite(PWMpin,255/k); // k’nın 0 değerine kadar PWM değeri 32 nin k katları olarak // azalacak. voltaj +5V’dan 0 ‘ a düşecek.
}
}